From patchwork Tue Oct 13 13:45:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 80533 X-Patchwork-Delegate: ferruh.yigit@amd.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 104DDA04B7; Tue, 13 Oct 2020 15:55:03 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 650F71DC35; Tue, 13 Oct 2020 15:46:42 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id A857F1DB86 for ; Tue, 13 Oct 2020 15:46:05 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.137]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 5371C200B3 for ; Tue, 13 Oct 2020 13:46:05 +0000 (UTC) Received: from us4-mdac16-28.at1.mdlocal (unknown [10.110.49.210]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 4EEEA600A1 for ; Tue, 13 Oct 2020 13:46:05 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.7]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id E3784220054 for ; Tue, 13 Oct 2020 13:46:04 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id ADB484C0066 for ; Tue, 13 Oct 2020 13:46:04 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 13 Oct 2020 14:45:57 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 13 Oct 2020 14:45:57 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09DDjuqu006140 for ; Tue, 13 Oct 2020 14:45:56 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id DBE781613A9 for ; Tue, 13 Oct 2020 14:45:56 +0100 (BST) From: Andrew Rybchenko To: Date: Tue, 13 Oct 2020 14:45:48 +0100 Message-ID: <1602596753-32282-32-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1602596753-32282-1-git-send-email-arybchenko@solarflare.com> References: <1602596753-32282-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25722.003 X-TM-AS-Result: No-9.471900-8.000000-10 X-TMASE-MatchedRID: pPa6SVZ3sfwij1rXhFZBDEf49ONH0RaSUHV7v8X++rmrKAMNdmNVEwBJ DO15WqH4neGsf5JrEMGC04of3RphfiRUxBx2BTapMiMrbc70PfcEa8g1x8eqF+9FCyScBaYaEUg fjHE89aJg0rUa0hD2zhaynp4lvsDbofaD2zI+zzycVWc2a+/ju0tc8DbogbSE31GU/N5W5BCGMx Gp2zHEYeBF8NeM5raywacIfAIy5MkCg5cSwpvOU2hQCsqhuTNiDvc/j9oMIgWsHCH3SeE3CXimo 7zurlpweEXh8DesfdOO3KEs8bl8iuVozigZV/U0cgDoZhYtavbyCvICuK46ckdmDSBYfnJRPmWb 5UMEjgQNSHV1uiGbXotff+L5+FITHwkK0fluYgBJUdgxNDUXWrfHCp+e+coeV8ukjx868O7C2A4 eQBRfqg35E9ywEdja/uRSU8BEUnBRpDxTweAjCWhCG8qMW+KyzQogSLZEin/2BDTy02jIbxSNCC rV6iq24vM1YF6AJbbCCfuIMF6xLSAHAopEd76vbkyW+7fUVhRoMk8drxHuaFli4M6AnOEDq0ce3 ghW4w57Q13/mIG5og== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--9.471900-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25722.003 X-MDID: 1602596765-8ZYgG4GtzN_o X-PPE-DISP: 1602596765;8ZYgG4GtzN_o Subject: [dpdk-dev] [PATCH 31/36] net/sfc: support per-queue Rx prefix for EF100 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" Riverhead FW supports Rx prefix choice based on required fields in Rx prefix. The feature is generalized in libefx to provide Rx prefixes layout for other NICs and firmware variants. Now driver can get the prefix layout after Rx queue start and use the layout details to check its expectations or simply in run-time. Rx prefix choice and query interface is defined in SF-119689-TC EF100 host interface. Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc_dp_rx.h | 3 ++- drivers/net/sfc/sfc_ef100_rx.c | 41 +++++++++++++++++++++++++++--- drivers/net/sfc/sfc_ef10_essb_rx.c | 32 ++++++++++++++++++++++- drivers/net/sfc/sfc_ef10_rx.c | 19 +++++++++++++- drivers/net/sfc/sfc_rx.c | 19 ++++++++++++-- 5 files changed, 106 insertions(+), 8 deletions(-) diff --git a/drivers/net/sfc/sfc_dp_rx.h b/drivers/net/sfc/sfc_dp_rx.h index 3aba39658e..362be933a9 100644 --- a/drivers/net/sfc/sfc_dp_rx.h +++ b/drivers/net/sfc/sfc_dp_rx.h @@ -159,7 +159,8 @@ typedef void (sfc_dp_rx_qdestroy_t)(struct sfc_dp_rxq *dp_rxq); * It handovers EvQ to the datapath. */ typedef int (sfc_dp_rx_qstart_t)(struct sfc_dp_rxq *dp_rxq, - unsigned int evq_read_ptr); + unsigned int evq_read_ptr, + const efx_rx_prefix_layout_t *pinfo); /** * Receive queue stop function called before flush. diff --git a/drivers/net/sfc/sfc_ef100_rx.c b/drivers/net/sfc/sfc_ef100_rx.c index 2f5c5ab533..5d46d5bac1 100644 --- a/drivers/net/sfc/sfc_ef100_rx.c +++ b/drivers/net/sfc/sfc_ef100_rx.c @@ -18,6 +18,7 @@ #include "efx_types.h" #include "efx_regs_ef100.h" +#include "efx.h" #include "sfc_debug.h" #include "sfc_tweak.h" @@ -337,6 +338,23 @@ sfc_ef100_rx_class_decode(const efx_word_t class, uint64_t *ol_flags) return ptype; } +/* + * Below function relies on the following fields in Rx prefix. + * Some fields are mandatory, some fields are optional. + * See sfc_ef100_rx_qstart() below. + */ +static const efx_rx_prefix_layout_t sfc_ef100_rx_prefix_layout = { + .erpl_fields = { +#define SFC_EF100_RX_PREFIX_FIELD(_name, _big_endian) \ + EFX_RX_PREFIX_FIELD(_name, ESF_GZ_RX_PREFIX_ ## _name, _big_endian) + + SFC_EF100_RX_PREFIX_FIELD(LENGTH, B_FALSE), + SFC_EF100_RX_PREFIX_FIELD(CLASS, B_FALSE), + +#undef SFC_EF100_RX_PREFIX_FIELD + } +}; + static bool sfc_ef100_rx_prefix_to_offloads(const efx_oword_t *rx_prefix, struct rte_mbuf *m) @@ -667,8 +685,6 @@ sfc_ef100_rx_qcreate(uint16_t port_id, uint16_t queue_id, rxq->evq_hw_ring = info->evq_hw_ring; rxq->max_fill_level = info->max_fill_level; rxq->refill_threshold = info->refill_threshold; - rxq->rearm_data = - sfc_ef100_mk_mbuf_rearm_data(port_id, info->prefix_size); rxq->prefix_size = info->prefix_size; rxq->buf_size = info->buf_size; rxq->refill_mb_pool = info->refill_mb_pool; @@ -702,13 +718,32 @@ sfc_ef100_rx_qdestroy(struct sfc_dp_rxq *dp_rxq) static sfc_dp_rx_qstart_t sfc_ef100_rx_qstart; static int -sfc_ef100_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr) +sfc_ef100_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr, + const efx_rx_prefix_layout_t *pinfo) { struct sfc_ef100_rxq *rxq = sfc_ef100_rxq_by_dp_rxq(dp_rxq); + uint32_t unsup_rx_prefix_fields; SFC_ASSERT(rxq->completed == 0); SFC_ASSERT(rxq->added == 0); + /* Prefix must fit into reserved Rx buffer space */ + if (pinfo->erpl_length > rxq->prefix_size) + return ENOTSUP; + + unsup_rx_prefix_fields = + efx_rx_prefix_layout_check(pinfo, &sfc_ef100_rx_prefix_layout); + + /* LENGTH and CLASS filds must always be present */ + if ((unsup_rx_prefix_fields & + ((1U << EFX_RX_PREFIX_FIELD_LENGTH) | + (1U << EFX_RX_PREFIX_FIELD_CLASS))) != 0) + return ENOTSUP; + + rxq->prefix_size = pinfo->erpl_length; + rxq->rearm_data = sfc_ef100_mk_mbuf_rearm_data(rxq->dp.dpq.port_id, + rxq->prefix_size); + sfc_ef100_rx_qrefill(rxq); rxq->evq_read_ptr = evq_read_ptr; diff --git a/drivers/net/sfc/sfc_ef10_essb_rx.c b/drivers/net/sfc/sfc_ef10_essb_rx.c index d9bf28525b..17e4c140f5 100644 --- a/drivers/net/sfc/sfc_ef10_essb_rx.c +++ b/drivers/net/sfc/sfc_ef10_essb_rx.c @@ -17,6 +17,7 @@ #include "efx_types.h" #include "efx_regs_ef10.h" +#include "efx.h" #include "sfc_debug.h" #include "sfc_tweak.h" @@ -304,6 +305,27 @@ sfc_ef10_essb_rx_process_ev(struct sfc_ef10_essb_rxq *rxq, efx_qword_t rx_ev) } while (ready > 0); } +/* + * Below function relies on the following length and layout of the + * Rx prefix. + */ +static const efx_rx_prefix_layout_t sfc_ef10_essb_rx_prefix_layout = { + .erpl_length = ES_EZ_ESSB_RX_PREFIX_LEN, + .erpl_fields = { +#define SFC_EF10_ESSB_RX_PREFIX_FIELD(_efx, _ef10) \ + EFX_RX_PREFIX_FIELD(_efx, ES_EZ_ESSB_RX_PREFIX_ ## _ef10, B_FALSE) + + SFC_EF10_ESSB_RX_PREFIX_FIELD(LENGTH, DATA_LEN), + SFC_EF10_ESSB_RX_PREFIX_FIELD(USER_MARK, MARK), + SFC_EF10_ESSB_RX_PREFIX_FIELD(RSS_HASH_VALID, HASH_VALID), + SFC_EF10_ESSB_RX_PREFIX_FIELD(USER_MARK_VALID, MARK_VALID), + SFC_EF10_ESSB_RX_PREFIX_FIELD(USER_FLAG, MATCH_FLAG), + SFC_EF10_ESSB_RX_PREFIX_FIELD(RSS_HASH, HASH), + +#undef SFC_EF10_ESSB_RX_PREFIX_FIELD + } +}; + static unsigned int sfc_ef10_essb_rx_get_pending(struct sfc_ef10_essb_rxq *rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) @@ -633,10 +655,18 @@ sfc_ef10_essb_rx_qdestroy(struct sfc_dp_rxq *dp_rxq) static sfc_dp_rx_qstart_t sfc_ef10_essb_rx_qstart; static int -sfc_ef10_essb_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr) +sfc_ef10_essb_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr, + const efx_rx_prefix_layout_t *pinfo) { struct sfc_ef10_essb_rxq *rxq = sfc_ef10_essb_rxq_by_dp_rxq(dp_rxq); + if (pinfo->erpl_length != sfc_ef10_essb_rx_prefix_layout.erpl_length) + return ENOTSUP; + + if (efx_rx_prefix_layout_check(pinfo, + &sfc_ef10_essb_rx_prefix_layout) != 0) + return ENOTSUP; + rxq->evq_read_ptr = evq_read_ptr; /* Initialize before refill */ diff --git a/drivers/net/sfc/sfc_ef10_rx.c b/drivers/net/sfc/sfc_ef10_rx.c index 62d0b6206b..e6bf3b9f42 100644 --- a/drivers/net/sfc/sfc_ef10_rx.c +++ b/drivers/net/sfc/sfc_ef10_rx.c @@ -223,6 +223,18 @@ sfc_ef10_rx_pending(struct sfc_ef10_rxq *rxq, struct rte_mbuf **rx_pkts, return rx_pkts; } +/* + * Below Rx pseudo-header (aka Rx prefix) accesssors rely on the + * following fields layout. + */ +static const efx_rx_prefix_layout_t sfc_ef10_rx_prefix_layout = { + .erpl_fields = { + [EFX_RX_PREFIX_FIELD_RSS_HASH] = + { 0, sizeof(uint32_t) * CHAR_BIT, B_FALSE }, + [EFX_RX_PREFIX_FIELD_LENGTH] = + { 8 * CHAR_BIT, sizeof(uint16_t) * CHAR_BIT, B_FALSE }, + } +}; static uint16_t sfc_ef10_rx_pseudo_hdr_get_len(const uint8_t *pseudo_hdr) { @@ -700,7 +712,8 @@ sfc_ef10_rx_qdestroy(struct sfc_dp_rxq *dp_rxq) static sfc_dp_rx_qstart_t sfc_ef10_rx_qstart; static int -sfc_ef10_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr) +sfc_ef10_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr, + const efx_rx_prefix_layout_t *pinfo) { struct sfc_ef10_rxq *rxq = sfc_ef10_rxq_by_dp_rxq(dp_rxq); @@ -708,6 +721,10 @@ sfc_ef10_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr) SFC_ASSERT(rxq->pending == 0); SFC_ASSERT(rxq->added == 0); + if (pinfo->erpl_length != rxq->prefix_size || + efx_rx_prefix_layout_check(pinfo, &sfc_ef10_rx_prefix_layout) != 0) + return ENOTSUP; + sfc_ef10_rx_qrefill(rxq); rxq->evq_read_ptr = evq_read_ptr; diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c index 09afb519d5..ff4e69e679 100644 --- a/drivers/net/sfc/sfc_rx.c +++ b/drivers/net/sfc/sfc_rx.c @@ -528,13 +528,22 @@ static sfc_dp_rx_qpurge_t sfc_efx_rx_qpurge; static sfc_dp_rx_qstart_t sfc_efx_rx_qstart; static int sfc_efx_rx_qstart(struct sfc_dp_rxq *dp_rxq, - __rte_unused unsigned int evq_read_ptr) + __rte_unused unsigned int evq_read_ptr, + const efx_rx_prefix_layout_t *pinfo) { /* libefx-based datapath is specific to libefx-based PMD */ struct sfc_efx_rxq *rxq = sfc_efx_rxq_by_dp_rxq(dp_rxq); struct sfc_rxq *crxq = sfc_rxq_by_dp_rxq(dp_rxq); int rc; + /* + * libefx API is used to extract information from Rx prefix and + * it guarantees consistency. Just do length check to ensure + * that we reserved space in Rx buffers correctly. + */ + if (rxq->prefix_size != pinfo->erpl_length) + return ENOTSUP; + rxq->common = crxq->common; rxq->pending = rxq->completed = rxq->added = rxq->pushed = 0; @@ -760,6 +769,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index) struct sfc_rxq_info *rxq_info; struct sfc_rxq *rxq; struct sfc_evq *evq; + efx_rx_prefix_layout_t pinfo; int rc; sfc_log_init(sa, "sw_index=%u", sw_index); @@ -811,9 +821,13 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index) if (rc != 0) goto fail_rx_qcreate; + rc = efx_rx_prefix_get_layout(rxq->common, &pinfo); + if (rc != 0) + goto fail_prefix_get_layout; + efx_rx_qenable(rxq->common); - rc = sa->priv.dp_rx->qstart(rxq_info->dp, evq->read_ptr); + rc = sa->priv.dp_rx->qstart(rxq_info->dp, evq->read_ptr, &pinfo); if (rc != 0) goto fail_dp_qstart; @@ -839,6 +853,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index) fail_dp_qstart: efx_rx_qdestroy(rxq->common); +fail_prefix_get_layout: fail_rx_qcreate: fail_bad_contig_block_size: fail_mp_get_info: