From cb3f5a095743a80f706d45cbcd4ddb08439577b6 Mon Sep 17 00:00:00 2001 From: Vikash Garodia Date: Wed, 10 Jun 2026 11:59:37 +0530 Subject: [PATCH] media: iris: Add iris vpu bus support On glymur platform, firmware loading needs a separate IOMMU mapping with its own stream ID. This stream ID is defined in the device tree with the associated firmware function ID in the iommu-map property. To create this mapping, a separate child device is needed so the firmware memory can be isolated in its own IOMMU context. Introduce a new bus called iris-vpu-bus. This creates a dynamic device, and its dma_configure() callback calls of_dma_configure_id() with the function ID provided by the client to map the corresponding stream ID. This sets up a dedicated IOMMU context for the child device. Reviewed-by: Vishnu Reddy Signed-off-by: Vikash Garodia Reviewed-by: Dmitry Baryshkov Signed-off-by: Vishnu Reddy --- MAINTAINERS | 1 + drivers/media/platform/qcom/iris/Kconfig | 4 ++ drivers/media/platform/qcom/iris/Makefile | 1 + .../media/platform/qcom/iris/iris_vpu_bus.c | 61 +++++++++++++++++++ include/linux/iris_vpu_bus.h | 25 ++++++++ 5 files changed, 92 insertions(+) create mode 100644 drivers/media/platform/qcom/iris/iris_vpu_bus.c create mode 100644 include/linux/iris_vpu_bus.h diff --git a/MAINTAINERS b/MAINTAINERS index 777fe733fd00..5459926ee72e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -22306,6 +22306,7 @@ L: linux-arm-msm@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/media/qcom,*-iris.yaml F: drivers/media/platform/qcom/iris/ +F: include/linux/iris_vpu_bus.h QUALCOMM MIPI CSI2 PHY DRIVER M: Bryan O'Donoghue diff --git a/drivers/media/platform/qcom/iris/Kconfig b/drivers/media/platform/qcom/iris/Kconfig index af78a1775937..76c9fcd253df 100644 --- a/drivers/media/platform/qcom/iris/Kconfig +++ b/drivers/media/platform/qcom/iris/Kconfig @@ -1,3 +1,6 @@ +config QCOM_IRIS_VPU_BUS + bool + config VIDEO_QCOM_IRIS tristate "Qualcomm iris V4L2 decoder driver" depends on VIDEO_DEV @@ -5,6 +8,7 @@ config VIDEO_QCOM_IRIS select V4L2_MEM2MEM_DEV select QCOM_MDT_LOADER select QCOM_SCM + select QCOM_IRIS_VPU_BUS select QCOM_UBWC_CONFIG select VIDEOBUF2_DMA_CONTIG help diff --git a/drivers/media/platform/qcom/iris/Makefile b/drivers/media/platform/qcom/iris/Makefile index 48570da56aa0..6c45d4ad13a8 100644 --- a/drivers/media/platform/qcom/iris/Makefile +++ b/drivers/media/platform/qcom/iris/Makefile @@ -31,3 +31,4 @@ qcom-iris-objs += iris_buffer.o \ iris_vpu_common.o \ obj-$(CONFIG_VIDEO_QCOM_IRIS) += qcom-iris.o +obj-$(CONFIG_QCOM_IRIS_VPU_BUS) += iris_vpu_bus.o diff --git a/drivers/media/platform/qcom/iris/iris_vpu_bus.c b/drivers/media/platform/qcom/iris/iris_vpu_bus.c new file mode 100644 index 000000000000..e3327b227332 --- /dev/null +++ b/drivers/media/platform/qcom/iris/iris_vpu_bus.c @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Innovation Center, Inc. All rights reserved. + */ + +#include +#include +#include +#include + +static int iris_vpu_bus_dma_configure(struct device *dev) +{ + const u32 *iommu_fid = (const u32 *)dev_get_platdata(dev); + + return of_dma_configure_id(dev, dev->parent->of_node, true, iommu_fid); +} + +const struct bus_type iris_vpu_bus_type = { + .name = "iris-vpu-bus", + .dma_configure = iris_vpu_bus_dma_configure, +}; +EXPORT_SYMBOL_GPL(iris_vpu_bus_type); + +static void iris_vpu_bus_release_device(struct device *dev) +{ + kfree(dev); +} + +struct device *iris_vpu_bus_create_device(struct device *parent_device, const char *name, + u64 dma_mask, const u32 *iommu_fid) +{ + struct device *dev; + int ret; + + dev = kzalloc_obj(*dev); + if (!dev) + return ERR_PTR(-ENOMEM); + + dev->release = iris_vpu_bus_release_device; + dev->bus = &iris_vpu_bus_type; + dev->parent = parent_device; + dev->coherent_dma_mask = dma_mask; + dev->dma_mask = &dev->coherent_dma_mask; + dev->platform_data = (void *)iommu_fid; + dev_set_name(dev, "%s", name); + + ret = device_register(dev); + if (ret) { + put_device(dev); + return ERR_PTR(ret); + } + + return dev; +} +EXPORT_SYMBOL_GPL(iris_vpu_bus_create_device); + +static int __init iris_vpu_bus_init(void) +{ + return bus_register(&iris_vpu_bus_type); +} +postcore_initcall(iris_vpu_bus_init); diff --git a/include/linux/iris_vpu_bus.h b/include/linux/iris_vpu_bus.h new file mode 100644 index 000000000000..62af9ee7e288 --- /dev/null +++ b/include/linux/iris_vpu_bus.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) Qualcomm Innovation Center, Inc. All rights reserved. + */ + +#ifndef _LINUX_IRIS_VPU_BUS_H +#define _LINUX_IRIS_VPU_BUS_H + +#include + +#ifdef CONFIG_QCOM_IRIS_VPU_BUS +extern const struct bus_type iris_vpu_bus_type; + +struct device *iris_vpu_bus_create_device(struct device *parent_device, const char *name, + u64 dma_mask, const u32 *iommu_fid); +#else +static inline struct device *iris_vpu_bus_create_device(struct device *parent_device, + const char *name, u64 dma_mask, + const u32 *iommu_fid) +{ + return ERR_PTR(-ENODEV); +} +#endif + +#endif /* _LINUX_IRIS_VPU_BUS_H */