net/dpaa2: support soft parser in MC
authorSunil Kumar Kori <sunil.kori@nxp.com>
Thu, 29 Aug 2019 10:27:36 +0000 (15:57 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 8 Oct 2019 10:14:31 +0000 (12:14 +0200)
Signed-off-by: Sunil Kumar Kori <sunil.kori@nxp.com>
Reviewed-by: Sachin Saxena <sachin.saxena@nxp.com>
drivers/net/dpaa2/mc/dpni.c
drivers/net/dpaa2/mc/fsl_dpni.h
drivers/net/dpaa2/mc/fsl_dpni_cmd.h

index 362cd47..b37f997 100644 (file)
@@ -2484,3 +2484,120 @@ int dpni_get_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
 
        return err;
 }
+
+int dpni_load_sw_sequence(struct fsl_mc_io *mc_io,
+             uint32_t cmd_flags,
+             uint16_t token,
+                 struct dpni_load_ss_cfg *cfg)
+{
+       struct dpni_load_sw_sequence *cmd_params;
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_LOAD_SW_SEQUENCE,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_load_sw_sequence *)cmd.params;
+       cmd_params->dest = cfg->dest;
+       cmd_params->ss_offset = cpu_to_le16(cfg->ss_offset);
+       cmd_params->ss_size = cpu_to_le16(cfg->ss_size);
+       cmd_params->ss_iova = cpu_to_le64(cfg->ss_iova);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_enable_sw_sequence(struct fsl_mc_io *mc_io,
+             uint32_t cmd_flags,
+             uint16_t token,
+                 struct dpni_enable_ss_cfg *cfg)
+{
+       struct dpni_enable_sw_sequence *cmd_params;
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_SW_SEQUENCE,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpni_enable_sw_sequence *)cmd.params;
+       cmd_params->dest = cfg->dest;
+       cmd_params->set_start = cfg->set_start;
+       cmd_params->hxs = cpu_to_le16(cfg->hxs);
+       cmd_params->ss_offset = cpu_to_le16(cfg->ss_offset);
+       cmd_params->param_offset = cfg->param_offset;
+       cmd_params->param_size = cfg->param_size;
+       cmd_params->param_iova = cpu_to_le64(cfg->param_iova);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_get_sw_sequence_layout() - Get the soft sequence layout
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @src:       Source of the layout (WRIOP Rx or Tx)
+ * @ss_layout_iova:  I/O virtual address of 264 bytes DMA-able memory
+ *
+ * warning: After calling this function, call dpni_extract_sw_sequence_layout()
+ *             to get the layout.
+ *
+ * Return:     '0' on Success; error code otherwise.
+ */
+int dpni_get_sw_sequence_layout(struct fsl_mc_io *mc_io,
+             uint32_t cmd_flags,
+             uint16_t token,
+                 enum dpni_soft_sequence_dest src,
+                 uint64_t ss_layout_iova)
+{
+       struct dpni_get_sw_sequence_layout *cmd_params;
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SW_SEQUENCE_LAYOUT,
+                                         cmd_flags,
+                                         token);
+
+       cmd_params = (struct dpni_get_sw_sequence_layout *)cmd.params;
+       cmd_params->src = src;
+       cmd_params->layout_iova = cpu_to_le64(ss_layout_iova);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+/**
+ * dpni_extract_sw_sequence_layout() - extract the software sequence layout
+ * @layout:            software sequence layout
+ * @sw_sequence_layout_buf:    Zeroed 264 bytes of memory before mapping it
+ *                             to DMA
+ *
+ * This function has to be called after dpni_get_sw_sequence_layout
+ *
+ */
+void dpni_extract_sw_sequence_layout(struct dpni_sw_sequence_layout *layout,
+                            const uint8_t *sw_sequence_layout_buf)
+{
+       const struct dpni_sw_sequence_layout_entry *ext_params;
+       int i;
+       uint16_t ss_size, ss_offset;
+
+       ext_params = (const struct dpni_sw_sequence_layout_entry *)
+                                               sw_sequence_layout_buf;
+
+       for (i = 0; i < DPNI_SW_SEQUENCE_LAYOUT_SIZE; i++) {
+               ss_offset = le16_to_cpu(ext_params[i].ss_offset);
+               ss_size = le16_to_cpu(ext_params[i].ss_size);
+
+               if (ss_offset == 0 && ss_size == 0) {
+                       layout->num_ss = i;
+                       return;
+               }
+
+               layout->ss[i].ss_offset = ss_offset;
+               layout->ss[i].ss_size = ss_size;
+               layout->ss[i].param_offset = ext_params[i].param_offset;
+               layout->ss[i].param_size = ext_params[i].param_size;
+       }
+}
index 8b1cfba..97fde31 100644 (file)
@@ -96,6 +96,12 @@ struct fsl_mc_io;
  */
 #define DPNI_OPT_CUSTOM_CG                             0x000200
 
+
+/**
+ * Software sequence maximum layout size
+ */
+#define DPNI_SW_SEQUENCE_LAYOUT_SIZE 33
+
 int dpni_open(struct fsl_mc_io *mc_io,
              uint32_t cmd_flags,
              int dpni_id,
@@ -1424,4 +1430,131 @@ struct dpni_custom_tpid_cfg {
 int dpni_get_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
                uint16_t token, struct dpni_custom_tpid_cfg *tpid);
 
+/**
+ * enum dpni_soft_sequence_dest - Enumeration of WRIOP software sequence
+ *                             destinations
+ * @DPNI_SS_INGRESS: Ingress parser
+ * @DPNI_SS_EGRESS: Egress parser
+ */
+enum dpni_soft_sequence_dest {
+       DPNI_SS_INGRESS = 0,
+       DPNI_SS_EGRESS = 1,
+};
+
+/**
+ * struct dpni_load_ss_cfg - Structure for Software Sequence load configuration
+ * @dest:      Destination of the Software Sequence: ingress or egress parser
+ * @ss_size: Size of the Software Sequence
+ * @ss_offset: The offset where to load the Software Sequence (0x20-0x7FD)
+ * @ss_iova: I/O virtual address of the Software Sequence
+ */
+struct dpni_load_ss_cfg {
+       enum dpni_soft_sequence_dest dest;
+       uint16_t ss_size;
+       uint16_t ss_offset;
+       uint64_t ss_iova;
+};
+
+/**
+ * struct dpni_enable_ss_cfg - Structure for software sequence enable
+ *                             configuration
+ * @dest:      Destination of the Software Sequence: ingress or egress parser
+ * @hxs: HXS to attach the software sequence to
+ * @set_start: If the Software Sequence or HDR it is attached to is set as
+ *             parser start
+ *             If hxs=DUMMY_LAST_HXS the ss_offset is set directly as parser
+ *                     start else the hdr index code is set as parser start
+ * @ss_offset: The offset of the Software Sequence to enable or set as parse
+ *             start
+ * @param_size: Size of the software sequence parameters
+ * @param_offset: Offset in the parameter zone for the software sequence
+ *                     parameters
+ * @param_iova: I/O virtual address of the parameters
+ */
+struct dpni_enable_ss_cfg {
+       enum dpni_soft_sequence_dest dest;
+       uint16_t hxs;
+       uint8_t set_start;
+       uint16_t ss_offset;
+       uint8_t param_size;
+       uint8_t param_offset;
+       uint64_t param_iova;
+};
+
+/**
+ * dpni_load_sw_sequence() - Loads a software sequence in parser memory.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @cfg:       Software sequence load configuration
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_load_sw_sequence(struct fsl_mc_io *mc_io,
+             uint32_t cmd_flags,
+             uint16_t token,
+                 struct dpni_load_ss_cfg *cfg);
+
+/**
+ * dpni_eanble_sw_sequence() - Enables a software sequence in the parser
+ *                             profile
+ * corresponding to the ingress or egress of the DPNI.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @cfg:       Software sequence enable configuration
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_enable_sw_sequence(struct fsl_mc_io *mc_io,
+                           uint32_t cmd_flags,
+                           uint16_t token,
+                           struct dpni_enable_ss_cfg *cfg);
+
+/**
+ * struct dpni_sw_sequence_layout - Structure for software sequence enable
+ *                             configuration
+ * @num_ss:    Number of software sequences returned
+ * @ss: Array of software sequence entries. The number of valid entries
+ *                     must match 'num_ss' value
+ */
+struct dpni_sw_sequence_layout {
+       uint8_t num_ss;
+       struct {
+               uint16_t ss_offset;
+               uint16_t ss_size;
+               uint8_t param_offset;
+               uint8_t param_size;
+       } ss[DPNI_SW_SEQUENCE_LAYOUT_SIZE];
+};
+
+/**
+ * dpni_get_sw_sequence_layout() - Get the soft sequence layout
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @src:       Source of the layout (WRIOP Rx or Tx)
+ * @ss_layout_iova:  I/O virtual address of 264 bytes DMA-able memory
+ *
+ * warning: After calling this function, call dpni_extract_sw_sequence_layout()
+ *             to get the layout
+ *
+ * Return:     '0' on Success; error code otherwise.
+ */
+int dpni_get_sw_sequence_layout(struct fsl_mc_io *mc_io,
+                               uint32_t cmd_flags,
+                               uint16_t token,
+                               enum dpni_soft_sequence_dest src,
+                               uint64_t ss_layout_iova);
+
+/**
+ * dpni_extract_sw_sequence_layout() - extract the software sequence layout
+ * @layout:            software sequence layout
+ * @sw_sequence_layout_buf:    Zeroed 264 bytes of memory before mapping it
+ *                             to DMA
+ *
+ * This function has to be called after dpni_get_sw_sequence_layout
+ *
+ */
+void dpni_extract_sw_sequence_layout(struct dpni_sw_sequence_layout *layout,
+                                    const uint8_t *sw_sequence_layout_buf);
+
 #endif /* __FSL_DPNI_H */
index 5effbb3..dfaccd9 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
  *
  * Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016-2017 NXP
+ * Copyright 2016-2019 NXP
  *
  */
 #ifndef _FSL_DPNI_CMD_H
@@ -97,6 +97,9 @@
 #define DPNI_CMDID_SET_OFFLOAD                 DPNI_CMD(0x26C)
 #define DPNI_CMDID_SET_TX_CONFIRMATION_MODE    DPNI_CMD(0x266)
 #define DPNI_CMDID_GET_TX_CONFIRMATION_MODE    DPNI_CMD(0x26D)
+#define DPNI_CMDID_LOAD_SW_SEQUENCE            DPNI_CMD(0x270)
+#define DPNI_CMDID_ENABLE_SW_SEQUENCE          DPNI_CMD(0x271)
+#define DPNI_CMDID_GET_SW_SEQUENCE_LAYOUT      DPNI_CMD(0x272)
 #define DPNI_CMDID_SET_OPR                     DPNI_CMD(0x26e)
 #define DPNI_CMDID_GET_OPR                     DPNI_CMD(0x26f)
 #define DPNI_CMDID_SET_RX_FS_DIST              DPNI_CMD(0x273)
@@ -798,5 +801,43 @@ struct dpni_cmd_set_rx_hash_dist {
        uint64_t        key_cfg_iova;
 };
 
+struct dpni_load_sw_sequence {
+       uint8_t dest;
+       uint8_t pad0[7];
+       uint16_t ss_offset;
+       uint16_t pad1;
+       uint16_t ss_size;
+       uint16_t pad2;
+       uint64_t ss_iova;
+};
+
+struct dpni_enable_sw_sequence {
+       uint8_t dest;
+       uint8_t pad0[7];
+       uint16_t ss_offset;
+       uint16_t hxs;
+       uint8_t set_start;
+       uint8_t pad1[3];
+       uint8_t param_offset;
+       uint8_t pad2[3];
+       uint8_t param_size;
+       uint8_t pad3[3];
+       uint64_t param_iova;
+};
+
+struct dpni_get_sw_sequence_layout {
+       uint8_t src;
+       uint8_t pad0[7];
+       uint64_t layout_iova;
+};
+
+struct dpni_sw_sequence_layout_entry {
+       uint16_t ss_offset;
+       uint16_t ss_size;
+       uint8_t param_offset;
+       uint8_t param_size;
+       uint16_t pad;
+};
+
 #pragma pack(pop)
 #endif /* _FSL_DPNI_CMD_H */