-----Original Message----- > Date: Thu, 14 Jun 2018 15:06:19 +0530 > From: rkudurumalla <rakesh.kuduruma...@cavium.com> > To: dev@dpdk.org > Cc: ferruh.yi...@intel.com, jerin.ja...@caviumnetworks.com, Rakesh > Kudurumalla <rkuduruma...@caviumnetworks.com> > Subject: [PATCH V2] net/thunderx: add support for hardware first skip
Add [dpdk-dev] in subject. [dpdk-dev] [PATCH v2] net/thunderx: add support for hardware first skip > feature > X-Mailer: git-send-email 2.7.4 > > This feature is used to create a hole between HEADROOM > and actual data.Size of hole is specified in bytes as > module param to pmd > > Signed-off-by: Rakesh Kudurumalla <rkuduruma...@caviumnetworks.com> > --- > V1: https://dpdk.org/ml/archives/dev/2018-May/103058.html > V2: Includes changes in thunder.rst to render outupt correctly in html > > doc/guides/nics/thunderx.rst | 18 +++++++++ > drivers/net/thunderx/base/nicvf_hw.c | 12 ++++++ > drivers/net/thunderx/base/nicvf_hw.h | 1 + > drivers/net/thunderx/nicvf_ethdev.c | 76 > +++++++++++++++++++++++++++++++++++- > drivers/net/thunderx/nicvf_ethdev.h | 1 + > drivers/net/thunderx/nicvf_struct.h | 1 + > 6 files changed, 108 insertions(+), 1 deletion(-) > > diff --git a/doc/guides/nics/thunderx.rst b/doc/guides/nics/thunderx.rst > index 2642374..7825b43 100644 > --- a/doc/guides/nics/thunderx.rst > +++ b/doc/guides/nics/thunderx.rst > @@ -30,6 +30,7 @@ Features of the ThunderX PMD are: > - SR-IOV VF > - NUMA support > - Multi queue set support (up to 96 queues (12 queue sets)) per port > +- First skip support > > Supported ThunderX SoCs > ----------------------- > @@ -312,6 +313,18 @@ We will choose four secondary queue sets from the ending > of the list (0002:01:01 > > The nicvf thunderx driver will make use of attached secondary VFs > automatically during the interface configuration stage. > > + > +Module params > +-------------- > + Create a sub section called skip_data_bytes. Since we are referecing this fearture as skip_data_bytes, please remove first skip instance. I have reformatted the documention. Here is the diff. Please consider using it. ➜ [master]laptop [dpdk.org] $ git diff diff --git a/doc/guides/nics/thunderx.rst b/doc/guides/nics/thunderx.rst index 5b00dd5e8..e84eaafe5 100644 --- a/doc/guides/nics/thunderx.rst +++ b/doc/guides/nics/thunderx.rst @@ -30,7 +30,7 @@ Features of the ThunderX PMD are: - SR-IOV VF - NUMA support - Multi queue set support (up to 96 queues (12 queue sets)) per port -- First skip support +- Skip data bytes Supported ThunderX SoCs ----------------------- @@ -317,13 +317,16 @@ The nicvf thunderx driver will make use of attached secondary VFs automatically Module params -------------- - This feature is used to create a hole between HEADROOM and actual data.Size of hole is specified - in bytes as module param("skip_data_bytes") to pmd. - This scheme is useful when application would like to insert vlan header without disturbing HEADROOM +skip_data_bytes +~~~~~~~~~~~~~~~ +This feature is used to create a hole between HEADROOM and actual data. Size of hole is specified +in bytes as module param("skip_data_bytes") to pmd. +This scheme is useful when application would like to insert vlan header without disturbing HEADROOM. +Example: + .. code-block:: console - use ``-w pci_id,skip_data_bytes="number of bytes to skip"`` - + -w 0002:01:00.2,skip_data_bytes=8 Limitations ----------- @@ -349,7 +352,7 @@ The ThunderX SoC family NICs support up to 12 segments per packet when working in scatter/gather mode. So, setting MTU will result with ``EINVAL`` when the frame size does not fit in the maximum number of segments. -First_skip -~~~~~~~~~~ +skip_data_bytes +~~~~~~~~~~~~~~~ -Maximum limit on first_skip is 128 bytes and number of bytes should be multiple of 8. +Maximum limit of skip_data_bytes is 128 bytes and number of bytes should be multiple of 8. > + This feature is used to create a hole between HEADROOM and actual > data.Size of hole is specified > + in bytes as module param("skip_data_bytes") to pmd. > + This scheme is useful when application would like to insert vlan header > without disturbing HEADROOM > + > + > + use ``-w pci_id,skip_data_bytes="number of bytes to skip"`` > + > + > Limitations > ----------- > > @@ -335,3 +348,8 @@ Maximum packet segments > The ThunderX SoC family NICs support up to 12 segments per packet when > working > in scatter/gather mode. So, setting MTU will result with ``EINVAL`` when the > frame size does not fit in the maximum number of segments. > + > +First_skip > +~~~~~~~~~~ > + > +Maximum limit on first_skip is 128 bytes and number of bytes should be > multiple of 8. > diff --git a/drivers/net/thunderx/base/nicvf_hw.c > b/drivers/net/thunderx/base/nicvf_hw.c > index ea8092c..b07a293 100644 > --- a/drivers/net/thunderx/base/nicvf_hw.c > +++ b/drivers/net/thunderx/base/nicvf_hw.c > @@ -703,6 +703,18 @@ nicvf_vlan_hw_strip(struct nicvf *nic, bool enable) > } > > void > +nicvf_first_skip_config(struct nicvf *nic, uint8_t num_dwords) > +{ > + uint64_t val; > + > + val = nicvf_reg_read(nic, NIC_VNIC_RQ_GEN_CFG); > + val &= ~(0xfULL); > + val |= (num_dwords & 0xf); > + > + nicvf_reg_write(nic, NIC_VNIC_RQ_GEN_CFG, val); > +} > + > +void > nicvf_apad_config(struct nicvf *nic, bool enable) > { > uint64_t val; > diff --git a/drivers/net/thunderx/base/nicvf_hw.h > b/drivers/net/thunderx/base/nicvf_hw.h > index 284d0bd..fd13ea8 100644 > --- a/drivers/net/thunderx/base/nicvf_hw.h > +++ b/drivers/net/thunderx/base/nicvf_hw.h > @@ -193,6 +193,7 @@ uint32_t nicvf_qsize_sq_roundup(uint32_t val); > void nicvf_vlan_hw_strip(struct nicvf *nic, bool enable); > > void nicvf_apad_config(struct nicvf *nic, bool enable); > +void nicvf_first_skip_config(struct nicvf *nic, uint8_t dwords); > > int nicvf_rss_config(struct nicvf *nic, uint32_t qcnt, uint64_t cfg); > int nicvf_rss_term(struct nicvf *nic); > diff --git a/drivers/net/thunderx/nicvf_ethdev.c > b/drivers/net/thunderx/nicvf_ethdev.c > index 99fcd51..466cb86 100644 > --- a/drivers/net/thunderx/nicvf_ethdev.c > +++ b/drivers/net/thunderx/nicvf_ethdev.c > @@ -34,6 +34,8 @@ > #include <rte_pci.h> > #include <rte_bus_pci.h> > #include <rte_tailq.h> > +#include <rte_devargs.h> > +#include <rte_kvargs.h> > > #include "base/nicvf_plat.h" > > @@ -1230,6 +1232,7 @@ nicvf_rxq_mbuf_setup(struct nicvf_rxq *rxq) > { > uintptr_t p; > struct rte_mbuf mb_def; > + struct nicvf *nic = rxq->nic; > > RTE_BUILD_BUG_ON(sizeof(union mbuf_initializer) != 8); > RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_off) % 8 != 0); > @@ -1240,7 +1243,7 @@ nicvf_rxq_mbuf_setup(struct nicvf_rxq *rxq) > RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, port) - > offsetof(struct rte_mbuf, data_off) != 6); > mb_def.nb_segs = 1; > - mb_def.data_off = RTE_PKTMBUF_HEADROOM; > + mb_def.data_off = RTE_PKTMBUF_HEADROOM + (nic->skip_bytes); > mb_def.port = rxq->port_id; > rte_mbuf_refcnt_set(&mb_def, 1); > > @@ -1260,9 +1263,19 @@ nicvf_dev_rx_queue_setup(struct rte_eth_dev *dev, > uint16_t qidx, > struct nicvf_rxq *rxq; > struct nicvf *nic = nicvf_pmd_priv(dev); > uint64_t offloads; > + uint32_t buffsz; > + struct rte_pktmbuf_pool_private *mbp_priv; > > PMD_INIT_FUNC_TRACE(); > > + /* First skip check */ > + mbp_priv = rte_mempool_get_priv(mp); > + buffsz = mbp_priv->mbuf_data_room_size - RTE_PKTMBUF_HEADROOM; > + if (buffsz < (uint32_t)(nic->skip_bytes)) { > + PMD_INIT_LOG(ERR, "First skip is more than configured buffer > size"); > + return -EINVAL; > + } > + > if (qidx >= MAX_RCV_QUEUES_PER_QS) > nic = nic->snicvf[qidx / MAX_RCV_QUEUES_PER_QS - 1]; > > @@ -1298,6 +1311,7 @@ nicvf_dev_rx_queue_setup(struct rte_eth_dev *dev, > uint16_t qidx, > return -EINVAL; > } > > + > /* Check rx_free_thresh upper bound */ > rx_free_thresh = (uint16_t)((rx_conf->rx_free_thresh) ? > rx_conf->rx_free_thresh : > @@ -1498,6 +1512,7 @@ nicvf_vf_start(struct rte_eth_dev *dev, struct nicvf > *nic, uint32_t rbdrsz) > return -EINVAL; > } > rxq->mbuf_phys_off -= data_off; > + rxq->mbuf_phys_off -= nic->skip_bytes; > > if (mbuf_phys_off == 0) > mbuf_phys_off = rxq->mbuf_phys_off; > @@ -1978,6 +1993,59 @@ static const struct eth_dev_ops nicvf_eth_dev_ops = { > .get_reg = nicvf_dev_get_regs, > }; > > +static inline int > +nicvf_set_first_skip(struct rte_eth_dev *dev) > +{ > + int bytes_to_skip = 0; > + int ret = 0; > + unsigned int i; > + struct rte_kvargs *kvlist; > + static const char *const skip[] = { > + SKIP_DATA_BYTES, > + NULL}; > + struct nicvf *nic = nicvf_pmd_priv(dev); > + > + if (!dev->device->devargs) { > + nicvf_first_skip_config(nic, 0); > + return ret; > + } > + > + kvlist = rte_kvargs_parse(dev->device->devargs->args, skip); > + if (!kvlist) > + return -EINVAL; > + > + if (kvlist->count == 0) > + goto exit; > + > + for (i = 0; i != kvlist->count; ++i) { > + const struct rte_kvargs_pair *pair = &kvlist->pairs[i]; > + > + if (!strcmp(pair->key, SKIP_DATA_BYTES)) > + bytes_to_skip = atoi(pair->value); > + } > + > + /*128 bytes amounts to one cache line*/ Please align the comment. Rest looks good to me.