nfp: abm: allow to opt-out of RED offload
authorJakub Kicinski <jakub.kicinski@netronome.com>
Fri, 14 Dec 2018 23:01:54 +0000 (15:01 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 16 Dec 2018 20:41:42 +0000 (12:41 -0800)
FW team asks to be able to not support RED even if NIC is capable
of buffering for testing and experimentation.  Add an opt-out flag.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/abm/ctrl.c
drivers/net/ethernet/netronome/nfp/abm/main.c
drivers/net/ethernet/netronome/nfp/abm/main.h

index ad6c2a621c7a6c508483c37f190175c710dcc2ff..9584f03f3efaf73fbd6894334ca47c98b2e18744 100644 (file)
@@ -17,6 +17,8 @@
 #define NFP_NUM_BANDS_SYM_NAME "_abi_pci_dscp_num_band_%u"
 #define NFP_ACT_MASK_SYM_NAME  "_abi_nfd_out_q_actions_%u"
 
+#define NFP_RED_SUPPORT_SYM_NAME       "_abi_nfd_out_red_offload_%u"
+
 #define NFP_QLVL_SYM_NAME      "_abi_nfd_out_q_lvls_%u%s"
 #define NFP_QLVL_STRIDE                16
 #define NFP_QLVL_BLOG_BYTES    0
@@ -358,6 +360,12 @@ int nfp_abm_ctrl_find_addrs(struct nfp_abm *abm)
 
        abm->pf_id = nfp_cppcore_pcie_unit(pf->cpp);
 
+       /* Check if Qdisc offloads are supported */
+       res = nfp_pf_rtsym_read_optional(pf, NFP_RED_SUPPORT_SYM_NAME, 1);
+       if (res < 0)
+               return res;
+       abm->red_support = res;
+
        /* Read count of prios and prio bands */
        res = nfp_pf_rtsym_read_optional(pf, NFP_NUM_BANDS_SYM_NAME, 1);
        if (res < 0)
@@ -390,6 +398,9 @@ int nfp_abm_ctrl_find_addrs(struct nfp_abm *abm)
        }
 
        /* Find level and stat symbols */
+       if (!abm->red_support)
+               return 0;
+
        sym = nfp_abm_ctrl_find_q_rtsym(abm, NFP_QLVL_SYM_NAME,
                                        NFP_QLVL_STRIDE);
        if (IS_ERR(sym))
index 80e79447b644afe8eb6b1312553224f74df8be20..4d4ff5844c4735ef36f5a135e1df190e0089ee24 100644 (file)
@@ -207,6 +207,9 @@ static int nfp_abm_eswitch_set_switchdev(struct nfp_abm *abm)
        struct nfp_net *nn;
        int err;
 
+       if (!abm->red_support)
+               return -EOPNOTSUPP;
+
        err = nfp_abm_ctrl_qm_enable(abm);
        if (err)
                return err;
@@ -418,12 +421,26 @@ nfp_abm_port_get_stats_strings(struct nfp_app *app, struct nfp_port *port,
        return data;
 }
 
+static int nfp_abm_fw_init_reset(struct nfp_abm *abm)
+{
+       unsigned int i;
+
+       if (!abm->red_support)
+               return 0;
+
+       for (i = 0; i < abm->num_bands * NFP_NET_MAX_RX_RINGS; i++) {
+               __nfp_abm_ctrl_set_q_lvl(abm, i, NFP_ABM_LVL_INFINITY);
+               __nfp_abm_ctrl_set_q_act(abm, i, NFP_ABM_ACT_DROP);
+       }
+
+       return nfp_abm_ctrl_qm_disable(abm);
+}
+
 static int nfp_abm_init(struct nfp_app *app)
 {
        struct nfp_pf *pf = app->pf;
        struct nfp_reprs *reprs;
        struct nfp_abm *abm;
-       unsigned int i;
        int err;
 
        if (!pf->eth_tbl) {
@@ -460,18 +477,14 @@ static int nfp_abm_init(struct nfp_app *app)
                                   sizeof(*abm->thresholds), GFP_KERNEL);
        if (!abm->thresholds)
                goto err_free_thresh_umap;
-       for (i = 0; i < abm->num_bands * NFP_NET_MAX_RX_RINGS; i++)
-               __nfp_abm_ctrl_set_q_lvl(abm, i, NFP_ABM_LVL_INFINITY);
 
        abm->actions = kvcalloc(abm->num_thresholds, sizeof(*abm->actions),
                                GFP_KERNEL);
        if (!abm->actions)
                goto err_free_thresh;
-       for (i = 0; i < abm->num_bands * NFP_NET_MAX_RX_RINGS; i++)
-               __nfp_abm_ctrl_set_q_act(abm, i, NFP_ABM_ACT_DROP);
 
        /* We start in legacy mode, make sure advanced queuing is disabled */
-       err = nfp_abm_ctrl_qm_disable(abm);
+       err = nfp_abm_fw_init_reset(abm);
        if (err)
                goto err_free_act;
 
index 4dcf5881fb4bff8d1e149ad6c9e5494b27a3bf46..49749c60885e128dc6da947cceff00bf03f8e490 100644 (file)
@@ -40,6 +40,7 @@ enum nfp_abm_q_action {
  * @app:       back pointer to nfp_app
  * @pf_id:     ID of our PF link
  *
+ * @red_support:       is RED offload supported
  * @num_prios: number of supported DSCP priorities
  * @num_bands: number of supported DSCP priority bands
  * @action_mask:       bitmask of supported actions
@@ -63,6 +64,7 @@ struct nfp_abm {
        struct nfp_app *app;
        unsigned int pf_id;
 
+       unsigned int red_support;
        unsigned int num_prios;
        unsigned int num_bands;
        unsigned int action_mask;