net/dpaa: support VSP in fmlib
authorJun Yang <jun.yang@nxp.com>
Fri, 4 Sep 2020 08:39:24 +0000 (14:09 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 18 Sep 2020 16:55:07 +0000 (18:55 +0200)
This patch adds support for VSP (Virtual Storage Profile)
in fmlib routines.
VSP allow a network interface to be divided into physical
and virtual instance(s).
The concept is very similar to SRIOV.

Signed-off-by: Jun Yang <jun.yang@nxp.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
doc/guides/nics/dpaa.rst
drivers/net/dpaa/fmlib/fm_vsp.c [new file with mode: 0644]
drivers/net/dpaa/fmlib/fm_vsp_ext.h [new file with mode: 0644]
drivers/net/dpaa/meson.build

index 0a8cfc6..74d4a60 100644 (file)
@@ -339,6 +339,14 @@ FMLIB
    `Kernel FMD Driver
    <https://source.codeaurora.org/external/qoriq/qoriq-components/linux/tree/drivers/net/ethernet/freescale/sdk_fman?h=linux-4.19-rt>`_.
 
+VSP (Virtual Storage Profile)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+   The storage profiled are means to provide virtualized interface. A ranges of
+   storage profiles cab be associated to Ethernet ports.
+   They are selected during classification. Specify how the frame should be
+   written to memory and which buffer pool to select for packet storange in
+   queues. Start and End margin of buffer can also be configured.
+
 Limitations
 -----------
 
diff --git a/drivers/net/dpaa/fmlib/fm_vsp.c b/drivers/net/dpaa/fmlib/fm_vsp.c
new file mode 100644 (file)
index 0000000..78efd93
--- /dev/null
@@ -0,0 +1,148 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2019-2020 NXP
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+#include <stdbool.h>
+
+#include <rte_common.h>
+#include "fm_ext.h"
+#include "fm_pcd_ext.h"
+#include "fm_port_ext.h"
+#include "fm_vsp_ext.h"
+#include <dpaa_ethdev.h>
+
+uint32_t
+fm_port_vsp_alloc(t_handle h_fm_port,
+                 t_fm_port_vspalloc_params *p_params)
+{
+       t_device *p_dev = (t_device *)h_fm_port;
+       ioc_fm_port_vsp_alloc_params_t params;
+
+       _fml_dbg("Calling...\n");
+       memset(&params, 0, sizeof(ioc_fm_port_vsp_alloc_params_t));
+       memcpy(&params.params, p_params, sizeof(t_fm_port_vspalloc_params));
+
+       if (ioctl(p_dev->fd, FM_PORT_IOC_VSP_ALLOC, &params))
+               RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
+
+       _fml_dbg("Called.\n");
+
+       return E_OK;
+}
+
+t_handle
+fm_vsp_config(t_fm_vsp_params *p_fm_vsp_params)
+{
+       t_device *p_dev = NULL;
+       t_device *p_vsp_dev = NULL;
+       ioc_fm_vsp_params_t param;
+
+       p_dev = p_fm_vsp_params->h_fm;
+
+       _fml_dbg("Performing VSP Configuration...\n");
+
+       memset(&param, 0, sizeof(ioc_fm_vsp_params_t));
+       memcpy(&param, p_fm_vsp_params, sizeof(t_fm_vsp_params));
+       param.vsp_params.h_fm = UINT_TO_PTR(p_dev->id);
+       param.id = NULL;
+
+       if (ioctl(p_dev->fd, FM_IOC_VSP_CONFIG, &param)) {
+               DPAA_PMD_ERR("%s ioctl error\n", __func__);
+               return NULL;
+       }
+
+       p_vsp_dev = (t_device *)malloc(sizeof(t_device));
+       if (!p_vsp_dev) {
+               DPAA_PMD_ERR("FM VSP Params!\n");
+               return NULL;
+       }
+       memset(p_vsp_dev, 0, sizeof(t_device));
+       p_vsp_dev->h_user_priv = (t_handle)p_dev;
+       p_dev->owners++;
+       p_vsp_dev->id = PTR_TO_UINT(param.id);
+
+       _fml_dbg("VSP Configuration completed\n");
+
+       return (t_handle)p_vsp_dev;
+}
+
+uint32_t
+fm_vsp_init(t_handle h_fm_vsp)
+{
+       t_device *p_dev = NULL;
+       t_device *p_vsp_dev = (t_device *)h_fm_vsp;
+       ioc_fm_obj_t id;
+
+       _fml_dbg("Calling...\n");
+
+       p_dev = (t_device *)p_vsp_dev->h_user_priv;
+       id.obj = UINT_TO_PTR(p_vsp_dev->id);
+
+       if (ioctl(p_dev->fd, FM_IOC_VSP_INIT, &id)) {
+               DPAA_PMD_ERR("%s ioctl error\n", __func__);
+               RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
+       }
+
+       _fml_dbg("Called.\n");
+
+       return E_OK;
+}
+
+uint32_t
+fm_vsp_free(t_handle h_fm_vsp)
+{
+       t_device *p_dev = NULL;
+       t_device *p_vsp_dev = (t_device *)h_fm_vsp;
+       ioc_fm_obj_t id;
+
+       _fml_dbg("Calling...\n");
+
+       p_dev = (t_device *)p_vsp_dev->h_user_priv;
+       id.obj = UINT_TO_PTR(p_vsp_dev->id);
+
+       if (ioctl(p_dev->fd, FM_IOC_VSP_FREE, &id)) {
+               DPAA_PMD_ERR("%s ioctl error\n", __func__);
+               RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
+       }
+
+       p_dev->owners--;
+       free(p_vsp_dev);
+
+       _fml_dbg("Called.\n");
+
+       return E_OK;
+}
+
+uint32_t
+fm_vsp_config_buffer_prefix_content(t_handle h_fm_vsp,
+               t_fm_buffer_prefix_content *p_fm_buffer_prefix_content)
+{
+       t_device *p_dev = NULL;
+       t_device *p_vsp_dev = (t_device *)h_fm_vsp;
+       ioc_fm_buffer_prefix_content_params_t params;
+
+       _fml_dbg("Calling...\n");
+
+       p_dev = (t_device *)p_vsp_dev->h_user_priv;
+       params.p_fm_vsp = UINT_TO_PTR(p_vsp_dev->id);
+       memcpy(&params.fm_buffer_prefix_content,
+              p_fm_buffer_prefix_content, sizeof(*p_fm_buffer_prefix_content));
+
+       if (ioctl(p_dev->fd, FM_IOC_VSP_CONFIG_BUFFER_PREFIX_CONTENT,
+                 &params)) {
+               DPAA_PMD_ERR("%s ioctl error\n", __func__);
+               RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
+       }
+
+       _fml_dbg("Called.\n");
+
+       return E_OK;
+}
diff --git a/drivers/net/dpaa/fmlib/fm_vsp_ext.h b/drivers/net/dpaa/fmlib/fm_vsp_ext.h
new file mode 100644 (file)
index 0000000..b51c461
--- /dev/null
@@ -0,0 +1,131 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2008-2012 Freescale Semiconductor, Inc
+ * Copyright 2019-2020 NXP
+ */
+
+/*
+ * @File          fm_vsp_ext.h
+ *
+ * @Description   FM Virtual Storage-Profile
+ */
+#ifndef __FM_VSP_EXT_H
+#define __FM_VSP_EXT_H
+#include "ncsw_ext.h"
+#include "fm_ext.h"
+#include "net_ext.h"
+
+typedef struct t_fm_vsp_params {
+       t_handle        h_fm;
+                       /**< A handle to the FM object this VSP related to */
+       t_fm_ext_pools  ext_buf_pools;
+                       /**< Which external buffer pools are used (up to
+                        * FM_PORT_MAX_NUM_OF_EXT_POOLS), and their sizes.
+                        * Parameter associated with Rx / OP port
+                        */
+       uint16_t        liodn_offset;   /**< VSP's LIODN offset */
+       struct {
+               e_fm_port_type  port_type; /**< Port type */
+               uint8_t port_id;           /**< Port Id - relative to type */
+       } port_params;
+       uint8_t relative_profile_id;
+                       /**< VSP Id - relative to VSP's range defined in
+                        * relevant FM object
+                        */
+} t_fm_vsp_params;
+
+typedef struct ioc_fm_vsp_params_t {
+       struct t_fm_vsp_params vsp_params;
+       void            *id;            /**< return value */
+} ioc_fm_vsp_params_t;
+
+typedef struct t_fm_port_vspalloc_params {
+       uint8_t     num_of_profiles;
+               /**< Number of Virtual Storage Profiles; must be a power of 2 */
+       uint8_t     dflt_relative_id;
+       /**< The default Virtual-Storage-Profile-id dedicated to Rx/OP port. The
+        * same default Virtual-Storage-Profile-id will be for coupled Tx port
+        * if relevant function called for Rx port
+        */
+} t_fm_port_vspalloc_params;
+
+typedef struct ioc_fm_port_vsp_alloc_params_t {
+       struct t_fm_port_vspalloc_params params;
+       void    *p_fm_tx_port;
+       /**< Handle to coupled Tx Port; not relevant for OP port. */
+} ioc_fm_port_vsp_alloc_params_t;
+
+typedef struct ioc_fm_buffer_prefix_content_t {
+       uint16_t priv_data_size;
+               /**< Number of bytes to be left at the beginning of the external
+                * buffer; Note that the private-area will start from the base
+                * of the buffer address.
+                */
+       bool pass_prs_result;
+                       /**< TRUE to pass the parse result to/from the FM; User
+                        * may use fm_port_get_buffer_prs_result() in order to
+                        * get the parser-result from a buffer.
+                        */
+       bool pass_time_stamp;
+                       /**< TRUE to pass the timeStamp to/from the FM User may
+                        * use fm_port_get_buffer_time_stamp() in order to get
+                        * the parser-result from a buffer.
+                        */
+       bool pass_hash_result;
+                       /**< TRUE to pass the KG hash result to/from the FM User
+                        * may use fm_port_get_buffer_hash_result() in order to
+                        * get the parser-result from a buffer.
+                        */
+       bool pass_all_other_pcd_info;
+                       /**< Add all other Internal-Context information: AD,
+                        * hash-result, key, etc.
+                        */
+       uint16_t data_align;
+                       /**< 0 to use driver's default alignment [64],
+                        * other value for selecting a data alignment (must be a
+                        * power of 2); if write optimization is used, must be
+                        * >= 16.
+                        */
+       uint8_t manip_extra_space;
+                       /**< Maximum extra size needed
+                        * (insertion-size minus removal-size);
+                        * Note that this field impacts the size of the
+                        * buffer-prefix (i.e. it pushes the data offset);
+                        * This field is irrelevant if DPAA_VERSION==10
+                        */
+} ioc_fm_buffer_prefix_content_t;
+
+typedef struct ioc_fm_buffer_prefix_content_params_t {
+       void    *p_fm_vsp;
+       ioc_fm_buffer_prefix_content_t fm_buffer_prefix_content;
+} ioc_fm_buffer_prefix_content_params_t;
+
+uint32_t fm_port_vsp_alloc(t_handle h_fm_port,
+                         t_fm_port_vspalloc_params *p_params);
+
+t_handle fm_vsp_config(t_fm_vsp_params *p_fm_vsp_params);
+
+uint32_t fm_vsp_init(t_handle h_fm_vsp);
+
+uint32_t fm_vsp_free(t_handle h_fm_vsp);
+
+uint32_t fm_vsp_config_buffer_prefix_content(t_handle h_fm_vsp,
+               t_fm_buffer_prefix_content *p_fm_buffer_prefix_content);
+
+#define FM_PORT_IOC_VSP_ALLOC \
+       _IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(38), \
+       ioc_fm_port_vsp_alloc_params_t)
+
+#define FM_IOC_VSP_CONFIG \
+       _IOWR(FM_IOC_TYPE_BASE, FM_IOC_NUM(8), ioc_fm_vsp_params_t)
+
+#define FM_IOC_VSP_INIT        \
+       _IOW(FM_IOC_TYPE_BASE, FM_IOC_NUM(9), ioc_fm_obj_t)
+
+#define FM_IOC_VSP_FREE        \
+       _IOW(FM_IOC_TYPE_BASE, FM_IOC_NUM(10), ioc_fm_obj_t)
+
+#define FM_IOC_VSP_CONFIG_BUFFER_PREFIX_CONTENT \
+       _IOW(FM_IOC_TYPE_BASE, FM_IOC_NUM(12), \
+       ioc_fm_buffer_prefix_content_params_t)
+
+#endif /* __FM_VSP_EXT_H */
index b2cd555..aca1dcc 100644 (file)
@@ -9,6 +9,7 @@ deps += ['mempool_dpaa']
 
 sources = files('dpaa_ethdev.c',
                'fmlib/fm_lib.c',
+               'fmlib/fm_vsp.c',
                'dpaa_rxtx.c')
 
 if cc.has_argument('-Wno-pointer-arith')