111313c20SJim Harris /* SPDX-License-Identifier: BSD-3-Clause 2a6dbe372Spaul luse * Copyright (C) 2022 Intel Corporation. 311313c20SJim Harris * All rights reserved. 411313c20SJim Harris */ 511313c20SJim Harris 611313c20SJim Harris #include <rte_config.h> 711313c20SJim Harris #include <rte_version.h> 811313c20SJim Harris #include "pci_dpdk.h" 9936726f8SJim Harris #include "spdk/log.h" 1011313c20SJim Harris 11a25a834aSJim Harris extern struct dpdk_fn_table fn_table_2207; 125497616eSJim Harris extern struct dpdk_fn_table fn_table_2211; 1353cd692bSJim Harris 14936726f8SJim Harris static struct dpdk_fn_table *g_dpdk_fn_table; 15936726f8SJim Harris 16936726f8SJim Harris int 17936726f8SJim Harris dpdk_pci_init(void) 18936726f8SJim Harris { 193d5971ecSJim Harris uint32_t year; 203d5971ecSJim Harris uint32_t month; 213d5971ecSJim Harris uint32_t minor; 22d33042fbSTomasz Zawadzki char release[32] = {0}; /* Max size of DPDK version string */ 233d5971ecSJim Harris int count; 243d5971ecSJim Harris 25d33042fbSTomasz Zawadzki count = sscanf(rte_version(), "DPDK %u.%u.%u%s", &year, &month, &minor, release); 26d33042fbSTomasz Zawadzki if (count != 3 && count != 4) { 273d5971ecSJim Harris SPDK_ERRLOG("Unrecognized DPDK version format '%s'\n", rte_version()); 283d5971ecSJim Harris return -EINVAL; 293d5971ecSJim Harris } 30936726f8SJim Harris 31d62a3810STomasz Zawadzki /* Add support for DPDK main branch, should be updated after each new release. 32d33042fbSTomasz Zawadzki * Only DPDK in development has additional suffix past minor version. 3332e6ffb5STomasz Zawadzki */ 34d33042fbSTomasz Zawadzki if (strlen(release) != 0) { 3524813ed4SKonrad Sztyber if (year == 24 && month == 11 && minor == 0) { 3632e6ffb5STomasz Zawadzki g_dpdk_fn_table = &fn_table_2211; 37d62a3810STomasz Zawadzki SPDK_NOTICELOG("In-development %s is used. There is no support for it in SPDK. " 38d62a3810STomasz Zawadzki "Enabled only for validation.\n", rte_version()); 3932e6ffb5STomasz Zawadzki return 0; 4032e6ffb5STomasz Zawadzki } 4132e6ffb5STomasz Zawadzki } 4232e6ffb5STomasz Zawadzki 43ce5116fbSJaroslaw /* Anything 25.x or higher is not supported. */ 44ce5116fbSJaroslaw if (year >= 25) { 45936726f8SJim Harris SPDK_ERRLOG("DPDK version %d.%02d.%d not supported.\n", year, month, minor); 46936726f8SJim Harris return -EINVAL; 47936726f8SJim Harris } 48936726f8SJim Harris 495497616eSJim Harris if (year == 22 && month == 11) { 5019a11e7eSTomasz Zawadzki if (minor > 4) { 515497616eSJim Harris /* It is possible that LTS minor release changed private ABI, so we 525497616eSJim Harris * cannot assume fn_table_2211 works for minor releases. As 22.11 535497616eSJim Harris * minor releases occur, this will need to be updated to either affirm 545497616eSJim Harris * no ABI changes for the minor release, or add new header files and 555497616eSJim Harris * pci_dpdk_xxx.c implementation for the new minor release. 565497616eSJim Harris */ 575497616eSJim Harris SPDK_ERRLOG("DPDK LTS version 22.11.%d not supported.\n", minor); 58936726f8SJim Harris return -EINVAL; 59936726f8SJim Harris } 605497616eSJim Harris g_dpdk_fn_table = &fn_table_2211; 614282294bSKonrad Sztyber } else if (year == 23) { 62c47b9b42STomasz Zawadzki /* Only 23.11.0, 23.07.0 and 23.03.0 are supported. */ 63c47b9b42STomasz Zawadzki if ((month != 11 || minor != 0) && 64c47b9b42STomasz Zawadzki (month != 7 || minor != 0) && 65396e6facSTomasz Zawadzki (month != 3 || minor != 0)) { 664282294bSKonrad Sztyber SPDK_ERRLOG("DPDK version 23.%02d.%d is not supported.\n", month, minor); 674282294bSKonrad Sztyber return -EINVAL; 684282294bSKonrad Sztyber } 69c47b9b42STomasz Zawadzki /* There were no changes between 22.11 and 23.11, so use the 22.11 implementation. */ 704282294bSKonrad Sztyber g_dpdk_fn_table = &fn_table_2211; 71ce5116fbSJaroslaw } else if (year == 24) { 7248c41d94SKonrad Sztyber /* Only 24.03.0 and 24.07.0 are supported. */ 7348c41d94SKonrad Sztyber if ((month != 7 || minor != 0) && 7448c41d94SKonrad Sztyber (month != 3 || minor != 0)) { 75ce5116fbSJaroslaw SPDK_ERRLOG("DPDK version 24.%02d.%d is not supported.\n", month, minor); 76ce5116fbSJaroslaw return -EINVAL; 77ce5116fbSJaroslaw } 7848c41d94SKonrad Sztyber /* There were no changes between 22.11 and 24.*, so use the 22.11 implementation. */ 79ce5116fbSJaroslaw g_dpdk_fn_table = &fn_table_2211; 80181143ccSKonrad Sztyber } else if (year < 21 || (year == 21 && month < 11)) { 81181143ccSKonrad Sztyber SPDK_ERRLOG("DPDK version %02d.%02d.%d is not supported.\n", year, month, minor); 82181143ccSKonrad Sztyber return -EINVAL; 835497616eSJim Harris } else { 84936726f8SJim Harris /* Everything else we use the 22.07 implementation. */ 85936726f8SJim Harris g_dpdk_fn_table = &fn_table_2207; 865497616eSJim Harris } 87936726f8SJim Harris return 0; 88936726f8SJim Harris } 8953cd692bSJim Harris 90c7f50109SJim Harris struct rte_mem_resource * 91c7f50109SJim Harris dpdk_pci_device_get_mem_resource(struct rte_pci_device *dev, uint32_t bar) 9253cd692bSJim Harris { 93c7f50109SJim Harris return g_dpdk_fn_table->pci_device_get_mem_resource(dev, bar); 9453cd692bSJim Harris } 9553cd692bSJim Harris 9653cd692bSJim Harris const char * 9753cd692bSJim Harris dpdk_pci_device_get_name(struct rte_pci_device *rte_dev) 9853cd692bSJim Harris { 9953cd692bSJim Harris return g_dpdk_fn_table->pci_device_get_name(rte_dev); 10053cd692bSJim Harris } 10153cd692bSJim Harris 10253cd692bSJim Harris struct rte_devargs * 10353cd692bSJim Harris dpdk_pci_device_get_devargs(struct rte_pci_device *rte_dev) 10453cd692bSJim Harris { 10553cd692bSJim Harris return g_dpdk_fn_table->pci_device_get_devargs(rte_dev); 10653cd692bSJim Harris } 10753cd692bSJim Harris 1085be703efSJim Harris struct rte_pci_addr * 1095be703efSJim Harris dpdk_pci_device_get_addr(struct rte_pci_device *rte_dev) 11053cd692bSJim Harris { 1115be703efSJim Harris return g_dpdk_fn_table->pci_device_get_addr(rte_dev); 1125be703efSJim Harris } 1135be703efSJim Harris 1145be703efSJim Harris struct rte_pci_id * 1155be703efSJim Harris dpdk_pci_device_get_id(struct rte_pci_device *rte_dev) 1165be703efSJim Harris { 1175be703efSJim Harris return g_dpdk_fn_table->pci_device_get_id(rte_dev); 1185be703efSJim Harris } 1195be703efSJim Harris 1205be703efSJim Harris int 1215be703efSJim Harris dpdk_pci_device_get_numa_node(struct rte_pci_device *_dev) 1225be703efSJim Harris { 1235be703efSJim Harris return g_dpdk_fn_table->pci_device_get_numa_node(_dev); 12453cd692bSJim Harris } 12553cd692bSJim Harris 12653cd692bSJim Harris int 12753cd692bSJim Harris dpdk_pci_device_read_config(struct rte_pci_device *dev, void *value, uint32_t len, uint32_t offset) 12853cd692bSJim Harris { 12953cd692bSJim Harris return g_dpdk_fn_table->pci_device_read_config(dev, value, len, offset); 13053cd692bSJim Harris } 13153cd692bSJim Harris 13253cd692bSJim Harris int 13353cd692bSJim Harris dpdk_pci_device_write_config(struct rte_pci_device *dev, void *value, uint32_t len, uint32_t offset) 13453cd692bSJim Harris { 13553cd692bSJim Harris return g_dpdk_fn_table->pci_device_write_config(dev, value, len, offset); 13653cd692bSJim Harris } 13753cd692bSJim Harris 13853cd692bSJim Harris int 13953cd692bSJim Harris dpdk_pci_driver_register(struct spdk_pci_driver *driver, 14053cd692bSJim Harris int (*probe_fn)(struct rte_pci_driver *driver, struct rte_pci_device *device), 14153cd692bSJim Harris int (*remove_fn)(struct rte_pci_device *device)) 14253cd692bSJim Harris 14353cd692bSJim Harris { 14453cd692bSJim Harris return g_dpdk_fn_table->pci_driver_register(driver, probe_fn, remove_fn); 14553cd692bSJim Harris } 14653cd692bSJim Harris 14753cd692bSJim Harris int 14853cd692bSJim Harris dpdk_pci_device_enable_interrupt(struct rte_pci_device *rte_dev) 14953cd692bSJim Harris { 15053cd692bSJim Harris return g_dpdk_fn_table->pci_device_enable_interrupt(rte_dev); 15153cd692bSJim Harris } 15253cd692bSJim Harris 15353cd692bSJim Harris int 15453cd692bSJim Harris dpdk_pci_device_disable_interrupt(struct rte_pci_device *rte_dev) 15553cd692bSJim Harris { 15653cd692bSJim Harris return g_dpdk_fn_table->pci_device_disable_interrupt(rte_dev); 15753cd692bSJim Harris } 15853cd692bSJim Harris 15953cd692bSJim Harris int 16053cd692bSJim Harris dpdk_pci_device_get_interrupt_efd(struct rte_pci_device *rte_dev) 16153cd692bSJim Harris { 16253cd692bSJim Harris return g_dpdk_fn_table->pci_device_get_interrupt_efd(rte_dev); 16353cd692bSJim Harris } 16453cd692bSJim Harris 16511313c20SJim Harris int 166*00715c7cSAnkit Kumar dpdk_pci_device_create_interrupt_efds(struct rte_pci_device *rte_dev, uint32_t count) 167*00715c7cSAnkit Kumar { 168*00715c7cSAnkit Kumar return g_dpdk_fn_table->pci_device_create_interrupt_efds(rte_dev, count); 169*00715c7cSAnkit Kumar } 170*00715c7cSAnkit Kumar 171*00715c7cSAnkit Kumar void 172*00715c7cSAnkit Kumar dpdk_pci_device_delete_interrupt_efds(struct rte_pci_device *rte_dev) 173*00715c7cSAnkit Kumar { 174*00715c7cSAnkit Kumar g_dpdk_fn_table->pci_device_delete_interrupt_efds(rte_dev); 175*00715c7cSAnkit Kumar } 176*00715c7cSAnkit Kumar 177*00715c7cSAnkit Kumar int 178*00715c7cSAnkit Kumar dpdk_pci_device_get_interrupt_efd_by_index(struct rte_pci_device *rte_dev, uint32_t index) 179*00715c7cSAnkit Kumar { 180*00715c7cSAnkit Kumar return g_dpdk_fn_table->pci_device_get_interrupt_efd_by_index(rte_dev, index); 181*00715c7cSAnkit Kumar } 182*00715c7cSAnkit Kumar 183*00715c7cSAnkit Kumar int 184*00715c7cSAnkit Kumar dpdk_pci_device_interrupt_cap_multi(struct rte_pci_device *rte_dev) 185*00715c7cSAnkit Kumar { 186*00715c7cSAnkit Kumar return g_dpdk_fn_table->pci_device_interrupt_cap_multi(rte_dev); 187*00715c7cSAnkit Kumar } 188*00715c7cSAnkit Kumar 189*00715c7cSAnkit Kumar int 19011313c20SJim Harris dpdk_bus_probe(void) 19111313c20SJim Harris { 19253cd692bSJim Harris return g_dpdk_fn_table->bus_probe(); 19311313c20SJim Harris } 19411313c20SJim Harris 19511313c20SJim Harris void 19611313c20SJim Harris dpdk_bus_scan(void) 19711313c20SJim Harris { 19853cd692bSJim Harris g_dpdk_fn_table->bus_scan(); 19911313c20SJim Harris } 20011313c20SJim Harris 20111313c20SJim Harris struct rte_devargs * 20211313c20SJim Harris dpdk_device_get_devargs(struct rte_device *dev) 20311313c20SJim Harris { 20453cd692bSJim Harris return g_dpdk_fn_table->device_get_devargs(dev); 20511313c20SJim Harris } 20611313c20SJim Harris 20711313c20SJim Harris void 20811313c20SJim Harris dpdk_device_set_devargs(struct rte_device *dev, struct rte_devargs *devargs) 20911313c20SJim Harris { 21053cd692bSJim Harris g_dpdk_fn_table->device_set_devargs(dev, devargs); 21111313c20SJim Harris } 21211313c20SJim Harris 21311313c20SJim Harris const char * 21411313c20SJim Harris dpdk_device_get_name(struct rte_device *dev) 21511313c20SJim Harris { 21653cd692bSJim Harris return g_dpdk_fn_table->device_get_name(dev); 21711313c20SJim Harris } 21811313c20SJim Harris 21911313c20SJim Harris bool 22011313c20SJim Harris dpdk_device_scan_allowed(struct rte_device *dev) 22111313c20SJim Harris { 22253cd692bSJim Harris return g_dpdk_fn_table->device_scan_allowed(dev); 22311313c20SJim Harris } 224