diff --git a/drivers/iommu/riscv/iommu.c b/drivers/iommu/riscv/iommu.c index cec3ddd7ab1032..14b572058ed9f1 100644 --- a/drivers/iommu/riscv/iommu.c +++ b/drivers/iommu/riscv/iommu.c @@ -668,12 +668,16 @@ void riscv_iommu_disable(struct riscv_iommu_device *iommu) riscv_iommu_writel(iommu, RISCV_IOMMU_REG_PQCSR, 0); } -#define riscv_iommu_read_ddtp(iommu) ({ \ - u64 ddtp; \ - riscv_iommu_readq_timeout((iommu), RISCV_IOMMU_REG_DDTP, ddtp, \ - !(ddtp & RISCV_IOMMU_DDTP_BUSY), 10, \ - RISCV_IOMMU_DDTP_TIMEOUT); \ - ddtp; }) +static u64 riscv_iommu_read_ddtp(struct riscv_iommu_device *iommu) +{ + u32 ddtp_lo; + + riscv_iommu_readl_timeout(iommu, RISCV_IOMMU_REG_DDTP, ddtp_lo, + !(ddtp_lo & RISCV_IOMMU_DDTP_BUSY), 10, + RISCV_IOMMU_DDTP_TIMEOUT); + + return riscv_iommu_readq(iommu, RISCV_IOMMU_REG_DDTP); +} static int riscv_iommu_iodir_alloc(struct riscv_iommu_device *iommu) { @@ -1501,7 +1505,7 @@ static int riscv_iommu_init_check(struct riscv_iommu_device *iommu) * regular boot flow and disable translation when we boot into a kexec * kernel and the previous kernel left them enabled. */ - ddtp = riscv_iommu_readq(iommu, RISCV_IOMMU_REG_DDTP); + ddtp = riscv_iommu_read_ddtp(iommu); if (ddtp & RISCV_IOMMU_DDTP_BUSY) return -EBUSY; diff --git a/drivers/iommu/riscv/iommu.h b/drivers/iommu/riscv/iommu.h index 46df79dd549570..1b03790fbe1fc2 100644 --- a/drivers/iommu/riscv/iommu.h +++ b/drivers/iommu/riscv/iommu.h @@ -11,6 +11,7 @@ #ifndef _RISCV_IOMMU_H_ #define _RISCV_IOMMU_H_ +#include #include #include #include @@ -70,17 +71,13 @@ void riscv_iommu_disable(struct riscv_iommu_device *iommu); readl_relaxed((iommu)->reg + (addr)) #define riscv_iommu_readq(iommu, addr) \ - readq_relaxed((iommu)->reg + (addr)) + hi_lo_readq_relaxed((iommu)->reg + (addr)) #define riscv_iommu_writel(iommu, addr, val) \ writel_relaxed((val), (iommu)->reg + (addr)) #define riscv_iommu_writeq(iommu, addr, val) \ - writeq_relaxed((val), (iommu)->reg + (addr)) - -#define riscv_iommu_readq_timeout(iommu, addr, val, cond, delay_us, timeout_us) \ - readx_poll_timeout(readq_relaxed, (iommu)->reg + (addr), val, cond, \ - delay_us, timeout_us) + hi_lo_writeq_relaxed((val), (iommu)->reg + (addr)) #define riscv_iommu_readl_timeout(iommu, addr, val, cond, delay_us, timeout_us) \ readx_poll_timeout(readl_relaxed, (iommu)->reg + (addr), val, cond, \