| From 7c3f75014ba41725c54753457abfd9e09d329a07 Mon Sep 17 00:00:00 2001 |
| From: Megha Dey <megha.dey@linux.intel.com> |
| Date: Mon, 9 Mar 2020 13:09:46 -0700 |
| Subject: [PATCH] iommu/vt-d: Fix debugfs register reads |
| |
| commit ba3b01d7a6f4ab9f8a0557044c9a7678f64ae070 upstream. |
| |
| Commit 6825d3ea6cde ("iommu/vt-d: Add debugfs support to show register |
| contents") dumps the register contents for all IOMMU devices. |
| |
| Currently, a 64 bit read(dmar_readq) is done for all the IOMMU registers, |
| even though some of the registers are 32 bits, which is incorrect. |
| |
| Use the correct read function variant (dmar_readl/dmar_readq) while |
| reading the contents of 32/64 bit registers respectively. |
| |
| Signed-off-by: Megha Dey <megha.dey@linux.intel.com> |
| Link: https://lore.kernel.org/r/1583784587-26126-2-git-send-email-megha.dey@linux.intel.com |
| Acked-by: Lu Baolu <baolu.lu@linux.intel.com> |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/iommu/intel-iommu-debugfs.c b/drivers/iommu/intel-iommu-debugfs.c |
| index 7fabf9b1c2dc..5739be7f7316 100644 |
| --- a/drivers/iommu/intel-iommu-debugfs.c |
| +++ b/drivers/iommu/intel-iommu-debugfs.c |
| @@ -21,38 +21,42 @@ struct iommu_regset { |
| |
| #define IOMMU_REGSET_ENTRY(_reg_) \ |
| { DMAR_##_reg_##_REG, __stringify(_reg_) } |
| -static const struct iommu_regset iommu_regs[] = { |
| + |
| +static const struct iommu_regset iommu_regs_32[] = { |
| IOMMU_REGSET_ENTRY(VER), |
| - IOMMU_REGSET_ENTRY(CAP), |
| - IOMMU_REGSET_ENTRY(ECAP), |
| IOMMU_REGSET_ENTRY(GCMD), |
| IOMMU_REGSET_ENTRY(GSTS), |
| - IOMMU_REGSET_ENTRY(RTADDR), |
| - IOMMU_REGSET_ENTRY(CCMD), |
| IOMMU_REGSET_ENTRY(FSTS), |
| IOMMU_REGSET_ENTRY(FECTL), |
| IOMMU_REGSET_ENTRY(FEDATA), |
| IOMMU_REGSET_ENTRY(FEADDR), |
| IOMMU_REGSET_ENTRY(FEUADDR), |
| - IOMMU_REGSET_ENTRY(AFLOG), |
| IOMMU_REGSET_ENTRY(PMEN), |
| IOMMU_REGSET_ENTRY(PLMBASE), |
| IOMMU_REGSET_ENTRY(PLMLIMIT), |
| + IOMMU_REGSET_ENTRY(ICS), |
| + IOMMU_REGSET_ENTRY(PRS), |
| + IOMMU_REGSET_ENTRY(PECTL), |
| + IOMMU_REGSET_ENTRY(PEDATA), |
| + IOMMU_REGSET_ENTRY(PEADDR), |
| + IOMMU_REGSET_ENTRY(PEUADDR), |
| +}; |
| + |
| +static const struct iommu_regset iommu_regs_64[] = { |
| + IOMMU_REGSET_ENTRY(CAP), |
| + IOMMU_REGSET_ENTRY(ECAP), |
| + IOMMU_REGSET_ENTRY(RTADDR), |
| + IOMMU_REGSET_ENTRY(CCMD), |
| + IOMMU_REGSET_ENTRY(AFLOG), |
| IOMMU_REGSET_ENTRY(PHMBASE), |
| IOMMU_REGSET_ENTRY(PHMLIMIT), |
| IOMMU_REGSET_ENTRY(IQH), |
| IOMMU_REGSET_ENTRY(IQT), |
| IOMMU_REGSET_ENTRY(IQA), |
| - IOMMU_REGSET_ENTRY(ICS), |
| IOMMU_REGSET_ENTRY(IRTA), |
| IOMMU_REGSET_ENTRY(PQH), |
| IOMMU_REGSET_ENTRY(PQT), |
| IOMMU_REGSET_ENTRY(PQA), |
| - IOMMU_REGSET_ENTRY(PRS), |
| - IOMMU_REGSET_ENTRY(PECTL), |
| - IOMMU_REGSET_ENTRY(PEDATA), |
| - IOMMU_REGSET_ENTRY(PEADDR), |
| - IOMMU_REGSET_ENTRY(PEUADDR), |
| IOMMU_REGSET_ENTRY(MTRRCAP), |
| IOMMU_REGSET_ENTRY(MTRRDEF), |
| IOMMU_REGSET_ENTRY(MTRR_FIX64K_00000), |
| @@ -115,10 +119,16 @@ static int iommu_regset_show(struct seq_file *m, void *unused) |
| * by adding the offset to the pointer (virtual address). |
| */ |
| raw_spin_lock_irqsave(&iommu->register_lock, flag); |
| - for (i = 0 ; i < ARRAY_SIZE(iommu_regs); i++) { |
| - value = dmar_readq(iommu->reg + iommu_regs[i].offset); |
| + for (i = 0 ; i < ARRAY_SIZE(iommu_regs_32); i++) { |
| + value = dmar_readl(iommu->reg + iommu_regs_32[i].offset); |
| + seq_printf(m, "%-16s\t0x%02x\t\t0x%016llx\n", |
| + iommu_regs_32[i].regs, iommu_regs_32[i].offset, |
| + value); |
| + } |
| + for (i = 0 ; i < ARRAY_SIZE(iommu_regs_64); i++) { |
| + value = dmar_readq(iommu->reg + iommu_regs_64[i].offset); |
| seq_printf(m, "%-16s\t0x%02x\t\t0x%016llx\n", |
| - iommu_regs[i].regs, iommu_regs[i].offset, |
| + iommu_regs_64[i].regs, iommu_regs_64[i].offset, |
| value); |
| } |
| raw_spin_unlock_irqrestore(&iommu->register_lock, flag); |
| diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h |
| index 1a1f77f77c0e..6dd07c852e6d 100644 |
| --- a/include/linux/intel-iommu.h |
| +++ b/include/linux/intel-iommu.h |
| @@ -120,6 +120,8 @@ |
| |
| #define dmar_readq(a) readq(a) |
| #define dmar_writeq(a,v) writeq(v,a) |
| +#define dmar_readl(a) readl(a) |
| +#define dmar_writel(a, v) writel(v, a) |
| |
| #define DMAR_VER_MAJOR(v) (((v) & 0xf0) >> 4) |
| #define DMAR_VER_MINOR(v) ((v) & 0x0f) |
| -- |
| 2.7.4 |
| |