From patchwork Fri Dec 13 22:42:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 63866 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id BEC67A04F1; Fri, 13 Dec 2019 23:42:49 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 91B2D1BFC2; Fri, 13 Dec 2019 23:42:49 +0100 (CET) Received: from rnd-relay.smtp.broadcom.com (rnd-relay.smtp.broadcom.com [192.19.229.170]) by dpdk.org (Postfix) with ESMTP id A34CD1BFB6 for ; Fri, 13 Dec 2019 23:42:48 +0100 (CET) Received: from mail-irv-17.broadcom.com (mail-irv-17.lvn.broadcom.net [10.75.242.48]) by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id C6AB530C0BD; Fri, 13 Dec 2019 14:38:05 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com C6AB530C0BD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1576276685; bh=o1m52Qvg8DyIBW+lQABbg0H3dy9YMy5+VWNmI8iaRus=; h=From:To:Cc:Subject:Date:From; b=JKDdiTRyhPLcjZWMupoIMYQ18ZytH0fjiohsATx4WmbnjRveg2FXdJGmzmn8iWxAp RHUa4WYyq+2gpKS+dSwBqyiuEA0e3t1g4jTI/fnpFMUA8y3uXcwrjEZ+tOMQMl2mjb l05XF7QdX2Ot/erHwwAA7JfVxpanNlAimi4Objes= Received: from C02VPB22HTD6.wifi.broadcom.net (c02vpb22htd6.wifi.broadcom.net [10.69.74.102]) by mail-irv-17.broadcom.com (Postfix) with ESMTP id 9BC7E140069; Fri, 13 Dec 2019 14:42:43 -0800 (PST) From: Ajit Khaparde To: dev@dpdk.org Cc: ferruh.yigit@intel.com Date: Fri, 13 Dec 2019 14:42:42 -0800 Message-Id: <20191213224242.42621-1-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.21.0 (Apple Git-122.2) MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH] net/bnxt: add support for flow mark action 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add support for RTE_FLOW_ACTION_TYPE_MARK Signed-off-by: Ajit Khaparde --- drivers/net/bnxt/bnxt.h | 1 + drivers/net/bnxt/bnxt_ethdev.c | 8 ++++++ drivers/net/bnxt/bnxt_filter.h | 3 ++ drivers/net/bnxt/bnxt_flow.c | 35 ++++++++++++++++++------ drivers/net/bnxt/bnxt_hwrm.c | 2 ++ drivers/net/bnxt/bnxt_rxr.c | 41 +++++++++++++++++++++++++++- drivers/net/bnxt/bnxt_rxr.h | 11 ++++++++ drivers/net/bnxt/bnxt_rxtx_vec_sse.c | 8 +++++- 8 files changed, 98 insertions(+), 11 deletions(-) diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h index ab18e8acd..bd8f66039 100644 --- a/drivers/net/bnxt/bnxt.h +++ b/drivers/net/bnxt/bnxt.h @@ -653,6 +653,7 @@ struct bnxt { /* Struct to hold adapter error recovery related info */ struct bnxt_error_recovery_info *recovery_info; + uint32_t *mark_table; }; int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu); diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 1b4ed293d..64f88e968 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -458,6 +458,9 @@ static int bnxt_init_chip(struct bnxt *bp) } bnxt_print_link_info(bp->eth_dev); + bp->mark_table = rte_zmalloc("bnxt_mark_table", + sizeof(uint16_t) * 64 * 1024, + 0); return 0; err_free: @@ -956,6 +959,7 @@ static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev) bnxt_int_handler(eth_dev); bnxt_shutdown_nic(bp); bnxt_hwrm_if_change(bp, 0); + memset(bp->mark_table, 0, sizeof(uint16_t) * 64 * 1024); bp->dev_stopped = 1; bp->rx_cosq_cnt = 0; } @@ -975,6 +979,10 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev) rte_free(bp->grp_info); bp->grp_info = NULL; } + if (bp->mark_table != NULL) { + rte_free(bp->mark_table); + bp->mark_table = NULL; + } bnxt_dev_uninit(eth_dev); } diff --git a/drivers/net/bnxt/bnxt_filter.h b/drivers/net/bnxt/bnxt_filter.h index 9db3e7487..8cafa8fe6 100644 --- a/drivers/net/bnxt/bnxt_filter.h +++ b/drivers/net/bnxt/bnxt_filter.h @@ -23,9 +23,11 @@ struct bnxt; #define BNXT_FLOW_L2_INNER_DST_VALID_FLAG BIT(4) #define BNXT_FLOW_L2_DROP_FLAG BIT(5) #define BNXT_FLOW_PARSE_INNER_FLAG BIT(6) +#define BNXT_FLOW_MARK_FLAG BIT(7) struct bnxt_filter_info { STAILQ_ENTRY(bnxt_filter_info) next; + uint32_t flow_id; uint64_t fw_l2_filter_id; struct bnxt_filter_info *matching_l2_fltr_ptr; uint64_t fw_em_filter_id; @@ -77,6 +79,7 @@ struct bnxt_filter_info { uint16_t ip_addr_type; uint16_t ethertype; uint32_t priority; + uint32_t mark; }; struct bnxt_filter_info *bnxt_alloc_filter(struct bnxt *bp); diff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c index 7bd6811f1..4381cd73a 100644 --- a/drivers/net/bnxt/bnxt_flow.c +++ b/drivers/net/bnxt/bnxt_flow.c @@ -1033,6 +1033,8 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, filter->flags = HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_PATH_RX; use_ntuple = bnxt_filter_type_check(pattern, error); + +start: switch (act->type) { case RTE_FLOW_ACTION_TYPE_QUEUE: /* Allow this flow. Redirect to a VNIC. */ @@ -1410,6 +1412,12 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, PMD_DRV_LOG(DEBUG, "L2 filter created\n"); bnxt_update_filter_flags_en(filter, filter1, use_ntuple); break; + case RTE_FLOW_ACTION_TYPE_MARK: + filter->valid_flags |= BNXT_FLOW_MARK_FLAG; + filter->mark = ((const struct rte_flow_action_mark *) + act->conf)->id; + PMD_DRV_LOG(DEBUG, "Mark the flow %d\n", filter->mark); + break; default: rte_flow_error_set(error, EINVAL, @@ -1427,15 +1435,8 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, done: act = bnxt_flow_non_void_action(++act); - if (act->type != RTE_FLOW_ACTION_TYPE_END) { - rte_flow_error_set(error, - EINVAL, - RTE_FLOW_ERROR_TYPE_ACTION, - act, - "Invalid action."); - rc = -rte_errno; - goto ret; - } + while (act->type != RTE_FLOW_ACTION_TYPE_END) + goto start; return rc; ret: @@ -1749,6 +1750,17 @@ bnxt_flow_create(struct rte_eth_dev *dev, STAILQ_INSERT_TAIL(&vnic->filter, filter, next); PMD_DRV_LOG(DEBUG, "Successfully created flow.\n"); STAILQ_INSERT_TAIL(&vnic->flow_list, flow, next); + if (filter->valid_flags & BNXT_FLOW_MARK_FLAG) { + uint16_t fid = 0; + + if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER) + fid = filter->fw_ntuple_filter_id >> 48; + else if (filter->filter_type == HWRM_CFA_L2_FILTER) + fid = filter->fw_l2_filter_id >> 48; + + PMD_DRV_LOG(DEBUG, "Mark action enabled for flow\n"); + bp->mark_table[fid] = filter->mark; + } bnxt_release_flow_lock(bp); return flow; } @@ -1862,6 +1874,11 @@ bnxt_flow_destroy(struct rte_eth_dev *dev, if (ret == 0) PMD_DRV_LOG(ERR, "Could not find matching flow\n"); + if (filter->valid_flags & BNXT_FLOW_MARK_FLAG) { + bp->mark_table[filter->flow_id] = 0; + filter->flow_id = 0; + } + if (filter->filter_type == HWRM_CFA_EM_FILTER) ret = bnxt_hwrm_clear_em_filter(bp, filter); if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER) diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index d0dcd561c..64dc78ae6 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -473,6 +473,7 @@ int bnxt_hwrm_set_l2_filter(struct bnxt *bp, HWRM_CHECK_RESULT(); filter->fw_l2_filter_id = rte_le_to_cpu_64(resp->l2_filter_id); + filter->flow_id = rte_le_to_cpu_32(resp->flow_id); HWRM_UNLOCK(); return rc; @@ -4283,6 +4284,7 @@ int bnxt_hwrm_set_ntuple_filter(struct bnxt *bp, HWRM_CHECK_RESULT(); filter->fw_ntuple_filter_id = rte_le_to_cpu_64(resp->ntuple_filter_id); + filter->flow_id = rte_le_to_cpu_32(resp->flow_id); HWRM_UNLOCK(); return rc; diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c index 3b713c242..1ae0c3c38 100644 --- a/drivers/net/bnxt/bnxt_rxr.c +++ b/drivers/net/bnxt/bnxt_rxr.c @@ -489,7 +489,8 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt, mbuf->hash.rss = rxcmp->rss_hash; mbuf->ol_flags |= PKT_RX_RSS_HASH; } else { - mbuf->hash.fdir.id = rxcmp1->cfa_code; + mbuf->hash.fdir.id = bnxt_get_cfa_code_or_mark_id(rxq->bp, + rxcmp1); mbuf->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID; } #ifdef RTE_LIBRTE_IEEE1588 @@ -895,3 +896,41 @@ int bnxt_init_one_rx_ring(struct bnxt_rx_queue *rxq) return 0; } + +uint32_t bnxt_get_cfa_code_or_mark_id(struct bnxt *bp, + struct rx_pkt_cmpl_hi *rxcmp1) +{ + uint32_t cfa_code = 0; + uint8_t meta_fmt = 0; + uint16_t flags2 = 0; + uint32_t meta = 0; + + cfa_code = rte_le_to_cpu_16(rxcmp1->cfa_code); + if (!cfa_code) + return 0; + + if (cfa_code && !bp->mark_table[cfa_code]) + return cfa_code; + + flags2 = rte_le_to_cpu_16(rxcmp1->flags2); + meta = rte_le_to_cpu_32(rxcmp1->metadata); + if (meta) { + meta >>= BNXT_RX_META_CFA_CODE_SHIFT; + + /* + * The flags field holds extra bits of info from [6:4] + * which indicate if the flow is in TCAM or EM or EEM + */ + meta_fmt = (flags2 & BNXT_CFA_META_FMT_MASK) >> + BNXT_CFA_META_FMT_SHFT; + + /* + * meta_fmt == 4 => 'b100 => 'b10x => EM. + * meta_fmt == 5 => 'b101 => 'b10x => EM + VLAN + * meta_fmt == 6 => 'b110 => 'b11x => EEM + * meta_fmt == 7 => 'b111 => 'b11x => EEM + VLAN. + */ + meta_fmt >>= BNXT_CFA_META_FMT_EM_EEM_SHFT; + } + return bp->mark_table[cfa_code]; +} diff --git a/drivers/net/bnxt/bnxt_rxr.h b/drivers/net/bnxt/bnxt_rxr.h index 76bf88d70..bf860020c 100644 --- a/drivers/net/bnxt/bnxt_rxr.h +++ b/drivers/net/bnxt/bnxt_rxr.h @@ -226,4 +226,15 @@ uint16_t bnxt_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, int bnxt_rxq_vec_setup(struct bnxt_rx_queue *rxq); #endif +uint32_t bnxt_get_cfa_code_or_mark_id(struct bnxt *bp, + struct rx_pkt_cmpl_hi *rxcmp1); +#define BNXT_RX_META_CFA_CODE_SHIFT 19 +#define BNXT_CFA_CODE_META_SHIFT 16 +#define BNXT_RX_META_CFA_CODE_INT_ACT_REC_BIT 0x8000000 +#define BNXT_RX_META_CFA_CODE_EEM_BIT 0x4000000 +#define BNXT_CFA_META_FMT_MASK 0x70 +#define BNXT_CFA_META_FMT_SHFT 4 +#define BNXT_CFA_META_FMT_EM_EEM_SHFT 1 +#define BNXT_CFA_META_FMT_EEM 3 + #endif diff --git a/drivers/net/bnxt/bnxt_rxtx_vec_sse.c b/drivers/net/bnxt/bnxt_rxtx_vec_sse.c index 22d9f9e84..ce00da633 100644 --- a/drivers/net/bnxt/bnxt_rxtx_vec_sse.c +++ b/drivers/net/bnxt/bnxt_rxtx_vec_sse.c @@ -280,8 +280,14 @@ bnxt_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, rte_compiler_barrier(); - if (rxcmp->flags_type & RX_PKT_CMPL_FLAGS_RSS_VALID) + if (rxcmp->flags_type & RX_PKT_CMPL_FLAGS_RSS_VALID) { mbuf->ol_flags |= PKT_RX_RSS_HASH; + } else { + mbuf->hash.fdir.id = + bnxt_get_cfa_code_or_mark_id(rxq->bp, + rxcmp1); + mbuf->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID; + } if (rxcmp1->flags2 & RX_PKT_CMPL_FLAGS2_META_FORMAT_VLAN) {