net/dpaa2: attach the buffer pool to dpni
This patch configures a MC-DPNI based DPAA2 PMD network port with a DPBP based buffer pool. Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
This commit is contained in:
parent
33fad4326c
commit
bee61d863e
@ -50,6 +50,7 @@ CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc
|
|||||||
CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/qbman/include
|
CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/qbman/include
|
||||||
CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/mc
|
CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/mc
|
||||||
CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/portal
|
CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/portal
|
||||||
|
CFLAGS += -I$(RTE_SDK)/drivers/mempool/dpaa2
|
||||||
CFLAGS += -I$(RTE_SDK)/lib/librte_eal/linuxapp/eal
|
CFLAGS += -I$(RTE_SDK)/lib/librte_eal/linuxapp/eal
|
||||||
|
|
||||||
# versioning export map
|
# versioning export map
|
||||||
@ -63,5 +64,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += dpaa2_ethdev.c
|
|||||||
SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += mc/dpni.c
|
SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += mc/dpni.c
|
||||||
|
|
||||||
LDLIBS += -lrte_bus_fslmc
|
LDLIBS += -lrte_bus_fslmc
|
||||||
|
LDLIBS += -lrte_mempool_dpaa2
|
||||||
|
|
||||||
include $(RTE_SDK)/mk/rte.lib.mk
|
include $(RTE_SDK)/mk/rte.lib.mk
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
|
|
||||||
#include <fslmc_logs.h>
|
#include <fslmc_logs.h>
|
||||||
#include <dpaa2_hw_pvt.h>
|
#include <dpaa2_hw_pvt.h>
|
||||||
|
#include <dpaa2_hw_mempool.h>
|
||||||
|
|
||||||
#include "../dpaa2_ethdev.h"
|
#include "../dpaa2_ethdev.h"
|
||||||
|
|
||||||
@ -285,3 +286,59 @@ dpaa2_distset_to_dpkg_profile_cfg(
|
|||||||
}
|
}
|
||||||
kg_cfg->num_extracts = i;
|
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;
|
||||||
|
}
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
#include <fslmc_logs.h>
|
#include <fslmc_logs.h>
|
||||||
#include <fslmc_vfio.h>
|
#include <fslmc_vfio.h>
|
||||||
#include <dpaa2_hw_pvt.h>
|
#include <dpaa2_hw_pvt.h>
|
||||||
|
#include <dpaa2_hw_mempool.h>
|
||||||
|
|
||||||
#include "dpaa2_ethdev.h"
|
#include "dpaa2_ethdev.h"
|
||||||
|
|
||||||
@ -63,6 +64,8 @@ dpaa2_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
|
|||||||
dev_info->if_index = priv->hw_id;
|
dev_info->if_index = priv->hw_id;
|
||||||
|
|
||||||
dev_info->max_mac_addrs = priv->max_mac_filters;
|
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_rx_queues = (uint16_t)priv->nb_rx_queues;
|
||||||
dev_info->max_tx_queues = (uint16_t)priv->nb_tx_queues;
|
dev_info->max_tx_queues = (uint16_t)priv->nb_tx_queues;
|
||||||
|
|
||||||
@ -187,6 +190,7 @@ dpaa2_dev_rx_queue_setup(struct rte_eth_dev *dev,
|
|||||||
struct dpni_queue cfg;
|
struct dpni_queue cfg;
|
||||||
uint8_t options = 0;
|
uint8_t options = 0;
|
||||||
uint8_t flow_id;
|
uint8_t flow_id;
|
||||||
|
uint32_t bpid;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
PMD_INIT_FUNC_TRACE();
|
PMD_INIT_FUNC_TRACE();
|
||||||
@ -194,6 +198,13 @@ dpaa2_dev_rx_queue_setup(struct rte_eth_dev *dev,
|
|||||||
PMD_INIT_LOG(DEBUG, "dev =%p, queue =%d, pool = %p, conf =%p",
|
PMD_INIT_LOG(DEBUG, "dev =%p, queue =%d, pool = %p, conf =%p",
|
||||||
dev, rx_queue_id, mb_pool, rx_conf);
|
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,
|
||||||
|
rte_dpaa2_bpid_info[bpid].bp_list);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[rx_queue_id];
|
dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[rx_queue_id];
|
||||||
dpaa2_q->mb_pool = mb_pool; /**< mbuf pool to populate RX ring. */
|
dpaa2_q->mb_pool = mb_pool; /**< mbuf pool to populate RX ring. */
|
||||||
|
|
||||||
@ -388,7 +399,9 @@ dpaa2_dev_init(struct rte_eth_dev *eth_dev)
|
|||||||
struct fsl_mc_io *dpni_dev;
|
struct fsl_mc_io *dpni_dev;
|
||||||
struct dpni_attr attr;
|
struct dpni_attr attr;
|
||||||
struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
|
struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
|
||||||
|
struct dpni_buffer_layout layout;
|
||||||
int i, ret, hw_id;
|
int i, ret, hw_id;
|
||||||
|
int tot_size;
|
||||||
|
|
||||||
PMD_INIT_FUNC_TRACE();
|
PMD_INIT_FUNC_TRACE();
|
||||||
|
|
||||||
@ -475,6 +488,55 @@ dpaa2_dev_init(struct rte_eth_dev *eth_dev)
|
|||||||
return -ret;
|
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;
|
eth_dev->dev_ops = &dpaa2_ethdev_ops;
|
||||||
eth_dev->data->drv_name = rte_dpaa2_pmd.driver.name;
|
eth_dev->data->drv_name = rte_dpaa2_pmd.driver.name;
|
||||||
|
|
||||||
|
@ -37,6 +37,9 @@
|
|||||||
#include <mc/fsl_dpni.h>
|
#include <mc/fsl_dpni.h>
|
||||||
#include <mc/fsl_mc_sys.h>
|
#include <mc/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_TCS DPNI_MAX_TC
|
||||||
#define MAX_RX_QUEUES 16
|
#define MAX_RX_QUEUES 16
|
||||||
#define MAX_TX_QUEUES 16
|
#define MAX_TX_QUEUES 16
|
||||||
@ -57,6 +60,7 @@ struct dpaa2_dev_priv {
|
|||||||
void *rx_vq[MAX_RX_QUEUES];
|
void *rx_vq[MAX_RX_QUEUES];
|
||||||
void *tx_vq[MAX_TX_QUEUES];
|
void *tx_vq[MAX_TX_QUEUES];
|
||||||
|
|
||||||
|
struct dpaa2_bp_list *bp_list; /**<Attached buffer pool list */
|
||||||
uint32_t options;
|
uint32_t options;
|
||||||
uint16_t num_dist_per_tc[MAX_TCS];
|
uint16_t num_dist_per_tc[MAX_TCS];
|
||||||
uint8_t max_mac_filters;
|
uint8_t max_mac_filters;
|
||||||
@ -71,4 +75,6 @@ int dpaa2_setup_flow_dist(struct rte_eth_dev *eth_dev,
|
|||||||
int dpaa2_remove_flow_dist(struct rte_eth_dev *eth_dev,
|
int dpaa2_remove_flow_dist(struct rte_eth_dev *eth_dev,
|
||||||
uint8_t tc_index);
|
uint8_t tc_index);
|
||||||
|
|
||||||
|
int dpaa2_attach_bp_list(struct dpaa2_dev_priv *priv, void *blist);
|
||||||
|
|
||||||
#endif /* _DPAA2_ETHDEV_H */
|
#endif /* _DPAA2_ETHDEV_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user