xref: /spdk/lib/env_dpdk/pci_dpdk.c (revision 307b8c112ffd90a26d53dd15fad67bd9038ef526)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (c) 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 
13 static struct dpdk_fn_table *g_dpdk_fn_table;
14 
15 int
16 dpdk_pci_init(void)
17 {
18 	uint32_t year;
19 	uint32_t month;
20 	uint32_t minor;
21 	int count;
22 
23 	count = sscanf(rte_version(), "DPDK %u.%u.%u", &year, &month, &minor);
24 	if (count != 3) {
25 		SPDK_ERRLOG("Unrecognized DPDK version format '%s'\n", rte_version());
26 		return -EINVAL;
27 	}
28 
29 	/* Anything 23.x or higher is not supported. */
30 	if (year > 22) {
31 		SPDK_ERRLOG("DPDK version %d.%02d.%d not supported.\n", year, month, minor);
32 		return -EINVAL;
33 	}
34 
35 	/* Anything greater than 22.07 is not supported. */
36 	if (year == 22 && month > 7) {
37 		SPDK_ERRLOG("DPDK version %d.%02d.%d not supported.\n", year, month, minor);
38 		return -EINVAL;
39 	}
40 
41 	/* Everything else we use the 22.07 implementation. */
42 	g_dpdk_fn_table = &fn_table_2207;
43 	return 0;
44 }
45 
46 struct rte_mem_resource *
47 dpdk_pci_device_get_mem_resource(struct rte_pci_device *dev, uint32_t bar)
48 {
49 	return g_dpdk_fn_table->pci_device_get_mem_resource(dev, bar);
50 }
51 
52 const char *
53 dpdk_pci_device_get_name(struct rte_pci_device *rte_dev)
54 {
55 	return g_dpdk_fn_table->pci_device_get_name(rte_dev);
56 }
57 
58 struct rte_devargs *
59 dpdk_pci_device_get_devargs(struct rte_pci_device *rte_dev)
60 {
61 	return g_dpdk_fn_table->pci_device_get_devargs(rte_dev);
62 }
63 
64 struct rte_pci_addr *
65 dpdk_pci_device_get_addr(struct rte_pci_device *rte_dev)
66 {
67 	return g_dpdk_fn_table->pci_device_get_addr(rte_dev);
68 }
69 
70 struct rte_pci_id *
71 dpdk_pci_device_get_id(struct rte_pci_device *rte_dev)
72 {
73 	return g_dpdk_fn_table->pci_device_get_id(rte_dev);
74 }
75 
76 int
77 dpdk_pci_device_get_numa_node(struct rte_pci_device *_dev)
78 {
79 	return g_dpdk_fn_table->pci_device_get_numa_node(_dev);
80 }
81 
82 int
83 dpdk_pci_device_read_config(struct rte_pci_device *dev, void *value, uint32_t len, uint32_t offset)
84 {
85 	return g_dpdk_fn_table->pci_device_read_config(dev, value, len, offset);
86 }
87 
88 int
89 dpdk_pci_device_write_config(struct rte_pci_device *dev, void *value, uint32_t len, uint32_t offset)
90 {
91 	return g_dpdk_fn_table->pci_device_write_config(dev, value, len, offset);
92 }
93 
94 int
95 dpdk_pci_driver_register(struct spdk_pci_driver *driver,
96 			 int (*probe_fn)(struct rte_pci_driver *driver, struct rte_pci_device *device),
97 			 int (*remove_fn)(struct rte_pci_device *device))
98 
99 {
100 	return g_dpdk_fn_table->pci_driver_register(driver, probe_fn, remove_fn);
101 }
102 
103 int
104 dpdk_pci_device_enable_interrupt(struct rte_pci_device *rte_dev)
105 {
106 	return g_dpdk_fn_table->pci_device_enable_interrupt(rte_dev);
107 }
108 
109 int
110 dpdk_pci_device_disable_interrupt(struct rte_pci_device *rte_dev)
111 {
112 	return g_dpdk_fn_table->pci_device_disable_interrupt(rte_dev);
113 }
114 
115 int
116 dpdk_pci_device_get_interrupt_efd(struct rte_pci_device *rte_dev)
117 {
118 	return g_dpdk_fn_table->pci_device_get_interrupt_efd(rte_dev);
119 }
120 
121 int
122 dpdk_bus_probe(void)
123 {
124 	return g_dpdk_fn_table->bus_probe();
125 }
126 
127 void
128 dpdk_bus_scan(void)
129 {
130 	g_dpdk_fn_table->bus_scan();
131 }
132 
133 struct rte_devargs *
134 dpdk_device_get_devargs(struct rte_device *dev)
135 {
136 	return g_dpdk_fn_table->device_get_devargs(dev);
137 }
138 
139 void
140 dpdk_device_set_devargs(struct rte_device *dev, struct rte_devargs *devargs)
141 {
142 	g_dpdk_fn_table->device_set_devargs(dev, devargs);
143 }
144 
145 const char *
146 dpdk_device_get_name(struct rte_device *dev)
147 {
148 	return g_dpdk_fn_table->device_get_name(dev);
149 }
150 
151 bool
152 dpdk_device_scan_allowed(struct rte_device *dev)
153 {
154 	return g_dpdk_fn_table->device_scan_allowed(dev);
155 }
156