Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 May 2025 22:46:28 GMT
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 86d20eaadfd1 - main - powernv: Add RF_BIGENDIAN resource flag
Message-ID:  <202505132246.54DMkSkM001602@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by jhibbits:

URL: https://cgit.FreeBSD.org/src/commit/?id=86d20eaadfd1a03e19d8bc8333c689b820299d52

commit 86d20eaadfd1a03e19d8bc8333c689b820299d52
Author:     Justin Hibbits <jhibbits@FreeBSD.org>
AuthorDate: 2025-05-13 22:39:37 +0000
Commit:     Justin Hibbits <jhibbits@FreeBSD.org>
CommitDate: 2025-05-13 22:44:09 +0000

    powernv: Add RF_BIGENDIAN resource flag
    
    The big-endian analogue to the RF_LITTLEENDIAN flag, if this flag is set
    on a memory resource it's always mapped big endian.
    
    This is needed by the PowerNV OPAL resources (XIVE and PCI), as these
    top-level peripherals are always big-endian.
    
    Tested by:      pkubaj
    Fixes:          c4921a0f("powerpc: Always use BE tag in nexus_map_resource")
    MFC after:      1 day
    X-MFC-with:     c4921a0f
---
 sys/powerpc/include/resource.h | 1 +
 sys/powerpc/powernv/opal_pci.c | 2 +-
 sys/powerpc/powernv/xive.c     | 2 +-
 sys/powerpc/powerpc/nexus.c    | 4 +++-
 4 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/sys/powerpc/include/resource.h b/sys/powerpc/include/resource.h
index e7e9493569cc..6726104403d0 100644
--- a/sys/powerpc/include/resource.h
+++ b/sys/powerpc/include/resource.h
@@ -47,5 +47,6 @@
  */
 
 #define	RF_LITTLEENDIAN		RF_SPARE1
+#define	RF_BIGENDIAN		RF_SPARE2
 
 #endif /* !_MACHINE_RESOURCE_H_ */
diff --git a/sys/powerpc/powernv/opal_pci.c b/sys/powerpc/powernv/opal_pci.c
index 8dee2c45c089..622c8c2cc09b 100644
--- a/sys/powerpc/powernv/opal_pci.c
+++ b/sys/powerpc/powernv/opal_pci.c
@@ -270,7 +270,7 @@ opalpci_attach(device_t dev)
 
 	rid = 0;
 	sc->r_reg = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
-	    &rid, RF_ACTIVE | RF_SHAREABLE);
+	    &rid, RF_ACTIVE | RF_SHAREABLE | RF_BIGENDIAN);
 	if (sc->r_reg == NULL) {
 		device_printf(dev, "Failed to allocate PHB[%jd] registers\n",
 		    (uintmax_t)sc->phb_id);
diff --git a/sys/powerpc/powernv/xive.c b/sys/powerpc/powernv/xive.c
index 384ff4ef20d2..aaf4953ba8a5 100644
--- a/sys/powerpc/powernv/xive.c
+++ b/sys/powerpc/powernv/xive.c
@@ -327,7 +327,7 @@ xive_attach(device_t dev)
 
 	rid = 1;	/* Get the Hypervisor-level register set. */
 	sc->sc_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
-	    &rid, RF_ACTIVE);
+	    &rid, RF_ACTIVE | RF_BIGENDIAN);
 	sc->sc_offset = XIVE_TM_QW3_HV;
 
 	mtx_init(&sc->sc_mtx, "XIVE", NULL, MTX_DEF);
diff --git a/sys/powerpc/powerpc/nexus.c b/sys/powerpc/powerpc/nexus.c
index 029b6ef8a479..1dac56a84cf9 100644
--- a/sys/powerpc/powerpc/nexus.c
+++ b/sys/powerpc/powerpc/nexus.c
@@ -287,8 +287,10 @@ nexus_map_resource(device_t bus, device_t child, struct resource *r,
 		map->r_vaddr = pmap_mapdev_attr(start, length, args.memattr);
 		if ((rman_get_flags(r) & RF_LITTLEENDIAN) != 0)
 			map->r_bustag = &bs_le_tag;
-		else
+		else if ((rman_get_flags(r) & RF_BIGENDIAN) != 0)
 			map->r_bustag = &bs_be_tag;
+		else
+			map->r_bustag = nexus_get_bus_tag(NULL, NULL);
 		map->r_size = length;
 		map->r_bushandle = (bus_space_handle_t)map->r_vaddr;
 		break;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202505132246.54DMkSkM001602>