]> git.droids-corp.org - dpdk.git/commitdiff
common/sfc_efx/base: provide control to deliver RSS hash
authorAndrew Rybchenko <arybchenko@solarflare.com>
Tue, 13 Oct 2020 13:45:45 +0000 (14:45 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 16 Oct 2020 17:48:18 +0000 (19:48 +0200)
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>
drivers/common/sfc_efx/base/ef10_rx.c
drivers/common/sfc_efx/base/efx.h
drivers/common/sfc_efx/base/efx_rx.c
drivers/common/sfc_efx/base/rhead_rx.c

index ea5f514f18ce78502be795d0807f79b791977c07..1b4f3f0152186bd94e9180f814e5c8759f0f2f3f 100644 (file)
@@ -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:
@@ -955,6 +959,11 @@ 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
@@ -962,7 +971,7 @@ ef10_rx_qcreate(
                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;
@@ -972,11 +981,15 @@ 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
@@ -984,13 +997,13 @@ ef10_rx_qcreate(
                /* 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 */
@@ -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 */
@@ -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;
@@ -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:
index 4b7beb209d9abf3b03f7e3f2ce9453e0bc97b379..406e96caf812fcacd456982c0d2d794457d4cfb7 100644 (file)
@@ -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
index 3536b0eb07ca5bf94388f6d5598a0aae4014e7f3..d6b56fec48e056246d9f8473b6a237e85bfaf7e4 100644 (file)
@@ -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);
 
@@ -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:
index d3d7339b8c8db63fe5f665a24349d034b162d884..b6f9d51fef9e4af99b3df44a1ee2d2369531dda2 100644 (file)
@@ -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)