common/sfc_efx/base: add API to get mport of PF/VF
authorIvan Malov <ivan.malov@oktetlabs.ru>
Tue, 20 Oct 2020 09:13:15 +0000 (10:13 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 3 Nov 2020 22:24:25 +0000 (23:24 +0100)
PCIe functions have static MPORTs which can be utilised by
MAE rules as delivery destinations for matching traffic.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
drivers/common/sfc_efx/base/efx.h
drivers/common/sfc_efx/base/efx_mae.c
drivers/common/sfc_efx/version.map

index eefd79d..96ea93f 100644 (file)
@@ -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
index 1f8f713..7acb964 100644 (file)
@@ -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);
index 6ed412e..cb92955 100644 (file)
@@ -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;