xref: /spdk/lib/env_dpdk/pci_dpdk.c (revision 838e61c3772fdefb17e1a0b8f9880e2bcb9c4c0d)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2022 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include <rte_config.h>
7 #include <rte_version.h>
8 #include "pci_dpdk.h"
9 #include "spdk/log.h"
10 
11 extern struct dpdk_fn_table fn_table_2207;
12 extern struct dpdk_fn_table fn_table_2211;
13 
14 static struct dpdk_fn_table *g_dpdk_fn_table;
15 
16 int
17 dpdk_pci_init(void)
18 {
19 	uint32_t year;
20 	uint32_t month;
21 	uint32_t minor;
22 	char release[32] = {0}; /* Max size of DPDK version string */
23 	int count;
24 
25 	count = sscanf(rte_version(), "DPDK %u.%u.%u%s", &year, &month, &minor, release);
26 	if (count != 3 && count != 4) {
27 		SPDK_ERRLOG("Unrecognized DPDK version format '%s'\n", rte_version());
28 		return -EINVAL;
29 	}
30 
31 	/* Add support for DPDK main branch.
32 	 * Only DPDK in development has additional suffix past minor version.
33 	 */
34 	if (strlen(release) != 0) {
35 		if (year == 23 && month == 7 && minor == 0) {
36 			g_dpdk_fn_table = &fn_table_2211;
37 			SPDK_NOTICELOG("DPDK version 23.07.0 not supported yet. Enabled only for validation.\n");
38 			return 0;
39 		}
40 	}
41 
42 	/* Anything 24.x or higher is not supported. */
43 	if (year > 23) {
44 		SPDK_ERRLOG("DPDK version %d.%02d.%d not supported.\n", year, month, minor);
45 		return -EINVAL;
46 	}
47 
48 	if (year == 22 && month == 11) {
49 		if (minor > 1) {
50 			/* It is possible that LTS minor release changed private ABI, so we
51 			 * cannot assume fn_table_2211 works for minor releases.  As 22.11
52 			 * minor releases occur, this will need to be updated to either affirm
53 			 * no ABI changes for the minor release, or add new header files and
54 			 * pci_dpdk_xxx.c implementation for the new minor release.
55 			 */
56 			SPDK_ERRLOG("DPDK LTS version 22.11.%d not supported.\n", minor);
57 			return -EINVAL;
58 		}
59 		g_dpdk_fn_table = &fn_table_2211;
60 	} else if (year == 23) {
61 		/* Only 23.03.0 is supported */
62 		if (month != 3 || minor != 0) {
63 			SPDK_ERRLOG("DPDK version 23.%02d.%d is not supported.\n", month, minor);
64 			return -EINVAL;
65 		}
66 		/* There were no changes between 22.11 and 23.03, so use the 22.11 implementation */
67 		g_dpdk_fn_table = &fn_table_2211;
68 	} else {
69 		/* Everything else we use the 22.07 implementation. */
70 		g_dpdk_fn_table = &fn_table_2207;
71 	}
72 	return 0;
73 }
74 
75 struct rte_mem_resource *
76 dpdk_pci_device_get_mem_resource(struct rte_pci_device *dev, uint32_t bar)
77 {
78 	return g_dpdk_fn_table->pci_device_get_mem_resource(dev, bar);
79 }
80 
81 const char *
82 dpdk_pci_device_get_name(struct rte_pci_device *rte_dev)
83 {
84 	return g_dpdk_fn_table->pci_device_get_name(rte_dev);
85 }
86 
87 struct rte_devargs *
88 dpdk_pci_device_get_devargs(struct rte_pci_device *rte_dev)
89 {
90 	return g_dpdk_fn_table->pci_device_get_devargs(rte_dev);
91 }
92 
93 struct rte_pci_addr *
94 dpdk_pci_device_get_addr(struct rte_pci_device *rte_dev)
95 {
96 	return g_dpdk_fn_table->pci_device_get_addr(rte_dev);
97 }
98 
99 struct rte_pci_id *
100 dpdk_pci_device_get_id(struct rte_pci_device *rte_dev)
101 {
102 	return g_dpdk_fn_table->pci_device_get_id(rte_dev);
103 }
104 
105 int
106 dpdk_pci_device_get_numa_node(struct rte_pci_device *_dev)
107 {
108 	return g_dpdk_fn_table->pci_device_get_numa_node(_dev);
109 }
110 
111 int
112 dpdk_pci_device_read_config(struct rte_pci_device *dev, void *value, uint32_t len, uint32_t offset)
113 {
114 	return g_dpdk_fn_table->pci_device_read_config(dev, value, len, offset);
115 }
116 
117 int
118 dpdk_pci_device_write_config(struct rte_pci_device *dev, void *value, uint32_t len, uint32_t offset)
119 {
120 	return g_dpdk_fn_table->pci_device_write_config(dev, value, len, offset);
121 }
122 
123 int
124 dpdk_pci_driver_register(struct spdk_pci_driver *driver,
125 			 int (*probe_fn)(struct rte_pci_driver *driver, struct rte_pci_device *device),
126 			 int (*remove_fn)(struct rte_pci_device *device))
127 
128 {
129 	return g_dpdk_fn_table->pci_driver_register(driver, probe_fn, remove_fn);
130 }
131 
132 int
133 dpdk_pci_device_enable_interrupt(struct rte_pci_device *rte_dev)
134 {
135 	return g_dpdk_fn_table->pci_device_enable_interrupt(rte_dev);
136 }
137 
138 int
139 dpdk_pci_device_disable_interrupt(struct rte_pci_device *rte_dev)
140 {
141 	return g_dpdk_fn_table->pci_device_disable_interrupt(rte_dev);
142 }
143 
144 int
145 dpdk_pci_device_get_interrupt_efd(struct rte_pci_device *rte_dev)
146 {
147 	return g_dpdk_fn_table->pci_device_get_interrupt_efd(rte_dev);
148 }
149 
150 int
151 dpdk_bus_probe(void)
152 {
153 	return g_dpdk_fn_table->bus_probe();
154 }
155 
156 void
157 dpdk_bus_scan(void)
158 {
159 	g_dpdk_fn_table->bus_scan();
160 }
161 
162 struct rte_devargs *
163 dpdk_device_get_devargs(struct rte_device *dev)
164 {
165 	return g_dpdk_fn_table->device_get_devargs(dev);
166 }
167 
168 void
169 dpdk_device_set_devargs(struct rte_device *dev, struct rte_devargs *devargs)
170 {
171 	g_dpdk_fn_table->device_set_devargs(dev, devargs);
172 }
173 
174 const char *
175 dpdk_device_get_name(struct rte_device *dev)
176 {
177 	return g_dpdk_fn_table->device_get_name(dev);
178 }
179 
180 bool
181 dpdk_device_scan_allowed(struct rte_device *dev)
182 {
183 	return g_dpdk_fn_table->device_scan_allowed(dev);
184 }
185