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 <busanna.reddy@oss.qualcomm.com>
Signed-off-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Signed-off-by: Vishnu Reddy <busanna.reddy@oss.qualcomm.com>
This commit is contained in:
Vikash Garodia
2026-08-05 15:36:02 +03:00
committed by Abel Vesa
parent 6a16cd5590
commit cb3f5a0957
5 changed files with 92 additions and 0 deletions
+1
View File
@@ -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 <bod@kernel.org>
+4
View File
@@ -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
@@ -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
@@ -0,0 +1,61 @@
// 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>
#include <linux/slab.h>
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);
+25
View File
@@ -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>
#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 */