env_dpdk: add dpdk_pci_init()

This checks the current version to make sure we have
a dpdk_fn_table that supports it.

This is easy for now, since the DPDK PCI API is
public.  Moving forward, DPDK 22.11 will likely make
these APIs private, requiring us to carry header file
copies for different DPDK versions so that we can
not only build against DPDK but also use the correct
data strucures and APIs to interact with those private
DPDK interfaces.  We will also need to consider
minor (i.e. stable or point) releases since they
could technically change PCI ABI as well - the current
year + month checks won't be sufficient.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: Ic9f41d9d13778f3d078b20b08da48d8d16362b11
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14637
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Jim Harris 2022-09-22 01:04:36 +00:00 committed by Tomasz Zawadzki
parent 52c674d23a
commit 936726f847
3 changed files with 34 additions and 1 deletions

View File

@ -300,6 +300,12 @@ int
pci_env_init(void)
{
struct spdk_pci_driver *driver;
int rc;
rc = dpdk_pci_init();
if (rc) {
return rc;
}
TAILQ_FOREACH(driver, &g_pci_drivers, tailq) {
dpdk_pci_driver_register(driver, pci_device_init, pci_device_fini);

View File

@ -6,10 +6,35 @@
#include <rte_config.h>
#include <rte_version.h>
#include "pci_dpdk.h"
#include "spdk/log.h"
extern struct dpdk_fn_table fn_table_2207;
static struct dpdk_fn_table *g_dpdk_fn_table = &fn_table_2207;
static struct dpdk_fn_table *g_dpdk_fn_table;
int
dpdk_pci_init(void)
{
uint32_t year = rte_version_year();
uint32_t month = rte_version_month();
uint32_t minor = rte_version_minor();
/* Anything 23.x or higher is not supported. */
if (year > 22) {
SPDK_ERRLOG("DPDK version %d.%02d.%d not supported.\n", year, month, minor);
return -EINVAL;
}
/* Anything greater than 22.07 is not supported. */
if (year == 22 && month > 7) {
SPDK_ERRLOG("DPDK version %d.%02d.%d not supported.\n", year, month, minor);
return -EINVAL;
}
/* Everything else we use the 22.07 implementation. */
g_dpdk_fn_table = &fn_table_2207;
return 0;
}
uint64_t
dpdk_pci_device_vtophys(struct rte_pci_device *dev, uint64_t vaddr)

View File

@ -50,6 +50,8 @@ struct dpdk_fn_table {
bool (*device_scan_allowed)(struct rte_device *dev);
};
int dpdk_pci_init(void);
uint64_t dpdk_pci_device_vtophys(struct rte_pci_device *dev, uint64_t vaddr);
const char *dpdk_pci_device_get_name(struct rte_pci_device *);
struct rte_devargs *dpdk_pci_device_get_devargs(struct rte_pci_device *);