From: Ivan Malov <ivan.ma...@oktetlabs.ru>

PCIe functions have static MPORTs which can be utilised by
MAE rules as delivery destinations for matching traffic.

Signed-off-by: Ivan Malov <ivan.ma...@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybche...@solarflare.com>
Reviewed-by: Andy Moreton <amore...@xilinx.com>
---
 drivers/common/sfc_efx/base/efx.h             | 14 +++++++
 drivers/common/sfc_efx/base/efx_mae.c         | 39 +++++++++++++++++++
 .../sfc_efx/rte_common_sfc_efx_version.map    |  1 +
 3 files changed, 54 insertions(+)

diff --git a/drivers/common/sfc_efx/base/efx.h 
b/drivers/common/sfc_efx/base/efx.h
index eefd79dd06..96ea93f75a 100644
--- a/drivers/common/sfc_efx/base/efx.h
+++ b/drivers/common/sfc_efx/base/efx.h
@@ -4111,6 +4111,20 @@ efx_mae_mport_by_phy_port(
        __in                            uint32_t phy_port,
        __out                           efx_mport_sel_t *mportp);
 
+/*
+ * Get MPORT selector of a PCIe function.
+ *
+ * The resulting MPORT selector is opaque to the caller and can be
+ * passed as an argument to efx_mae_match_spec_mport_set()
+ * and efx_mae_action_set_populate_deliver().
+ */
+LIBEFX_API
+extern __checkReturn                   efx_rc_t
+efx_mae_mport_by_pcie_function(
+       __in                            uint32_t pf,
+       __in                            uint32_t vf,
+       __out                           efx_mport_sel_t *mportp);
+
 /*
  * Fields which have BE postfix in their named constants are expected
  * to be passed by callers in big-endian byte order. They will appear
diff --git a/drivers/common/sfc_efx/base/efx_mae.c 
b/drivers/common/sfc_efx/base/efx_mae.c
index 880336a7d9..ee51f19e5e 100644
--- a/drivers/common/sfc_efx/base/efx_mae.c
+++ b/drivers/common/sfc_efx/base/efx_mae.c
@@ -357,6 +357,45 @@ efx_mae_mport_by_phy_port(
 
        return (0);
 
+fail1:
+       EFSYS_PROBE1(fail1, efx_rc_t, rc);
+       return (rc);
+}
+
+       __checkReturn                   efx_rc_t
+efx_mae_mport_by_pcie_function(
+       __in                            uint32_t pf,
+       __in                            uint32_t vf,
+       __out                           efx_mport_sel_t *mportp)
+{
+       efx_dword_t dword;
+       efx_rc_t rc;
+
+       EFX_STATIC_ASSERT(EFX_PCI_VF_INVALID ==
+           MAE_MPORT_SELECTOR_FUNC_VF_ID_NULL);
+
+       if (pf > EFX_MASK32(MAE_MPORT_SELECTOR_FUNC_PF_ID)) {
+               rc = EINVAL;
+               goto fail1;
+       }
+
+       if (vf > EFX_MASK32(MAE_MPORT_SELECTOR_FUNC_VF_ID)) {
+               rc = EINVAL;
+               goto fail2;
+       }
+
+       EFX_POPULATE_DWORD_3(dword,
+           MAE_MPORT_SELECTOR_TYPE, MAE_MPORT_SELECTOR_TYPE_FUNC,
+           MAE_MPORT_SELECTOR_FUNC_PF_ID, pf,
+           MAE_MPORT_SELECTOR_FUNC_VF_ID, vf);
+
+       memset(mportp, 0, sizeof (*mportp));
+       mportp->sel = dword.ed_u32[0];
+
+       return (0);
+
+fail2:
+       EFSYS_PROBE(fail2);
 fail1:
        EFSYS_PROBE1(fail1, efx_rc_t, rc);
        return (rc);
diff --git a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map 
b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
index 6ed412ee39..cb92955a64 100644
--- a/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
+++ b/drivers/common/sfc_efx/rte_common_sfc_efx_version.map
@@ -106,6 +106,7 @@ INTERNAL {
        efx_mae_match_spec_is_valid;
        efx_mae_match_spec_mport_set;
        efx_mae_match_specs_class_cmp;
+       efx_mae_mport_by_pcie_function;
        efx_mae_mport_by_phy_port;
 
        efx_mcdi_fini;
-- 
2.17.1

Reply via email to