bus/dpaa: add fman flow control threshold setting
authorShreyansh Jain <shreyansh.jain@nxp.com>
Thu, 28 Sep 2017 12:29:35 +0000 (17:59 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 6 Oct 2017 00:49:50 +0000 (02:49 +0200)
Signed-off-by: Geoff Thorpe <geoff.thorpe@nxp.com>
Signed-off-by: Roy Pledge <roy.pledge@nxp.com>
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
drivers/bus/dpaa/base/fman/fman_hw.c
drivers/bus/dpaa/include/fsl_fman.h

index a7ca661..077c17c 100644 (file)
@@ -37,6 +37,7 @@
  */
 #include <fsl_fman.h>
 #include <fsl_fman_crc64.h>
+#include <fsl_bman.h>
 
 /* Instantiate the global variable that the inline CRC64 implementation (in
  * <fsl_fman.h>) depends on.
@@ -392,6 +393,33 @@ fman_if_set_bp(struct fman_if *fm_if, unsigned num __always_unused,
                 fmbm_ebmpi);
 }
 
+int
+fman_if_get_fc_threshold(struct fman_if *fm_if)
+{
+       struct __fman_if *__if = container_of(fm_if, struct __fman_if, __if);
+       unsigned int *fmbm_mpd;
+
+       assert(fman_ccsr_map_fd != -1);
+
+       fmbm_mpd = &((struct rx_bmi_regs *)__if->bmi_map)->fmbm_mpd;
+       return in_be32(fmbm_mpd);
+}
+
+int
+fman_if_set_fc_threshold(struct fman_if *fm_if, u32 high_water,
+                        u32 low_water, u32 bpid)
+{
+       struct __fman_if *__if = container_of(fm_if, struct __fman_if, __if);
+       unsigned int *fmbm_mpd;
+
+       assert(fman_ccsr_map_fd != -1);
+
+       fmbm_mpd = &((struct rx_bmi_regs *)__if->bmi_map)->fmbm_mpd;
+       out_be32(fmbm_mpd, FMAN_ENABLE_BPOOL_DEPLETION);
+       return bm_pool_set_hw_threshold(bpid, low_water, high_water);
+
+}
+
 int
 fman_if_get_fc_quanta(struct fman_if *fm_if)
 {
index ac38082..95aee67 100644 (file)
@@ -112,6 +112,13 @@ void fman_if_loopback_disable(struct fman_if *p);
 void fman_if_set_bp(struct fman_if *fm_if, unsigned int num, int bpid,
                    size_t bufsize);
 
+/* Get Flow Control threshold parameters on specific interface */
+int fman_if_get_fc_threshold(struct fman_if *fm_if);
+
+/* Enable and Set Flow Control threshold parameters on specific interface */
+int fman_if_set_fc_threshold(struct fman_if *fm_if,
+                       u32 high_water, u32 low_water, u32 bpid);
+
 /* Get Flow Control pause quanta on specific interface */
 int fman_if_get_fc_quanta(struct fman_if *fm_if);