From 097058033f034365d124cf93acda6947036f4aa7 Mon Sep 17 00:00:00 2001 From: Ivan Malov Date: Tue, 20 Oct 2020 10:13:15 +0100 Subject: [PATCH] common/sfc_efx/base: add API to get mport of PF/VF PCIe functions have static MPORTs which can be utilised by MAE rules as delivery destinations for matching traffic. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/efx.h | 14 ++++++++++ drivers/common/sfc_efx/base/efx_mae.c | 39 +++++++++++++++++++++++++++ drivers/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 1f8f71377a..7acb964e65 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/version.map b/drivers/common/sfc_efx/version.map index 6ed412ee39..cb92955a64 100644 --- a/drivers/common/sfc_efx/version.map +++ b/drivers/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.20.1