net/dpaa2: skip resetting dpdmux
authorApeksha Gupta <apeksha.gupta@nxp.com>
Wed, 24 Feb 2021 12:42:59 +0000 (18:12 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 24 Feb 2021 17:03:30 +0000 (18:03 +0100)
This is require as the interface is shared with Linux and we do not want
the dpdmux to be reset. Rather the default interface to kernel shall
continue.
command dpdmux_set_resetable is used to skip DPDMUX reset.

By default the DPDMUX_RESET command will reset the DPDMUX completely,
dpdmux_set_resetable command will be ignored in old MC firmware.

Signed-off-by: Apeksha Gupta <apeksha.gupta@nxp.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
drivers/net/dpaa2/dpaa2_mux.c
drivers/net/dpaa2/mc/dpdmux.c
drivers/net/dpaa2/mc/fsl_dpdmux.h
drivers/net/dpaa2/mc/fsl_dpdmux_cmd.h

index b669a16..1ff00ca 100644 (file)
@@ -264,6 +264,8 @@ dpaa2_create_dpdmux_device(int vdev_fd __rte_unused,
        struct dpaa2_dpdmux_dev *dpdmux_dev;
        struct dpdmux_attr attr;
        int ret;
+       uint16_t maj_ver;
+       uint16_t min_ver;
 
        PMD_INIT_FUNC_TRACE();
 
@@ -298,6 +300,30 @@ dpaa2_create_dpdmux_device(int vdev_fd __rte_unused,
                goto init_err;
        }
 
+       ret = dpdmux_get_api_version(&dpdmux_dev->dpdmux, CMD_PRI_LOW,
+                                       &maj_ver, &min_ver);
+       if (ret) {
+               DPAA2_PMD_ERR("setting version failed in %s",
+                               __func__);
+               goto init_err;
+       }
+
+       /* The new dpdmux_set/get_resetable() API are available starting with
+        * DPDMUX_VER_MAJOR==6 and DPDMUX_VER_MINOR==6
+        */
+       if (maj_ver >= 6 && min_ver >= 6) {
+               ret = dpdmux_set_resetable(&dpdmux_dev->dpdmux, CMD_PRI_LOW,
+                               dpdmux_dev->token,
+                               DPDMUX_SKIP_DEFAULT_INTERFACE |
+                               DPDMUX_SKIP_UNICAST_RULES |
+                               DPDMUX_SKIP_MULTICAST_RULES);
+               if (ret) {
+                       DPAA2_PMD_ERR("setting default interface failed in %s",
+                                     __func__);
+                       goto init_err;
+               }
+       }
+
        dpdmux_dev->dpdmux_id = dpdmux_id;
        dpdmux_dev->num_ifs = attr.num_ifs;
 
index 67d37ed..57c811c 100644 (file)
@@ -123,10 +123,12 @@ int dpdmux_create(struct fsl_mc_io *mc_io,
        cmd_params->method = cfg->method;
        cmd_params->manip = cfg->manip;
        cmd_params->num_ifs = cpu_to_le16(cfg->num_ifs);
+       cmd_params->default_if = cpu_to_le16(cfg->default_if);
        cmd_params->adv_max_dmat_entries =
                        cpu_to_le16(cfg->adv.max_dmat_entries);
        cmd_params->adv_max_mc_groups = cpu_to_le16(cfg->adv.max_mc_groups);
        cmd_params->adv_max_vlan_ids = cpu_to_le16(cfg->adv.max_vlan_ids);
+       cmd_params->mem_size = cpu_to_le16(cfg->adv.mem_size);
        cmd_params->options = cpu_to_le64(cfg->adv.options);
 
        /* send command to mc*/
@@ -278,6 +280,87 @@ int dpdmux_reset(struct fsl_mc_io *mc_io,
        return mc_send_command(mc_io, &cmd);
 }
 
+/**
+ * dpdmux_set_resetable() - Set overall resetable DPDMUX parameters.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPDMUX object
+ * @skip_reset_flags:  By default all are 0.
+ *                     By setting 1 will deactivate the reset.
+ *     The flags are:
+ *                     DPDMUX_SKIP_DEFAULT_INTERFACE  0x01
+ *                     DPDMUX_SKIP_UNICAST_RULES      0x02
+ *                     DPDMUX_SKIP_MULTICAST_RULES    0x04
+ *
+ * For example, by default, through DPDMUX_RESET the default
+ * interface will be restored with the one from create.
+ * By setting DPDMUX_SKIP_DEFAULT_INTERFACE flag,
+ * through DPDMUX_RESET the default interface will not be modified.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpdmux_set_resetable(struct fsl_mc_io *mc_io,
+                                 uint32_t cmd_flags,
+                                 uint16_t token,
+                                 uint8_t skip_reset_flags)
+{
+       struct mc_command cmd = { 0 };
+       struct dpdmux_cmd_set_skip_reset_flags *cmd_params;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPDMUX_CMDID_SET_RESETABLE,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpdmux_cmd_set_skip_reset_flags *)cmd.params;
+       dpdmux_set_field(cmd_params->skip_reset_flags,
+                       SKIP_RESET_FLAGS,
+                       skip_reset_flags);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpdmux_get_resetable() - Get overall resetable parameters.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPDMUX object
+ * @skip_reset_flags:  Get the reset flags.
+ *
+ *     The flags are:
+ *                     DPDMUX_SKIP_DEFAULT_INTERFACE  0x01
+ *                     DPDMUX_SKIP_UNICAST_RULES      0x02
+ *                     DPDMUX_SKIP_MULTICAST_RULES    0x04
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpdmux_get_resetable(struct fsl_mc_io *mc_io,
+                                 uint32_t cmd_flags,
+                                 uint16_t token,
+                                 uint8_t *skip_reset_flags)
+{
+       struct mc_command cmd = { 0 };
+       struct dpdmux_rsp_get_skip_reset_flags *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPDMUX_CMDID_GET_RESETABLE,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpdmux_rsp_get_skip_reset_flags *)cmd.params;
+       *skip_reset_flags = dpdmux_get_field(rsp_params->skip_reset_flags,
+                       SKIP_RESET_FLAGS);
+
+       return 0;
+}
+
 /**
  * dpdmux_get_attributes() - Retrieve DPDMUX attributes
  * @mc_io:     Pointer to MC portal's I/O object
@@ -314,6 +397,7 @@ int dpdmux_get_attributes(struct fsl_mc_io *mc_io,
        attr->manip = rsp_params->manip;
        attr->num_ifs = le16_to_cpu(rsp_params->num_ifs);
        attr->mem_size = le16_to_cpu(rsp_params->mem_size);
+       attr->default_if = le16_to_cpu(rsp_params->default_if);
 
        return 0;
 }
index 2f167ee..dc067b8 100644 (file)
@@ -79,6 +79,8 @@ enum dpdmux_method {
  * @method: Defines the operation method for the DPDMUX address table
  * @manip: Required manipulation operation
  * @num_ifs: Number of interfaces (excluding the uplink interface)
+ * @default_if: Default interface number (different from uplink,
+       maximum value num_ifs)
  * @adv: Advanced parameters; default is all zeros;
  *     use this structure to change default settings
  * @adv.options: DPDMUX options - combination of 'DPDMUX_OPT_<X>' flags.
@@ -89,16 +91,20 @@ enum dpdmux_method {
  * @adv.max_vlan_ids: Maximum vlan ids allowed in the system -
  *     relevant only case of working in mac+vlan method.
  *     0 - indicates default 16 vlan ids.
+ * @adv.mem_size: Size of the memory used for internal buffers expressed as
+ * number of 256byte buffers.
  */
 struct dpdmux_cfg {
        enum dpdmux_method method;
        enum dpdmux_manip manip;
        uint16_t num_ifs;
+       uint16_t default_if;
        struct {
                uint64_t options;
                uint16_t max_dmat_entries;
                uint16_t max_mc_groups;
                uint16_t max_vlan_ids;
+               uint16_t mem_size;
        } adv;
 };
 
@@ -130,6 +136,29 @@ int dpdmux_reset(struct fsl_mc_io *mc_io,
                 uint32_t cmd_flags,
                 uint16_t token);
 
+/**
+ *Setting 1 DPDMUX_RESET will not reset default interface
+ */
+#define DPDMUX_SKIP_DEFAULT_INTERFACE  0x01
+/**
+ *Setting 1 DPDMUX_RESET will not reset unicast rules
+ */
+#define DPDMUX_SKIP_UNICAST_RULES      0x02
+/**
+ *Setting 1 DPDMUX_RESET will not reset multicast rules
+ */
+#define DPDMUX_SKIP_MULTICAST_RULES    0x04
+
+int dpdmux_set_resetable(struct fsl_mc_io *mc_io,
+                                 uint32_t cmd_flags,
+                                 uint16_t token,
+                                 uint8_t skip_reset_flags);
+
+int dpdmux_get_resetable(struct fsl_mc_io *mc_io,
+                                 uint32_t cmd_flags,
+                                 uint16_t token,
+                                 uint8_t *skip_reset_flags);
+
 /**
  * struct dpdmux_attr - Structure representing DPDMUX attributes
  * @id: DPDMUX object ID
@@ -138,6 +167,8 @@ int dpdmux_reset(struct fsl_mc_io *mc_io,
  * @manip: DPDMUX manipulation type
  * @num_ifs: Number of interfaces (excluding the uplink interface)
  * @mem_size: DPDMUX frame storage memory size
+ * @default_if: Default interface number (different from uplink,
+       maximum value num_ifs)
  */
 struct dpdmux_attr {
        int id;
@@ -146,6 +177,7 @@ struct dpdmux_attr {
        enum dpdmux_manip manip;
        uint16_t num_ifs;
        uint16_t mem_size;
+       uint16_t default_if;
 };
 
 int dpdmux_get_attributes(struct fsl_mc_io *mc_io,
index b6b8c38..2444e9a 100644 (file)
@@ -55,6 +55,9 @@
 #define DPDMUX_CMDID_IF_SET_DEFAULT            DPDMUX_CMD(0x0b8)
 #define DPDMUX_CMDID_IF_GET_DEFAULT            DPDMUX_CMD(0x0b9)
 
+#define DPDMUX_CMDID_SET_RESETABLE             DPDMUX_CMD(0x0ba)
+#define DPDMUX_CMDID_GET_RESETABLE             DPDMUX_CMD(0x0bb)
+
 #define DPDMUX_MASK(field)        \
        GENMASK(DPDMUX_##field##_SHIFT + DPDMUX_##field##_SIZE - 1, \
                DPDMUX_##field##_SHIFT)
@@ -72,12 +75,13 @@ struct dpdmux_cmd_create {
        uint8_t method;
        uint8_t manip;
        uint16_t num_ifs;
-       uint32_t pad;
+       uint16_t default_if;
+       uint16_t pad;
 
        uint16_t adv_max_dmat_entries;
        uint16_t adv_max_mc_groups;
        uint16_t adv_max_vlan_ids;
-       uint16_t pad1;
+       uint16_t mem_size;
 
        uint64_t options;
 };
@@ -100,7 +104,7 @@ struct dpdmux_rsp_get_attr {
        uint8_t manip;
        uint16_t num_ifs;
        uint16_t mem_size;
-       uint16_t pad;
+       uint16_t default_if;
 
        uint64_t pad1;
 
@@ -217,5 +221,17 @@ struct dpdmux_cmd_remove_custom_cls_entry {
        uint64_t key_iova;
        uint64_t mask_iova;
 };
+
+#define DPDMUX_SKIP_RESET_FLAGS_SHIFT    0
+#define DPDMUX_SKIP_RESET_FLAGS_SIZE     3
+
+struct dpdmux_cmd_set_skip_reset_flags {
+       uint8_t skip_reset_flags;
+};
+
+struct dpdmux_rsp_get_skip_reset_flags {
+       uint8_t skip_reset_flags;
+};
+
 #pragma pack(pop)
 #endif /* _FSL_DPDMUX_CMD_H */