git: 31e796c86de0 - main - amdiommu: use static array for device table base register offsets

From: Jason A. Harmening <jah_at_FreeBSD.org>
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);