xref: /spdk/lib/env_dpdk/pci_dpdk.c (revision 00715c7c87f9558be1aa4aaef327a611aa9ff5b6)
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