From 7d104a8db6e63c50a9275ad4e6b1e735a0345a85 Mon Sep 17 00:00:00 2001 From: Viacheslav Galaktionov Date: Mon, 11 Oct 2021 17:48:48 +0300 Subject: [PATCH] common/sfc_efx/base: retrieve function interfaces for VNICs This information is required to be able to fully identify the function. Add this information to the NIC configuration structure for easy access. Signed-off-by: Viacheslav Galaktionov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/common/sfc_efx/base/ef10_impl.h | 3 +- drivers/common/sfc_efx/base/ef10_nic.c | 4 +- drivers/common/sfc_efx/base/efx.h | 1 + drivers/common/sfc_efx/base/efx_impl.h | 6 +++ drivers/common/sfc_efx/base/efx_mcdi.c | 55 +++++++++++++++++++++++-- 5 files changed, 64 insertions(+), 5 deletions(-) diff --git a/drivers/common/sfc_efx/base/ef10_impl.h b/drivers/common/sfc_efx/base/ef10_impl.h index 7c8d51b7a5..d48f238479 100644 --- a/drivers/common/sfc_efx/base/ef10_impl.h +++ b/drivers/common/sfc_efx/base/ef10_impl.h @@ -1372,7 +1372,8 @@ extern __checkReturn efx_rc_t efx_mcdi_get_function_info( __in efx_nic_t *enp, __out uint32_t *pfp, - __out_opt uint32_t *vfp); + __out_opt uint32_t *vfp, + __out_opt efx_pcie_interface_t *intfp); LIBEFX_INTERNAL extern __checkReturn efx_rc_t diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c index eda0ad3068..3cd9ff89d0 100644 --- a/drivers/common/sfc_efx/base/ef10_nic.c +++ b/drivers/common/sfc_efx/base/ef10_nic.c @@ -1847,6 +1847,7 @@ efx_mcdi_nic_board_cfg( efx_nic_cfg_t *encp = &(enp->en_nic_cfg); ef10_link_state_t els; efx_port_t *epp = &(enp->en_port); + efx_pcie_interface_t intf; uint32_t board_type = 0; uint32_t base, nvec; uint32_t port; @@ -1875,11 +1876,12 @@ efx_mcdi_nic_board_cfg( * - PCIe PF: pf = PF number, vf = 0xffff. * - PCIe VF: pf = parent PF, vf = VF number. */ - if ((rc = efx_mcdi_get_function_info(enp, &pf, &vf)) != 0) + if ((rc = efx_mcdi_get_function_info(enp, &pf, &vf, &intf)) != 0) goto fail3; encp->enc_pf = pf; encp->enc_vf = vf; + encp->enc_intf = intf; if ((rc = ef10_mcdi_get_pf_count(enp, &encp->enc_hw_pf_count)) != 0) goto fail4; diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index 159e7957a3..996126217e 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -1511,6 +1511,7 @@ typedef struct efx_nic_cfg_s { uint32_t enc_bist_mask; #endif /* EFSYS_OPT_BIST */ #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() + efx_pcie_interface_t enc_intf; uint32_t enc_pf; uint32_t enc_vf; uint32_t enc_privilege_mask; diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 992edbabe3..e0efbb8cdd 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -1529,6 +1529,12 @@ efx_mcdi_get_workarounds( #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() +LIBEFX_INTERNAL +extern __checkReturn efx_rc_t +efx_mcdi_intf_from_pcie( + __in uint32_t pcie_intf, + __out efx_pcie_interface_t *efx_intf); + LIBEFX_INTERNAL extern __checkReturn efx_rc_t efx_mcdi_init_evq( diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c index b68fc0503d..69bf7ce70f 100644 --- a/drivers/common/sfc_efx/base/efx_mcdi.c +++ b/drivers/common/sfc_efx/base/efx_mcdi.c @@ -2130,6 +2130,36 @@ fail1: #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() + __checkReturn efx_rc_t +efx_mcdi_intf_from_pcie( + __in uint32_t pcie_intf, + __out efx_pcie_interface_t *efx_intf) +{ + efx_rc_t rc; + + switch (pcie_intf) { + case PCIE_INTERFACE_CALLER: + *efx_intf = EFX_PCIE_INTERFACE_CALLER; + break; + case PCIE_INTERFACE_HOST_PRIMARY: + *efx_intf = EFX_PCIE_INTERFACE_HOST_PRIMARY; + break; + case PCIE_INTERFACE_NIC_EMBEDDED: + *efx_intf = EFX_PCIE_INTERFACE_NIC_EMBEDDED; + break; + default: + rc = EINVAL; + goto fail1; + } + + return (0); + +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + + return (rc); +} + /* * This function returns the pf and vf number of a function. If it is a pf the * vf number is 0xffff. The vf number is the index of the vf on that @@ -2140,18 +2170,21 @@ fail1: efx_mcdi_get_function_info( __in efx_nic_t *enp, __out uint32_t *pfp, - __out_opt uint32_t *vfp) + __out_opt uint32_t *vfp, + __out_opt efx_pcie_interface_t *intfp) { + efx_pcie_interface_t intf; efx_mcdi_req_t req; EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_FUNCTION_INFO_IN_LEN, - MC_CMD_GET_FUNCTION_INFO_OUT_LEN); + MC_CMD_GET_FUNCTION_INFO_OUT_V2_LEN); + uint32_t pcie_intf; efx_rc_t rc; req.emr_cmd = MC_CMD_GET_FUNCTION_INFO; req.emr_in_buf = payload; req.emr_in_length = MC_CMD_GET_FUNCTION_INFO_IN_LEN; req.emr_out_buf = payload; - req.emr_out_length = MC_CMD_GET_FUNCTION_INFO_OUT_LEN; + req.emr_out_length = MC_CMD_GET_FUNCTION_INFO_OUT_V2_LEN; efx_mcdi_execute(enp, &req); @@ -2169,8 +2202,24 @@ efx_mcdi_get_function_info( if (vfp != NULL) *vfp = MCDI_OUT_DWORD(req, GET_FUNCTION_INFO_OUT_VF); + if (req.emr_out_length < MC_CMD_GET_FUNCTION_INFO_OUT_V2_LEN) { + intf = EFX_PCIE_INTERFACE_HOST_PRIMARY; + } else { + pcie_intf = MCDI_OUT_DWORD(req, + GET_FUNCTION_INFO_OUT_V2_INTF); + + rc = efx_mcdi_intf_from_pcie(pcie_intf, &intf); + if (rc != 0) + goto fail3; + } + + if (intfp != NULL) + *intfp = intf; + return (0); +fail3: + EFSYS_PROBE(fail3); fail2: EFSYS_PROBE(fail2); fail1: -- 2.20.1