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