The uacce bus originally only supports devices with SVA capability. This patch extends the uacce bus to support no-iommu mode for devices without or not enabling IOMMU/SVA.
For no-iommu mode UACCE devices: - The device api name is suffixed with _noiommu - The device flags bit1 was set (UACCE_DEV_FLAG_NOIOMMU) To support such devices, DPDK device drivers can mark RTE_UACCE_DRV_SUPPORT_NOIOMMU_MODE in drv_flags to declare capability of working with no-iommu devices. This commit also fixes typo UACCE_DEV_FLGA_SVA -> UACCE_DEV_FLAG_SVA. Signed-off-by: Chengwen Feng <[email protected]> --- doc/guides/rel_notes/release_26_07.rst | 4 ++++ drivers/bus/uacce/bus_uacce_driver.h | 8 ++++++++ drivers/bus/uacce/uacce.c | 24 +++++++++++++++++------- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/doc/guides/rel_notes/release_26_07.rst b/doc/guides/rel_notes/release_26_07.rst index f012d47a4b..1f53e1253e 100644 --- a/doc/guides/rel_notes/release_26_07.rst +++ b/doc/guides/rel_notes/release_26_07.rst @@ -63,6 +63,10 @@ New Features ``rte_eal_init`` and the application is responsible for probing each device, * ``--auto-probing`` enables the initial bus probing, which is the current default behavior. +* **UACCE bus supports no-iommu mode.** + + Support no-iommu mode for devices without or not enabling IOMMU/SVA. + Removed Items ------------- diff --git a/drivers/bus/uacce/bus_uacce_driver.h b/drivers/bus/uacce/bus_uacce_driver.h index c7445778a6..7ff9c7b483 100644 --- a/drivers/bus/uacce/bus_uacce_driver.h +++ b/drivers/bus/uacce/bus_uacce_driver.h @@ -15,6 +15,7 @@ #include <stdlib.h> #include <linux/types.h> +#include <rte_bitops.h> #include <rte_compat.h> #include <rte_devargs.h> #include <dev_driver.h> @@ -28,6 +29,11 @@ extern "C" { #define RTE_UACCE_ALGS_NAME_SIZE 384 #define RTE_UACCE_ATTR_MAX_SIZE 384 +/* UACCE device flag of SVA. */ +#define UACCE_DEV_FLAG_SVA RTE_BIT32(0) +/* UACCE device flag of NOIOMMU */ +#define UACCE_DEV_FLAG_NOIOMMU RTE_BIT32(1) + /* * Definition for queue file region type. */ @@ -106,6 +112,8 @@ struct rte_uacce_driver { /** Device driver supports forward compatibility device */ #define RTE_UACCE_DRV_FORWARD_COMPATIBILITY_DEV 0x1 +/** Device driver supports NO-IOMMU mode */ +#define RTE_UACCE_DRV_SUPPORT_NOIOMMU_MODE 0x2 /** * Get available queue number. diff --git a/drivers/bus/uacce/uacce.c b/drivers/bus/uacce/uacce.c index ade2452ad5..2dab3e1c4d 100644 --- a/drivers/bus/uacce/uacce.c +++ b/drivers/bus/uacce/uacce.c @@ -15,7 +15,6 @@ #include <sys/types.h> #include <eal_export.h> -#include <rte_bitops.h> #include <rte_common.h> #include <rte_devargs.h> #include <rte_eal_paging.h> @@ -28,9 +27,6 @@ #define UACCE_BUS_CLASS_PATH "/sys/class/uacce" -/* UACCE device flag of SVA. */ -#define UACCE_DEV_FLGA_SVA RTE_BIT32(0) - /* Support -a uacce:device-name when start DPDK application. */ #define UACCE_DEV_PREFIX "uacce:" @@ -151,9 +147,19 @@ uacce_read_attr_u32(const char *dev_root, const char *attr, uint32_t *val) static int uacce_read_api(struct rte_uacce_device *dev) { - int ret = uacce_read_attr(dev->dev_root, "api", dev->api, sizeof(dev->api) - 1); +#define NOIOMMU_SUBFIX "_noiommu" + size_t api_len, sub_len; + int ret; + + ret = uacce_read_attr(dev->dev_root, "api", dev->api, sizeof(dev->api) - 1); if (ret < 0) return ret; + + api_len = strlen(dev->api); + sub_len = strlen(NOIOMMU_SUBFIX); + if (api_len > sub_len && strcmp(dev->api + api_len - sub_len, NOIOMMU_SUBFIX) == 0) + dev->api[api_len - sub_len] = 0; + return 0; } @@ -196,8 +202,8 @@ uacce_read_qfrt_sz(struct rte_uacce_device *dev) static int uacce_verify(struct rte_uacce_device *dev) { - if (!(dev->flags & UACCE_DEV_FLGA_SVA)) { - UACCE_BUS_WARN("device %s don't support SVA, skip it!", dev->name); + if (!(dev->flags & (UACCE_DEV_FLAG_SVA | UACCE_DEV_FLAG_NOIOMMU))) { + UACCE_BUS_WARN("device %s don't support SVA or NOIOMMU, skip it!", dev->name); return 1; /* >0 will skip this device. */ } @@ -333,12 +339,16 @@ static bool uacce_match(const struct rte_uacce_driver *dr, struct rte_uacce_device *dev) { bool forward_compat = !!(dr->drv_flags & RTE_UACCE_DRV_FORWARD_COMPATIBILITY_DEV); + bool support_noiommu = !!(dr->drv_flags & RTE_UACCE_DRV_SUPPORT_NOIOMMU_MODE); uint32_t api_ver = uacce_calc_api_ver(dev->api, NULL); const struct rte_uacce_id *id_table; const char *map; uint32_t len; for (id_table = dr->id_table; id_table->dev_api != NULL; id_table++) { + if ((dev->flags & UACCE_DEV_FLAG_NOIOMMU) && !support_noiommu) + continue; + if (!uacce_match_api(dev, forward_compat, id_table)) continue; -- 2.17.1

