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