net/bnxt: reorganize ULP template directory structure
[dpdk.git] / drivers / net / bnxt / bnxt_ethdev.c
index b77f12b..d859ef5 100644 (file)
@@ -87,6 +87,7 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
        { .vendor_id = 0, /* sentinel */ },
 };
 
+#define        BNXT_DEVARG_ACCUM_STATS "accum-stats"
 #define BNXT_DEVARG_FLOW_XSTAT "flow-xstat"
 #define BNXT_DEVARG_MAX_NUM_KFLOWS  "max-num-kflows"
 #define BNXT_DEVARG_REPRESENTOR        "representor"
@@ -96,9 +97,11 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
 #define BNXT_DEVARG_REP_Q_F2R  "rep-q-f2r"
 #define BNXT_DEVARG_REP_FC_R2F  "rep-fc-r2f"
 #define BNXT_DEVARG_REP_FC_F2R  "rep-fc-f2r"
+#define BNXT_DEVARG_APP_ID     "app-id"
 
 static const char *const bnxt_dev_args[] = {
        BNXT_DEVARG_REPRESENTOR,
+       BNXT_DEVARG_ACCUM_STATS,
        BNXT_DEVARG_FLOW_XSTAT,
        BNXT_DEVARG_MAX_NUM_KFLOWS,
        BNXT_DEVARG_REP_BASED_PF,
@@ -107,9 +110,21 @@ static const char *const bnxt_dev_args[] = {
        BNXT_DEVARG_REP_Q_F2R,
        BNXT_DEVARG_REP_FC_R2F,
        BNXT_DEVARG_REP_FC_F2R,
+       BNXT_DEVARG_APP_ID,
        NULL
 };
 
+/*
+ * accum-stats == false to disable flow counter accumulation
+ * accum-stats == true to enable flow counter accumulation
+ */
+#define        BNXT_DEVARG_ACCUM_STATS_INVALID(accum_stats)    ((accum_stats) > 1)
+
+/*
+ * app-id = an non-negative 8-bit number
+ */
+#define BNXT_DEVARG_APP_ID_INVALID(val)                        ((val) > 255)
+
 /*
  * flow_xstat == false to disable the feature
  * flow_xstat == true to enable the feature
@@ -4866,6 +4881,32 @@ static void bnxt_config_vf_req_fwd(struct bnxt *bp)
        BNXT_HWRM_CMD_TO_FORWARD(HWRM_OEM_CMD);
 }
 
+struct bnxt *
+bnxt_get_bp(uint16_t port)
+{
+       struct bnxt *bp;
+       struct rte_eth_dev *dev;
+
+       if (!rte_eth_dev_is_valid_port(port)) {
+               PMD_DRV_LOG(ERR, "Invalid port %d\n", port);
+               return NULL;
+       }
+
+       dev = &rte_eth_devices[port];
+       if (!is_bnxt_supported(dev)) {
+               PMD_DRV_LOG(ERR, "Device %d not supported\n", port);
+               return NULL;
+       }
+
+       bp = (struct bnxt *)dev->data->dev_private;
+       if (!BNXT_TRUFLOW_EN(bp)) {
+               PMD_DRV_LOG(ERR, "TRUFLOW not enabled\n");
+               return NULL;
+       }
+
+       return bp;
+}
+
 uint16_t
 bnxt_get_svif(uint16_t port_id, bool func_svif,
              enum bnxt_ulp_intf_type type)
@@ -4890,6 +4931,39 @@ bnxt_get_svif(uint16_t port_id, bool func_svif,
        return func_svif ? bp->func_svif : bp->port_svif;
 }
 
+void
+bnxt_get_iface_mac(uint16_t port, enum bnxt_ulp_intf_type type,
+                  uint8_t *mac, uint8_t *parent_mac)
+{
+       struct rte_eth_dev *eth_dev;
+       struct bnxt *bp;
+
+       if (type != BNXT_ULP_INTF_TYPE_TRUSTED_VF &&
+           type != BNXT_ULP_INTF_TYPE_PF)
+               return;
+
+       eth_dev = &rte_eth_devices[port];
+       bp = eth_dev->data->dev_private;
+       memcpy(mac, bp->mac_addr, RTE_ETHER_ADDR_LEN);
+
+       if (type == BNXT_ULP_INTF_TYPE_TRUSTED_VF)
+               memcpy(parent_mac, bp->parent->mac_addr, RTE_ETHER_ADDR_LEN);
+}
+
+uint16_t
+bnxt_get_parent_vnic_id(uint16_t port, enum bnxt_ulp_intf_type type)
+{
+       struct rte_eth_dev *eth_dev;
+       struct bnxt *bp;
+
+       if (type != BNXT_ULP_INTF_TYPE_TRUSTED_VF)
+               return 0;
+
+       eth_dev = &rte_eth_devices[port];
+       bp = eth_dev->data->dev_private;
+
+       return bp->parent->vnic;
+}
 uint16_t
 bnxt_get_vnic_id(uint16_t port, enum bnxt_ulp_intf_type type)
 {
@@ -5253,6 +5327,45 @@ static int bnxt_init_resources(struct bnxt *bp, bool reconfig_dev)
        return 0;
 }
 
+static int
+bnxt_parse_devarg_accum_stats(__rte_unused const char *key,
+                             const char *value, void *opaque_arg)
+{
+       struct bnxt *bp = opaque_arg;
+       unsigned long accum_stats;
+       char *end = NULL;
+
+       if (!value || !opaque_arg) {
+               PMD_DRV_LOG(ERR,
+                           "Invalid parameter passed to accum-stats devargs.\n");
+               return -EINVAL;
+       }
+
+       accum_stats = strtoul(value, &end, 10);
+       if (end == NULL || *end != '\0' ||
+           (accum_stats == ULONG_MAX && errno == ERANGE)) {
+               PMD_DRV_LOG(ERR,
+                           "Invalid parameter passed to accum-stats devargs.\n");
+               return -EINVAL;
+       }
+
+       if (BNXT_DEVARG_ACCUM_STATS_INVALID(accum_stats)) {
+               PMD_DRV_LOG(ERR,
+                           "Invalid value passed to accum-stats devargs.\n");
+               return -EINVAL;
+       }
+
+       if (accum_stats) {
+               bp->flags2 |= BNXT_FLAGS2_ACCUM_STATS_EN;
+               PMD_DRV_LOG(INFO, "Host-based accum-stats feature enabled.\n");
+       } else {
+               bp->flags2 &= ~BNXT_FLAGS2_ACCUM_STATS_EN;
+               PMD_DRV_LOG(INFO, "Host-based accum-stats feature disabled.\n");
+       }
+
+       return 0;
+}
+
 static int
 bnxt_parse_devarg_flow_xstat(__rte_unused const char *key,
                             const char *value, void *opaque_arg)
@@ -5324,6 +5437,42 @@ bnxt_parse_devarg_max_num_kflows(__rte_unused const char *key,
        return 0;
 }
 
+static int
+bnxt_parse_devarg_app_id(__rte_unused const char *key,
+                                const char *value, void *opaque_arg)
+{
+       struct bnxt *bp = opaque_arg;
+       unsigned long app_id;
+       char *end = NULL;
+
+       if (!value || !opaque_arg) {
+               PMD_DRV_LOG(ERR,
+                           "Invalid parameter passed to app-id "
+                           "devargs.\n");
+               return -EINVAL;
+       }
+
+       app_id = strtoul(value, &end, 10);
+       if (end == NULL || *end != '\0' ||
+           (app_id == ULONG_MAX && errno == ERANGE)) {
+               PMD_DRV_LOG(ERR,
+                           "Invalid parameter passed to app_id "
+                           "devargs.\n");
+               return -EINVAL;
+       }
+
+       if (BNXT_DEVARG_APP_ID_INVALID(app_id)) {
+               PMD_DRV_LOG(ERR, "Invalid app-id(%d) devargs.\n",
+                           (uint16_t)app_id);
+               return -EINVAL;
+       }
+
+       bp->app_id = app_id;
+       PMD_DRV_LOG(INFO, "app-id=%d feature enabled.\n", (uint16_t)app_id);
+
+       return 0;
+}
+
 static int
 bnxt_parse_devarg_rep_is_pf(__rte_unused const char *key,
                            const char *value, void *opaque_arg)
@@ -5569,6 +5718,12 @@ bnxt_parse_dev_args(struct bnxt *bp, struct rte_devargs *devargs)
        if (ret)
                goto err;
 
+       /*
+        * Handler for "accum-stats" devarg.
+        * Invoked as for ex: "-a 0000:00:0d.0,accum-stats=1"
+        */
+       rte_kvargs_process(kvlist, BNXT_DEVARG_ACCUM_STATS,
+                          bnxt_parse_devarg_accum_stats, bp);
        /*
         * Handler for "max_num_kflows" devarg.
         * Invoked as for ex: "-a 000:00:0d.0,max_num_kflows=32"
@@ -5579,6 +5734,13 @@ bnxt_parse_dev_args(struct bnxt *bp, struct rte_devargs *devargs)
                goto err;
 
 err:
+       /*
+        * Handler for "app-id" devarg.
+        * Invoked as for ex: "-a 000:00:0d.0,app-id=1"
+        */
+       rte_kvargs_process(kvlist, BNXT_DEVARG_APP_ID,
+                          bnxt_parse_devarg_app_id, bp);
+
        rte_kvargs_free(kvlist);
        return ret;
 }