[RFC PATCH 4/9] iommu/rockchip: skip orphaned-fault banks in rk_iommu_is_stall_active

From: Jiaxing Hu

Date: Fri Jul 17 2026 - 04:54:11 EST


Boot firmware can leave a PAGE_FAULT_ACTIVE condition in an IOMMU bank
before the driver has configured paging. Such a bank shows:

PAGE_FAULT_ACTIVE=1 STALL_ACTIVE=0 IDLE=1

rk_iommu_is_stall_active() sees STALL_ACTIVE=0 and reports the whole
IOMMU as "not stalled", so any subsequent readx_poll_timeout() loop
waiting for the stall to complete never sees a passing result even
after the other banks have correctly entered stall mode.

Detect the orphaned-fault pattern (PAGE_FAULT_ACTIVE & !STALL_ACTIVE &
IDLE) and skip those banks in the stall check. They have no in-flight
transaction, so they are already quiescent.

Signed-off-by: Jiaxing Hu <gahing@xxxxxxxxxxxxx>
---
drivers/iommu/rockchip-iommu.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c
index 0013cf196..f42ffcafb 100644
--- a/drivers/iommu/rockchip-iommu.c
+++ b/drivers/iommu/rockchip-iommu.c
@@ -378,9 +378,23 @@ static bool rk_iommu_is_stall_active(struct rk_iommu *iommu)
bool active = true;
int i;

- for (i = 0; i < iommu->num_mmu; i++)
- active &= !!(rk_iommu_read(iommu->bases[i], RK_MMU_STATUS) &
- RK_MMU_STATUS_STALL_ACTIVE);
+ for (i = 0; i < iommu->num_mmu; i++) {
+ u32 status = rk_iommu_read(iommu->bases[i], RK_MMU_STATUS);
+
+ /*
+ * A bank stuck with PAGE_FAULT_ACTIVE but without STALL_ACTIVE
+ * and with IDLE set has an orphaned fault left by firmware before
+ * paging was configured. It cannot enter stall mode but has no
+ * transaction in flight, so it is already quiescent. Skip it
+ * rather than treating it as "not stalled."
+ */
+ if ((status & RK_MMU_STATUS_PAGE_FAULT_ACTIVE) &&
+ !(status & RK_MMU_STATUS_STALL_ACTIVE) &&
+ (status & RK_MMU_STATUS_IDLE))
+ continue;
+
+ active &= !!(status & RK_MMU_STATUS_STALL_ACTIVE);
+ }

return active;
}
--
2.43.0