Commit 936726f8 authored by Jim Harris's avatar Jim Harris Committed by Tomasz Zawadzki
Browse files

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: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: Ic9f41d9d13778f3d078b20b08da48d8d16362b11
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14637


Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 52c674d2
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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);
+26 −1
Original line number Diff line number Diff line
@@ -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)
+2 −0
Original line number Diff line number Diff line
@@ -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 *);