summaryrefslogtreecommitdiff
path: root/sys/arch/mvme88k/dev/mainbus.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/mvme88k/dev/mainbus.c')
-rw-r--r--sys/arch/mvme88k/dev/mainbus.c143
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);