From 2bee4c229e7a3385906702962673f7a758fb8d20 Mon Sep 17 00:00:00 2001 From: Mostafa Saleh Date: Tue, 7 Jan 2025 13:30:41 +0000 Subject: [PATCH] ANDROID: iommu/arm-smmu-v3-kvm: Use PM runtime functions for evtq/gerrors As RPM is enabled, make sure that access to SMMU MMIO from evtq/gerrors only happens when it's powered. Bug: 357781595 Bug: 384432312 Change-Id: I67f3b61ca87793942559f0142aa742e60e461beb Signed-off-by: Mostafa Saleh --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-kvm.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-kvm.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-kvm.c index 0b488ecb8f61..7c6ec366752e 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-kvm.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-kvm.c @@ -556,6 +556,11 @@ static irqreturn_t kvm_arm_smmu_evt_handler(int irq, void *dev) DEFAULT_RATELIMIT_BURST); u64 evt[EVTQ_ENT_DWORDS]; + if (pm_runtime_get_if_active(smmu->dev) == 0) { + dev_err(smmu->dev, "Unable to handle event interrupt because device not runtime active\n"); + return IRQ_NONE; + } + do { while (!queue_remove_raw(q, evt)) { u8 id = FIELD_GET(EVTQ_0_ID, evt[0]); @@ -581,6 +586,7 @@ static irqreturn_t kvm_arm_smmu_evt_handler(int irq, void *dev) /* Sync our overflow flag, as we believe we're up to speed */ queue_sync_cons_ovf(q); + pm_runtime_put(smmu->dev); return IRQ_HANDLED; } @@ -589,12 +595,19 @@ static irqreturn_t kvm_arm_smmu_gerror_handler(int irq, void *dev) u32 gerror, gerrorn, active; struct arm_smmu_device *smmu = dev; + if (pm_runtime_get_if_active(smmu->dev) == 0) { + dev_err(smmu->dev, "Unable to handle global error interrupt because device not runtime active\n"); + return IRQ_NONE; + } + gerror = readl_relaxed(smmu->base + ARM_SMMU_GERROR); gerrorn = readl_relaxed(smmu->base + ARM_SMMU_GERRORN); active = gerror ^ gerrorn; - if (!(active & GERROR_ERR_MASK)) + if (!(active & GERROR_ERR_MASK)) { + pm_runtime_put(smmu->dev); return IRQ_NONE; /* No errors pending */ + } dev_warn(smmu->dev, "unexpected global error reported (0x%08x), this could be serious\n", @@ -628,7 +641,7 @@ static irqreturn_t kvm_arm_smmu_gerror_handler(int irq, void *dev) } writel(gerror, smmu->base + ARM_SMMU_GERRORN); - + pm_runtime_put(smmu->dev); return IRQ_HANDLED; }