[PATCH v1 1/4] bus/pci: introduce PCIe TPH support
Chengwen Feng
fengchengwen at huawei.com
Fri May 8 11:28:52 CEST 2026
Add experimental API and Linux VFIO implementation for PCIe TLP
Processing Hints (TPH). Support device capability query, TPH
enable/disable, and steering tag get/set operations.
Stub functions are added for BSD and Windows.
The API includes:
- rte_pci_tph_query: Query device TPH capabilities
- rte_pci_tph_enable: Enable TPH with specified mode
- rte_pci_tph_disable: Disable TPH on device
- rte_pci_tph_st_get: Get steering tags for CPUs
- rte_pci_tph_st_set: Program steering tags into device's ST table
Signed-off-by: Chengwen Feng <fengchengwen at huawei.com>
---
drivers/bus/pci/bsd/pci.c | 50 ++++++
drivers/bus/pci/linux/pci.c | 48 ++++++
drivers/bus/pci/linux/pci_init.h | 9 +
drivers/bus/pci/linux/pci_vfio.c | 272 +++++++++++++++++++++++++++++++
drivers/bus/pci/rte_bus_pci.h | 112 +++++++++++++
drivers/bus/pci/windows/pci.c | 50 ++++++
6 files changed, 541 insertions(+)
diff --git a/drivers/bus/pci/bsd/pci.c b/drivers/bus/pci/bsd/pci.c
index aba44492e0..0ba1c9d898 100644
--- a/drivers/bus/pci/bsd/pci.c
+++ b/drivers/bus/pci/bsd/pci.c
@@ -667,3 +667,53 @@ rte_pci_ioport_unmap(struct rte_pci_ioport *p)
return ret;
}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_query, 26.07)
+int
+rte_pci_tph_query(const struct rte_pci_device *dev, uint32_t *supported_modes,
+ uint32_t *st_table_sz)
+{
+ RTE_SET_USED(dev);
+ RTE_SET_USED(supported_modes);
+ RTE_SET_USED(st_table_sz);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_enable, 26.07)
+int
+rte_pci_tph_enable(const struct rte_pci_device *dev, uint32_t mode)
+{
+ RTE_SET_USED(dev);
+ RTE_SET_USED(mode);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_disable, 26.07)
+int
+rte_pci_tph_disable(const struct rte_pci_device *dev)
+{
+ RTE_SET_USED(dev);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_st_get, 26.07)
+int
+rte_pci_tph_st_get(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count)
+{
+ RTE_SET_USED(dev);
+ RTE_SET_USED(ents);
+ RTE_SET_USED(count);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_st_set, 26.07)
+int
+rte_pci_tph_st_set(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count)
+{
+ RTE_SET_USED(dev);
+ RTE_SET_USED(ents);
+ RTE_SET_USED(count);
+ return -ENOTSUP;
+}
diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c
index 5f263f8b28..d2eade14a5 100644
--- a/drivers/bus/pci/linux/pci.c
+++ b/drivers/bus/pci/linux/pci.c
@@ -791,3 +791,51 @@ rte_pci_ioport_unmap(struct rte_pci_ioport *p)
return ret;
}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_query, 26.07)
+int
+rte_pci_tph_query(const struct rte_pci_device *dev, uint32_t *supported_modes,
+ uint32_t *st_table_sz)
+{
+ if (dev->kdrv == RTE_PCI_KDRV_VFIO && pci_vfio_is_enabled())
+ return pci_vfio_tph_query(dev, supported_modes, st_table_sz);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_enable, 26.07)
+int
+rte_pci_tph_enable(const struct rte_pci_device *dev, uint32_t mode)
+{
+ if (dev->kdrv == RTE_PCI_KDRV_VFIO && pci_vfio_is_enabled())
+ return pci_vfio_tph_enable(dev, mode);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_disable, 26.07)
+int
+rte_pci_tph_disable(const struct rte_pci_device *dev)
+{
+ if (dev->kdrv == RTE_PCI_KDRV_VFIO && pci_vfio_is_enabled())
+ return pci_vfio_tph_disable(dev);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_st_get, 26.07)
+int
+rte_pci_tph_st_get(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count)
+{
+ if (dev->kdrv == RTE_PCI_KDRV_VFIO && pci_vfio_is_enabled())
+ return pci_vfio_tph_st_get(dev, ents, count);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_st_set, 26.07)
+int
+rte_pci_tph_st_set(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count)
+{
+ if (dev->kdrv == RTE_PCI_KDRV_VFIO && pci_vfio_is_enabled())
+ return pci_vfio_tph_st_set(dev, ents, count);
+ return -ENOTSUP;
+}
diff --git a/drivers/bus/pci/linux/pci_init.h b/drivers/bus/pci/linux/pci_init.h
index 6949dd57d9..7cbdc7e807 100644
--- a/drivers/bus/pci/linux/pci_init.h
+++ b/drivers/bus/pci/linux/pci_init.h
@@ -73,4 +73,13 @@ int pci_vfio_unmap_resource(struct rte_pci_device *dev);
int pci_vfio_is_enabled(void);
+int pci_vfio_tph_query(const struct rte_pci_device *dev, uint32_t *supported_modes,
+ uint32_t *st_table_sz);
+int pci_vfio_tph_enable(const struct rte_pci_device *dev, uint32_t mode);
+int pci_vfio_tph_disable(const struct rte_pci_device *dev);
+int pci_vfio_tph_st_get(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count);
+int pci_vfio_tph_st_set(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count);
+
#endif /* EAL_PCI_INIT_H_ */
diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c
index bc5c5c2499..d109f44d45 100644
--- a/drivers/bus/pci/linux/pci_vfio.c
+++ b/drivers/bus/pci/linux/pci_vfio.c
@@ -1308,3 +1308,275 @@ pci_vfio_is_enabled(void)
}
return status;
}
+
+/**
+ * struct vfio_pci_tph_cap - PCIe TPH capability information
+ * @supported_modes: Supported TPH operating modes
+ * @st_table_sz: Number of entries in ST table; 0 means no ST table
+ * @reserved: Must be zero
+ *
+ * Used with VFIO_PCI_TPH_GET_CAP operation to return device
+ * TLP Processing Hints (TPH) capabilities to userspace.
+ */
+struct vfio_pci_tph_cap {
+ __u8 supported_modes;
+#define VFIO_PCI_TPH_MODE_IV (1u << 0) /* Interrupt vector */
+#define VFIO_PCI_TPH_MODE_DS (1u << 1) /* Device specific */
+ __u8 reserved0;
+ __u16 st_table_sz;
+ __u32 reserved;
+};
+
+/**
+ * struct vfio_pci_tph_ctrl - TPH enable control structure
+ * @mode: Selected TPH operating mode (VFIO_PCI_TPH_MODE_*)
+ * @reserved: Must be zero
+ *
+ * Used with VFIO_PCI_TPH_ENABLE operation to specify the
+ * operating mode when enabling TPH on the device.
+ */
+struct vfio_pci_tph_ctrl {
+ __u8 mode;
+ __u8 reserved[7];
+};
+
+/**
+ * struct vfio_pci_tph_entry - Single TPH steering tag entry
+ * @cpu: CPU identifier for steering tag calculation
+ * @mem_type: Memory type (VFIO_PCI_TPH_MEM_TYPE_*)
+ * @reserved0: Must be zero
+ * @index: ST table index for programming
+ * @st: Unused for SET_ST
+ * @reserved1: Must be zero
+ *
+ * For VFIO_PCI_TPH_GET_ST:
+ * Userspace sets @cpu and @mem_type; kernel returns @st.
+ *
+ * For VFIO_PCI_TPH_SET_ST:
+ * Userspace sets @index, @cpu, and @mem_type.
+ * Kernel internally computes the steering tag and programs
+ * it into the specified @index.
+ *
+ * If @cpu == U32_MAX, kernel clears the steering tag at
+ * the specified @index.
+ */
+struct vfio_pci_tph_entry {
+ __u32 cpu;
+ __u8 mem_type;
+#define VFIO_PCI_TPH_MEM_TYPE_VM 0
+#define VFIO_PCI_TPH_MEM_TYPE_PM 1
+ __u8 reserved0;
+ __u16 index;
+ __u16 st;
+ __u16 reserved1;
+};
+
+/**
+ * struct vfio_pci_tph_st - Batch steering tag request
+ * @count: Number of entries in the array
+ * @reserved: Must be zero
+ * @ents: Flexible array of steering tag entries
+ *
+ * Container structure for batch get/set operations.
+ * Used with both VFIO_PCI_TPH_GET_ST and VFIO_PCI_TPH_SET_ST.
+ */
+struct vfio_pci_tph_st {
+ __u32 count;
+ __u32 reserved;
+ struct vfio_pci_tph_entry ents[];
+#define VFIO_PCI_TPH_MAX_ENTRIES 2048
+};
+
+/**
+ * struct vfio_device_pci_tph_op - Argument for VFIO_DEVICE_PCI_TPH
+ * @argsz: User allocated size of this structure
+ * @op: TPH operation (VFIO_PCI_TPH_*)
+ * @cap: Capability data for GET_CAP
+ * @ctrl: Control data for ENABLE
+ * @st: Batch entry data for GET_ST/SET_ST
+ *
+ * @argsz must be set by the user to the size of the structure
+ * being executed. Kernel validates input and returns data
+ * only within the specified size.
+ *
+ * Operations:
+ * - VFIO_PCI_TPH_GET_CAP: Query device TPH capabilities.
+ * - VFIO_PCI_TPH_ENABLE: Enable TPH using mode from &ctrl.
+ * - VFIO_PCI_TPH_DISABLE: Disable TPH on the device.
+ * - VFIO_PCI_TPH_GET_ST: Retrieve CPU steering tags for Device-Specific (DS)
+ * mode. Used when device requires SW to obtain ST
+ * values for programming.
+ * - VFIO_PCI_TPH_SET_ST: Program steering tag entries into device ST table.
+ * Valid when ST table resides in TPH Requester
+ * Capability or MSI-X Table.
+ * If any entry fails, all programmed entries are rolled
+ * back to 0 before returning error.
+ */
+struct vfio_device_pci_tph_op {
+ __u32 argsz;
+ __u32 op;
+#define VFIO_PCI_TPH_GET_CAP 0
+#define VFIO_PCI_TPH_ENABLE 1
+#define VFIO_PCI_TPH_DISABLE 2
+#define VFIO_PCI_TPH_GET_ST 3
+#define VFIO_PCI_TPH_SET_ST 4
+ union {
+ struct vfio_pci_tph_cap cap;
+ struct vfio_pci_tph_ctrl ctrl;
+ struct vfio_pci_tph_st st;
+ };
+};
+
+/**
+ * VFIO_DEVICE_PCI_TPH - _IO(VFIO_TYPE, VFIO_BASE + 22)
+ *
+ * IOCTL for managing PCIe TLP Processing Hints (TPH) on
+ * a VFIO-assigned PCI device. Provides operations to query
+ * device capabilities, enable/disable TPH, retrieve CPU's
+ * steering tags, and program steering tag tables.
+ *
+ * Return: 0 on success, negative errno on failure.
+ * -EOPNOTSUPP: Operation not supported
+ * -ENODEV: Device or required functionality not present
+ * -EINVAL: Invalid argument or TPH not supported
+ */
+#define VFIO_DEVICE_PCI_TPH _IO(VFIO_TYPE, VFIO_BASE + 22)
+
+static int
+pci_vfio_tph_ioctl(const struct rte_pci_device *dev, struct vfio_device_pci_tph_op *op)
+{
+ const struct rte_intr_handle *intr_handle = dev->intr_handle;
+ int vfio_dev_fd;
+
+ vfio_dev_fd = rte_intr_dev_fd_get(intr_handle);
+ if (vfio_dev_fd < 0)
+ return -EIO;
+
+ return ioctl(vfio_dev_fd, VFIO_DEVICE_PCI_TPH, op);
+}
+
+int
+pci_vfio_tph_query(const struct rte_pci_device *dev, uint32_t *supported_modes,
+ uint32_t *st_table_sz)
+{
+ struct vfio_device_pci_tph_op op = {
+ .argsz = sizeof(struct vfio_device_pci_tph_op),
+ .op = VFIO_PCI_TPH_GET_CAP,
+ };
+ int ret;
+
+ ret = pci_vfio_tph_ioctl(dev, &op);
+ if (ret != 0)
+ return ret;
+
+ *supported_modes = 0;
+ if (op.cap.supported_modes & VFIO_PCI_TPH_MODE_IV)
+ *supported_modes |= RTE_PCI_TPH_MODE_IV;
+ if (op.cap.supported_modes & VFIO_PCI_TPH_MODE_DS)
+ *supported_modes |= RTE_PCI_TPH_MODE_DS;
+ *st_table_sz = op.cap.st_table_sz;
+
+ return 0;
+}
+
+int
+pci_vfio_tph_enable(const struct rte_pci_device *dev, uint32_t mode)
+{
+ struct vfio_device_pci_tph_op op = {
+ .argsz = sizeof(struct vfio_device_pci_tph_op),
+ .op = VFIO_PCI_TPH_ENABLE,
+ };
+
+ if (mode == RTE_PCI_TPH_MODE_IV)
+ op.ctrl.mode = VFIO_PCI_TPH_MODE_IV;
+ else if (mode == RTE_PCI_TPH_MODE_DS)
+ op.ctrl.mode = VFIO_PCI_TPH_MODE_DS;
+ else
+ return -EINVAL;
+
+ return pci_vfio_tph_ioctl(dev, &op);
+}
+
+int
+pci_vfio_tph_disable(const struct rte_pci_device *dev)
+{
+ struct vfio_device_pci_tph_op op = {
+ .argsz = sizeof(struct vfio_device_pci_tph_op),
+ .op = VFIO_PCI_TPH_DISABLE,
+ };
+ return pci_vfio_tph_ioctl(dev, &op);
+}
+
+static struct vfio_device_pci_tph_op *
+pci_vfio_tph_alloc_st_op(uint32_t count)
+{
+ struct vfio_device_pci_tph_op *op;
+ ssize_t sz = sizeof(struct vfio_device_pci_tph_op) +
+ count * sizeof(struct vfio_pci_tph_entry);
+ op = calloc(1, sz);
+ if (op == NULL)
+ return NULL;
+ op->argsz = sz;
+ op->st.count = count;
+ return op;
+}
+
+static void
+pci_vfio_tph_free_st_op(struct vfio_device_pci_tph_op *op)
+{
+ free(op);
+}
+
+int
+pci_vfio_tph_st_get(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count)
+{
+ struct vfio_device_pci_tph_op *op;
+ uint32_t i;
+ int ret;
+
+ op = pci_vfio_tph_alloc_st_op(count);
+ if (op == NULL)
+ return -ENOMEM;
+
+ op->op = VFIO_PCI_TPH_GET_ST;
+ for (i = 0; i < count; i++) {
+ op->st.ents[i].cpu = ents[i].cpu;
+ op->st.ents[i].mem_type = VFIO_PCI_TPH_MEM_TYPE_VM;
+ }
+
+ ret = pci_vfio_tph_ioctl(dev, op);
+ if (ret != 0) {
+ pci_vfio_tph_free_st_op(op);
+ return ret;
+ }
+ for (i = 0; i < count; i++)
+ ents[i].st = op->st.ents[i].st;
+
+ pci_vfio_tph_free_st_op(op);
+ return 0;
+}
+
+int
+pci_vfio_tph_st_set(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count)
+{
+ struct vfio_device_pci_tph_op *op;
+ uint32_t i;
+ int ret;
+
+ op = pci_vfio_tph_alloc_st_op(count);
+ if (op == NULL)
+ return -ENOMEM;
+
+ op->op = VFIO_PCI_TPH_SET_ST;
+ for (i = 0; i < count; i++) {
+ op->st.ents[i].cpu = ents[i].cpu;
+ op->st.ents[i].mem_type = VFIO_PCI_TPH_MEM_TYPE_VM;
+ op->st.ents[i].index = ents[i].index;
+ }
+
+ ret = pci_vfio_tph_ioctl(dev, op);
+ pci_vfio_tph_free_st_op(op);
+ return ret;
+}
diff --git a/drivers/bus/pci/rte_bus_pci.h b/drivers/bus/pci/rte_bus_pci.h
index 19a7b15b99..58dd4620a3 100644
--- a/drivers/bus/pci/rte_bus_pci.h
+++ b/drivers/bus/pci/rte_bus_pci.h
@@ -312,6 +312,118 @@ void rte_pci_ioport_read(struct rte_pci_ioport *p,
void rte_pci_ioport_write(struct rte_pci_ioport *p,
const void *data, size_t len, off_t offset);
+#define RTE_PCI_TPH_MODE_IV (1u << 0) /* Interrupt vector */
+#define RTE_PCI_TPH_MODE_DS (1u << 1) /* Device specific */
+
+/**
+ * @struct rte_pci_tph_entry
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice.
+ *
+ * An entry used for TPH Steering Tag (ST) get/set operations.
+ */
+struct rte_pci_tph_entry {
+ /**
+ * CPU ID used for both get and set operations.
+ * For set operation: if set to U32_MAX, clear the ST entry at
+ * specified index.
+ */
+ uint32_t cpu;
+ /** ST table index, only used for set operation */
+ uint16_t index;
+ /** Steering tag value, only used for get operation to return result */
+ uint16_t st;
+};
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Query PCIe TLP Processing Hints (TPH) capabilities of a device.
+ *
+ * @param dev
+ * A pointer to a rte_pci_device structure describing the device to query.
+ * @param supported_modes
+ * Output: supported TPH modes (RTE_PCI_TPH_MODE_*).
+ * @param st_table_sz
+ * Output: number of entries in the ST table; 0 means no table present.
+ * @return
+ * 0 on success, negative value on error.
+ */
+__rte_experimental
+int rte_pci_tph_query(const struct rte_pci_device *dev, uint32_t *supported_modes,
+ uint32_t *st_table_sz);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Enable PCIe TLP Processing Hints (TPH) on a device with specified mode.
+ *
+ * @param dev
+ * A pointer to a rte_pci_device structure describing the device to enable.
+ * @param mode
+ * TPH operating mode (RTE_PCI_TPH_MODE_*).
+ * @return
+ * 0 on success, negative value on error.
+ */
+__rte_experimental
+int rte_pci_tph_enable(const struct rte_pci_device *dev, uint32_t mode);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Disable PCIe TLP Processing Hints (TPH) on a device.
+ *
+ * @param dev
+ * A pointer to a rte_pci_device structure describing the device to disable.
+ * @return
+ * 0 on success, negative value on error.
+ */
+__rte_experimental
+int rte_pci_tph_disable(const struct rte_pci_device *dev);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Get steering tags for given CPU IDs from the device.
+ * Only valid when TPH is enabled in Device-Specific (DS) mode.
+ *
+ * @param dev
+ * A pointer to a rte_pci_device structure describing the device.
+ * @param ents
+ * Array of entries with CPU IDs as input; steering tags are returned
+ * as output.
+ * @param count
+ * Number of entries in the array.
+ * @return
+ * 0 on success, negative value on error.
+ */
+__rte_experimental
+int rte_pci_tph_st_get(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Program steering tags into the device's ST table.
+ *
+ * @param dev
+ * A pointer to a rte_pci_device structure describing the device.
+ * @param ents
+ * Array of entries with CPU IDs and index indices to program.
+ * @param count
+ * Number of entries in the array.
+ * @return
+ * 0 on success, negative errno value on error.
+ */
+__rte_experimental
+int rte_pci_tph_st_set(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count);
+
#ifdef __cplusplus
}
#endif
diff --git a/drivers/bus/pci/windows/pci.c b/drivers/bus/pci/windows/pci.c
index 549319ad5b..0a2f0408ca 100644
--- a/drivers/bus/pci/windows/pci.c
+++ b/drivers/bus/pci/windows/pci.c
@@ -207,6 +207,56 @@ pci_uio_remap_resource(struct rte_pci_device *dev __rte_unused)
return -1;
}
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_query, 26.07)
+int
+rte_pci_tph_query(const struct rte_pci_device *dev, uint32_t *supported_modes,
+ uint32_t *st_table_sz)
+{
+ RTE_SET_USED(dev);
+ RTE_SET_USED(supported_modes);
+ RTE_SET_USED(st_table_sz);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_enable, 26.07)
+int
+rte_pci_tph_enable(const struct rte_pci_device *dev, uint32_t mode)
+{
+ RTE_SET_USED(dev);
+ RTE_SET_USED(mode);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_disable, 26.07)
+int
+rte_pci_tph_disable(const struct rte_pci_device *dev)
+{
+ RTE_SET_USED(dev);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_st_get, 26.07)
+int
+rte_pci_tph_st_get(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count)
+{
+ RTE_SET_USED(dev);
+ RTE_SET_USED(ents);
+ RTE_SET_USED(count);
+ return -ENOTSUP;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pci_tph_st_set, 26.07)
+int
+rte_pci_tph_st_set(const struct rte_pci_device *dev,
+ struct rte_pci_tph_entry *ents, uint32_t count)
+{
+ RTE_SET_USED(dev);
+ RTE_SET_USED(ents);
+ RTE_SET_USED(count);
+ return -ENOTSUP;
+}
+
static int
get_device_pci_address(HDEVINFO dev_info,
PSP_DEVINFO_DATA device_info_data, struct rte_pci_addr *addr)
--
2.17.1
More information about the dev
mailing list