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