dma/idxd: add skeleton for VFIO based DSA device

Add the basic device probe/remove skeleton code for DSA device bound to
the vfio pci driver. Relevant documentation and MAINTAINERS update also
included.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
Reviewed-by: Conor Walsh <conor.walsh@intel.com>
This commit is contained in:
Kevin Laatz 2021-10-20 16:29:59 +00:00 committed by Thomas Monjalon
parent 65bcddfc66
commit e33ad06eae
10 changed files with 184 additions and 0 deletions

View File

@ -1201,6 +1201,16 @@ F: doc/guides/compressdevs/zlib.rst
F: doc/guides/compressdevs/features/zlib.ini
DMAdev Drivers
--------------
Intel IDXD - EXPERIMENTAL
M: Bruce Richardson <bruce.richardson@intel.com>
M: Kevin Laatz <kevin.laatz@intel.com>
F: drivers/dma/idxd/
F: doc/guides/dmadevs/idxd.rst
RegEx Drivers
-------------

View File

@ -0,0 +1,58 @@
.. SPDX-License-Identifier: BSD-3-Clause
Copyright(c) 2021 Intel Corporation.
.. include:: <isonum.txt>
IDXD DMA Device Driver
======================
The ``idxd`` dmadev driver provides a poll-mode driver (PMD) for Intel\ |reg|
Data Streaming Accelerator `(Intel DSA)
<https://software.intel.com/content/www/us/en/develop/articles/intel-data-streaming-accelerator-architecture-specification.html>`_.
This PMD can be used in conjunction with Intel\ |reg| DSA devices to offload
data operations, such as data copies, to hardware, freeing up CPU cycles for
other tasks.
Hardware Requirements
----------------------
The ``dpdk-devbind.py`` script, included with DPDK, can be used to show the
presence of supported hardware. Running ``dpdk-devbind.py --status-dev dma``
will show all the DMA devices on the system, including IDXD supported devices.
Intel\ |reg| DSA devices, are currently (at time of writing) appearing
as devices with type “0b25”, due to the absence of pci-id database entries for
them at this point.
Compilation
------------
For builds using ``meson`` and ``ninja``, the driver will be built when the
target platform is x86-based. No additional compilation steps are necessary.
Device Setup
-------------
Devices using VFIO/UIO drivers
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The HW devices to be used will need to be bound to a user-space IO driver for use.
The ``dpdk-devbind.py`` script can be used to view the state of the devices
and to bind them to a suitable DPDK-supported driver, such as ``vfio-pci``.
For example::
$ dpdk-devbind.py -b vfio-pci 6a:01.0
Device Probing and Initialization
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For devices bound to a suitable DPDK-supported VFIO/UIO driver, the HW devices will
be found as part of the device scan done at application initialization time without
the need to pass parameters to the application.
For Intel\ |reg| DSA devices, DPDK will automatically configure the device with the
maximum number of workqueues available on it, partitioning all resources equally
among the queues.
If fewer workqueues are required, then the ``max_queues`` parameter may be passed to
the device driver on the EAL commandline, via the ``allowlist`` or ``-a`` flag e.g.::
$ dpdk-test -a <b:d:f>,max_queues=4

View File

@ -10,3 +10,5 @@ an application through DMA API.
.. toctree::
:maxdepth: 2
:numbered:
idxd

View File

@ -75,6 +75,11 @@ New Features
operations.
* Added multi-process support.
* **Added IDXD dmadev driver implementation.**
The IDXD dmadev driver provide device drivers for the Intel DSA devices.
This device driver can be used through the generic dmadev API.
* **Added support to get all MAC addresses of a device.**
Added ``rte_eth_macaddrs_get`` to allow user to retrieve all Ethernet

View File

@ -0,0 +1,11 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright 2021 Intel Corporation
*/
#include <rte_log.h>
#include "idxd_internal.h"
int idxd_pmd_logtype;
RTE_LOG_REGISTER_DEFAULT(idxd_pmd_logtype, WARNING);

View File

@ -0,0 +1,27 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright 2021 Intel Corporation
*/
#ifndef _IDXD_INTERNAL_H_
#define _IDXD_INTERNAL_H_
/**
* @file idxd_internal.h
*
* Internal data structures for the idxd/DSA driver for dmadev
*
* @warning
* @b EXPERIMENTAL: these structures and APIs may change without prior notice
*/
extern int idxd_pmd_logtype;
#define IDXD_PMD_LOG(level, fmt, args...) rte_log(RTE_LOG_ ## level, \
idxd_pmd_logtype, "IDXD: %s(): " fmt "\n", __func__, ##args)
#define IDXD_PMD_DEBUG(fmt, args...) IDXD_PMD_LOG(DEBUG, fmt, ## args)
#define IDXD_PMD_INFO(fmt, args...) IDXD_PMD_LOG(INFO, fmt, ## args)
#define IDXD_PMD_ERR(fmt, args...) IDXD_PMD_LOG(ERR, fmt, ## args)
#define IDXD_PMD_WARN(fmt, args...) IDXD_PMD_LOG(WARNING, fmt, ## args)
#endif /* _IDXD_INTERNAL_H_ */

View File

@ -0,0 +1,55 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2021 Intel Corporation
*/
#include <rte_bus_pci.h>
#include "idxd_internal.h"
#define IDXD_VENDOR_ID 0x8086
#define IDXD_DEVICE_ID_SPR 0x0B25
#define IDXD_PMD_DMADEV_NAME_PCI dmadev_idxd_pci
const struct rte_pci_id pci_id_idxd_map[] = {
{ RTE_PCI_DEVICE(IDXD_VENDOR_ID, IDXD_DEVICE_ID_SPR) },
{ .vendor_id = 0, /* sentinel */ },
};
static int
idxd_dmadev_probe_pci(struct rte_pci_driver *drv, struct rte_pci_device *dev)
{
int ret = 0;
char name[PCI_PRI_STR_SIZE];
rte_pci_device_name(&dev->addr, name, sizeof(name));
IDXD_PMD_INFO("Init %s on NUMA node %d", name, dev->device.numa_node);
dev->device.driver = &drv->driver;
return ret;
}
static int
idxd_dmadev_remove_pci(struct rte_pci_device *dev)
{
char name[PCI_PRI_STR_SIZE];
rte_pci_device_name(&dev->addr, name, sizeof(name));
IDXD_PMD_INFO("Closing %s on NUMA node %d",
name, dev->device.numa_node);
return 0;
}
struct rte_pci_driver idxd_pmd_drv_pci = {
.id_table = pci_id_idxd_map,
.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
.probe = idxd_dmadev_probe_pci,
.remove = idxd_dmadev_remove_pci,
};
RTE_PMD_REGISTER_PCI(IDXD_PMD_DMADEV_NAME_PCI, idxd_pmd_drv_pci);
RTE_PMD_REGISTER_PCI_TABLE(IDXD_PMD_DMADEV_NAME_PCI, pci_id_idxd_map);
RTE_PMD_REGISTER_KMOD_DEP(IDXD_PMD_DMADEV_NAME_PCI, "vfio-pci");
RTE_PMD_REGISTER_PARAM_STRING(dmadev_idxd_pci, "max_queues=0");

View File

@ -0,0 +1,11 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2021 Intel Corporation
build = dpdk_conf.has('RTE_ARCH_X86')
reason = 'only supported on x86'
deps += ['bus_pci']
sources = files(
'idxd_common.c',
'idxd_pci.c',
)

View File

@ -0,0 +1,3 @@
DPDK_22 {
local: *;
};

View File

@ -2,5 +2,7 @@
# Copyright 2021 HiSilicon Limited
drivers = [
'idxd',
'skeleton',
]
std_deps = ['dmadev']