git: 451f0333b707 - main - sys: Make the iommu xref uintptr_t

From: Andrew Turner <andrew_at_FreeBSD.org>
Date: Tue, 08 Apr 2025 10:49:05 UTC
The branch main has been updated by andrew:

URL: https://cgit.FreeBSD.org/src/commit/?id=451f0333b707642b4ffd88b7527fb7c401a6b3ef

commit 451f0333b707642b4ffd88b7527fb7c401a6b3ef
Author:     Andrew Turner <andrew@FreeBSD.org>
AuthorDate: 2025-04-08 10:48:22 +0000
Commit:     Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2025-04-08 10:48:22 +0000

    sys: Make the iommu xref uintptr_t
    
    On arm64 we use the iommu base address as an xref. This fails when
    the address has the lower 32-bits in common with another iommu as
    they will share an xref.
    
    Reviewed by:    kib
    Sponsored by:   Arm Ltd
    Differential Revision:  https://reviews.freebsd.org/D48726
---
 sys/arm64/acpica/acpi_iort.c        | 4 ++--
 sys/arm64/iommu/smmu.c              | 4 ++--
 sys/dev/acpica/acpivar.h            | 7 ++++---
 sys/dev/pci/pci_host_generic_acpi.c | 3 ++-
 sys/dev/pci/pci_host_generic_fdt.c  | 2 +-
 sys/dev/pci/pcivar.h                | 2 +-
 6 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/sys/arm64/acpica/acpi_iort.c b/sys/arm64/acpica/acpi_iort.c
index a0e24788b775..a180dc1a2a2c 100644
--- a/sys/arm64/acpica/acpi_iort.c
+++ b/sys/arm64/acpica/acpi_iort.c
@@ -630,7 +630,7 @@ acpi_iort_map_pci_msi(u_int seg, u_int rid, u_int *xref, u_int *devid)
 }
 
 int
-acpi_iort_map_pci_smmuv3(u_int seg, u_int rid, u_int *xref, u_int *sid)
+acpi_iort_map_pci_smmuv3(u_int seg, u_int rid, uint64_t *xref, u_int *sid)
 {
 	ACPI_IORT_SMMU_V3 *smmu;
 	struct iort_node *node;
@@ -672,7 +672,7 @@ acpi_iort_map_named_msi(const char *devname, u_int rid, u_int *xref,
 }
 
 int
-acpi_iort_map_named_smmuv3(const char *devname, u_int rid, u_int *xref,
+acpi_iort_map_named_smmuv3(const char *devname, u_int rid, uint64_t *xref,
     u_int *devid)
 {
 	ACPI_IORT_SMMU_V3 *smmu;
diff --git a/sys/arm64/iommu/smmu.c b/sys/arm64/iommu/smmu.c
index a832f6a6ec70..ec8e04ce117b 100644
--- a/sys/arm64/iommu/smmu.c
+++ b/sys/arm64/iommu/smmu.c
@@ -1781,7 +1781,7 @@ smmu_set_buswide(device_t dev, struct smmu_domain *domain,
 }
 
 static int
-smmu_pci_get_sid(device_t child, u_int *xref0, u_int *sid0)
+smmu_pci_get_sid(device_t child, uintptr_t *xref0, u_int *sid0)
 {
 	struct pci_id_ofw_iommu pi;
 	int err;
@@ -1945,7 +1945,7 @@ static int
 smmu_find(device_t dev, device_t child)
 {
 	struct smmu_softc *sc;
-	u_int xref;
+	uintptr_t xref;
 	int err;
 
 	sc = device_get_softc(dev);
diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h
index d35504127c9c..106ec9038820 100644
--- a/sys/dev/acpica/acpivar.h
+++ b/sys/dev/acpica/acpivar.h
@@ -614,12 +614,13 @@ bus_get_cpus_t		acpi_get_cpus;
  * ARM specific ACPI interfaces, relating to IORT table.
  */
 int	acpi_iort_map_pci_msi(u_int seg, u_int rid, u_int *xref, u_int *devid);
-int	acpi_iort_map_pci_smmuv3(u_int seg, u_int rid, u_int *xref, u_int *devid);
+int	acpi_iort_map_pci_smmuv3(u_int seg, u_int rid, uint64_t *xref,
+	    u_int *devid);
 int	acpi_iort_its_lookup(u_int its_id, u_int *xref, int *pxm);
 int	acpi_iort_map_named_msi(const char *devname, u_int rid, u_int *xref,
 	    u_int *devid);
-int	acpi_iort_map_named_smmuv3(const char *devname, u_int rid, u_int *xref,
-	    u_int *devid);
+int	acpi_iort_map_named_smmuv3(const char *devname, u_int rid,
+	    uint64_t *xref, u_int *devid);
 #endif
 #endif /* _KERNEL */
 #endif /* !_ACPIVAR_H_ */
diff --git a/sys/dev/pci/pci_host_generic_acpi.c b/sys/dev/pci/pci_host_generic_acpi.c
index f12632e7205b..324ead5e8b87 100644
--- a/sys/dev/pci/pci_host_generic_acpi.c
+++ b/sys/dev/pci/pci_host_generic_acpi.c
@@ -411,7 +411,8 @@ generic_pcie_get_iommu(device_t pci, device_t child, uintptr_t *id)
 {
 	struct generic_pcie_acpi_softc *sc;
 	struct pci_id_ofw_iommu *iommu;
-	u_int iommu_sid, iommu_xref;
+	uint64_t iommu_xref;
+	u_int iommu_sid;
 	uintptr_t rid;
 	int err;
 
diff --git a/sys/dev/pci/pci_host_generic_fdt.c b/sys/dev/pci/pci_host_generic_fdt.c
index 73c6201dc14b..ffe63b82a234 100644
--- a/sys/dev/pci/pci_host_generic_fdt.c
+++ b/sys/dev/pci/pci_host_generic_fdt.c
@@ -367,7 +367,7 @@ generic_pcie_get_iommu(device_t pci, device_t child, uintptr_t *id)
 {
 	struct pci_id_ofw_iommu *iommu;
 	uint32_t iommu_rid;
-	uint32_t iommu_xref;
+	phandle_t iommu_xref;
 	uint16_t pci_rid;
 	phandle_t node;
 	int err;
diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h
index 14cb577dbedf..d1b7d28eae91 100644
--- a/sys/dev/pci/pcivar.h
+++ b/sys/dev/pci/pcivar.h
@@ -122,8 +122,8 @@ struct pcicfg_msix {
 };
 
 struct pci_id_ofw_iommu {
+	uintptr_t xref;
 	uint32_t id;
-	uint32_t xref;
 };
 
 /* Interesting values for HyperTransport */