Commit 00715c7c authored by Ankit Kumar's avatar Ankit Kumar Committed by Konrad Sztyber
Browse files

env_dpdk: add required APIs to handle interrupt



Add the necessary interfaces to create and delete eventfds, and to fetch
it for a particular index. These are required to enable and disable
multiple interrupts for pcie nvme devices.
As only VFIO MSIX supports multiple interrupt vectors, added an
interface to check the same.

Change-Id: Iaa463c9fdc76ce01d66236ce5fb3d89c9bc6146f
Signed-off-by: default avatarAnkit Kumar <ankit.kumar@samsung.com>
Signed-off-by: default avatarLiu, Xiaodong <xiaodong.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24902


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent c9f2ea22
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -162,6 +162,30 @@ dpdk_pci_device_get_interrupt_efd(struct rte_pci_device *rte_dev)
	return g_dpdk_fn_table->pci_device_get_interrupt_efd(rte_dev);
}

int
dpdk_pci_device_create_interrupt_efds(struct rte_pci_device *rte_dev, uint32_t count)
{
	return g_dpdk_fn_table->pci_device_create_interrupt_efds(rte_dev, count);
}

void
dpdk_pci_device_delete_interrupt_efds(struct rte_pci_device *rte_dev)
{
	g_dpdk_fn_table->pci_device_delete_interrupt_efds(rte_dev);
}

int
dpdk_pci_device_get_interrupt_efd_by_index(struct rte_pci_device *rte_dev, uint32_t index)
{
	return g_dpdk_fn_table->pci_device_get_interrupt_efd_by_index(rte_dev, index);
}

int
dpdk_pci_device_interrupt_cap_multi(struct rte_pci_device *rte_dev)
{
	return g_dpdk_fn_table->pci_device_interrupt_cap_multi(rte_dev);
}

int
dpdk_bus_probe(void)
{
+8 −0
Original line number Diff line number Diff line
@@ -42,6 +42,10 @@ struct dpdk_fn_table {
	int (*pci_device_enable_interrupt)(struct rte_pci_device *rte_dev);
	int (*pci_device_disable_interrupt)(struct rte_pci_device *rte_dev);
	int (*pci_device_get_interrupt_efd)(struct rte_pci_device *rte_dev);
	int (*pci_device_create_interrupt_efds)(struct rte_pci_device *rte_dev, uint32_t count);
	void (*pci_device_delete_interrupt_efds)(struct rte_pci_device *rte_dev);
	int (*pci_device_get_interrupt_efd_by_index)(struct rte_pci_device *rte_dev, uint32_t index);
	int (*pci_device_interrupt_cap_multi)(struct rte_pci_device *rte_dev);
	void (*bus_scan)(void);
	int (*bus_probe)(void);
	struct rte_devargs *(*device_get_devargs)(struct rte_device *dev);
@@ -69,6 +73,10 @@ int dpdk_pci_driver_register(struct spdk_pci_driver *driver,
int dpdk_pci_device_enable_interrupt(struct rte_pci_device *rte_dev);
int dpdk_pci_device_disable_interrupt(struct rte_pci_device *rte_dev);
int dpdk_pci_device_get_interrupt_efd(struct rte_pci_device *rte_dev);
int dpdk_pci_device_create_interrupt_efds(struct rte_pci_device *rte_dev, uint32_t count);
void dpdk_pci_device_delete_interrupt_efds(struct rte_pci_device *rte_dev);
int dpdk_pci_device_get_interrupt_efd_by_index(struct rte_pci_device *rte_dev, uint32_t index);
int dpdk_pci_device_interrupt_cap_multi(struct rte_pci_device *rte_dev);
void dpdk_bus_scan(void);
int dpdk_bus_probe(void);
struct rte_devargs *dpdk_device_get_devargs(struct rte_device *dev);
+29 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
 *   All rights reserved.
 */

#define ALLOW_INTERNAL_API
#include <rte_config.h>
#include <rte_version.h>
#include "pci_dpdk.h"
@@ -162,6 +163,30 @@ pci_device_get_interrupt_efd_2207(struct rte_pci_device *rte_dev)
	return rte_intr_fd_get(rte_dev->intr_handle);
}

static int
pci_device_create_interrupt_efds_2207(struct rte_pci_device *rte_dev, uint32_t count)
{
	return rte_intr_efd_enable(rte_dev->intr_handle, count);
}

static void
pci_device_delete_interrupt_efds_2207(struct rte_pci_device *rte_dev)
{
	return rte_intr_efd_disable(rte_dev->intr_handle);
}

static int
pci_device_get_interrupt_efd_by_index_2207(struct rte_pci_device *rte_dev, uint32_t index)
{
	return rte_intr_efds_index_get(rte_dev->intr_handle, index);
}

static int
pci_device_interrupt_cap_multi_2207(struct rte_pci_device *rte_dev)
{
	return rte_intr_cap_multiple(rte_dev->intr_handle);
}

static int
bus_probe_2207(void)
{
@@ -211,6 +236,10 @@ struct dpdk_fn_table fn_table_2207 = {
	.pci_device_enable_interrupt	= pci_device_enable_interrupt_2207,
	.pci_device_disable_interrupt	= pci_device_disable_interrupt_2207,
	.pci_device_get_interrupt_efd	= pci_device_get_interrupt_efd_2207,
	.pci_device_create_interrupt_efds = pci_device_create_interrupt_efds_2207,
	.pci_device_delete_interrupt_efds = pci_device_delete_interrupt_efds_2207,
	.pci_device_get_interrupt_efd_by_index = pci_device_get_interrupt_efd_by_index_2207,
	.pci_device_interrupt_cap_multi	= pci_device_interrupt_cap_multi_2207,
	.bus_scan			= bus_scan_2207,
	.bus_probe			= bus_probe_2207,
	.device_get_devargs		= device_get_devargs_2207,
+28 −0
Original line number Diff line number Diff line
@@ -170,6 +170,30 @@ pci_device_get_interrupt_efd_2211(struct rte_pci_device *rte_dev)
	return rte_intr_fd_get(rte_dev->intr_handle);
}

static int
pci_device_create_interrupt_efds_2211(struct rte_pci_device *rte_dev, uint32_t count)
{
	return rte_intr_efd_enable(rte_dev->intr_handle, count);
}

static void
pci_device_delete_interrupt_efds_2211(struct rte_pci_device *rte_dev)
{
	return rte_intr_efd_disable(rte_dev->intr_handle);
}

static int
pci_device_get_interrupt_efd_by_index_2211(struct rte_pci_device *rte_dev, uint32_t index)
{
	return rte_intr_efds_index_get(rte_dev->intr_handle, index);
}

static int
pci_device_interrupt_cap_multi_2211(struct rte_pci_device *rte_dev)
{
	return rte_intr_cap_multiple(rte_dev->intr_handle);
}

static int
bus_probe_2211(void)
{
@@ -219,6 +243,10 @@ struct dpdk_fn_table fn_table_2211 = {
	.pci_device_enable_interrupt	= pci_device_enable_interrupt_2211,
	.pci_device_disable_interrupt	= pci_device_disable_interrupt_2211,
	.pci_device_get_interrupt_efd	= pci_device_get_interrupt_efd_2211,
	.pci_device_create_interrupt_efds = pci_device_create_interrupt_efds_2211,
	.pci_device_delete_interrupt_efds = pci_device_delete_interrupt_efds_2211,
	.pci_device_get_interrupt_efd_by_index = pci_device_get_interrupt_efd_by_index_2211,
	.pci_device_interrupt_cap_multi	= pci_device_interrupt_cap_multi_2211,
	.bus_scan			= bus_scan_2211,
	.bus_probe			= bus_probe_2211,
	.device_get_devargs		= device_get_devargs_2211,