diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index 2ac23651b26f..e7c7e50a994c 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -806,6 +806,15 @@ static int mpp_task_run(struct mpp_dev *mpp, } else { mpp_set_grf(mpp->grf_info); } + /* + * for iommu share hardware, should attach to ensure + * working in current device + */ + ret = mpp_iommu_attach(mpp->iommu_info); + if (ret) { + dev_err(mpp->dev, "mpp_iommu_attach failed\n"); + return -ENODATA; + } mpp_power_on(mpp); mpp_debug_func(DEBUG_TASK_INFO, "pid %d run %s\n", diff --git a/drivers/video/rockchip/mpp/mpp_iommu.c b/drivers/video/rockchip/mpp/mpp_iommu.c index db98386da6cd..5ba44f54f5fe 100644 --- a/drivers/video/rockchip/mpp/mpp_iommu.c +++ b/drivers/video/rockchip/mpp/mpp_iommu.c @@ -388,6 +388,9 @@ int mpp_iommu_attach(struct mpp_iommu_info *info) if (!info) return 0; + if (info->domain == iommu_get_domain_for_dev(info->dev)) + return 0; + return iommu_attach_group(info->domain, info->group); }