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 <smostafa@google.com>
This commit is contained in:
Mostafa Saleh
2025-01-07 13:30:41 +00:00
parent cd15b54d08
commit 2bee4c229e
@@ -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;
}