From: Ivan Malov Date: Tue, 1 Feb 2022 08:50:01 +0000 (+0300) Subject: common/sfc_efx/base: support even spread RSS mode X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=bcdcec8cca8a2ea2b4962e7fda6d6d3c866ef760;p=dpdk.git common/sfc_efx/base: support even spread RSS mode Riverhead boards support spreading traffic across the specified number of queues without using indirections. This mode is provided by a dedicated RSS context type. Signed-off-by: Ivan Malov Reviewed-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c index cca31bc725..aa667309ab 100644 --- a/drivers/common/sfc_efx/base/ef10_nic.c +++ b/drivers/common/sfc_efx/base/ef10_nic.c @@ -1482,10 +1482,32 @@ ef10_get_datapath_caps( encp->enc_rx_scale_tbl_max_nentries = MCDI_OUT_DWORD(req, GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_TABLE_SIZE); + + if (CAP_FLAGS3(req, RSS_EVEN_SPREADING)) { +#define RSS_MAX_EVEN_SPREADING_QUEUES \ + GET_CAPABILITIES_V9_OUT_RSS_MAX_EVEN_SPREADING_QUEUES + /* + * The even spreading mode distributes traffic across + * the specified number of queues without the need to + * allocate precious indirection entry pool resources. + */ + encp->enc_rx_scale_even_spread_max_nqueues = + MCDI_OUT_DWORD(req, RSS_MAX_EVEN_SPREADING_QUEUES); +#undef RSS_MAX_EVEN_SPREADING_QUEUES + } else { + /* There is no support for the even spread contexts. */ + encp->enc_rx_scale_even_spread_max_nqueues = 0; + } } else { encp->enc_rx_scale_indirection_max_nqueues = EFX_MAXRSS; encp->enc_rx_scale_tbl_min_nentries = EFX_RSS_TBL_SIZE; encp->enc_rx_scale_tbl_max_nentries = EFX_RSS_TBL_SIZE; + + /* + * Assume that there is no support + * for the even spread contexts. + */ + encp->enc_rx_scale_even_spread_max_nqueues = 0; } #endif /* EFSYS_OPT_RX_SCALE */ diff --git a/drivers/common/sfc_efx/base/ef10_rx.c b/drivers/common/sfc_efx/base/ef10_rx.c index 78af7300a0..afc9cf025f 100644 --- a/drivers/common/sfc_efx/base/ef10_rx.c +++ b/drivers/common/sfc_efx/base/ef10_rx.c @@ -23,30 +23,45 @@ efx_mcdi_rss_context_alloc( efx_mcdi_req_t req; EFX_MCDI_DECLARE_BUF(payload, MC_CMD_RSS_CONTEXT_ALLOC_V2_IN_LEN, MC_CMD_RSS_CONTEXT_ALLOC_OUT_LEN); + uint32_t table_nentries_min; + uint32_t table_nentries_max; + uint32_t num_queues_max; uint32_t rss_context; uint32_t context_type; efx_rc_t rc; - if (num_queues > encp->enc_rx_scale_indirection_max_nqueues) { - rc = EINVAL; - goto fail1; - } - - if (table_nentries < encp->enc_rx_scale_tbl_min_nentries || - table_nentries > encp->enc_rx_scale_tbl_max_nentries || - !ISP2(table_nentries)) { - rc = EINVAL; - goto fail2; - } - switch (type) { case EFX_RX_SCALE_EXCLUSIVE: context_type = MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_EXCLUSIVE; + num_queues_max = encp->enc_rx_scale_indirection_max_nqueues; + table_nentries_min = encp->enc_rx_scale_tbl_min_nentries; + table_nentries_max = encp->enc_rx_scale_tbl_max_nentries; break; case EFX_RX_SCALE_SHARED: context_type = MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_SHARED; + num_queues_max = encp->enc_rx_scale_indirection_max_nqueues; + table_nentries_min = encp->enc_rx_scale_tbl_min_nentries; + table_nentries_max = encp->enc_rx_scale_tbl_max_nentries; + break; + case EFX_RX_SCALE_EVEN_SPREAD: + context_type = MC_CMD_RSS_CONTEXT_ALLOC_IN_TYPE_EVEN_SPREADING; + num_queues_max = encp->enc_rx_scale_even_spread_max_nqueues; + table_nentries_min = 0; + table_nentries_max = 0; break; default: + rc = EINVAL; + goto fail1; + } + + if (num_queues == 0 || num_queues > num_queues_max) { + rc = EINVAL; + goto fail2; + } + + if (table_nentries < table_nentries_min || + table_nentries > table_nentries_max || + (table_nentries != 0 && !ISP2(table_nentries))) { rc = EINVAL; goto fail3; } @@ -69,6 +84,9 @@ efx_mcdi_rss_context_alloc( * indirection table offsets. * For shared contexts, the provided context will spread traffic over * NUM_QUEUES many queues. + * For the even spread contexts, the provided context will spread + * traffic over NUM_QUEUES many queues, but that will not involve + * the use of precious indirection table resources in the adapter. */ MCDI_IN_SET_DWORD(req, RSS_CONTEXT_ALLOC_IN_NUM_QUEUES, num_queues); diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 4523829eb2..854527e0fd 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -1495,6 +1495,11 @@ typedef struct efx_nic_cfg_s { uint32_t enc_rx_buf_align_start; uint32_t enc_rx_buf_align_end; #if EFSYS_OPT_RX_SCALE + /* + * The limit on how many queues an RSS context in the even spread + * mode can span. When this mode is not supported, the value is 0. + */ + uint32_t enc_rx_scale_even_spread_max_nqueues; /* * The limit on how many queues an RSS indirection table can address. * @@ -2784,7 +2789,8 @@ typedef enum efx_rx_hash_support_e { typedef enum efx_rx_scale_context_type_e { EFX_RX_SCALE_UNAVAILABLE = 0, /* No RX scale context */ EFX_RX_SCALE_EXCLUSIVE, /* Writable key/indirection table */ - EFX_RX_SCALE_SHARED /* Read-only key/indirection table */ + EFX_RX_SCALE_SHARED, /* Read-only key/indirection table */ + EFX_RX_SCALE_EVEN_SPREAD, /* No indirection table, writable key */ } efx_rx_scale_context_type_t; /* diff --git a/drivers/common/sfc_efx/base/efx_rx.c b/drivers/common/sfc_efx/base/efx_rx.c index d10b990259..45dc5d6c6d 100644 --- a/drivers/common/sfc_efx/base/efx_rx.c +++ b/drivers/common/sfc_efx/base/efx_rx.c @@ -504,6 +504,7 @@ efx_rx_scale_context_alloc( __in uint32_t num_queues, __out uint32_t *rss_contextp) { + uint32_t table_nentries = EFX_RSS_TBL_SIZE; const efx_rx_ops_t *erxop = enp->en_erxop; efx_rc_t rc; @@ -515,8 +516,11 @@ efx_rx_scale_context_alloc( goto fail1; } + if (type == EFX_RX_SCALE_EVEN_SPREAD) + table_nentries = 0; + if ((rc = erxop->erxo_scale_context_alloc(enp, type, num_queues, - EFX_RSS_TBL_SIZE, rss_contextp)) != 0) { + table_nentries, rss_contextp)) != 0) { goto fail2; } diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c index 5f6d298d3f..939551dbf5 100644 --- a/drivers/common/sfc_efx/base/siena_nic.c +++ b/drivers/common/sfc_efx/base/siena_nic.c @@ -121,6 +121,9 @@ siena_board_cfg( #if EFSYS_OPT_RX_SCALE encp->enc_rx_scale_indirection_max_nqueues = EFX_MAXRSS; + /* There is no support for the even spread contexts. */ + encp->enc_rx_scale_even_spread_max_nqueues = 0; + /* There is one RSS context per function */ encp->enc_rx_scale_max_exclusive_contexts = 1;