diff options
Diffstat (limited to 'sys/arch/mvme88k/dev/mainbus.c')
-rw-r--r-- | sys/arch/mvme88k/dev/mainbus.c | 143 |
1 files changed, 131 insertions, 12 deletions
diff --git a/sys/arch/mvme88k/dev/mainbus.c b/sys/arch/mvme88k/dev/mainbus.c index d5f70518c87..12a17d1ce47 100644 --- a/sys/arch/mvme88k/dev/mainbus.c +++ b/sys/arch/mvme88k/dev/mainbus.c @@ -1,5 +1,30 @@ -/* $OpenBSD: mainbus.c,v 1.10 2004/01/14 20:50:48 miod Exp $ */ -/* Copyright (c) 1998 Steve Murphree, Jr. */ +/* $OpenBSD: mainbus.c,v 1.11 2004/04/24 19:51:48 miod Exp $ */ +/* + * Copyright (c) 1998 Steve Murphree, Jr. + * Copyright (c) 2004, Miodrag Vallat. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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/param.h> #include <sys/systm.h> #include <sys/reboot.h> @@ -7,14 +32,108 @@ #include <sys/device.h> #include <sys/disklabel.h> +#include <machine/bus.h> +#include <machine/autoconf.h> +#include <machine/board.h> #include <machine/cmmu.h> #include <machine/cpu.h> -#include <machine/autoconf.h> -void mainbus_attach(struct device *, struct device *, void *); -int mainbus_match(struct device *, void *, void *); -int mainbus_print(void *, const char *); -int mainbus_scan(struct device *, void *, void *); +void mainbus_attach(struct device *, struct device *, void *); +int mainbus_match(struct device *, void *, void *); +int mainbus_print(void *, const char *); +int mainbus_scan(struct device *, void *, void *); + +/* + * bus_space routines for 1:1 obio mappings + */ + +int mainbus_map(bus_addr_t, bus_size_t, int, bus_space_handle_t *); +void mainbus_unmap(bus_space_handle_t, bus_size_t); +int mainbus_subregion(bus_space_handle_t, bus_size_t, bus_size_t, + bus_space_handle_t *); +void *mainbus_vaddr(bus_space_handle_t); + +const struct mvme88k_bus_space_tag mainbus_bustag = { + mainbus_map, + mainbus_unmap, + mainbus_subregion, + mainbus_vaddr +}; + +/* + * Obio (internal IO) space is mapped 1:1 (see pmap_bootstrap() for details). + * + * However, sram attaches as a child of mainbus, but does not reside in + * internal IO space. As a result, we have to allow both 1:1 and iomap + * translations, depending upon the address to map. + */ + +int +mainbus_map(bus_addr_t addr, bus_size_t size, int flags, + bus_space_handle_t *ret) +{ + vaddr_t map; + static bus_addr_t threshold = 0; + + if (threshold == 0) { + switch (brdtyp) { +#ifdef MVME188 + case BRD_188: + threshold = MVME188_UTILITY; + break; +#endif +#ifdef MVME187 + case BRD_187: + case BRD_8120: +#endif +#ifdef MVME197 + case BRD_197: +#endif + threshold = OBIO_START; + break; + } + } + + if (addr >= threshold) + map = (vaddr_t)addr; + else { +#if 0 + map = iomap_mapin(addr, size, 0); +#else + map = (vaddr_t)mapiodev((void *)addr, size); +#endif + } + + if (map == NULL) + return ENOMEM; + + *ret = (bus_space_handle_t)map; + return 0; +} + +void +mainbus_unmap(bus_space_handle_t handle, bus_size_t size) +{ + /* XXX what to do for non-obio mappings? */ +} + +int +mainbus_subregion(bus_space_handle_t handle, bus_addr_t offset, + bus_size_t size, bus_space_handle_t *ret) +{ + *ret = handle + offset; + return (0); +} + +void * +mainbus_vaddr(bus_space_handle_t handle) +{ + return (void *)handle; +} + +/* + * Configuration glue + */ struct cfattach mainbus_ca = { sizeof(struct device), mainbus_match, mainbus_attach @@ -40,8 +159,8 @@ mainbus_print(args, bus) { struct confargs *ca = args; - if (ca->ca_paddr != (void *)-1) - printf(" addr 0x%x", (u_int32_t)ca->ca_paddr); + if (ca->ca_paddr != -1) + printf(" addr 0x%x", ca->ca_paddr); return (UNCONF); } @@ -54,10 +173,10 @@ mainbus_scan(parent, child, args) struct confargs oca; bzero(&oca, sizeof oca); - oca.ca_paddr = (void *)cf->cf_loc[0]; - oca.ca_vaddr = (void *)-1; - oca.ca_ipl = -1; + oca.ca_iot = &mainbus_bustag; oca.ca_bustype = BUS_MAIN; + oca.ca_paddr = cf->cf_loc[0]; + oca.ca_ipl = -1; oca.ca_name = cf->cf_driver->cd_name; if ((*cf->cf_attach->ca_match)(parent, cf, &oca) == 0) return (0); |