From 78162b4b900a230d0e8de2022bcd431dc32e6f13 Mon Sep 17 00:00:00 2001 From: Ding Wei Date: Fri, 22 Oct 2021 18:11:29 +0800 Subject: [PATCH] video: rockchip: mpp: mpp_iommu_refresh via rockchip_iommu funcs reason: 1. might_sleep is called by pm_runtime_xx, thus, it cannot covered by rcu_read_lock/unlock which is atomic context. 2. it need use device_links_read_lock/unlock when meets dev->links.suppliers. however, device_links_read_lock/unlock are not export symbols. thus use rockchip_iommu_disable/enable instead. Change-Id: I545eced499533383f6cfbdf81e696064f42b6c3e Signed-off-by: Ding Wei --- drivers/video/rockchip/mpp/mpp_iommu.c | 28 ++++++++------------------ 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/drivers/video/rockchip/mpp/mpp_iommu.c b/drivers/video/rockchip/mpp/mpp_iommu.c index 50c60756e3cc..7f7fe40684ce 100644 --- a/drivers/video/rockchip/mpp/mpp_iommu.c +++ b/drivers/video/rockchip/mpp/mpp_iommu.c @@ -21,6 +21,7 @@ #ifdef CONFIG_ARM_DMA_USE_IOMMU #include #endif +#include #include "mpp_debug.h" #include "mpp_iommu.h" @@ -460,27 +461,14 @@ int mpp_iommu_remove(struct mpp_iommu_info *info) int mpp_iommu_refresh(struct mpp_iommu_info *info, struct device *dev) { - int i; - int usage_count; - struct device_link *link; - struct device *iommu_dev = &info->pdev->dev; + int ret; - rcu_read_lock(); - - usage_count = atomic_read(&iommu_dev->power.usage_count); - list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) { - for (i = 0; i < usage_count; i++) - pm_runtime_put_sync(link->supplier); - } - - list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) { - for (i = 0; i < usage_count; i++) - pm_runtime_get_sync(link->supplier); - } - - rcu_read_unlock(); - - return 0; + /* disable iommu */ + ret = rockchip_iommu_disable(dev); + if (ret) + return ret; + /* re-enable iommu */ + return rockchip_iommu_enable(dev); } int mpp_iommu_flush_tlb(struct mpp_iommu_info *info)