[v2,29/38] common/sfc_efx/base: retrieve function interfaces for VNICs

Message ID 20211011144857.446802-30-andrew.rybchenko@oktetlabs.ru (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers
Series net/sfc: support port representors |

Checks

Context Check Description
ci/checkpatch warning coding style issues

Commit Message

Andrew Rybchenko Oct. 11, 2021, 2:48 p.m. UTC
  From: Viacheslav Galaktionov <viacheslav.galaktionov@oktetlabs.ru>

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 |  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(-)
  

Patch

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 @@  efx_mcdi_mac_stats_periodic(
 
 #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 @@  efx_mcdi_mac_stats_periodic(
 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: