net/sfc: handle ingress mport in EF100 Rx prefix
authorIgor Romanov <igor.romanov@oktetlabs.ru>
Mon, 11 Oct 2021 14:48:43 +0000 (17:48 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 12 Oct 2021 16:44:11 +0000 (18:44 +0200)
Set ingress mport dynamic field in mbuf in EF100.

For a given PF, Rx queues of representor devices
function on top of the only Rx queue operated by
the PF representor proxy facility. This field is
a means to demultiplex traffic hitting the queue.

Signed-off-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Reviewed-by: Ivan Malov <ivan.malov@oktetlabs.ru>
drivers/net/sfc/sfc_ef100_rx.c

index dcb8c46..de35c19 100644 (file)
@@ -62,6 +62,7 @@ struct sfc_ef100_rxq {
 #define SFC_EF100_RXQ_RSS_HASH         0x10
 #define SFC_EF100_RXQ_USER_MARK                0x20
 #define SFC_EF100_RXQ_FLAG_INTR_EN     0x40
+#define SFC_EF100_RXQ_INGRESS_MPORT    0x80
        unsigned int                    ptr_mask;
        unsigned int                    evq_phase_bit_shift;
        unsigned int                    ready_pkts;
@@ -370,6 +371,8 @@ static const efx_rx_prefix_layout_t sfc_ef100_rx_prefix_layout = {
                SFC_EF100_RX_PREFIX_FIELD(LENGTH, B_FALSE),
                SFC_EF100_RX_PREFIX_FIELD(RSS_HASH_VALID, B_FALSE),
                SFC_EF100_RX_PREFIX_FIELD(CLASS, B_FALSE),
+               EFX_RX_PREFIX_FIELD(INGRESS_MPORT,
+                                   ESF_GZ_RX_PREFIX_INGRESS_MPORT, B_FALSE),
                SFC_EF100_RX_PREFIX_FIELD(RSS_HASH, B_FALSE),
                SFC_EF100_RX_PREFIX_FIELD(USER_MARK, B_FALSE),
 
@@ -419,6 +422,15 @@ sfc_ef100_rx_prefix_to_offloads(const struct sfc_ef100_rxq *rxq,
                }
        }
 
+       if (rxq->flags & SFC_EF100_RXQ_INGRESS_MPORT) {
+               ol_flags |= sfc_dp_mport_override;
+               *RTE_MBUF_DYNFIELD(m,
+                       sfc_dp_mport_offset,
+                       typeof(&((efx_mport_id_t *)0)->id)) =
+                               EFX_XWORD_FIELD(rx_prefix[0],
+                                               ESF_GZ_RX_PREFIX_INGRESS_MPORT);
+       }
+
        m->ol_flags = ol_flags;
        return true;
 }
@@ -809,6 +821,12 @@ sfc_ef100_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr,
        else
                rxq->flags &= ~SFC_EF100_RXQ_USER_MARK;
 
+       if ((unsup_rx_prefix_fields &
+            (1U << EFX_RX_PREFIX_FIELD_INGRESS_MPORT)) == 0)
+               rxq->flags |= SFC_EF100_RXQ_INGRESS_MPORT;
+       else
+               rxq->flags &= ~SFC_EF100_RXQ_INGRESS_MPORT;
+
        rxq->prefix_size = pinfo->erpl_length;
        rxq->rearm_data = sfc_ef100_mk_mbuf_rearm_data(rxq->dp.dpq.port_id,
                                                       rxq->prefix_size);