From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from netronome.com (host-79-78-33-110.static.as9105.net [79.78.33.110]) by dpdk.org (Postfix) with ESMTP id 81A77FA88 for ; Tue, 20 Dec 2016 15:13:57 +0100 (CET) Received: from netronome.com (localhost [127.0.0.1]) by netronome.com (8.14.4/8.14.4/Debian-4.1ubuntu1) with ESMTP id uBKEDvcE028664 for ; Tue, 20 Dec 2016 14:13:57 GMT Received: (from alucero@localhost) by netronome.com (8.14.4/8.14.4/Submit) id uBKEDvkh028663 for dev@dpdk.org; Tue, 20 Dec 2016 14:13:57 GMT From: Alejandro Lucero To: dev@dpdk.org Date: Tue, 20 Dec 2016 14:13:57 +0000 Message-Id: <1482243237-28625-1-git-send-email-alejandro.lucero@netronome.com> X-Mailer: git-send-email 1.9.1 Subject: [dpdk-dev] [PATCH] nfp: add support for new metadata api X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 Dec 2016 14:13:57 -0000 NFP is a smart programmable NIC and firmware is deployed for specific system needs, like offloading OVS, vRouter, contrack or eBPF into the hardware. This often requires to give metadata to the host within packets delivered. Last NFP firmware implementations support richer metadata api facilitating interaction between firmware and host code. Old way of handling metadata needs to be still there for supporting old firmware. Signed-off-by: Alejandro Lucero --- drivers/net/nfp/nfp_net.c | 33 +++++++++++++++++++++++++++------ drivers/net/nfp/nfp_net_ctrl.h | 6 ++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c index cee8f63..69ae6d5 100644 --- a/drivers/net/nfp/nfp_net.c +++ b/drivers/net/nfp/nfp_net.c @@ -1726,6 +1726,7 @@ static void nfp_net_read_mac(struct nfp_net_hw *hw) #define NFP_HASH_OFFSET ((uint8_t *)mbuf->buf_addr + mbuf->data_off - 4) #define NFP_HASH_TYPE_OFFSET ((uint8_t *)mbuf->buf_addr + mbuf->data_off - 8) +#define NFP_DESC_META_LEN(d) (d->rxd.meta_len_dd & PCIE_DESC_RX_META_LEN_MASK) /* * nfp_net_set_hash - Set mbuf hash data @@ -1739,16 +1740,38 @@ static void nfp_net_read_mac(struct nfp_net_hw *hw) { uint32_t hash; uint32_t hash_type; + uint32_t meta_info; + uint8_t *meta_offset; struct nfp_net_hw *hw = rxq->hw; if (!(hw->ctrl & NFP_NET_CFG_CTRL_RSS)) return; - if (!(rxd->rxd.flags & PCIE_DESC_RX_RSS)) + if (NFD_CFG_MAJOR_VERSION_of(hw->ver) <= 3) { + if (!(rxd->rxd.flags & PCIE_DESC_RX_RSS)) + return; + + hash = rte_be_to_cpu_32(*(uint32_t *)NFP_HASH_OFFSET); + hash_type = rte_be_to_cpu_32(*(uint32_t *)NFP_HASH_TYPE_OFFSET); + + } else if (NFP_DESC_META_LEN(rxd)) { + meta_offset = (uint8_t *)mbuf->buf_addr; + meta_info = rte_be_to_cpu_32(*(uint32_t *)meta_offset); + meta_offset += 4; + /* NFP PMD just supports metadata for hashing */ + switch (meta_info & NFP_NET_META_FIELD_MASK) { + case NFP_NET_META_HASH: + meta_info >>= NFP_NET_META_FIELD_SIZE; + hash = rte_be_to_cpu_32(*(uint32_t *)meta_offset); + hash_type = meta_info && NFP_NET_META_FIELD_MASK; + break; + default: + /* Unsupported metadata can be a performance issue */ + return; + } + } else { return; - - hash = rte_be_to_cpu_32(*(uint32_t *)NFP_HASH_OFFSET); - hash_type = rte_be_to_cpu_32(*(uint32_t *)NFP_HASH_TYPE_OFFSET); + } mbuf->hash.rss = hash; mbuf->ol_flags |= PKT_RX_RSS_HASH; @@ -1774,8 +1797,6 @@ static void nfp_net_read_mac(struct nfp_net_hw *hw) rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++; } -#define NFP_DESC_META_LEN(d) (d->rxd.meta_len_dd & PCIE_DESC_RX_META_LEN_MASK) - /* * RX path design: * diff --git a/drivers/net/nfp/nfp_net_ctrl.h b/drivers/net/nfp/nfp_net_ctrl.h index 2c50043..281205d 100644 --- a/drivers/net/nfp/nfp_net_ctrl.h +++ b/drivers/net/nfp/nfp_net_ctrl.h @@ -52,6 +52,12 @@ /* Offset in Freelist buffer where packet starts on RX */ #define NFP_NET_RX_OFFSET 32 +/* Prepend field types */ +#define NFP_NET_META_FIELD_SIZE 4 +#define NFP_NET_META_HASH 1 /* next field carries hash type */ +#define NFP_NET_META_MARK 2 +#define NFP_NET_META_FIELD_MASK (0xf) + /* Hash type pre-pended when a RSS hash was computed */ #define NFP_NET_RSS_NONE 0 #define NFP_NET_RSS_IPV4 1 -- 1.9.1