diff options
author | Dale S. Rahn <rahnds@cvs.openbsd.org> | 1999-11-08 23:49:01 +0000 |
---|---|---|
committer | Dale S. Rahn <rahnds@cvs.openbsd.org> | 1999-11-08 23:49:01 +0000 |
commit | 0b93a282a4901915cf5cbd81741e1ef7eb6d6726 (patch) | |
tree | 7f00c3bc473218e23d1dd8d8f325d61c28130679 /sys/arch/powerpc/pci/macobio.c | |
parent | f852bd66af9ffe7e798bb823f628e1e9c20cc084 (diff) |
Changes for imac support. support for VI computers and MCG Powerstack
will need to be merged back in. Both are currently untested.
mac interrupt support is currently a big hack and needs to be redesigned
as part of the system, several of the mac drivers need busified also.
Diffstat (limited to 'sys/arch/powerpc/pci/macobio.c')
-rw-r--r-- | sys/arch/powerpc/pci/macobio.c | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/sys/arch/powerpc/pci/macobio.c b/sys/arch/powerpc/pci/macobio.c new file mode 100644 index 00000000000..f7d9de1b34b --- /dev/null +++ b/sys/arch/powerpc/pci/macobio.c @@ -0,0 +1,212 @@ +/* $NetBSD: obio.c,v 1.6 1999/05/01 10:36:08 tsubai Exp $ */ + +/*- + * Copyright (C) 1998 Internet Research Institute, Inc. + * All rights reserved. + * + * 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 + * Internet Research Institute, Inc. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * 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/types.h> +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/device.h> + +#include <dev/pci/pcivar.h> +#include <dev/pci/pcidevs.h> + +#include <dev/ofw/openfirm.h> + +#include <machine/bus.h> +#include <machine/autoconf.h> + +static void obio_attach __P((struct device *, struct device *, void *)); +static int obio_match __P((struct device *, void *, void *)); +static int obio_print __P((void *, const char *)); + +struct obio_softc { + struct device sc_dev; + int sc_node; + struct ppc_bus_space sc_membus_space; +}; +struct cfdriver obio_cd = { + NULL, "macobio", DV_DULL, +}; + + +struct cfattach obio_ca = { + sizeof(struct obio_softc), obio_match, obio_attach +}; + +int +obio_match(parent, cf, aux) + struct device *parent; + void *cf; + void *aux; +{ + struct pci_attach_args *pa = aux; + + if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_APPLE) + switch (PCI_PRODUCT(pa->pa_id)) { + + case 0x02: /* gc */ + case 0x07: /* ohare */ + case 0x10: /* mac-io "Heathrow" */ + case 0x17: /* mac-io "Paddington" */ + return 1; + } + + return 0; +} + +#define HEATHROW_FCR_OFFSET 0x38 +u_int32_t *heathrow_FCR = NULL; + +void prog_switch (void *arg) +{ + Debugger(); +} + +/* + * Attach all the sub-devices we can find + */ +void +obio_attach(parent, self, aux) + struct device *parent, *self; + void *aux; +{ + struct obio_softc *sc = (struct obio_softc *)self; + struct pci_attach_args *pa = aux; + struct confargs ca; + int node, child, namelen; + u_int32_t reg[20]; + int32_t intr[5]; + char name[32]; + + printf("obio ver %x\n", (PCI_PRODUCT(pa->pa_id))); + + switch (PCI_PRODUCT(pa->pa_id)) { + + /* XXX should not use name */ + case 0x02: + node = OF_finddevice("/bandit/gc"); + break; + + case 0x07: + node = OF_finddevice("/bandit/ohare"); + break; + + case 0x10: /* heathrow */ + case 0x17: /* paddington */ + node = OF_finddevice("mac-io"); + if (node == -1) + node = OF_finddevice("/pci/mac-io"); + if (OF_getprop(node, "assigned-addresses", reg, sizeof(reg)) + == (sizeof (reg[0]) * 5)) + { + /* always ??? */ + heathrow_FCR = mapiodev(reg[2] + HEATHROW_FCR_OFFSET, + 4); + printf("heathrow fcr, %x\n", heathrow_FCR); + } + break; + + default: + printf("obio_attach: unknown obio controller\n"); + return; + } + sc->sc_node = node; + + if (OF_getprop(node, "assigned-addresses", reg, sizeof(reg)) < 12) + return; + ca.ca_baseaddr = reg[2]; + + sc->sc_membus_space.bus_base = ca.ca_baseaddr; + { + extern u_int32_t *interrupt_reg; + /* OK THIS IS AN UGLY HACK */ + void mac_do_pending_int(); + void mac_ext_intr(); + typedef void (void_f) (void); + extern void_f *pending_int_f; + + interrupt_reg = (void*)ca.ca_baseaddr; + + install_extint(mac_ext_intr); + pending_int_f = mac_do_pending_int; + + mac_intr_establish(0x14, IST_LEVEL, IPL_HIGH, + prog_switch, 0x14); + } + + sc->sc_membus_space.bus_reverse = 1; + + ca.ca_iot = &sc->sc_membus_space; + + printf(": addr 0x%x\n", ca.ca_baseaddr); + + for (child = OF_child(node); child; child = OF_peer(child)) { + namelen = OF_getprop(child, "name", name, sizeof(name)); + if (namelen < 0) + continue; + if (namelen >= sizeof(name)) + continue; + + name[namelen] = 0; + ca.ca_name = name; + ca.ca_node = child; + + ca.ca_nreg = OF_getprop(child, "reg", reg, sizeof(reg)); + ca.ca_nintr = OF_getprop(child, "AAPL,interrupts", intr, + sizeof(intr)); + if (ca.ca_nintr == -1) + ca.ca_nintr = OF_getprop(child, "interrupts", intr, + sizeof(intr)); + + ca.ca_reg = reg; + ca.ca_intr = intr; + + config_found(self, &ca, obio_print); + } +} + +int +obio_print(aux, obio) + void *aux; + const char *obio; +{ + struct confargs *ca = aux; + + if (obio) + printf("%s at %s", ca->ca_name, obio); + + if (ca->ca_nreg > 0) + printf(" offset 0x%x", ca->ca_reg[0]); + + return UNCONF; +} |