From: Igor Romanov <igor.roma...@oktetlabs.ru>

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.roma...@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <andrew.rybche...@oktetlabs.ru>
Reviewed-by: Andy Moreton <amore...@xilinx.com>
Reviewed-by: Ivan Malov <ivan.ma...@oktetlabs.ru>
---
 drivers/net/sfc/sfc_ef100_rx.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/net/sfc/sfc_ef100_rx.c b/drivers/net/sfc/sfc_ef100_rx.c
index 15fce55361..bbf3bf4dc0 100644
--- a/drivers/net/sfc/sfc_ef100_rx.c
+++ b/drivers/net/sfc/sfc_ef100_rx.c
@@ -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;
 }
@@ -806,6 +818,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);
-- 
2.30.2

Reply via email to