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
This commit is contained in:
John Baldwin 2024-01-23 09:38:36 -08:00
parent 3cf553288b
commit a82470212b
3 changed files with 16 additions and 4 deletions

View file

@ -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_ */

View file

@ -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);

View file

@ -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;