The branch main has been updated by jah:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=31e796c86de08f48422a12a2b846876e93391a63

commit 31e796c86de08f48422a12a2b846876e93391a63
Author:     Jason A. Harmening <j...@freebsd.org>
AuthorDate: 2024-11-26 18:12:55 +0000
Commit:     Jason A. Harmening <j...@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);

Reply via email to