Redefine bus_space_tag_t on PowerPC from a 32-bit integral to

a pointer to struct bus_space. The structure contains function
pointers that do the actual bus space access.

The reason for this change is that previously all bus space
accesses were little endian (i.e. had an explicit byte-swap
for multi-byte accesses), because all busses on Macs are little
endian.
The upcoming support for Book E, and in particular the E500
core, requires support for big-endian busses because all
embedded peripherals are in the native byte-order.

With this change, there's no distinction between I/O port
space and memory mapped I/O. PowerPC doesn't have I/O port
space. Busses assign tags based on the byte-order only.
For that purpose, two global structures exist (bs_be_tag and
bs_le_tag), of which the address can be taken to get a valid
tag.

Obtained from: Juniper, Semihalf
This commit is contained in:
Marcel Moolenaar 2007-12-19 18:00:50 +00:00
parent 1981bc3b8a
commit de2fa7b8af
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=174782
12 changed files with 1164 additions and 667 deletions

View File

@ -85,6 +85,7 @@ powerpc/powermac/uninorth.c optional powermac pci
powerpc/powerpc/atomic.S standard
powerpc/powerpc/autoconf.c standard
powerpc/powerpc/bcopy.c standard
powerpc/powerpc/bus_machdep.c standard
powerpc/powerpc/busdma_machdep.c standard
powerpc/powerpc/copystr.c standard
powerpc/powerpc/cpu.c standard

View File

@ -40,6 +40,7 @@
#include <machine/bus.h>
#include <machine/md_var.h>
#include <machine/nexusvar.h>
#include <machine/pio.h>
#include <machine/resource.h>
#include <sys/rman.h>

View File

@ -38,8 +38,8 @@ __FBSDID("$FreeBSD$");
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
bus_space_tag_t uart_bus_space_io = PPC_BUS_SPACE_IO;
bus_space_tag_t uart_bus_space_mem = PPC_BUS_SPACE_MEM;
bus_space_tag_t uart_bus_space_io = &bs_le_tag;
bus_space_tag_t uart_bus_space_mem = &bs_le_tag;
int
uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)

View File

@ -415,10 +415,7 @@ OF_decode_addr(phandle_t dev, int regno, bus_space_tag_t *tag,
OF_get_addr_props(bridge, &naddr, &nsize, &pci);
}
/* Default to memory mapped I/O. */
*tag = PPC_BUS_SPACE_MEM;
if (spc == OFW_PCI_PHYS_HI_SPACE_IO)
*tag = PPC_BUS_SPACE_IO;
*tag = &bs_le_tag;
return (bus_space_map(*tag, addr, size, 0, handle));
}

View File

@ -47,6 +47,8 @@ nodevice snake_saver
# isa
nodevice pcii
nodevice tnt4882
# sound
nodevice snd_cmi
# wants gdb_cur
nodevice dcons
nodevice dcons_crom

View File

@ -40,7 +40,7 @@ typedef u_int32_t bus_size_t;
/*
* Access methods for bus resources and address space.
*/
typedef u_int32_t bus_space_tag_t;
typedef struct bus_space *bus_space_tag_t;
typedef u_int32_t bus_space_handle_t;
#endif /* POWERPC_INCLUDE__BUS_H */

File diff suppressed because it is too large Load Diff

View File

@ -43,6 +43,7 @@
#include <machine/bus.h>
#include <machine/md_var.h>
#include <machine/nexusvar.h>
#include <machine/pio.h>
#include <machine/resource.h>
#include <sys/rman.h>
@ -363,7 +364,6 @@ grackle_alloc_resource(device_t bus, device_t child, int type, int *rid,
struct grackle_softc *sc;
struct resource *rv;
struct rman *rm;
bus_space_tag_t bt;
int needactivate;
needactivate = flags & RF_ACTIVE;
@ -374,18 +374,15 @@ grackle_alloc_resource(device_t bus, device_t child, int type, int *rid,
switch (type) {
case SYS_RES_MEMORY:
rm = &sc->sc_mem_rman;
bt = PPC_BUS_SPACE_MEM;
break;
case SYS_RES_IOPORT:
rm = &sc->sc_io_rman;
bt = PPC_BUS_SPACE_IO;
break;
case SYS_RES_IRQ:
return (bus_alloc_resource(bus, type, rid, start, end, count,
flags));
break;
default:
device_printf(bus, "unknown resource request from %s\n",
@ -401,7 +398,7 @@ grackle_alloc_resource(device_t bus, device_t child, int type, int *rid,
}
rman_set_rid(rv, *rid);
rman_set_bustag(rv, bt);
rman_set_bustag(rv, &bs_le_tag);
rman_set_bushandle(rv, rman_get_start(rv));
if (needactivate) {

View File

@ -369,7 +369,6 @@ macio_alloc_resource(device_t bus, device_t child, int type, int *rid,
int needactivate;
struct resource *rv;
struct rman *rm;
bus_space_tag_t tagval;
u_long adjstart, adjend, adjcount;
struct macio_devinfo *dinfo;
struct resource_list_entry *rle;
@ -408,8 +407,6 @@ macio_alloc_resource(device_t bus, device_t child, int type, int *rid,
adjcount = adjend - adjstart;
rm = &sc->sc_mem_rman;
tagval = PPC_BUS_SPACE_MEM;
break;
case SYS_RES_IRQ:
@ -431,7 +428,6 @@ macio_alloc_resource(device_t bus, device_t child, int type, int *rid,
return (resource_list_alloc(&dinfo->mdi_resources, bus, child,
type, rid, start, end, count, flags));
break;
default:
device_printf(bus, "unknown resource request from %s\n",
@ -449,7 +445,7 @@ macio_alloc_resource(device_t bus, device_t child, int type, int *rid,
}
rman_set_rid(rv, *rid);
rman_set_bustag(rv, tagval);
rman_set_bustag(rv, &bs_le_tag);
rman_set_bushandle(rv, rman_get_start(rv));
if (needactivate) {

View File

@ -41,6 +41,7 @@
#include <machine/bus.h>
#include <machine/md_var.h>
#include <machine/nexusvar.h>
#include <machine/pio.h>
#include <machine/resource.h>
#include <sys/rman.h>
@ -347,7 +348,6 @@ uninorth_alloc_resource(device_t bus, device_t child, int type, int *rid,
struct uninorth_softc *sc;
struct resource *rv;
struct rman *rm;
bus_space_tag_t bt;
int needactivate;
needactivate = flags & RF_ACTIVE;
@ -358,18 +358,16 @@ uninorth_alloc_resource(device_t bus, device_t child, int type, int *rid,
switch (type) {
case SYS_RES_MEMORY:
rm = &sc->sc_mem_rman;
bt = PPC_BUS_SPACE_MEM;
break;
case SYS_RES_IOPORT:
rm = &sc->sc_io_rman;
bt = PPC_BUS_SPACE_IO;
break;
case SYS_RES_IRQ:
return (bus_alloc_resource(bus, type, rid, start, end, count,
flags));
break;
default:
device_printf(bus, "unknown resource request from %s\n",
device_get_nameunit(child));
@ -384,7 +382,7 @@ uninorth_alloc_resource(device_t bus, device_t child, int type, int *rid,
}
rman_set_rid(rv, *rid);
rman_set_bustag(rv, bt);
rman_set_bustag(rv, &bs_le_tag);
rman_set_bushandle(rv, rman_get_start(rv));
if (needactivate) {

View File

@ -0,0 +1,788 @@
/*-
* Copyright (c) 2006 Semihalf, Rafal Jaworowski <raj@semihalf.com>
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
* NASA Ames Research Center.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <machine/pio.h>
#define TODO panic("%s: not implemented", __func__)
static __inline void *
__ppc_ba(bus_space_handle_t bsh, bus_size_t ofs)
{
return ((void *)(bsh + ofs));
}
static int
bs_gen_map(bus_addr_t addr, bus_size_t size __unused, int flags __unused,
bus_space_handle_t *bshp)
{
*bshp = addr;
return (0);
}
static void
bs_gen_unmap(bus_size_t size __unused)
{
}
static int
bs_gen_subregion(bus_space_handle_t bsh, bus_size_t ofs,
bus_size_t size __unused, bus_space_handle_t *nbshp)
{
*nbshp = bsh + ofs;
return (0);
}
static int
bs_gen_alloc(bus_addr_t rstart __unused, bus_addr_t rend __unused,
bus_size_t size __unused, bus_size_t alignment __unused,
bus_size_t boundary __unused, int flags __unused,
bus_addr_t *bpap __unused, bus_space_handle_t *bshp __unused)
{
TODO;
}
static void
bs_gen_free(bus_space_handle_t bsh __unused, bus_size_t size __unused)
{
TODO;
}
static void
bs_gen_barrier(bus_space_handle_t bsh __unused, bus_size_t ofs __unused,
bus_size_t size __unused, int flags __unused)
{
__asm __volatile("" : : : "memory");
}
/*
* Big-endian access functions
*/
static uint8_t
bs_be_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
{
return (in8(__ppc_ba(bsh, ofs)));
}
static uint16_t
bs_be_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
{
return (in16(__ppc_ba(bsh, ofs)));
}
static uint32_t
bs_be_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
{
return (in32(__ppc_ba(bsh, ofs)));
}
static uint64_t
bs_be_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
{
TODO;
}
static void
bs_be_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
{
ins8(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_be_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
{
ins16(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_be_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
{
ins32(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_be_rm_8(bus_space_handle_t bshh, bus_size_t ofs, uint64_t *addr, size_t cnt)
{
TODO;
}
static void
bs_be_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
{
volatile uint8_t *s = __ppc_ba(bsh, ofs);
while (cnt--)
*addr++ = *s++;
__asm __volatile("eieio; sync");
}
static void
bs_be_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
{
volatile uint16_t *s = __ppc_ba(bsh, ofs);
while (cnt--)
*addr++ = *s++;
__asm __volatile("eieio; sync");
}
static void
bs_be_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
{
volatile uint32_t *s = __ppc_ba(bsh, ofs);
while (cnt--)
*addr++ = *s++;
__asm __volatile("eieio; sync");
}
static void
bs_be_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
{
TODO;
}
static void
bs_be_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
{
out8(__ppc_ba(bsh, ofs), val);
}
static void
bs_be_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
{
out16(__ppc_ba(bsh, ofs), val);
}
static void
bs_be_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
{
out32(__ppc_ba(bsh, ofs), val);
}
static void
bs_be_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
{
TODO;
}
static void
bs_be_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
bus_size_t cnt)
{
outsb(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_be_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
bus_size_t cnt)
{
outsw(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_be_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
bus_size_t cnt)
{
outsl(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_be_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
bus_size_t cnt)
{
TODO;
}
static void
bs_be_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
size_t cnt)
{
volatile uint8_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d++ = *addr++;
__asm __volatile("eieio; sync");
}
static void
bs_be_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
size_t cnt)
{
volatile uint16_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d++ = *addr++;
__asm __volatile("eieio; sync");
}
static void
bs_be_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
size_t cnt)
{
volatile uint32_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d++ = *addr++;
__asm __volatile("eieio; sync");
}
static void
bs_be_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
size_t cnt)
{
TODO;
}
static void
bs_be_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
{
volatile uint8_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d = val;
__asm __volatile("eieio; sync");
}
static void
bs_be_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
{
volatile uint16_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d = val;
__asm __volatile("eieio; sync");
}
static void
bs_be_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
{
volatile uint32_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d = val;
__asm __volatile("eieio; sync");
}
static void
bs_be_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
{
TODO;
}
static void
bs_be_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
{
volatile uint8_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d++ = val;
__asm __volatile("eieio; sync");
}
static void
bs_be_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
{
volatile uint16_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d++ = val;
__asm __volatile("eieio; sync");
}
static void
bs_be_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
{
volatile uint32_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d++ = val;
__asm __volatile("eieio; sync");
}
static void
bs_be_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
{
TODO;
}
/*
* Little-endian access functions
*/
static uint8_t
bs_le_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
{
return (in8(__ppc_ba(bsh, ofs)));
}
static uint16_t
bs_le_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
{
return (in16rb(__ppc_ba(bsh, ofs)));
}
static uint32_t
bs_le_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
{
return (in32rb(__ppc_ba(bsh, ofs)));
}
static uint64_t
bs_le_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
{
TODO;
}
static void
bs_le_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
{
ins8(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_le_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
{
ins16rb(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_le_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
{
ins32rb(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_le_rm_8(bus_space_handle_t bshh, bus_size_t ofs, uint64_t *addr, size_t cnt)
{
TODO;
}
static void
bs_le_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
{
volatile uint8_t *s = __ppc_ba(bsh, ofs);
while (cnt--)
*addr++ = *s++;
__asm __volatile("eieio; sync");
}
static void
bs_le_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
{
volatile uint16_t *s = __ppc_ba(bsh, ofs);
while (cnt--)
*addr++ = in16rb(s++);
__asm __volatile("eieio; sync");
}
static void
bs_le_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
{
volatile uint32_t *s = __ppc_ba(bsh, ofs);
while (cnt--)
*addr++ = in32rb(s++);
__asm __volatile("eieio; sync");
}
static void
bs_le_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
{
TODO;
}
static void
bs_le_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
{
out8(__ppc_ba(bsh, ofs), val);
}
static void
bs_le_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
{
out16rb(__ppc_ba(bsh, ofs), val);
}
static void
bs_le_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
{
out32rb(__ppc_ba(bsh, ofs), val);
}
static void
bs_le_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
{
TODO;
}
static void
bs_le_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
bus_size_t cnt)
{
outs8(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_le_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
bus_size_t cnt)
{
outs16rb(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_le_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
bus_size_t cnt)
{
outs32rb(__ppc_ba(bsh, ofs), addr, cnt);
}
static void
bs_le_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
bus_size_t cnt)
{
TODO;
}
static void
bs_le_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
size_t cnt)
{
volatile uint8_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d++ = *addr++;
__asm __volatile("eieio; sync");
}
static void
bs_le_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
size_t cnt)
{
volatile uint16_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
out16rb(d++, *addr++);
__asm __volatile("eieio; sync");
}
static void
bs_le_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
size_t cnt)
{
volatile uint32_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
out32rb(d++, *addr++);
__asm __volatile("eieio; sync");
}
static void
bs_le_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
size_t cnt)
{
TODO;
}
static void
bs_le_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
{
volatile uint8_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d = val;
__asm __volatile("eieio; sync");
}
static void
bs_le_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
{
volatile uint16_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
out16rb(d, val);
__asm __volatile("eieio; sync");
}
static void
bs_le_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
{
volatile uint32_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
out32rb(d, val);
__asm __volatile("eieio; sync");
}
static void
bs_le_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
{
TODO;
}
static void
bs_le_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
{
volatile uint8_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
*d++ = val;
__asm __volatile("eieio; sync");
}
static void
bs_le_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
{
volatile uint16_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
out16rb(d++, val);
__asm __volatile("eieio; sync");
}
static void
bs_le_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
{
volatile uint32_t *d = __ppc_ba(bsh, ofs);
while (cnt--)
out32rb(d++, val);
__asm __volatile("eieio; sync");
}
static void
bs_le_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
{
TODO;
}
struct bus_space bs_be_tag = {
/* mapping/unmapping */
bs_gen_map,
bs_gen_unmap,
bs_gen_subregion,
/* allocation/deallocation */
bs_gen_alloc,
bs_gen_free,
/* barrier */
bs_gen_barrier,
/* read (single) */
bs_be_rs_1,
bs_be_rs_2,
bs_be_rs_4,
bs_be_rs_8,
bs_be_rs_2,
bs_be_rs_4,
bs_be_rs_8,
/* read multiple */
bs_be_rm_1,
bs_be_rm_2,
bs_be_rm_4,
bs_be_rm_8,
bs_be_rm_2,
bs_be_rm_4,
bs_be_rm_8,
/* read region */
bs_be_rr_1,
bs_be_rr_2,
bs_be_rr_4,
bs_be_rr_8,
bs_be_rr_2,
bs_be_rr_4,
bs_be_rr_8,
/* write (single) */
bs_be_ws_1,
bs_be_ws_2,
bs_be_ws_4,
bs_be_ws_8,
bs_be_ws_2,
bs_be_ws_4,
bs_be_ws_8,
/* write multiple */
bs_be_wm_1,
bs_be_wm_2,
bs_be_wm_4,
bs_be_wm_8,
bs_be_wm_2,
bs_be_wm_4,
bs_be_wm_8,
/* write region */
bs_be_wr_1,
bs_be_wr_2,
bs_be_wr_4,
bs_be_wr_8,
bs_be_wr_2,
bs_be_wr_4,
bs_be_wr_8,
/* set multiple */
bs_be_sm_1,
bs_be_sm_2,
bs_be_sm_4,
bs_be_sm_8,
bs_be_sm_2,
bs_be_sm_4,
bs_be_sm_8,
/* set region */
bs_be_sr_1,
bs_be_sr_2,
bs_be_sr_4,
bs_be_sr_8,
bs_be_sr_2,
bs_be_sr_4,
bs_be_sr_8,
};
struct bus_space bs_le_tag = {
/* mapping/unmapping */
bs_gen_map,
bs_gen_unmap,
bs_gen_subregion,
/* allocation/deallocation */
bs_gen_alloc,
bs_gen_free,
/* barrier */
bs_gen_barrier,
/* read (single) */
bs_le_rs_1,
bs_le_rs_2,
bs_le_rs_4,
bs_le_rs_8,
bs_be_rs_2,
bs_be_rs_4,
bs_be_rs_8,
/* read multiple */
bs_le_rm_1,
bs_le_rm_2,
bs_le_rm_4,
bs_le_rm_8,
bs_be_rm_2,
bs_be_rm_4,
bs_be_rm_8,
/* read region */
bs_le_rr_1,
bs_le_rr_2,
bs_le_rr_4,
bs_le_rr_8,
bs_be_rr_2,
bs_be_rr_4,
bs_be_rr_8,
/* write (single) */
bs_le_ws_1,
bs_le_ws_2,
bs_le_ws_4,
bs_le_ws_8,
bs_be_ws_2,
bs_be_ws_4,
bs_be_ws_8,
/* write multiple */
bs_le_wm_1,
bs_le_wm_2,
bs_le_wm_4,
bs_le_wm_8,
bs_be_wm_2,
bs_be_wm_4,
bs_be_wm_8,
/* write region */
bs_le_wr_1,
bs_le_wr_2,
bs_le_wr_4,
bs_le_wr_8,
bs_be_wr_2,
bs_be_wr_4,
bs_be_wr_8,
/* set multiple */
bs_le_sm_1,
bs_le_sm_2,
bs_le_sm_4,
bs_le_sm_8,
bs_be_sm_2,
bs_be_sm_4,
bs_be_sm_8,
/* set region */
bs_le_sr_1,
bs_le_sr_2,
bs_le_sr_4,
bs_le_sr_8,
bs_be_sr_2,
bs_be_sr_4,
bs_be_sr_8,
};

View File

@ -311,7 +311,6 @@ iobus_alloc_resource(device_t bus, device_t child, int type, int *rid,
int needactivate;
struct resource *rv;
struct rman *rm;
bus_space_tag_t tagval;
sc = device_get_softc(bus);
@ -322,15 +321,13 @@ iobus_alloc_resource(device_t bus, device_t child, int type, int *rid,
case SYS_RES_MEMORY:
case SYS_RES_IOPORT:
rm = &sc->sc_mem_rman;
tagval = PPC_BUS_SPACE_MEM;
break;
case SYS_RES_IRQ:
return (bus_alloc_resource(bus, type, rid, start, end, count,
flags));
break;
flags));
default:
device_printf(bus, "unknown resource request from %s\n",
device_get_nameunit(child));
device_get_nameunit(child));
return (NULL);
}
@ -342,7 +339,7 @@ iobus_alloc_resource(device_t bus, device_t child, int type, int *rid,
}
rman_set_rid(rv, *rid);
rman_set_bustag(rv, tagval);
rman_set_bustag(rv, &bs_le_tag);
rman_set_bushandle(rv, rman_get_start(rv));
if (needactivate) {