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