Messages in this thread Patch in this message |  | | From | Vishnu Reddy <> | | Date | Tue, 05 May 2026 12:29:25 +0530 | | Subject | [PATCH v4 04/13] media: iris: Add iris vpu bus support |
| |
From: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
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 assosiated 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.
Introduced 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.
Signed-off-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com> Signed-off-by: Vishnu Reddy <busanna.reddy@oss.qualcomm.com> --- drivers/media/platform/qcom/iris/Makefile | 4 ++ drivers/media/platform/qcom/iris/iris_vpu_bus.c | 69 +++++++++++++++++++++++++ include/linux/iris_vpu_bus.h | 25 +++++++++ 3 files changed, 98 insertions(+)
diff --git a/drivers/media/platform/qcom/iris/Makefile b/drivers/media/platform/qcom/iris/Makefile index 2abbd3aeb4af..6f4052b98491 100644 --- a/drivers/media/platform/qcom/iris/Makefile +++ b/drivers/media/platform/qcom/iris/Makefile @@ -31,3 +31,7 @@ qcom-iris-objs += iris_platform_gen1.o endif obj-$(CONFIG_VIDEO_QCOM_IRIS) += qcom-iris.o + +ifdef CONFIG_VIDEO_QCOM_IRIS +obj-y += iris_vpu_bus.o +endif 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..15ba4d9c563e --- /dev/null +++ b/drivers/media/platform/qcom/iris/iris_vpu_bus.c @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Innovation Center, Inc. All rights reserved. + */ + +#include <linux/device.h> +#include <linux/iris_vpu_bus.h> +#include <linux/of_device.h> + +static int iris_vpu_bus_dma_configure(struct device *dev) +{ + const u32 *iommu_fid = dev_get_drvdata(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 release_iris_vpu_bus_device(struct device *dev) +{ + kfree(dev); +} + +struct device *create_iris_vpu_bus_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 = release_iris_vpu_bus_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_set_name(dev, "%s", name); + dev_set_drvdata(dev, (void *)iommu_fid); + + ret = device_register(dev); + if (ret) { + put_device(dev); + return ERR_PTR(ret); + } + + return dev; +} +EXPORT_SYMBOL_GPL(create_iris_vpu_bus_device); + +static int __init iris_vpu_bus_init(void) +{ + int ret; + + ret = bus_register(&iris_vpu_bus_type); + if (ret) { + pr_err("iris-vpu-bus registration failed: %d\n", ret); + return ret; + } + + return 0; +} +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..750e878e489f --- /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 <linux/device.h> + +#if IS_ENABLED(CONFIG_VIDEO_QCOM_IRIS) +extern const struct bus_type iris_vpu_bus_type; + +struct device *create_iris_vpu_bus_device(struct device *parent_device, const char *name, + u64 dma_mask, const u32 *iommu_fid); +#else +static inline struct device *create_iris_vpu_bus_device(struct device *parent_device, + const char *name, u64 dma_mask, + const u32 *iommu_fid) +{ + return NULL; +} +#endif + +#endif /* _LINUX_IRIS_VPU_BUS_H */ -- 2.34.1
|  |