Messages in this thread |  | | Date | Wed, 6 May 2026 19:45:43 +0530 | | Subject | Re: [PATCH v4 04/13] media: iris: Add iris vpu bus support | | From | Vikash Garodia <> |
| |
On 5/5/2026 12:29 PM, Vishnu Reddy wrote: > 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;
change this to return ERR_PTR(-ENODEV);
> +} > +#endif > + > +#endif /* _LINUX_IRIS_VPU_BUS_H */ >
|  |