Signed-off-by: Hemant Agrawal <hemant.agra...@nxp.com>
---
 drivers/net/dpaa2/base/dpaa2_hw_dpni.c | 56 +++++++++++++++++++++++++++++
 drivers/net/dpaa2/base/dpaa2_hw_dpni.h |  6 ++++
 drivers/net/dpaa2/base/dpaa2_hw_pvt.h  | 10 ++++++
 drivers/net/dpaa2/dpaa2_ethdev.c       | 65 ++++++++++++++++++++++++++++++++++
 4 files changed, 137 insertions(+)

diff --git a/drivers/net/dpaa2/base/dpaa2_hw_dpni.c 
b/drivers/net/dpaa2/base/dpaa2_hw_dpni.c
index b26d5a7..0271cd2 100644
--- a/drivers/net/dpaa2/base/dpaa2_hw_dpni.c
+++ b/drivers/net/dpaa2/base/dpaa2_hw_dpni.c
@@ -48,6 +48,7 @@
 
 #include <base/dpaa2_hw_pvt.h>
 #include <base/dpaa2_hw_dpni.h>
+#include <base/dpaa2_hw_dpbp.h>
 
 static void
 dpaa2_distset_to_dpkg_profile_cfg(
@@ -285,3 +286,58 @@ int dpaa2_remove_flow_dist(
        }
        kg_cfg->num_extracts = i;
 }
+
+int
+dpaa2_attach_bp_list(struct dpaa2_dev_priv *priv,
+                    void *blist)
+{
+       /* Function to attach a DPNI with a buffer pool list. Buffer pool list
+        * handle is passed in blist.
+        */
+       int32_t retcode;
+       struct fsl_mc_io *dpni = priv->hw;
+       struct dpni_pools_cfg bpool_cfg;
+       struct dpaa2_bp_list *bp_list = (struct dpaa2_bp_list *)blist;
+       struct dpni_buffer_layout layout;
+       int tot_size;
+
+       /* ... rx buffer layout .
+       Check alignment for buffer layouts first*/
+
+       /* ... rx buffer layout ... */
+       tot_size = DPAA2_HW_BUF_RESERVE + RTE_PKTMBUF_HEADROOM;
+       tot_size = RTE_ALIGN_CEIL(tot_size,
+                                 DPAA2_PACKET_LAYOUT_ALIGN);
+
+       memset(&layout, 0, sizeof(struct dpni_buffer_layout));
+       layout.options = DPNI_BUF_LAYOUT_OPT_DATA_HEAD_ROOM;
+
+       layout.data_head_room =
+               tot_size - DPAA2_FD_PTA_SIZE - DPAA2_MBUF_HW_ANNOTATION;
+       retcode = dpni_set_buffer_layout(dpni, CMD_PRI_LOW, priv->token,
+                                        DPNI_QUEUE_RX, &layout);
+       if (retcode) {
+               PMD_INIT_LOG(ERR, "Err(%d) in setting rx buffer layout\n",
+                            retcode);
+               return retcode;
+       }
+
+       /*Attach buffer pool to the network interface as described by the user*/
+       bpool_cfg.num_dpbp = 1;
+       bpool_cfg.pools[0].dpbp_id = bp_list->buf_pool.dpbp_node->dpbp_id;
+       bpool_cfg.pools[0].backup_pool = 0;
+       bpool_cfg.pools[0].buffer_size =
+               RTE_ALIGN_CEIL(bp_list->buf_pool.size,
+                              256 /*DPAA2_PACKET_LAYOUT_ALIGN*/);
+
+       retcode = dpni_set_pools(dpni, CMD_PRI_LOW, priv->token, &bpool_cfg);
+       if (retcode != 0) {
+               PMD_INIT_LOG(ERR, "Error in attaching the buffer pool list"
+                               " bpid = %d Error code = %d\n",
+                               bpool_cfg.pools[0].dpbp_id, retcode);
+               return retcode;
+       }
+
+       priv->bp_list = bp_list;
+       return 0;
+}
diff --git a/drivers/net/dpaa2/base/dpaa2_hw_dpni.h 
b/drivers/net/dpaa2/base/dpaa2_hw_dpni.h
index 70d52b6..6d97bc9 100644
--- a/drivers/net/dpaa2/base/dpaa2_hw_dpni.h
+++ b/drivers/net/dpaa2/base/dpaa2_hw_dpni.h
@@ -37,6 +37,9 @@
 #include <fsl_dpni.h>
 #include <fsl_mc_sys.h>
 
+#define DPAA2_MIN_RX_BUF_SIZE 512
+#define DPAA2_MAX_RX_PKT_LEN  10240 /*WRIOP support*/
+
 #define MAX_TCS                        DPNI_MAX_TC
 #define MAX_RX_QUEUES          16
 #define MAX_TX_QUEUES          16
@@ -63,6 +66,7 @@ struct dpaa2_dev_priv {
        void *rx_vq[MAX_RX_QUEUES];
        void *tx_vq[MAX_TX_QUEUES];
 
+       struct dpaa2_bp_list *bp_list; /**<Attached buffer pool list */
        uint32_t options;
        uint16_t num_dist_per_tc[MAX_TCS];
        uint8_t max_mac_filters;
@@ -77,4 +81,6 @@ int dpaa2_setup_flow_dist(struct rte_eth_dev *eth_dev,
 int dpaa2_remove_flow_dist(struct rte_eth_dev *eth_dev,
                           uint8_t tc_index);
 
+int dpaa2_attach_bp_list(struct dpaa2_dev_priv *priv, void *blist);
+
 #endif /* _DPAA2_DPNI_H_ */
diff --git a/drivers/net/dpaa2/base/dpaa2_hw_pvt.h 
b/drivers/net/dpaa2/base/dpaa2_hw_pvt.h
index abc70ac..7e34ea8 100644
--- a/drivers/net/dpaa2/base/dpaa2_hw_pvt.h
+++ b/drivers/net/dpaa2/base/dpaa2_hw_pvt.h
@@ -50,6 +50,16 @@
 #define DPAA2_MBUF_MAX_ACQ_REL 7
 
 #define MAX_BPID 256
+#define DPAA2_MBUF_HW_ANNOTATION       64
+#define DPAA2_FD_PTA_SIZE              64
+
+#if (DPAA2_MBUF_HW_ANNOTATION + DPAA2_FD_PTA_SIZE) > RTE_PKTMBUF_HEADROOM
+#error "Annotation requirement is more than RTE_PKTMBUF_HEADROOM"
+#endif
+
+/* we will re-use the HEADROOM for annotation in RX */
+#define DPAA2_HW_BUF_RESERVE   0
+#define DPAA2_PACKET_LAYOUT_ALIGN      64 /*changing from 256 */
 
 struct dpaa2_dpio_dev {
        TAILQ_ENTRY(dpaa2_dpio_dev) next;
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 65c3384..9080e56 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -46,8 +46,12 @@
 #include <rte_dpaa2.h>
 
 #include <dpaa2_logs.h>
+/* DPAA2 Base interface files */
 #include <base/dpaa2_hw_pvt.h>
+
+#include <base/dpaa2_hw_dpbp.h>
 #include <base/dpaa2_hw_dpni.h>
+
 /* DPDK Interfaces */
 #include <dpaa2_ethdev.h>
 
@@ -65,6 +69,8 @@
        dev_info->if_index = priv->hw_id;
 
        dev_info->max_mac_addrs = priv->max_mac_filters;
+       dev_info->max_rx_pktlen = DPAA2_MAX_RX_PKT_LEN;
+       dev_info->min_rx_bufsize = DPAA2_MIN_RX_BUF_SIZE;
        dev_info->max_rx_queues = (uint16_t)priv->nb_rx_queues;
        dev_info->max_tx_queues = (uint16_t)priv->nb_tx_queues;
        dev_info->speed_capa = ETH_LINK_SPEED_1G |
@@ -188,6 +194,7 @@
        struct dpni_queue cfg;
        uint8_t options = 0;
        uint8_t flow_id;
+       uint32_t bpid;
        int ret;
 
        PMD_INIT_FUNC_TRACE();
@@ -195,6 +202,13 @@
        PMD_INIT_LOG(DEBUG, "dev =%p, queue =%d, pool = %p, conf =%p",
                     dev, rx_queue_id, mb_pool, rx_conf);
 
+       if (!priv->bp_list || priv->bp_list->mp != mb_pool) {
+               bpid = mempool_to_bpid(mb_pool);
+               ret = dpaa2_attach_bp_list(priv,
+                                          bpid_info[bpid].bp_list);
+               if (ret)
+                       return ret;
+       }
        dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[rx_queue_id];
        dpaa2_q->mb_pool = mb_pool; /**< mbuf pool to populate RX ring. */
 
@@ -389,7 +403,9 @@
        struct fsl_mc_io *dpni_dev;
        struct dpni_attr attr;
        struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
+       struct dpni_buffer_layout layout;
        int i, ret, hw_id;
+       int tot_size;
 
        PMD_INIT_FUNC_TRACE();
 
@@ -478,6 +494,55 @@
                return -ret;
        }
 
+       /* ... rx buffer layout ... */
+       tot_size = DPAA2_HW_BUF_RESERVE + RTE_PKTMBUF_HEADROOM;
+       tot_size = RTE_ALIGN_CEIL(tot_size,
+                                 DPAA2_PACKET_LAYOUT_ALIGN);
+
+       memset(&layout, 0, sizeof(struct dpni_buffer_layout));
+       layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS |
+                               DPNI_BUF_LAYOUT_OPT_PARSER_RESULT |
+                               DPNI_BUF_LAYOUT_OPT_DATA_HEAD_ROOM |
+                               DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE;
+
+       layout.pass_frame_status = 1;
+       layout.data_head_room = tot_size
+               - DPAA2_FD_PTA_SIZE - DPAA2_MBUF_HW_ANNOTATION;
+       layout.private_data_size = DPAA2_FD_PTA_SIZE;
+       layout.pass_parser_result = 1;
+       PMD_INIT_LOG(DEBUG, "Tot_size = %d, head room = %d, private = %d",
+                    tot_size, layout.data_head_room, layout.private_data_size);
+       ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token,
+                                    DPNI_QUEUE_RX, &layout);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "Err(%d) in setting rx buffer layout", ret);
+               return -1;
+       }
+
+       /* ... tx buffer layout ... */
+       memset(&layout, 0, sizeof(struct dpni_buffer_layout));
+       layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;
+       layout.pass_frame_status = 1;
+       ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token,
+                                    DPNI_QUEUE_TX, &layout);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "Error (%d) in setting tx buffer"
+                                 " layout", ret);
+               return -1;
+       }
+
+       /* ... tx-conf and error buffer layout ... */
+       memset(&layout, 0, sizeof(struct dpni_buffer_layout));
+       layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;
+       layout.pass_frame_status = 1;
+       ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token,
+                                    DPNI_QUEUE_TX_CONFIRM, &layout);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "Error (%d) in setting tx-conf buffer"
+                                 " layout", ret);
+               return -1;
+       }
+
        eth_dev->dev_ops = &dpaa2_ethdev_ops;
        return 0;
 }
-- 
1.9.1

Reply via email to