mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
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:
committed by
Abel Vesa
parent
6a16cd5590
commit
cb3f5a0957
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
@@ -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 */
|
||||
Reference in New Issue
Block a user