git: 18172439a303 - stable/14 - amdiommu: use static array for device table base register offsets

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Tue, 03 Dec 2024 00:51:17 UTC
The branch stable/14 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=18172439a303d048e668c2fdae4249d37e223524

commit 18172439a303d048e668c2fdae4249d37e223524
Author:     Jason A. Harmening <jah@FreeBSD.org>
AuthorDate: 2024-11-26 18:12:55 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2024-12-03 00:39:22 +0000

    amdiommu: use static array for device table base register offsets
    
    (cherry picked from commit 31e796c86de08f48422a12a2b846876e93391a63)
---
 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 1d9d3b6b72ef..2ab0213925eb 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);