Skip to content

Commit

Permalink
common/sfc_efx/base: provide control to deliver RSS hash
Browse files Browse the repository at this point in the history
When Rx queue is created, allow to specify if the driver would like
to get RSS hash value calculated by the hardware.

Use the flag to choose Rx prefix on Riverhead.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
  • Loading branch information
arybchenko authored and Ferruh Yigit committed Oct 16, 2020
1 parent f21c6e7 commit f784cdc
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 19 deletions.
45 changes: 30 additions & 15 deletions drivers/common/sfc_efx/base/ef10_rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -926,6 +926,10 @@ ef10_rx_qcreate(
goto fail1;
}
erp->er_buf_size = type_data->ertd_default.ed_buf_size;
/*
* Ignore EFX_RXQ_FLAG_RSS_HASH since if RSS hash is calculated
* it is always delivered from HW in the pseudo-header.
*/
break;
#if EFSYS_OPT_RX_PACKED_STREAM
case EFX_RXQ_TYPE_PACKED_STREAM:
Expand Down Expand Up @@ -955,14 +959,19 @@ ef10_rx_qcreate(
goto fail3;
}
erp->er_buf_size = type_data->ertd_packed_stream.eps_buf_size;
/* Packed stream pseudo header does not have RSS hash value */
if (flags & EFX_RXQ_FLAG_RSS_HASH) {
rc = ENOTSUP;
goto fail4;
}
break;
#endif /* EFSYS_OPT_RX_PACKED_STREAM */
#if EFSYS_OPT_RX_ES_SUPER_BUFFER
case EFX_RXQ_TYPE_ES_SUPER_BUFFER:
erpl = &ef10_essb_rx_prefix_layout;
if (type_data == NULL) {
rc = EINVAL;
goto fail4;
goto fail5;
}
params.es_bufs_per_desc =
type_data->ertd_es_super_buffer.eessb_bufs_per_desc;
Expand All @@ -972,25 +981,29 @@ ef10_rx_qcreate(
type_data->ertd_es_super_buffer.eessb_buf_stride;
params.hol_block_timeout =
type_data->ertd_es_super_buffer.eessb_hol_block_timeout;
/*
* Ignore EFX_RXQ_FLAG_RSS_HASH since if RSS hash is calculated
* it is always delivered from HW in the pseudo-header.
*/
break;
#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
default:
rc = ENOTSUP;
goto fail5;
goto fail6;
}

#if EFSYS_OPT_RX_PACKED_STREAM
if (params.ps_buf_size != 0) {
/* Check if datapath firmware supports packed stream mode */
if (encp->enc_rx_packed_stream_supported == B_FALSE) {
rc = ENOTSUP;
goto fail6;
goto fail7;
}
/* Check if packed stream allows configurable buffer sizes */
if ((params.ps_buf_size != MC_CMD_INIT_RXQ_EXT_IN_PS_BUFF_1M) &&
(encp->enc_rx_var_packed_stream_supported == B_FALSE)) {
rc = ENOTSUP;
goto fail7;
goto fail8;
}
}
#else /* EFSYS_OPT_RX_PACKED_STREAM */
Expand All @@ -1001,17 +1014,17 @@ ef10_rx_qcreate(
if (params.es_bufs_per_desc > 0) {
if (encp->enc_rx_es_super_buffer_supported == B_FALSE) {
rc = ENOTSUP;
goto fail8;
goto fail9;
}
if (!EFX_IS_P2ALIGNED(uint32_t, params.es_max_dma_len,
EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
rc = EINVAL;
goto fail9;
goto fail10;
}
if (!EFX_IS_P2ALIGNED(uint32_t, params.es_buf_stride,
EFX_RX_ES_SUPER_BUFFER_BUF_ALIGNMENT)) {
rc = EINVAL;
goto fail10;
goto fail11;
}
}
#else /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
Expand All @@ -1031,7 +1044,7 @@ ef10_rx_qcreate(

if ((rc = efx_mcdi_init_rxq(enp, ndescs, eep, label, index,
esmp, &params)) != 0)
goto fail11;
goto fail12;

erp->er_eep = eep;
erp->er_label = label;
Expand All @@ -1044,29 +1057,31 @@ ef10_rx_qcreate(

return (0);

fail12:
EFSYS_PROBE(fail12);
#if EFSYS_OPT_RX_ES_SUPER_BUFFER
fail11:
EFSYS_PROBE(fail11);
#if EFSYS_OPT_RX_ES_SUPER_BUFFER
fail10:
EFSYS_PROBE(fail10);
fail9:
EFSYS_PROBE(fail9);
fail8:
EFSYS_PROBE(fail8);
#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
#if EFSYS_OPT_RX_PACKED_STREAM
fail8:
EFSYS_PROBE(fail8);
fail7:
EFSYS_PROBE(fail7);
#endif /* EFSYS_OPT_RX_PACKED_STREAM */
fail6:
EFSYS_PROBE(fail6);
#endif /* EFSYS_OPT_RX_PACKED_STREAM */
#if EFSYS_OPT_RX_ES_SUPER_BUFFER
fail5:
EFSYS_PROBE(fail5);
#if EFSYS_OPT_RX_ES_SUPER_BUFFER
fail4:
EFSYS_PROBE(fail4);
#endif /* EFSYS_OPT_RX_ES_SUPER_BUFFER */
#if EFSYS_OPT_RX_PACKED_STREAM
fail4:
EFSYS_PROBE(fail4);
fail3:
EFSYS_PROBE(fail3);
fail2:
Expand Down
5 changes: 5 additions & 0 deletions drivers/common/sfc_efx/base/efx.h
Original file line number Diff line number Diff line change
Expand Up @@ -2948,6 +2948,11 @@ typedef enum efx_rxq_type_e {
* Rx checksum offload results.
*/
#define EFX_RXQ_FLAG_INNER_CLASSES 0x2
/*
* Request delivery of the RSS hash calculated by HW to be used by
* the driver.
*/
#define EFX_RXQ_FLAG_RSS_HASH 0x4

LIBEFX_API
extern __checkReturn efx_rc_t
Expand Down
19 changes: 19 additions & 0 deletions drivers/common/sfc_efx/base/efx_rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -889,11 +889,26 @@ efx_rx_qcreate_internal(
ndescs, id, flags, eep, erp)) != 0)
goto fail4;

/* Sanity check queue creation result */
if (flags & EFX_RXQ_FLAG_RSS_HASH) {
const efx_rx_prefix_layout_t *erplp = &erp->er_prefix_layout;
const efx_rx_prefix_field_info_t *rss_hash_field;

rss_hash_field =
&erplp->erpl_fields[EFX_RX_PREFIX_FIELD_RSS_HASH];
if (rss_hash_field->erpfi_width_bits == 0)
goto fail5;
}

enp->en_rx_qcount++;
*erpp = erp;

return (0);

fail5:
EFSYS_PROBE(fail5);

erxop->erxo_qdestroy(erp);
fail4:
EFSYS_PROBE(fail4);

Expand Down Expand Up @@ -1717,6 +1732,10 @@ siena_rx_qcreate(
switch (type) {
case EFX_RXQ_TYPE_DEFAULT:
erp->er_buf_size = type_data->ertd_default.ed_buf_size;
/*
* Ignore EFX_RXQ_FLAG_RSS_HASH since if RSS hash is calculated
* it is always delivered from HW in the pseudo-header.
*/
break;

default:
Expand Down
9 changes: 5 additions & 4 deletions drivers/common/sfc_efx/base/rhead_rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -624,13 +624,14 @@ rhead_rx_qcreate(
else
params.disable_scatter = encp->enc_rx_disable_scatter_supported;

if (flags & EFX_RXQ_FLAG_RSS_HASH) {
fields_mask |= 1U << EFX_RX_PREFIX_FIELD_RSS_HASH;
fields_mask |= 1U << EFX_RX_PREFIX_FIELD_RSS_HASH_VALID;
}

/*
* LENGTH is required in EF100 host interface, as receive events
* do not include the packet length.
* NOTE: Required fields are hard-wired now. Future designs will
* want to allow the client (driver) code to have control over
* which fields are required or may be allow to request so-called
* default Rx prefix (which ID is equal to 0).
*/
fields_mask |= 1U << EFX_RX_PREFIX_FIELD_LENGTH;
if ((rc = rhead_rx_choose_prefix_id(enp, fields_mask, &erpl)) != 0)
Expand Down

0 comments on commit f784cdc

Please sign in to comment.