[2/8] common/sfc_efx/base: query RSS queue span limit on Riverhead
Checks
Commit Message
On Riverhead boards, clients can query the limit on how many
queues an RSS context may address. Put the capability to use.
Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
---
drivers/common/sfc_efx/base/ef10_nic.c | 14 ++++++++++++--
drivers/common/sfc_efx/base/ef10_rx.c | 3 ++-
drivers/common/sfc_efx/base/efx.h | 7 +++++++
drivers/common/sfc_efx/base/siena_nic.c | 2 ++
4 files changed, 23 insertions(+), 3 deletions(-)
@@ -1051,14 +1051,14 @@ ef10_get_datapath_caps(
efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
efx_mcdi_req_t req;
EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_CAPABILITIES_IN_LEN,
- MC_CMD_GET_CAPABILITIES_V7_OUT_LEN);
+ MC_CMD_GET_CAPABILITIES_V9_OUT_LEN);
efx_rc_t rc;
req.emr_cmd = MC_CMD_GET_CAPABILITIES;
req.emr_in_buf = payload;
req.emr_in_length = MC_CMD_GET_CAPABILITIES_IN_LEN;
req.emr_out_buf = payload;
- req.emr_out_length = MC_CMD_GET_CAPABILITIES_V7_OUT_LEN;
+ req.emr_out_length = MC_CMD_GET_CAPABILITIES_V9_OUT_LEN;
efx_mcdi_execute_quiet(enp, &req);
@@ -1466,6 +1466,16 @@ ef10_get_datapath_caps(
encp->enc_mae_admin = B_FALSE;
#endif /* EFSYS_OPT_MAE */
+#if EFSYS_OPT_RX_SCALE
+ if (req.emr_out_length_used >= MC_CMD_GET_CAPABILITIES_V9_OUT_LEN) {
+ encp->enc_rx_scale_indirection_max_nqueues =
+ MCDI_OUT_DWORD(req,
+ GET_CAPABILITIES_V9_OUT_RSS_MAX_INDIRECTION_QUEUES);
+ } else {
+ encp->enc_rx_scale_indirection_max_nqueues = EFX_MAXRSS;
+ }
+#endif /* EFSYS_OPT_RX_SCALE */
+
#undef CAP_FLAGS1
#undef CAP_FLAGS2
#undef CAP_FLAGS3
@@ -18,6 +18,7 @@ efx_mcdi_rss_context_alloc(
__in uint32_t num_queues,
__out uint32_t *rss_contextp)
{
+ const efx_nic_cfg_t *encp = efx_nic_cfg_get(enp);
efx_mcdi_req_t req;
EFX_MCDI_DECLARE_BUF(payload, MC_CMD_RSS_CONTEXT_ALLOC_IN_LEN,
MC_CMD_RSS_CONTEXT_ALLOC_OUT_LEN);
@@ -25,7 +26,7 @@ efx_mcdi_rss_context_alloc(
uint32_t context_type;
efx_rc_t rc;
- if (num_queues > EFX_MAXRSS) {
+ if (num_queues > encp->enc_rx_scale_indirection_max_nqueues) {
rc = EINVAL;
goto fail1;
}
@@ -1495,6 +1495,13 @@ 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 indirection table can address.
+ *
+ * Indirection table entries are offsets relative to a base queue ID.
+ * This means that the maximum offset has to be less than this value.
+ */
+ uint32_t enc_rx_scale_indirection_max_nqueues;
uint32_t enc_rx_scale_max_exclusive_contexts;
/*
* Mask of supported hash algorithms.
@@ -119,6 +119,8 @@ siena_board_cfg(
encp->enc_rx_push_align = 1;
#if EFSYS_OPT_RX_SCALE
+ encp->enc_rx_scale_indirection_max_nqueues = EFX_MAXRSS;
+
/* There is one RSS context per function */
encp->enc_rx_scale_max_exclusive_contexts = 1;