git: 31e796c86de0 - main - amdiommu: use static array for device table base register offsets
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 26 Nov 2024 20:16:02 UTC
The branch main has been updated by jah:
URL: https://cgit.FreeBSD.org/src/commit/?id=31e796c86de08f48422a12a2b846876e93391a63
commit 31e796c86de08f48422a12a2b846876e93391a63
Author: Jason A. Harmening <jah@FreeBSD.org>
AuthorDate: 2024-11-26 18:12:55 +0000
Commit: Jason A. Harmening <jah@FreeBSD.org>
CommitDate: 2024-11-26 20:14:25 +0000
amdiommu: use static array for device table base register offsets
This is a somewhat cleaner and more future-proof way to get the correct
device table offsets.
Reviewed by: kib
Reported by: crest_freebsd_rlwinm.de
Fixes: 5035db22 "amdiommu: Fix device table segment
base register offsets"
Differential Revision: https://reviews.freebsd.org/D47769
---
sys/x86/iommu/amd_drv.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/sys/x86/iommu/amd_drv.c b/sys/x86/iommu/amd_drv.c
index 5820594691f7..4d7db52a4acd 100644
--- a/sys/x86/iommu/amd_drv.c
+++ b/sys/x86/iommu/amd_drv.c
@@ -224,10 +224,24 @@ amdiommu_create_dev_tbl(struct amdiommu_unit *sc)
u_int devtbl_sz, dom, i, reclaimno, segnum_log, segnum, seg_sz;
int error;
+ static const int devtab_base_regs[] = {
+ AMDIOMMU_DEVTAB_BASE,
+ AMDIOMMU_DEVTAB_S1_BASE,
+ AMDIOMMU_DEVTAB_S2_BASE,
+ AMDIOMMU_DEVTAB_S3_BASE,
+ AMDIOMMU_DEVTAB_S4_BASE,
+ AMDIOMMU_DEVTAB_S5_BASE,
+ AMDIOMMU_DEVTAB_S6_BASE,
+ AMDIOMMU_DEVTAB_S7_BASE
+ };
+
segnum_log = (sc->efr & AMDIOMMU_EFR_DEVTBLSEG_MASK) >>
AMDIOMMU_EFR_DEVTBLSEG_SHIFT;
segnum = 1 << segnum_log;
+ KASSERT(segnum <= nitems(devtab_base_regs),
+ ("%s: unsupported devtab segment count %u", __func__, segnum));
+
devtbl_sz = amdiommu_devtbl_sz(sc);
seg_sz = devtbl_sz / segnum;
sc->devtbl_obj = vm_pager_allocate(OBJT_PHYS, NULL, atop(devtbl_sz),
@@ -248,7 +262,6 @@ amdiommu_create_dev_tbl(struct amdiommu_unit *sc)
for (i = 0; i < segnum; i++) {
vm_page_t m;
uint64_t rval;
- u_int reg;
for (reclaimno = 0; reclaimno < 3; reclaimno++) {
VM_OBJECT_WLOCK(sc->devtbl_obj);
@@ -276,9 +289,7 @@ amdiommu_create_dev_tbl(struct amdiommu_unit *sc)
pmap_zero_page(m);
pmap_qenter(seg_vaddr, &m, 1);
}
- reg = i == 0 ? AMDIOMMU_DEVTAB_BASE : AMDIOMMU_DEVTAB_S1_BASE +
- ((i - 1) << 3);
- amdiommu_write8(sc, reg, rval);
+ amdiommu_write8(sc, devtab_base_regs[i], rval);
}
return (0);