common/sfc_efx/base: retrieve function interfaces for VNICs
authorViacheslav Galaktionov <viacheslav.galaktionov@oktetlabs.ru>
Mon, 11 Oct 2021 14:48:48 +0000 (17:48 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 12 Oct 2021 16:44:11 +0000 (18:44 +0200)
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 <viacheslav.galaktionov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
drivers/common/sfc_efx/base/ef10_impl.h
drivers/common/sfc_efx/base/ef10_nic.c
drivers/common/sfc_efx/base/efx.h
drivers/common/sfc_efx/base/efx_impl.h
drivers/common/sfc_efx/base/efx_mcdi.c

index 7c8d51b..d48f238 100644 (file)
@@ -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
index eda0ad3..3cd9ff8 100644 (file)
@@ -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;
index 159e795..9961262 100644 (file)
@@ -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;
index 992edba..e0efbb8 100644 (file)
@@ -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(
index b68fc05..69bf7ce 100644 (file)
@@ -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: