summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/loongson/conf/GENERIC4
-rw-r--r--sys/arch/loongson/conf/RAMDISK3
-rw-r--r--sys/arch/loongson/conf/files.loongson6
-rw-r--r--sys/arch/loongson/dev/ohci_voyager.c188
-rw-r--r--sys/arch/loongson/dev/smfb.c4
-rw-r--r--sys/arch/loongson/dev/voyager.c179
-rw-r--r--sys/arch/loongson/dev/voyagerreg.h95
-rw-r--r--sys/arch/loongson/dev/voyagervar.h7
8 files changed, 457 insertions, 29 deletions
diff --git a/sys/arch/loongson/conf/GENERIC b/sys/arch/loongson/conf/GENERIC
index 2876a9b4d37..b9ed254b97f 100644
--- a/sys/arch/loongson/conf/GENERIC
+++ b/sys/arch/loongson/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.14 2010/02/24 22:16:18 miod Exp $
+# $OpenBSD: GENERIC,v 1.15 2010/02/26 14:53:11 miod Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -62,7 +62,7 @@ stsec0 at iic0 # ST7 Embedded Controller
lmtemp0 at iic0 # National Semiconductor LM75
mfokclock0 at iic0 # M41T8x todclock
#iic* at voyager?
-#ohci* at voyager?
+ohci* at voyager?
smfb* at voyager?
wsdisplay* at smfb?
diff --git a/sys/arch/loongson/conf/RAMDISK b/sys/arch/loongson/conf/RAMDISK
index 02eaff0c8e4..4645e275491 100644
--- a/sys/arch/loongson/conf/RAMDISK
+++ b/sys/arch/loongson/conf/RAMDISK
@@ -1,4 +1,4 @@
-# $OpenBSD: RAMDISK,v 1.8 2010/02/19 00:21:43 miod Exp $
+# $OpenBSD: RAMDISK,v 1.9 2010/02/26 14:53:11 miod Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -68,6 +68,7 @@ gdiumiic0 at gpio0 offset 6 mask 0x81 # pins 6 and 13
gdiumiic0 at gpio0 offset 46 mask 0x03 # pins 46 and 47
iic0 at gdiumiic0
mfokclock0 at iic0 # M41T8x todclock
+ohci* at voyager?
smfb* at voyager?
wsdisplay* at smfb?
diff --git a/sys/arch/loongson/conf/files.loongson b/sys/arch/loongson/conf/files.loongson
index 6cdb10f0ce7..a5099a90154 100644
--- a/sys/arch/loongson/conf/files.loongson
+++ b/sys/arch/loongson/conf/files.loongson
@@ -1,4 +1,4 @@
-# $OpenBSD: files.loongson,v 1.6 2010/02/24 22:16:18 miod Exp $
+# $OpenBSD: files.loongson,v 1.7 2010/02/26 14:53:11 miod Exp $
# Standard stanzas config(8) can't run without
maxpartitions 16
@@ -98,6 +98,10 @@ device mfokclock
attach mfokclock at i2c
file arch/loongson/dev/m41t8xclock.c mfokclock
+# SM502 OHCI
+attach ohci at voyager with ohci_voyager
+file arch/loongson/dev/ohci_voyager.c ohci_voyager
+
# Silicon Motion SM502/SM712 frame buffer
device smfb: wsemuldisplaydev, rasops16
attach smfb at pci with smfb_pci
diff --git a/sys/arch/loongson/dev/ohci_voyager.c b/sys/arch/loongson/dev/ohci_voyager.c
new file mode 100644
index 00000000000..ca37ca57503
--- /dev/null
+++ b/sys/arch/loongson/dev/ohci_voyager.c
@@ -0,0 +1,188 @@
+/* $OpenBSD: ohci_voyager.c,v 1.1 2010/02/26 14:53:11 miod Exp $ */
+/* OpenBSD: ohci_pci.c,v 1.33 2008/06/26 05:42:17 ray Exp */
+/* $NetBSD: ohci_pci.c,v 1.23 2002/10/02 16:51:47 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Lennart Augustsson (lennart@augustsson.net) at
+ * Carlstedt Research & Technology.
+ *
+ * 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 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.
+ */
+
+/*
+ * USB Open Host Controller driver.
+ *
+ * OHCI spec: http://www.intel.com/design/usb/ohci11d.pdf
+ * USB spec: http://www.teleport.com/cgi-bin/mailmerge.cgi/~usb/cgiform.tpl
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/device.h>
+#include <sys/proc.h>
+#include <sys/queue.h>
+
+#include <machine/bus.h>
+
+#include <dev/pci/pcivar.h>
+
+#include <loongson/dev/voyagerreg.h>
+#include <loongson/dev/voyagervar.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usbdivar.h>
+#include <dev/usb/usb_mem.h>
+
+#include <dev/usb/ohcireg.h>
+#include <dev/usb/ohcivar.h>
+
+extern int gdium_revision;
+
+int ohci_voyager_match(struct device *, void *, void *);
+void ohci_voyager_attach(struct device *, struct device *, void *);
+void ohci_voyager_attach_deferred(struct device *);
+
+struct ohci_voyager_softc {
+ ohci_softc_t sc;
+ void *sc_ih;
+};
+
+struct cfattach ohci_voyager_ca = {
+ sizeof(struct ohci_voyager_softc),
+ ohci_voyager_match, ohci_voyager_attach, NULL, ohci_activate
+};
+
+int
+ohci_voyager_match(struct device *parent, void *vcf, void *aux)
+{
+ struct voyager_attach_args *vaa = (struct voyager_attach_args *)aux;
+ struct cfdata *cf = (struct cfdata *)vcf;
+
+ return gdium_revision == 0 &&
+ strcmp(vaa->vaa_name, cf->cf_driver->cd_name) == 0;
+}
+
+void
+ohci_voyager_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct ohci_voyager_softc *sc = (struct ohci_voyager_softc *)self;
+ struct voyager_attach_args *vaa = (struct voyager_attach_args *)aux;
+ struct pci_attach_args *pa = vaa->vaa_pa;
+ int s;
+ const char *vendor;
+ char *devname = sc->sc.sc_bus.bdev.dv_xname;
+
+ /* Map I/O registers */
+ sc->sc.sc_size = VOYAGER_OHCI_SIZE;
+ sc->sc.iot = vaa->vaa_mmiot;
+ if (bus_space_subregion(vaa->vaa_mmiot, vaa->vaa_mmioh,
+ VOYAGER_OHCI_BASE, VOYAGER_OHCI_SIZE, &sc->sc.ioh) != 0) {
+ printf(": can't map mem space\n");
+ return;
+ }
+
+ /* Record what interrupts were enabled by SMM/BIOS. */
+ sc->sc.sc_intre = bus_space_read_4(sc->sc.iot, sc->sc.ioh,
+ OHCI_INTERRUPT_ENABLE);
+
+ /* Disable interrupts, so we don't get any spurious ones. */
+ bus_space_write_4(sc->sc.iot, sc->sc.ioh, OHCI_INTERRUPT_DISABLE,
+ OHCI_MIE);
+
+ sc->sc.sc_bus.dmatag = pa->pa_dmat;
+
+ bus_space_barrier(sc->sc.iot, sc->sc.ioh, 0, sc->sc.sc_size,
+ BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE);
+ bus_space_write_4(sc->sc.iot, sc->sc.ioh,
+ OHCI_INTERRUPT_DISABLE, OHCI_MIE);
+
+ s = splusb();
+ /* establish the interrupt. */
+ sc->sc_ih = voyager_intr_establish(parent, VOYAGER_INTR_USB_HOST,
+ IPL_USB, ohci_intr, sc, devname);
+ if (sc->sc_ih == NULL) {
+ printf(": couldn't establish interrupt\n");
+ splx(s);
+ return;
+ }
+ printf(": %s", voyager_intr_string(sc->sc_ih));
+
+ /* Figure out vendor for root hub descriptor. */
+ vendor = pci_findvendor(pa->pa_id);
+ sc->sc.sc_id_vendor = PCI_VENDOR(pa->pa_id);
+ if (vendor)
+ strlcpy(sc->sc.sc_vendor, vendor, sizeof (sc->sc.sc_vendor));
+ else
+ snprintf(sc->sc.sc_vendor, sizeof (sc->sc.sc_vendor),
+ "vendor 0x%04x", PCI_VENDOR(pa->pa_id));
+
+ /* Display revision and perform legacy emulation handover. */
+ if (ohci_checkrev(&sc->sc) != USBD_NORMAL_COMPLETION ||
+ ohci_handover(&sc->sc) != USBD_NORMAL_COMPLETION) {
+ splx(s);
+ return;
+ }
+
+ /* Ignore interrupts for now */
+ sc->sc.sc_dying = 1;
+
+ config_defer(self, ohci_voyager_attach_deferred);
+
+ splx(s);
+}
+
+void
+ohci_voyager_attach_deferred(struct device *self)
+{
+ struct ohci_voyager_softc *sc = (struct ohci_voyager_softc *)self;
+ usbd_status r;
+ int s;
+
+ s = splusb();
+
+ sc->sc.sc_dying = 0;
+
+ r = ohci_init(&sc->sc);
+ if (r != USBD_NORMAL_COMPLETION) {
+ printf("%s: init failed, error=%d\n",
+ sc->sc.sc_bus.bdev.dv_xname, r);
+ bus_space_unmap(sc->sc.iot, sc->sc.ioh, sc->sc.sc_size);
+ splx(s);
+ return;
+ }
+
+ sc->sc.sc_powerhook = powerhook_establish(ohci_power, &sc->sc);
+ if (sc->sc.sc_powerhook == NULL)
+ printf("%s: unable to establish powerhook\n",
+ sc->sc.sc_bus.bdev.dv_xname);
+
+ splx(s);
+
+ /* Attach usb device. */
+ sc->sc.sc_child = config_found((void *)sc, &sc->sc.sc_bus, usbctlprint);
+}
diff --git a/sys/arch/loongson/dev/smfb.c b/sys/arch/loongson/dev/smfb.c
index 7bb9ace4430..47496d92747 100644
--- a/sys/arch/loongson/dev/smfb.c
+++ b/sys/arch/loongson/dev/smfb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smfb.c,v 1.5 2010/02/18 22:45:28 miod Exp $ */
+/* $OpenBSD: smfb.c,v 1.6 2010/02/26 14:53:11 miod Exp $ */
/*
* Copyright (c) 2009, 2010 Miodrag Vallat.
@@ -523,7 +523,7 @@ smfb_wait(struct smfb *fb)
while (i-- != 0) {
if (fb->is5xx) {
reg = REG_READ(fb, VOYAGER_SYSTEM_CONTROL);
- if ((reg & (VSC_FIFO_EMPTY | VSC_STATUS_BUSY)) ==
+ if ((reg & (VSC_FIFO_EMPTY | VSC_2DENGINE_BUSY)) ==
VSC_FIFO_EMPTY)
return 0;
} else {
diff --git a/sys/arch/loongson/dev/voyager.c b/sys/arch/loongson/dev/voyager.c
index f470e968f4a..40aa6f2c0a8 100644
--- a/sys/arch/loongson/dev/voyager.c
+++ b/sys/arch/loongson/dev/voyager.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: voyager.c,v 1.2 2010/02/24 22:14:54 miod Exp $ */
+/* $OpenBSD: voyager.c,v 1.3 2010/02/26 14:53:11 miod Exp $ */
/*
* Copyright (c) 2010 Miodrag Vallat.
@@ -27,6 +27,7 @@
#include <machine/bus.h>
#include <machine/cpu.h>
+#include <machine/intr.h>
#include <dev/gpio/gpiovar.h>
@@ -34,6 +35,7 @@
#include <dev/pci/pcivar.h>
#include <dev/pci/pcidevs.h>
+#include <loongson/dev/bonito_irq.h> /* for BONITO_NINTS */
#include <loongson/dev/voyagerreg.h>
#include <loongson/dev/voyagervar.h>
@@ -49,7 +51,10 @@ struct voyager_softc {
bus_size_t sc_mmiosize;
struct gpio_chipset_tag sc_gpio_tag;
- gpio_pin_t sc_gpio_pins[VOYAGER_NGPIO];
+ gpio_pin_t sc_gpio_pins[32 + 32];
+
+ void *sc_ih;
+ struct intrhand *sc_intr[32];
};
int voyager_match(struct device *, void *, void *);
@@ -64,6 +69,7 @@ struct cfdriver voyager_cd = {
};
void voyager_attach_gpio(struct voyager_softc *);
+int voyager_intr(void *);
int voyager_print(void *, const char *);
int voyager_search(struct device *, void *, void *);
@@ -88,23 +94,54 @@ voyager_attach(struct device *parent, struct device *self, void *aux)
{
struct voyager_softc *sc = (struct voyager_softc *)self;
struct pci_attach_args *pa = (struct pci_attach_args *)aux;
+ pci_intr_handle_t ih;
+ const char *intrstr;
+
+ printf(": ");
+
+ /*
+ * Map registers.
+ */
if (pci_mapreg_map(pa, PCI_MAPREG_START, PCI_MAPREG_TYPE_MEM,
BUS_SPACE_MAP_LINEAR, &sc->sc_fbt, &sc->sc_fbh,
NULL, &sc->sc_fbsize, 0) != 0) {
- printf(": can't map frame buffer\n");
+ printf("can't map frame buffer\n");
return;
}
if (pci_mapreg_map(pa, PCI_MAPREG_START + 0x04, PCI_MAPREG_TYPE_MEM,
BUS_SPACE_MAP_LINEAR, &sc->sc_mmiot, &sc->sc_mmioh,
NULL, &sc->sc_mmiosize, 0) != 0) {
- printf(": can't map mmio\n");
- bus_space_unmap(sc->sc_fbt, sc->sc_fbh, sc->sc_fbsize);
- return;
+ printf("can't map mmio\n");
+ goto fail1;
}
- printf("\n");
+ /*
+ * Setup interrut handling.
+ */
+
+ bus_space_write_4(sc->sc_mmiot, sc->sc_mmioh, VOYAGER_RAW_ICR,
+ 0xffffffff);
+ bus_space_write_4(sc->sc_mmiot, sc->sc_mmioh, VOYAGER_IMR, 0);
+ (void)bus_space_read_4(sc->sc_mmiot, sc->sc_mmioh, VOYAGER_IMR);
+
+ if (pci_intr_map(pa, &ih) != 0) {
+ printf("can't map interrupt\n");
+ goto fail2;
+ }
+ intrstr = pci_intr_string(pa->pa_pc, ih);
+ sc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_TTY, voyager_intr,
+ sc, self->dv_xname);
+ if (sc->sc_ih == NULL) {
+ printf("can't establish interrupt");
+ if (intrstr != NULL)
+ printf(" at %s", intrstr);
+ printf("\n");
+ goto fail2;
+ }
+
+ printf("%s\n", intrstr);
/*
* Attach GPIO devices.
@@ -115,6 +152,12 @@ voyager_attach(struct device *parent, struct device *self, void *aux)
* Attach child devices.
*/
config_search(voyager_search, self, pa);
+
+ return;
+fail2:
+ bus_space_unmap(sc->sc_mmiot, sc->sc_mmioh, sc->sc_mmiosize);
+fail1:
+ bus_space_unmap(sc->sc_fbt, sc->sc_fbh, sc->sc_fbsize);
}
int
@@ -158,6 +201,89 @@ voyager_search(struct device *parent, void *vcf, void *args)
}
/*
+ * Interrupt disatcher
+ */
+
+int
+voyager_intr(void *vsc)
+{
+ struct voyager_softc *sc = (struct voyager_softc *)vsc;
+ uint32_t isr, imr, mask, bitno;
+ struct intrhand *ih;
+
+ isr = bus_space_read_4(sc->sc_mmiot, sc->sc_mmioh, VOYAGER_ISR);
+ imr = bus_space_read_4(sc->sc_mmiot, sc->sc_mmioh, VOYAGER_IMR);
+
+ isr &= imr;
+ if (isr == 0)
+ return 0;
+
+ for (bitno = 0, mask = 1 << 0; isr != 0; bitno++, mask <<= 1) {
+ if ((isr & mask) == 0)
+ continue;
+ isr ^= mask;
+ for (ih = sc->sc_intr[bitno]; ih != NULL; ih = ih->ih_next) {
+ if ((*ih->ih_fun)(ih->ih_arg) != 0)
+ ih->ih_count.ec_count++;
+ }
+ }
+
+ return 1;
+}
+
+void *
+voyager_intr_establish(void *cookie, int irq, int level, int (*fun)(void *),
+ void *arg, const char *name)
+{
+ struct voyager_softc *sc = (struct voyager_softc *)cookie;
+ struct intrhand *prevh, *nh;
+ uint32_t imr;
+
+#ifdef DIAGNOSTIC
+ if (irq < 0 || irq >= nitems(sc->sc_intr))
+ return NULL;
+#endif
+
+ nh = (struct intrhand *)malloc(sizeof *nh, M_DEVBUF, M_NOWAIT | M_ZERO);
+ if (nh == NULL)
+ return NULL;
+
+ nh->ih_fun = fun;
+ nh->ih_arg = arg;
+ nh->ih_level = level;
+ nh->ih_irq = irq + BONITO_NINTS;
+ evcount_attach(&nh->ih_count, name, (void *)&nh->ih_irq, &evcount_intr);
+
+ if (sc->sc_intr[irq] == NULL)
+ sc->sc_intr[irq] = nh;
+ else {
+ /* insert at tail */
+ for (prevh = sc->sc_intr[irq]; prevh->ih_next != NULL;
+ prevh = prevh->ih_next) ;
+ prevh->ih_next = nh;
+ }
+
+ /* enable interrupt source */
+ imr = bus_space_read_4(sc->sc_mmiot, sc->sc_mmioh, VOYAGER_IMR);
+ imr |= 1 << irq;
+ bus_space_write_4(sc->sc_mmiot, sc->sc_mmioh, VOYAGER_IMR, imr);
+ (void)bus_space_read_4(sc->sc_mmiot, sc->sc_mmioh, VOYAGER_IMR);
+
+ return nh;
+}
+
+const char *
+voyager_intr_string(void *vih)
+{
+ struct intrhand *ih = (struct intrhand *)vih;
+ static char intrstr[1 + 32];
+
+ snprintf(intrstr, sizeof intrstr, "voyager irq %d",
+ ih->ih_irq - BONITO_NINTS);
+ return intrstr;
+}
+
+/*
* GPIO support code
*/
@@ -241,22 +367,49 @@ voyager_attach_gpio(struct voyager_softc *sc)
{
struct gpiobus_attach_args gba;
int pin;
+ uint32_t control, value;
bcopy(&voyager_gpio_tag, &sc->sc_gpio_tag, sizeof voyager_gpio_tag);
sc->sc_gpio_tag.gp_cookie = sc;
- for (pin = 0; pin < VOYAGER_NGPIO; pin++) {
+ control = bus_space_read_4(sc->sc_mmiot, sc->sc_mmioh,
+ VOYAGER_GPIOL_CONTROL);
+ value = bus_space_read_4(sc->sc_mmiot, sc->sc_mmioh,
+ VOYAGER_GPIO_DATA_LOW);
+ for (pin = 0; pin < 32; pin++) {
+ sc->sc_gpio_pins[pin].pin_num = pin;
+ if ((control & 1) == 0) {
+ sc->sc_gpio_pins[pin].pin_caps =
+ GPIO_PIN_INPUT | GPIO_PIN_OUTPUT;
+ sc->sc_gpio_pins[pin].pin_state = value & 1;
+ } else {
+ /* disable control of taken over pins */
+ sc->sc_gpio_pins[pin].pin_caps = 0;
+ sc->sc_gpio_pins[pin].pin_state = 0;
+ }
+ }
+
+ control = bus_space_read_4(sc->sc_mmiot, sc->sc_mmioh,
+ VOYAGER_GPIOH_CONTROL);
+ value = bus_space_read_4(sc->sc_mmiot, sc->sc_mmioh,
+ VOYAGER_GPIO_DATA_HIGH);
+ for (pin = 32 + 0; pin < 32 + 32; pin++) {
sc->sc_gpio_pins[pin].pin_num = pin;
- sc->sc_gpio_pins[pin].pin_caps =
- GPIO_PIN_INPUT | GPIO_PIN_OUTPUT;
- sc->sc_gpio_pins[pin].pin_state =
- voyager_gpio_pin_read(sc, pin);
+ if ((control & 1) == 0) {
+ sc->sc_gpio_pins[pin].pin_caps =
+ GPIO_PIN_INPUT | GPIO_PIN_OUTPUT;
+ sc->sc_gpio_pins[pin].pin_state = value & 1;
+ } else {
+ /* disable control of taken over pins */
+ sc->sc_gpio_pins[pin].pin_caps = 0;
+ sc->sc_gpio_pins[pin].pin_state = 0;
+ }
}
gba.gba_name = "gpio";
gba.gba_gc = &sc->sc_gpio_tag;
gba.gba_pins = sc->sc_gpio_pins;
- gba.gba_npins = VOYAGER_NGPIO;
+ gba.gba_npins = nitems(sc->sc_gpio_pins);
config_found(&sc->sc_dev, &gba, voyager_print);
}
diff --git a/sys/arch/loongson/dev/voyagerreg.h b/sys/arch/loongson/dev/voyagerreg.h
index 4a56a51d88c..364635639bd 100644
--- a/sys/arch/loongson/dev/voyagerreg.h
+++ b/sys/arch/loongson/dev/voyagerreg.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: voyagerreg.h,v 1.1 2010/02/18 22:45:28 miod Exp $ */
+/* $OpenBSD: voyagerreg.h,v 1.2 2010/02/26 14:53:11 miod Exp $ */
/*
* Copyright (c) 2010 Miodrag Vallat.
@@ -20,19 +20,96 @@
* Silicon Motion SM501/SM502 registers
*/
-#define SM5XX_MMIO_BASE 0x00000000
+#define SM5XX_MMIO_BASE 0x000000
-#define VOYAGER_SYSTEM_CONTROL 0x00
+#define VOYAGER_SYSTEM_CONTROL 0x000000
+#define VSC_DPMS_VSYNC_DISABLE 0x80000000
+#define VSC_DPMS_HSYNC_DISABLE 0x40000000
+#define VSC_COLOR_CONVERSION_BUSY 0x10000000
#define VSC_FIFO_EMPTY 0x00100000
-#define VSC_STATUS_BUSY 0x00080000
+#define VSC_2DENGINE_BUSY 0x00080000
+#define VSC_2DENGINE_ABORT 0x00003000 /* not a typo */
+#define VOYAGER_MISC_CONTROL 0x000004
+#define VOYAGER_GPIOL_CONTROL 0x000008
+#define VOYAGER_GPIOH_CONTROL 0x00000c
+#define VOYAGER_DRAM_CONTROL 0x000010
+#define VOYAGER_ARB_CONTROL 0x000014
+
+#define VOYAGER_COMMANDLIST_CONTROL 0x000018
+#define VOYAGER_COMMANDLIST_CONDITION 0x00001c
+#define VOYAGER_COMMANDLIST_RETURN 0x000020
+#define VOYAGER_COMMANDLIST_STATUS 0x000024
+
+#define VOYAGER_RAW_ISR 0x000028
+#define VOYAGER_RAWINTR_ZV1 6
+#define VOYAGER_RAWINTR_USB_PLUGIN 5
+#define VOYAGER_RAWINTR_ZV0 4
+#define VOYAGER_RAWINTR_CRT_VSYNC 3
+#define VOYAGER_RAWINTR_USB_SLAVE 2
+#define VOYAGER_RAWINTR_PANEL_VSYNC 1
+#define VOYAGER_RAWINTR_COMMAND_INTERPRETER 0
+#define VOYAGER_RAW_ICR 0x000028
+#define VOYAGER_ISR 0x00002c
+#define VOYAGER_INTR_USB_PLUGIN 31
+#define VOYAGER_INTR_GPIO54 30
+#define VOYAGER_INTR_GPIO53 29
+#define VOYAGER_INTR_GPIO52 28
+#define VOYAGER_INTR_GPIO51 27
+#define VOYAGER_INTR_GPIO50 26
+#define VOYAGER_INTR_GPIO49 25
+#define VOYAGER_INTR_GPIO48 24
+#define VOYAGER_INTR_I2C 23
+#define VOYAGER_INTR_PWM 22
+#define VOYAGER_INTR_DMA 20
+#define VOYAGER_INTR_PCI 19
+#define VOYAGER_INTR_I2S 18
+#define VOYAGER_INTR_AC97 17
+#define VOYAGER_INTR_USB_SLAVE 16
+#define VOYAGER_INTR_UART1 13
+#define VOYAGER_INTR_UART0 12
+#define VOYAGER_INTR_CRT_VSYNC 11
+#define VOYAGER_INTR_8051 10
+#define VOYAGER_INTR_SSP1 9
+#define VOYAGER_INTR_SSP0 8
+#define VOYAGER_INTR_USB_HOST 6
+#define VOYAGER_INTR_ZV1 4
+#define VOYAGER_INTR_2DENGINE 3
+#define VOYAGER_INTR_ZV0 2
+#define VOYAGER_INTR_PANEL_VSYNC 1
+#define VOYAGER_INTR_COMMAND_INTERPRETER 0
+#define VOYAGER_IMR 0x000030
+#define VOYAGER_DEBUG 0x000034
+
+#define VOYAGER_PM_CURRENT_GATE 0x000038
+#define VOYAGER_PM_CURRENT_CLOCK 0x00003c
+#define VOYAGER_PM_MODE0_GATE 0x000040
+#define VOYAGER_PM_MODE0_CLOCK 0x000044
+#define VOYAGER_PM_MODE1_GATE 0x000048
+#define VOYAGER_PM_MODE1_CLOCK 0x00004c
+#define VOYAGER_PM_SLEEP_GATE 0x000050
+#define VOYAGER_PM_CONTROL 0x000054
+
+#define VOYAGER_MASTER_PCI_BASE 0x000058
+#define VOYAGER_ENDIAN_CONTROL 0x00005c
+#define VOYAGER_DEVICE_ID 0x000060
+#define VOYAGER_PLL_COUNT 0x000064
+#define VOYAGER_MISC 0x000068
+#define VOYAGER_SDRAM_CLOCK 0x00006c
+#define VOYAGER_NON_CACHE_ADDRESS 0x000070
+#define VOYAGER_PLL_CONTROL 0x000074
/*
* GPIO
*/
-#define VOYAGER_NGPIO (32 + 32)
+#define VOYAGER_GPIO_DATA_LOW 0x010000
+#define VOYAGER_GPIO_DATA_HIGH 0x010004
+#define VOYAGER_GPIO_DIR_LOW 0x010008
+#define VOYAGER_GPIO_DIR_HIGH 0x01000c
+
+/*
+ * OHCI
+ */
-#define VOYAGER_GPIO_DATA_LOW 0x00010000
-#define VOYAGER_GPIO_DATA_HIGH 0x00010004
-#define VOYAGER_GPIO_DIR_LOW 0x00010008
-#define VOYAGER_GPIO_DIR_HIGH 0x0001000c
+#define VOYAGER_OHCI_BASE 0x040000
+#define VOYAGER_OHCI_SIZE 0x020000
diff --git a/sys/arch/loongson/dev/voyagervar.h b/sys/arch/loongson/dev/voyagervar.h
index 6e4e38f43ec..d2bd3f1cb89 100644
--- a/sys/arch/loongson/dev/voyagervar.h
+++ b/sys/arch/loongson/dev/voyagervar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: voyagervar.h,v 1.1 2010/02/18 22:45:28 miod Exp $ */
+/* $OpenBSD: voyagervar.h,v 1.2 2010/02/26 14:53:11 miod Exp $ */
/*
* Copyright (c) 2010 Miodrag Vallat.
@@ -25,3 +25,8 @@ struct voyager_attach_args {
bus_space_tag_t vaa_mmiot;
bus_space_handle_t vaa_mmioh;
};
+
+void *voyager_intr_establish(void *, int, int, int (*)(void *), void *,
+ const char *);
+const char *
+ voyager_intr_string(void *);