xref: /dpdk/drivers/common/sfc_efx/sfc_efx.c (revision f33e8c0e4a80c1456987f96c1ce448d65e7d6dfb)
15e111ed8SAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
25e111ed8SAndrew Rybchenko  *
3672386c1SAndrew Rybchenko  * Copyright(c) 2019-2021 Xilinx, Inc.
45e111ed8SAndrew Rybchenko  * Copyright(c) 2019 Solarflare Communications Inc.
55e111ed8SAndrew Rybchenko  *
65e111ed8SAndrew Rybchenko  * This software was jointly developed between OKTET Labs (under contract
75e111ed8SAndrew Rybchenko  * for Solarflare) and Solarflare Communications, Inc.
85e111ed8SAndrew Rybchenko  */
95e111ed8SAndrew Rybchenko 
101adaea57SVijay Kumar Srivastava #include <string.h>
115e111ed8SAndrew Rybchenko #include <rte_log.h>
121adaea57SVijay Kumar Srivastava #include <rte_kvargs.h>
131adaea57SVijay Kumar Srivastava #include <rte_devargs.h>
145e111ed8SAndrew Rybchenko 
155e111ed8SAndrew Rybchenko #include "sfc_efx_log.h"
161adaea57SVijay Kumar Srivastava #include "sfc_efx.h"
175e111ed8SAndrew Rybchenko 
18*2604c459SStephen Hemminger int sfc_efx_logtype;
195e111ed8SAndrew Rybchenko 
201adaea57SVijay Kumar Srivastava static int
211adaea57SVijay Kumar Srivastava sfc_efx_kvarg_dev_class_handler(__rte_unused const char *key,
221adaea57SVijay Kumar Srivastava 				const char *class_str, void *opaque)
231adaea57SVijay Kumar Srivastava {
241adaea57SVijay Kumar Srivastava 	enum sfc_efx_dev_class *dev_class = opaque;
251adaea57SVijay Kumar Srivastava 
261adaea57SVijay Kumar Srivastava 	if (strcmp(class_str, "vdpa") == 0) {
271adaea57SVijay Kumar Srivastava 		*dev_class = SFC_EFX_DEV_CLASS_VDPA;
281adaea57SVijay Kumar Srivastava 	} else if (strcmp(class_str, "net") == 0) {
291adaea57SVijay Kumar Srivastava 		*dev_class = SFC_EFX_DEV_CLASS_NET;
301adaea57SVijay Kumar Srivastava 	} else {
311adaea57SVijay Kumar Srivastava 		SFC_EFX_LOG(ERR, "Unsupported class %s.", class_str);
321adaea57SVijay Kumar Srivastava 		*dev_class = SFC_EFX_DEV_CLASS_INVALID;
331adaea57SVijay Kumar Srivastava 	}
341adaea57SVijay Kumar Srivastava 
351adaea57SVijay Kumar Srivastava 	return 0;
361adaea57SVijay Kumar Srivastava }
371adaea57SVijay Kumar Srivastava 
381adaea57SVijay Kumar Srivastava enum sfc_efx_dev_class
391adaea57SVijay Kumar Srivastava sfc_efx_dev_class_get(struct rte_devargs *devargs)
401adaea57SVijay Kumar Srivastava {
411adaea57SVijay Kumar Srivastava 	struct rte_kvargs *kvargs;
421adaea57SVijay Kumar Srivastava 	enum sfc_efx_dev_class dev_class = SFC_EFX_DEV_CLASS_NET;
431adaea57SVijay Kumar Srivastava 
441adaea57SVijay Kumar Srivastava 	if (devargs == NULL)
451adaea57SVijay Kumar Srivastava 		return dev_class;
461adaea57SVijay Kumar Srivastava 
471adaea57SVijay Kumar Srivastava 	kvargs = rte_kvargs_parse(devargs->args, NULL);
481adaea57SVijay Kumar Srivastava 	if (kvargs == NULL)
491adaea57SVijay Kumar Srivastava 		return dev_class;
501adaea57SVijay Kumar Srivastava 
5135d4f17bSXueming Li 	if (rte_kvargs_count(kvargs, RTE_DEVARGS_KEY_CLASS) != 0) {
5235d4f17bSXueming Li 		rte_kvargs_process(kvargs, RTE_DEVARGS_KEY_CLASS,
5335d4f17bSXueming Li 				   sfc_efx_kvarg_dev_class_handler, &dev_class);
541adaea57SVijay Kumar Srivastava 	}
551adaea57SVijay Kumar Srivastava 
561adaea57SVijay Kumar Srivastava 	rte_kvargs_free(kvargs);
571adaea57SVijay Kumar Srivastava 
581adaea57SVijay Kumar Srivastava 	return dev_class;
591adaea57SVijay Kumar Srivastava }
601adaea57SVijay Kumar Srivastava 
617178fbdcSVijay Kumar Srivastava static efx_rc_t
627178fbdcSVijay Kumar Srivastava sfc_efx_find_mem_bar(efsys_pci_config_t *configp, int bar_index,
637178fbdcSVijay Kumar Srivastava 		     efsys_bar_t *barp)
647178fbdcSVijay Kumar Srivastava {
657178fbdcSVijay Kumar Srivastava 	efsys_bar_t result;
667178fbdcSVijay Kumar Srivastava 	struct rte_pci_device *dev;
677178fbdcSVijay Kumar Srivastava 
687178fbdcSVijay Kumar Srivastava 	memset(&result, 0, sizeof(result));
697178fbdcSVijay Kumar Srivastava 
707178fbdcSVijay Kumar Srivastava 	if (bar_index < 0 || bar_index >= PCI_MAX_RESOURCE)
717178fbdcSVijay Kumar Srivastava 		return -EINVAL;
727178fbdcSVijay Kumar Srivastava 
737178fbdcSVijay Kumar Srivastava 	dev = configp->espc_dev;
747178fbdcSVijay Kumar Srivastava 
757178fbdcSVijay Kumar Srivastava 	result.esb_rid = bar_index;
767178fbdcSVijay Kumar Srivastava 	result.esb_dev = dev;
777178fbdcSVijay Kumar Srivastava 	result.esb_base = dev->mem_resource[bar_index].addr;
787178fbdcSVijay Kumar Srivastava 
797178fbdcSVijay Kumar Srivastava 	*barp = result;
807178fbdcSVijay Kumar Srivastava 
817178fbdcSVijay Kumar Srivastava 	return 0;
827178fbdcSVijay Kumar Srivastava }
837178fbdcSVijay Kumar Srivastava 
847178fbdcSVijay Kumar Srivastava static efx_rc_t
857178fbdcSVijay Kumar Srivastava sfc_efx_pci_config_readd(efsys_pci_config_t *configp, uint32_t offset,
867178fbdcSVijay Kumar Srivastava 			 efx_dword_t *edp)
877178fbdcSVijay Kumar Srivastava {
887178fbdcSVijay Kumar Srivastava 	int rc;
897178fbdcSVijay Kumar Srivastava 
907178fbdcSVijay Kumar Srivastava 	rc = rte_pci_read_config(configp->espc_dev, edp->ed_u32, sizeof(*edp),
917178fbdcSVijay Kumar Srivastava 				 offset);
927178fbdcSVijay Kumar Srivastava 
937178fbdcSVijay Kumar Srivastava 	return (rc < 0 || rc != sizeof(*edp)) ? EIO : 0;
947178fbdcSVijay Kumar Srivastava }
957178fbdcSVijay Kumar Srivastava 
967178fbdcSVijay Kumar Srivastava int
977178fbdcSVijay Kumar Srivastava sfc_efx_family(struct rte_pci_device *pci_dev,
987178fbdcSVijay Kumar Srivastava 	       efx_bar_region_t *mem_ebrp, efx_family_t *family)
997178fbdcSVijay Kumar Srivastava {
1007178fbdcSVijay Kumar Srivastava 	static const efx_pci_ops_t ops = {
1017178fbdcSVijay Kumar Srivastava 		.epo_config_readd = sfc_efx_pci_config_readd,
1027178fbdcSVijay Kumar Srivastava 		.epo_find_mem_bar = sfc_efx_find_mem_bar,
1037178fbdcSVijay Kumar Srivastava 	};
1047178fbdcSVijay Kumar Srivastava 
1057178fbdcSVijay Kumar Srivastava 	efsys_pci_config_t espcp;
1067178fbdcSVijay Kumar Srivastava 	int rc;
1077178fbdcSVijay Kumar Srivastava 
1087178fbdcSVijay Kumar Srivastava 	espcp.espc_dev = pci_dev;
1097178fbdcSVijay Kumar Srivastava 
1107178fbdcSVijay Kumar Srivastava 	rc = efx_family_probe_bar(pci_dev->id.vendor_id,
1117178fbdcSVijay Kumar Srivastava 				  pci_dev->id.device_id,
1127178fbdcSVijay Kumar Srivastava 				  &espcp, &ops, family, mem_ebrp);
1137178fbdcSVijay Kumar Srivastava 
1147178fbdcSVijay Kumar Srivastava 	return rc;
1157178fbdcSVijay Kumar Srivastava }
1167178fbdcSVijay Kumar Srivastava 
117*2604c459SStephen Hemminger RTE_LOG_REGISTER_DEFAULT(sfc_efx_logtype, NOTICE);
118