From 1c08fe357f18cb1f4b3c42830dcfb6ce4c23f78f Mon Sep 17 00:00:00 2001 From: Chandler Chen Date: Mon, 3 Apr 2023 10:08:06 +0800 Subject: [PATCH] iommu/rockchip: add iommu force reset interface for device Signed-off-by: Chandler Chen Change-Id: I153b91b2e1ad8e099d80f4af8c9e51d12f3af607 --- drivers/iommu/rockchip-iommu.c | 22 ++++++++++++++++++++++ include/soc/rockchip/rockchip_iommu.h | 5 +++++ 2 files changed, 27 insertions(+) diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index c3cdfded69f5..4a8481af5601 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -1434,6 +1434,28 @@ bool rockchip_iommu_is_enabled(struct device *dev) } EXPORT_SYMBOL(rockchip_iommu_is_enabled); +int rockchip_iommu_force_reset(struct device *dev) +{ + struct rk_iommu *iommu; + int ret; + + iommu = rk_iommu_from_dev(dev); + if (!iommu) + return -ENODEV; + + ret = rk_iommu_enable_stall(iommu); + if (ret) + return ret; + + ret = rk_iommu_force_reset(iommu); + + rk_iommu_disable_stall(iommu); + + return ret; + +} +EXPORT_SYMBOL(rockchip_iommu_force_reset); + static void rk_iommu_detach_device(struct iommu_domain *domain, struct device *dev) { diff --git a/include/soc/rockchip/rockchip_iommu.h b/include/soc/rockchip/rockchip_iommu.h index f202874416e7..3a16de253214 100644 --- a/include/soc/rockchip/rockchip_iommu.h +++ b/include/soc/rockchip/rockchip_iommu.h @@ -13,6 +13,7 @@ int rockchip_iommu_disable(struct device *dev); bool rockchip_iommu_is_enabled(struct device *dev); int rockchip_pagefault_done(struct device *master_dev); void __iomem *rockchip_get_iommu_base(struct device *master_dev, int idx); +int rockchip_iommu_force_reset(struct device *dev); #else static inline int rockchip_iommu_enable(struct device *dev) { @@ -33,6 +34,10 @@ static inline void __iomem *rockchip_get_iommu_base(struct device *master_dev, i { return NULL; } +static inline int rockchip_iommu_force_reset(struct device *dev) +{ + return -ENODEV; +} #endif #endif