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