Skip to content

Commit ba3b01d

Browse files
Megha Deyjoergroedel
authored andcommitted
iommu/vt-d: Fix debugfs register reads
Commit 6825d3e ("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 <[email protected]> Link: https://lore.kernel.org/r/[email protected] Acked-by: Lu Baolu <[email protected]> Signed-off-by: Joerg Roedel <[email protected]>
1 parent 81ee85d commit ba3b01d

File tree

2 files changed

+27
-15
lines changed

2 files changed

+27
-15
lines changed

drivers/iommu/intel-iommu-debugfs.c

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,38 +33,42 @@ struct iommu_regset {
3333

3434
#define IOMMU_REGSET_ENTRY(_reg_) \
3535
{ DMAR_##_reg_##_REG, __stringify(_reg_) }
36-
static const struct iommu_regset iommu_regs[] = {
36+
37+
static const struct iommu_regset iommu_regs_32[] = {
3738
IOMMU_REGSET_ENTRY(VER),
38-
IOMMU_REGSET_ENTRY(CAP),
39-
IOMMU_REGSET_ENTRY(ECAP),
4039
IOMMU_REGSET_ENTRY(GCMD),
4140
IOMMU_REGSET_ENTRY(GSTS),
42-
IOMMU_REGSET_ENTRY(RTADDR),
43-
IOMMU_REGSET_ENTRY(CCMD),
4441
IOMMU_REGSET_ENTRY(FSTS),
4542
IOMMU_REGSET_ENTRY(FECTL),
4643
IOMMU_REGSET_ENTRY(FEDATA),
4744
IOMMU_REGSET_ENTRY(FEADDR),
4845
IOMMU_REGSET_ENTRY(FEUADDR),
49-
IOMMU_REGSET_ENTRY(AFLOG),
5046
IOMMU_REGSET_ENTRY(PMEN),
5147
IOMMU_REGSET_ENTRY(PLMBASE),
5248
IOMMU_REGSET_ENTRY(PLMLIMIT),
49+
IOMMU_REGSET_ENTRY(ICS),
50+
IOMMU_REGSET_ENTRY(PRS),
51+
IOMMU_REGSET_ENTRY(PECTL),
52+
IOMMU_REGSET_ENTRY(PEDATA),
53+
IOMMU_REGSET_ENTRY(PEADDR),
54+
IOMMU_REGSET_ENTRY(PEUADDR),
55+
};
56+
57+
static const struct iommu_regset iommu_regs_64[] = {
58+
IOMMU_REGSET_ENTRY(CAP),
59+
IOMMU_REGSET_ENTRY(ECAP),
60+
IOMMU_REGSET_ENTRY(RTADDR),
61+
IOMMU_REGSET_ENTRY(CCMD),
62+
IOMMU_REGSET_ENTRY(AFLOG),
5363
IOMMU_REGSET_ENTRY(PHMBASE),
5464
IOMMU_REGSET_ENTRY(PHMLIMIT),
5565
IOMMU_REGSET_ENTRY(IQH),
5666
IOMMU_REGSET_ENTRY(IQT),
5767
IOMMU_REGSET_ENTRY(IQA),
58-
IOMMU_REGSET_ENTRY(ICS),
5968
IOMMU_REGSET_ENTRY(IRTA),
6069
IOMMU_REGSET_ENTRY(PQH),
6170
IOMMU_REGSET_ENTRY(PQT),
6271
IOMMU_REGSET_ENTRY(PQA),
63-
IOMMU_REGSET_ENTRY(PRS),
64-
IOMMU_REGSET_ENTRY(PECTL),
65-
IOMMU_REGSET_ENTRY(PEDATA),
66-
IOMMU_REGSET_ENTRY(PEADDR),
67-
IOMMU_REGSET_ENTRY(PEUADDR),
6872
IOMMU_REGSET_ENTRY(MTRRCAP),
6973
IOMMU_REGSET_ENTRY(MTRRDEF),
7074
IOMMU_REGSET_ENTRY(MTRR_FIX64K_00000),
@@ -127,10 +131,16 @@ static int iommu_regset_show(struct seq_file *m, void *unused)
127131
* by adding the offset to the pointer (virtual address).
128132
*/
129133
raw_spin_lock_irqsave(&iommu->register_lock, flag);
130-
for (i = 0 ; i < ARRAY_SIZE(iommu_regs); i++) {
131-
value = dmar_readq(iommu->reg + iommu_regs[i].offset);
134+
for (i = 0 ; i < ARRAY_SIZE(iommu_regs_32); i++) {
135+
value = dmar_readl(iommu->reg + iommu_regs_32[i].offset);
136+
seq_printf(m, "%-16s\t0x%02x\t\t0x%016llx\n",
137+
iommu_regs_32[i].regs, iommu_regs_32[i].offset,
138+
value);
139+
}
140+
for (i = 0 ; i < ARRAY_SIZE(iommu_regs_64); i++) {
141+
value = dmar_readq(iommu->reg + iommu_regs_64[i].offset);
132142
seq_printf(m, "%-16s\t0x%02x\t\t0x%016llx\n",
133-
iommu_regs[i].regs, iommu_regs[i].offset,
143+
iommu_regs_64[i].regs, iommu_regs_64[i].offset,
134144
value);
135145
}
136146
raw_spin_unlock_irqrestore(&iommu->register_lock, flag);

include/linux/intel-iommu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@
123123

124124
#define dmar_readq(a) readq(a)
125125
#define dmar_writeq(a,v) writeq(v,a)
126+
#define dmar_readl(a) readl(a)
127+
#define dmar_writel(a, v) writel(v, a)
126128

127129
#define DMAR_VER_MAJOR(v) (((v) & 0xf0) >> 4)
128130
#define DMAR_VER_MINOR(v) ((v) & 0x0f)

0 commit comments

Comments
 (0)