git: a82470212b76 - main - powerpc: Add RF_LITTLEENDIAN resource flag

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Tue, 23 Jan 2024 17:46:06 UTC
The branch main has been updated by jhb:

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

commit a82470212b7659afb7d3287e2ccae72d5e496b71
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2024-01-23 17:38:36 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2024-01-23 17:38:36 +0000

    powerpc: Add RF_LITTLEENDIAN resource flag
    
    If this powerpc-specific flag is set on a resource, then the
    little-endian bus tag is always used when mapping that resource.
    
    Make use of this flag in the mpc85xx/fsl_sata driver to avoid setting
    the SATA BAR's bus tag after bus_alloc_resource.
    
    Reviewed by:    jhibbits
    Differential Revision:  https://reviews.freebsd.org/D43553
---
 sys/powerpc/include/resource.h |  7 +++++++
 sys/powerpc/mpc85xx/fsl_sata.c |  3 +--
 sys/powerpc/powerpc/nexus.c    | 10 ++++++++--
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/sys/powerpc/include/resource.h b/sys/powerpc/include/resource.h
index 9477572176e0..e7e9493569cc 100644
--- a/sys/powerpc/include/resource.h
+++ b/sys/powerpc/include/resource.h
@@ -41,4 +41,11 @@
 #define	SYS_RES_IOPORT	4	/* i/o ports */
 #define	PCI_RES_BUS	5	/* PCI bus numbers */
 
+/*
+ * A powerpc-specific resource flag to request little-endian bus tags
+ * for a resource.
+ */
+
+#define	RF_LITTLEENDIAN		RF_SPARE1
+
 #endif /* !_MACHINE_RESOURCE_H_ */
diff --git a/sys/powerpc/mpc85xx/fsl_sata.c b/sys/powerpc/mpc85xx/fsl_sata.c
index 861aaba530e3..74fc40053fdc 100644
--- a/sys/powerpc/mpc85xx/fsl_sata.c
+++ b/sys/powerpc/mpc85xx/fsl_sata.c
@@ -352,9 +352,8 @@ fsl_sata_attach(device_t dev)
 	}
 	ch->r_mid = 0;
 	if (!(ch->r_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
-	    &ch->r_mid, RF_ACTIVE)))
+	    &ch->r_mid, RF_ACTIVE | RF_LITTLEENDIAN)))
 		return (ENXIO);
-	rman_set_bustag(ch->r_mem, &bs_le_tag);
 	fsl_sata_dmainit(dev);
 	fsl_sata_slotsalloc(dev);
 	fsl_sata_init(dev);
diff --git a/sys/powerpc/powerpc/nexus.c b/sys/powerpc/powerpc/nexus.c
index 3c71e1e79e3b..55afadcb4e20 100644
--- a/sys/powerpc/powerpc/nexus.c
+++ b/sys/powerpc/powerpc/nexus.c
@@ -275,14 +275,20 @@ nexus_map_resource(device_t bus, device_t child, int type, struct resource *r,
 		panic("%s:%d SYS_RES_IOPORT handling not implemented", __func__, __LINE__);
 		/*   XXX: untested
 		map->r_bushandle = start;
-		map->r_bustag = nexus_get_bus_tag(NULL, NULL);
+		if ((rman_get_flags(r) & RF_LITTLEENDIAN) != 0)
+			map->r_bustag = &bs_le_tag;
+		else
+			map->r_bustag = nexus_get_bus_tag(NULL, NULL);
 		map->r_size = length;
 		map->r_vaddr = NULL;
 		*/
 		break;
 	case SYS_RES_MEMORY:
 		map->r_vaddr = pmap_mapdev_attr(start, length, args.memattr);
-		map->r_bustag = nexus_get_bus_tag(NULL, NULL);
+		if ((rman_get_flags(r) & RF_LITTLEENDIAN) != 0)
+			map->r_bustag = &bs_le_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;