xref: /spdk/lib/env_dpdk/pci_dpdk.c (revision a1dfa7ec92a6c49538482c8bb73f0b1ce040441f)
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 == 3 && minor == 0) {
36 			g_dpdk_fn_table = &fn_table_2211;
37 			SPDK_NOTICELOG("DPDK version 23.03.0 not supported yet. Enabled only for validation.\n");
38 			return 0;
39 		}
40 	}
41 
42 	/* Anything 23.x or higher is not supported. */
43 	if (year > 22) {
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 {
61 		/* Everything else we use the 22.07 implementation. */
62 		g_dpdk_fn_table = &fn_table_2207;
63 	}
64 	return 0;
65 }
66 
67 struct rte_mem_resource *
68 dpdk_pci_device_get_mem_resource(struct rte_pci_device *dev, uint32_t bar)
69 {
70 	return g_dpdk_fn_table->pci_device_get_mem_resource(dev, bar);
71 }
72 
73 const char *
74 dpdk_pci_device_get_name(struct rte_pci_device *rte_dev)
75 {
76 	return g_dpdk_fn_table->pci_device_get_name(rte_dev);
77 }
78 
79 struct rte_devargs *
80 dpdk_pci_device_get_devargs(struct rte_pci_device *rte_dev)
81 {
82 	return g_dpdk_fn_table->pci_device_get_devargs(rte_dev);
83 }
84 
85 struct rte_pci_addr *
86 dpdk_pci_device_get_addr(struct rte_pci_device *rte_dev)
87 {
88 	return g_dpdk_fn_table->pci_device_get_addr(rte_dev);
89 }
90 
91 struct rte_pci_id *
92 dpdk_pci_device_get_id(struct rte_pci_device *rte_dev)
93 {
94 	return g_dpdk_fn_table->pci_device_get_id(rte_dev);
95 }
96 
97 int
98 dpdk_pci_device_get_numa_node(struct rte_pci_device *_dev)
99 {
100 	return g_dpdk_fn_table->pci_device_get_numa_node(_dev);
101 }
102 
103 int
104 dpdk_pci_device_read_config(struct rte_pci_device *dev, void *value, uint32_t len, uint32_t offset)
105 {
106 	return g_dpdk_fn_table->pci_device_read_config(dev, value, len, offset);
107 }
108 
109 int
110 dpdk_pci_device_write_config(struct rte_pci_device *dev, void *value, uint32_t len, uint32_t offset)
111 {
112 	return g_dpdk_fn_table->pci_device_write_config(dev, value, len, offset);
113 }
114 
115 int
116 dpdk_pci_driver_register(struct spdk_pci_driver *driver,
117 			 int (*probe_fn)(struct rte_pci_driver *driver, struct rte_pci_device *device),
118 			 int (*remove_fn)(struct rte_pci_device *device))
119 
120 {
121 	return g_dpdk_fn_table->pci_driver_register(driver, probe_fn, remove_fn);
122 }
123 
124 int
125 dpdk_pci_device_enable_interrupt(struct rte_pci_device *rte_dev)
126 {
127 	return g_dpdk_fn_table->pci_device_enable_interrupt(rte_dev);
128 }
129 
130 int
131 dpdk_pci_device_disable_interrupt(struct rte_pci_device *rte_dev)
132 {
133 	return g_dpdk_fn_table->pci_device_disable_interrupt(rte_dev);
134 }
135 
136 int
137 dpdk_pci_device_get_interrupt_efd(struct rte_pci_device *rte_dev)
138 {
139 	return g_dpdk_fn_table->pci_device_get_interrupt_efd(rte_dev);
140 }
141 
142 int
143 dpdk_bus_probe(void)
144 {
145 	return g_dpdk_fn_table->bus_probe();
146 }
147 
148 void
149 dpdk_bus_scan(void)
150 {
151 	g_dpdk_fn_table->bus_scan();
152 }
153 
154 struct rte_devargs *
155 dpdk_device_get_devargs(struct rte_device *dev)
156 {
157 	return g_dpdk_fn_table->device_get_devargs(dev);
158 }
159 
160 void
161 dpdk_device_set_devargs(struct rte_device *dev, struct rte_devargs *devargs)
162 {
163 	g_dpdk_fn_table->device_set_devargs(dev, devargs);
164 }
165 
166 const char *
167 dpdk_device_get_name(struct rte_device *dev)
168 {
169 	return g_dpdk_fn_table->device_get_name(dev);
170 }
171 
172 bool
173 dpdk_device_scan_allowed(struct rte_device *dev)
174 {
175 	return g_dpdk_fn_table->device_scan_allowed(dev);
176 }
177