net/octeontx2: support enabling switch type
authorKiran Kumar K <kirankumark@marvell.com>
Wed, 23 Oct 2019 15:25:48 +0000 (20:55 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 8 Nov 2019 22:15:04 +0000 (23:15 +0100)
Adding support to configure specific switch types like high2 and dsa
on a port. When this switch type is configured, it is expected that
all the traffic on that port should be of specific type only.

Signed-off-by: Kiran Kumar K <kirankumark@marvell.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
doc/guides/nics/octeontx2.rst
drivers/common/octeontx2/otx2_mbox.h
drivers/net/octeontx2/otx2_ethdev.c
drivers/net/octeontx2/otx2_ethdev_devargs.c
drivers/net/octeontx2/otx2_flow.h

index fc8a130..adf7c71 100644 (file)
@@ -170,6 +170,18 @@ Runtime Config Options
    With the above configuration, each send queue's decscriptor buffer count is
    limited to a maximum of 64 buffers.
 
+- ``switch header enable`` (default ``none``)
+
+   A port can be configured to a specific switch header type by using
+   ``switch_header`` ``devargs`` parameter.
+
+   For example::
+
+      -w 0002:02:00.0,switch_header="higig2"
+
+   With the above configuration, higig2 will be enabled on that port and the
+   traffic on this port should be higig2 traffic only. Supported switch header
+   types are "higig2" and "dsa".
 
 .. note::
 
index 445b03e..c2a9e9f 100644 (file)
@@ -89,7 +89,7 @@ struct mbox_msghdr {
 #define OTX2_MBOX_RSP_SIG (0xbeef)
        /* Signature, for validating corrupted msgs */
        uint16_t __otx2_io sig;
-#define OTX2_MBOX_VERSION (0x0002)
+#define OTX2_MBOX_VERSION (0x0003)
        /* Version of msg's structure for this ID */
        uint16_t __otx2_io ver;
        /* Offset of next msg within mailbox region */
@@ -236,6 +236,9 @@ M(NPC_DELETE_FLOW,    0x600e, npc_delete_flow,                      \
 M(NPC_MCAM_READ_ENTRY,   0x600f, npc_mcam_read_entry,                  \
                                  npc_mcam_read_entry_req,              \
                                  npc_mcam_read_entry_rsp)              \
+M(NPC_SET_PKIND,          0x6010, npc_set_pkind,                        \
+                                 npc_set_pkind,                        \
+                                 msg_rsp)                              \
 /* NIX mbox IDs (range 0x8000 - 0xFFFF) */                             \
 M(NIX_LF_ALLOC,                0x8000, nix_lf_alloc, nix_lf_alloc_req,         \
                                nix_lf_alloc_rsp)                       \
@@ -329,6 +332,20 @@ struct ready_msg_rsp {
        uint16_t __otx2_io rclk_freq; /* RCLK frequency */
 };
 
+/* Struct to set pkind */
+struct npc_set_pkind {
+       struct mbox_msghdr hdr;
+#define OTX2_PRIV_FLAGS_DEFAULT  BIT_ULL(0)
+#define OTX2_PRIV_FLAGS_EDSA     BIT_ULL(1)
+#define OTX2_PRIV_FLAGS_HIGIG    BIT_ULL(2)
+#define OTX2_PRIV_FLAGS_CUSTOM   BIT_ULL(63)
+       uint64_t __otx2_io mode;
+#define PKIND_TX               BIT_ULL(0)
+#define PKIND_RX               BIT_ULL(1)
+       uint8_t __otx2_io dir;
+       uint8_t __otx2_io pkind; /* valid only in case custom flag */
+};
+
 /* Structure for requesting resource provisioning.
  * 'modify' flag to be used when either requesting more
  * or detach partial of a certain resource type.
index 62291c6..dfa8cd2 100644 (file)
@@ -90,6 +90,30 @@ nix_lf_alloc(struct otx2_eth_dev *dev, uint32_t nb_rxq, uint32_t nb_txq)
        return 0;
 }
 
+static int
+nix_lf_switch_header_type_enable(struct otx2_eth_dev *dev)
+{
+       struct otx2_mbox *mbox = dev->mbox;
+       struct npc_set_pkind *req;
+       struct msg_resp *rsp;
+       int rc;
+
+       if (dev->npc_flow.switch_header_type == 0)
+               return 0;
+
+       /* Notify AF about higig2 config */
+       req = otx2_mbox_alloc_msg_npc_set_pkind(mbox);
+       req->mode = dev->npc_flow.switch_header_type;
+       req->dir = PKIND_RX;
+       rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
+       if (rc)
+               return rc;
+       req = otx2_mbox_alloc_msg_npc_set_pkind(mbox);
+       req->mode = dev->npc_flow.switch_header_type;
+       req->dir = PKIND_TX;
+       return otx2_mbox_process_msg(mbox, (void *)&rsp);
+}
+
 static int
 nix_lf_free(struct otx2_eth_dev *dev)
 {
@@ -1612,6 +1636,12 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
                goto fail_offloads;
        }
 
+       rc = nix_lf_switch_header_type_enable(dev);
+       if (rc) {
+               otx2_err("Failed to enable switch type nix_lf rc=%d", rc);
+               goto free_nix_lf;
+       }
+
        rc = nix_setup_lso_formats(dev);
        if (rc) {
                otx2_err("failed to setup nix lso format fields, rc=%d", rc);
index 7dc6e92..ca9a5ff 100644 (file)
@@ -104,12 +104,27 @@ parse_sqb_count(const char *key, const char *value, void *extra_args)
        return 0;
 }
 
+static int
+parse_switch_header_type(const char *key, const char *value, void *extra_args)
+{
+       RTE_SET_USED(key);
+
+       if (strcmp(value, "higig2") == 0)
+               *(uint16_t *)extra_args = OTX2_PRIV_FLAGS_HIGIG;
+
+       if (strcmp(value, "dsa") == 0)
+               *(uint16_t *)extra_args = OTX2_PRIV_FLAGS_EDSA;
+
+       return 0;
+}
+
 #define OTX2_RSS_RETA_SIZE "reta_size"
 #define OTX2_PTYPE_DISABLE "ptype_disable"
 #define OTX2_SCL_ENABLE "scalar_enable"
 #define OTX2_MAX_SQB_COUNT "max_sqb_count"
 #define OTX2_FLOW_PREALLOC_SIZE "flow_prealloc_size"
 #define OTX2_FLOW_MAX_PRIORITY "flow_max_priority"
+#define OTX2_SWITCH_HEADER_TYPE "switch_header"
 
 int
 otx2_ethdev_parse_devargs(struct rte_devargs *devargs, struct otx2_eth_dev *dev)
@@ -118,6 +133,7 @@ otx2_ethdev_parse_devargs(struct rte_devargs *devargs, struct otx2_eth_dev *dev)
        uint16_t rss_size = NIX_RSS_RETA_SIZE;
        uint16_t sqb_count = NIX_MAX_SQB;
        uint16_t flow_prealloc_size = 8;
+       uint16_t switch_header_type = 0;
        uint16_t flow_max_priority = 3;
        uint16_t scalar_enable = 0;
        struct rte_kvargs *kvlist;
@@ -141,6 +157,8 @@ otx2_ethdev_parse_devargs(struct rte_devargs *devargs, struct otx2_eth_dev *dev)
                           &parse_flow_prealloc_size, &flow_prealloc_size);
        rte_kvargs_process(kvlist, OTX2_FLOW_MAX_PRIORITY,
                           &parse_flow_max_priority, &flow_max_priority);
+       rte_kvargs_process(kvlist, OTX2_SWITCH_HEADER_TYPE,
+                          &parse_switch_header_type, &switch_header_type);
        rte_kvargs_free(kvlist);
 
 null_devargs:
@@ -150,6 +168,7 @@ null_devargs:
        dev->rss_info.rss_size = rss_size;
        dev->npc_flow.flow_prealloc_size = flow_prealloc_size;
        dev->npc_flow.flow_max_priority = flow_max_priority;
+       dev->npc_flow.switch_header_type = switch_header_type;
        return 0;
 
 exit:
@@ -162,4 +181,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_octeontx2,
                              OTX2_SCL_ENABLE "=1"
                              OTX2_MAX_SQB_COUNT "=<8-512>"
                              OTX2_FLOW_PREALLOC_SIZE "=<1-32>"
-                             OTX2_FLOW_MAX_PRIORITY "=<1-32>");
+                             OTX2_FLOW_MAX_PRIORITY "=<1-32>"
+                             OTX2_SWITCH_HEADER_TYPE "=<higig2|dsa>");
index ab068b0..6bfd5af 100644 (file)
@@ -190,6 +190,7 @@ struct otx2_npc_flow_info {
        uint16_t channel; /*rx channel */
        uint16_t flow_prealloc_size;
        uint16_t flow_max_priority;
+       uint16_t switch_header_type;
 };
 
 struct otx2_parse_state {