aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorXu Lu <luxu.kernel@bytedance.com>2025-01-03 17:32:19 +0800
committerJoerg Roedel <jroedel@suse.de>2025-01-06 12:37:19 +0100
commit8d8d3752c0a4f7fb072352837cbdbf57c02df239 (patch)
treeaeb2f10f1b12dc6ff9782713ab906f55da9e4975
parentiommu/riscv: Add support for platform msi (diff)
downloadwireguard-linux-8d8d3752c0a4f7fb072352837cbdbf57c02df239.tar.xz
wireguard-linux-8d8d3752c0a4f7fb072352837cbdbf57c02df239.zip
iommu/riscv: Empty iommu queue before enabling it
Changing cqen/fqen/pqen from 0 to 1 sets the cqh/fqt/pqt registers to 0. But the cqt/fqh/pqh registers are left unmodified. This commit resets cqt/fqh/pqh registers to ensure corresponding queues are empty before being enabled during initialization. Signed-off-by: Xu Lu <luxu.kernel@bytedance.com> Link: https://lore.kernel.org/r/20250103093220.38106-2-luxu.kernel@bytedance.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to '')
-rw-r--r--drivers/iommu/riscv/iommu.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/iommu/riscv/iommu.c b/drivers/iommu/riscv/iommu.c
index 8a05def774bd..84806724f568 100644
--- a/drivers/iommu/riscv/iommu.c
+++ b/drivers/iommu/riscv/iommu.c
@@ -240,6 +240,12 @@ static int riscv_iommu_queue_enable(struct riscv_iommu_device *iommu,
return rc;
}
+ /* Empty queue before enabling it */
+ if (queue->qid == RISCV_IOMMU_INTR_CQ)
+ riscv_iommu_writel(queue->iommu, Q_TAIL(queue), 0);
+ else
+ riscv_iommu_writel(queue->iommu, Q_HEAD(queue), 0);
+
/*
* Enable queue with interrupts, clear any memory fault if any.
* Wait for the hardware to acknowledge request and activate queue