summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorTakuya ASADA <syuu@cvs.openbsd.org>2010-10-01 16:14:00 +0000
committerTakuya ASADA <syuu@cvs.openbsd.org>2010-10-01 16:14:00 +0000
commit156590809a25ba5d258293fef25b0c81babff906 (patch)
treecabb06a1397594d1436da405df6740a6a0de8d76 /sys/arch
parent1210de267195b96e611c471f8f6ad9ed3c07d72b (diff)
Implemented combus to support com device on OCTEON without modifing dev/ic/com.c ok deraadt@
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/octeon/conf/RAMDISK7
-rw-r--r--sys/arch/octeon/conf/files.octeon9
-rw-r--r--sys/arch/octeon/dev/com_oct.c108
-rw-r--r--sys/arch/octeon/dev/combus.c371
-rw-r--r--sys/arch/octeon/dev/combusvar.h43
-rw-r--r--sys/arch/octeon/dev/mainbus.c6
-rw-r--r--sys/arch/octeon/dev/obio.c14
-rw-r--r--sys/arch/octeon/octeon/machdep.c10
8 files changed, 545 insertions, 23 deletions
diff --git a/sys/arch/octeon/conf/RAMDISK b/sys/arch/octeon/conf/RAMDISK
index ea8dd85639b..32f9c4a4899 100644
--- a/sys/arch/octeon/conf/RAMDISK
+++ b/sys/arch/octeon/conf/RAMDISK
@@ -1,4 +1,4 @@
-# $OpenBSD: RAMDISK,v 1.1 2010/09/20 06:32:30 syuu Exp $
+# $OpenBSD: RAMDISK,v 1.2 2010/10/01 16:13:59 syuu Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -42,9 +42,10 @@ mainbus0 at root
cpu0 at mainbus0
clock0 at mainbus0
obio0 at mainbus0
+combus0 at mainbus0
-com0 at obio0
-com1 at obio0
+com0 at combus0
+com1 at combus0
pseudo-device loop 1 # network loopback
pseudo-device bpfilter 1 # packet filter
diff --git a/sys/arch/octeon/conf/files.octeon b/sys/arch/octeon/conf/files.octeon
index 928fb8997ac..5b2665b7535 100644
--- a/sys/arch/octeon/conf/files.octeon
+++ b/sys/arch/octeon/conf/files.octeon
@@ -1,4 +1,4 @@
-# $OpenBSD: files.octeon,v 1.2 2010/09/21 06:21:00 syuu Exp $
+# $OpenBSD: files.octeon,v 1.3 2010/10/01 16:13:59 syuu Exp $
# Standard stanzas config(8) can't run without
maxpartitions 16
@@ -53,5 +53,10 @@ device obio
attach obio at mainbus
file arch/octeon/dev/obio.c mainbus
-attach com at obio with com_oct
+define combus {[base = -1]}
+device combus
+attach combus at mainbus
+file arch/octeon/dev/combus.c combus
+
+attach com at combus with com_oct
file arch/octeon/dev/com_oct.c com_oct
diff --git a/sys/arch/octeon/dev/com_oct.c b/sys/arch/octeon/dev/com_oct.c
index b6ee0513a8d..49615e64301 100644
--- a/sys/arch/octeon/dev/com_oct.c
+++ b/sys/arch/octeon/dev/com_oct.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: com_oct.c,v 1.1 2010/09/20 06:32:30 syuu Exp $ */
+/* $OpenBSD: com_oct.c,v 1.2 2010/10/01 16:13:59 syuu Exp $ */
/*
* Copyright (c) 2001-2004 Opsycon AB (www.opsycon.se / www.opsycon.com)
@@ -30,14 +30,17 @@
#include <sys/systm.h>
#include <sys/device.h>
#include <sys/tty.h>
+#include <sys/conf.h>
#include <machine/autoconf.h>
#include <machine/bus.h>
#include <dev/ic/comreg.h>
#include <dev/ic/comvar.h>
+#include <dev/cons.h>
#include <octeon/dev/obiovar.h>
+#include <octeon/dev/combusvar.h>
#include <octeon/dev/octeonreg.h>
int com_oct_probe(struct device *, void *, void *);
@@ -49,23 +52,38 @@ struct cfattach com_oct_ca = {
extern struct cfdriver com_cd;
+cons_decl(com_oct);
+
+#define OCTEON_MIO_UART0 0x8001180000000800ull
+#define OCTEON_MIO_UART0_LSR 0x8001180000000828ull
+#define OCTEON_MIO_UART0_RBR 0x8001180000000800ull
+#define OCTEON_MIO_UART0_USR 0x8001180000000938ull
+#define OCTEON_MIO_UART0_LCR 0x8001180000000818ull
+#define OCTEON_MIO_UART0_DLL 0x8001180000000880ull
+#define OCTEON_MIO_UART0_DLH 0x8001180000000888ull
+#define USR_TXFIFO_NOTFULL 2
+
+static int delay_changed = 1;
+int com_oct_delay(void);
+void com_oct_wait_txhr_empty(int);
+
int
com_oct_probe(struct device *parent, void *match, void *aux)
{
struct cfdata *cf = match;
- struct obio_attach_args *oba = aux;
- bus_space_tag_t iot = oba->oba_memt;
+ struct combus_attach_args *cba = aux;
+ bus_space_tag_t iot = cba->cba_memt;
bus_space_handle_t ioh;
int rv = 0, console;
- if (strcmp(oba->oba_name, com_cd.cd_name) != 0)
+ if (strcmp(cba->cba_name, com_cd.cd_name) != 0)
return 0;
console = 1;
/* if it's in use as console, it's there. */
if (!(console && !comconsattached)) {
- if (bus_space_map(iot, oba->oba_baseaddr, COM_NPORTS, 0, &ioh)) {
+ if (bus_space_map(iot, cba->cba_baseaddr, COM_NPORTS, 0, &ioh)) {
printf(": can't map uart registers\n");
return 1;
}
@@ -84,13 +102,13 @@ void
com_oct_attach(struct device *parent, struct device *self, void *aux)
{
struct com_softc *sc = (void *)self;
- struct obio_attach_args *oba = aux;
+ struct combus_attach_args *cba = aux;
int console;
console = 1;
- sc->sc_iot = oba->oba_memt;
- sc->sc_iobase = oba->oba_baseaddr;
+ sc->sc_iot = cba->cba_memt;
+ sc->sc_iobase = cba->cba_baseaddr;
sc->sc_hwflags = 0;
sc->sc_swflags = 0;
sc->sc_frequency = curcpu()->ci_hw.clock;
@@ -116,6 +134,78 @@ com_oct_attach(struct device *parent, struct device *self, void *aux)
com_attach_subr(sc);
- obio_intr_establish(oba->oba_intr, IPL_TTY, comintr,
+ obio_intr_establish(cba->cba_intr, IPL_TTY, comintr,
(void *)sc, sc->sc_dev.dv_xname);
}
+
+/*
+ * Early console routines.
+ */
+int
+com_oct_delay(void)
+{
+ int divisor;
+ u_char lcr;
+ static int d = 0;
+
+ if (!delay_changed) return d;
+ delay_changed = 0;
+ lcr = (u_char)*(uint64_t*)OCTEON_MIO_UART0_LCR;
+ *(uint64_t*)OCTEON_MIO_UART0_LCR = lcr | LCR_DLAB;
+ divisor = (int)(*(uint64_t*)OCTEON_MIO_UART0_DLL |
+ *(uint64_t*)OCTEON_MIO_UART0_DLH << 8);
+ *(uint64_t*)OCTEON_MIO_UART0_LCR = lcr;
+
+ return 10; /* return an approx delay value */
+}
+
+void
+com_oct_wait_txhr_empty(int d)
+{
+ while (((*(uint64_t*)OCTEON_MIO_UART0_LSR & LSR_TXRDY) == 0) &&
+ ((*(uint64_t*)OCTEON_MIO_UART0_USR & USR_TXFIFO_NOTFULL) == 0))
+ delay(d);
+}
+
+void
+com_octcninit(struct consdev *consdev)
+{
+}
+
+void
+com_octcnprobe(struct consdev *consdev)
+{
+}
+
+void
+com_octcnpollc(dev_t dev, int c)
+{
+}
+
+void
+com_octcnputc (dev_t dev, int c)
+{
+ int d;
+
+ /* 1/10th the time to transmit 1 character (estimate). */
+ d = com_oct_delay();
+ com_oct_wait_txhr_empty(d);
+ *(uint64_t*)OCTEON_MIO_UART0_RBR = (uint8_t)c;
+ com_oct_wait_txhr_empty(d);
+}
+
+int
+com_octcngetc (dev_t dev)
+{
+ int c, d;
+
+ /* 1/10th the time to transmit 1 character (estimate). */
+ d = com_oct_delay();
+
+ while ((*(uint64_t*)OCTEON_MIO_UART0_LSR & LSR_RXRDY) == 0)
+ delay(d);
+
+ c = (uint8_t)*(uint64_t*)OCTEON_MIO_UART0_RBR;
+
+ return (c);
+}
diff --git a/sys/arch/octeon/dev/combus.c b/sys/arch/octeon/dev/combus.c
new file mode 100644
index 00000000000..6f14def5f16
--- /dev/null
+++ b/sys/arch/octeon/dev/combus.c
@@ -0,0 +1,371 @@
+/* $OpenBSD: combus.c,v 1.1 2010/10/01 16:13:59 syuu Exp $ */
+
+/*
+ * Copyright (c) 2000-2004 Opsycon AB (www.opsycon.se)
+ *
+ * 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.
+ *
+ */
+
+/*
+ * This is a combus, for OCTEON UART.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/conf.h>
+#include <sys/malloc.h>
+#include <sys/device.h>
+#include <sys/proc.h>
+
+#include <mips64/archtype.h>
+
+#include <machine/autoconf.h>
+#include <machine/intr.h>
+#include <machine/atomic.h>
+
+#include <octeon/dev/octeonreg.h>
+#include <octeon/dev/combusvar.h>
+
+#include <dev/ic/comreg.h>
+#include <dev/ic/ns16550reg.h>
+#define com_lcr com_cfcr
+
+int combusmatch(struct device *, void *, void *);
+void combusattach(struct device *, struct device *, void *);
+int combusprint(void *, const char *);
+int combussubmatch(struct device *, void *, void *);
+
+u_int8_t combus_read_1(bus_space_tag_t, bus_space_handle_t, bus_size_t);
+u_int16_t combus_read_2(bus_space_tag_t, bus_space_handle_t, bus_size_t);
+u_int32_t combus_read_4(bus_space_tag_t, bus_space_handle_t, bus_size_t);
+u_int64_t combus_read_8(bus_space_tag_t, bus_space_handle_t, bus_size_t);
+
+void combus_write_1(bus_space_tag_t, bus_space_handle_t, bus_size_t,
+ u_int8_t);
+void combus_write_2(bus_space_tag_t, bus_space_handle_t, bus_size_t,
+ u_int16_t);
+void combus_write_4(bus_space_tag_t, bus_space_handle_t, bus_size_t,
+ u_int32_t);
+void combus_write_8(bus_space_tag_t, bus_space_handle_t, bus_size_t,
+ u_int64_t);
+
+void combus_read_raw_2(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
+ u_int8_t *, bus_size_t);
+void combus_write_raw_2(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
+ const u_int8_t *, bus_size_t);
+void combus_read_raw_4(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
+ u_int8_t *, bus_size_t);
+void combus_write_raw_4(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
+ const u_int8_t *, bus_size_t);
+void combus_read_raw_8(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
+ u_int8_t *, bus_size_t);
+void combus_write_raw_8(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
+ const u_int8_t *, bus_size_t);
+
+int combus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t, int,
+ bus_space_handle_t *);
+void combus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t);
+int combus_space_region(bus_space_tag_t, bus_space_handle_t, bus_size_t,
+ bus_size_t, bus_space_handle_t *);
+
+void *combus_space_vaddr(bus_space_tag_t, bus_space_handle_t);
+
+bus_addr_t combus_pa_to_device(paddr_t);
+paddr_t combus_device_to_pa(bus_addr_t);
+
+bus_size_t combus_get_read_reg(bus_size_t);
+bus_size_t combus_get_write_reg(bus_size_t, u_int8_t);
+
+static int lcr = 0;
+
+struct cfattach combus_ca = {
+ sizeof(struct device), combusmatch, combusattach
+};
+
+struct cfdriver combus_cd = {
+ NULL, "combus", DV_DULL
+};
+
+bus_space_t combus_tag = {
+ PHYS_TO_XKPHYS(0, CCA_NC),
+ NULL,
+ combus_read_1, combus_write_1,
+ combus_read_2, combus_write_2,
+ combus_read_4, combus_write_4,
+ combus_read_8, combus_write_8,
+ combus_read_raw_2, combus_write_raw_2,
+ combus_read_raw_4, combus_write_raw_4,
+ combus_read_raw_8, combus_write_raw_8,
+ combus_space_map, combus_space_unmap, combus_space_region,
+ combus_space_vaddr
+};
+
+/*
+ * List of combus child devices.
+ */
+
+#define COMBUSDEV(name, addr, i) \
+ { name, &combus_tag, &combus_tag, addr, i }
+struct combus_attach_args combus_children[] = {
+ COMBUSDEV("com", OCTEON_UART0_BASE, CIU_INT_UART0),
+ COMBUSDEV("com", OCTEON_UART1_BASE, CIU_INT_UART1),
+};
+#undef COMBUSDEV
+
+
+
+/*
+ * Match bus only to targets which have this bus.
+ */
+int
+combusmatch(struct device *parent, void *match, void *aux)
+{
+ return (1);
+}
+
+int
+combusprint(void *aux, const char *combus)
+{
+ struct combus_attach_args *cba = aux;
+
+ if (combus != NULL)
+ printf("%s at %s", cba->cba_name, combus);
+
+ if (cba->cba_baseaddr != 0)
+ printf(" base 0x%llx", cba->cba_baseaddr);
+ if (cba->cba_intr >= 0)
+ printf(" irq %d", cba->cba_intr);
+
+ return (UNCONF);
+}
+
+int
+combussubmatch(struct device *parent, void *vcf, void *args)
+{
+ struct cfdata *cf = vcf;
+ struct combus_attach_args *cba = args;
+
+ if (strcmp(cf->cf_driver->cd_name, cba->cba_name) != 0)
+ return 0;
+
+ if (cf->cf_loc[0] != -1 && cf->cf_loc[0] != (int)cba->cba_baseaddr)
+ return 0;
+
+ return (*cf->cf_attach->ca_match)(parent, cf, cba);
+}
+
+void
+combusattach(struct device *parent, struct device *self, void *aux)
+{
+ uint i;
+
+ printf("\n");
+
+ /*
+ * Attach subdevices.
+ */
+ for (i = 0; i < nitems(combus_children); i++)
+ config_found_sm(self, combus_children + i,
+ combusprint, combussubmatch);
+}
+
+/*
+ * Bus access primitives. These are really ugly...
+ */
+
+u_int8_t
+combus_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
+{
+ o = combus_get_read_reg(o);
+ return (u_int8_t)(volatile uint64_t)*(volatile uint64_t *)(h + o);
+}
+
+u_int16_t
+combus_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
+{
+ panic(__func__);
+}
+
+u_int32_t
+combus_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
+{
+ panic(__func__);
+}
+
+u_int64_t
+combus_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
+{
+ panic(__func__);
+}
+
+void
+combus_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v)
+{
+ o = combus_get_write_reg(o, 1);
+ *(volatile uint64_t *)(h + o) = (volatile uint64_t)v;
+}
+
+void
+combus_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v)
+{
+ panic(__func__);
+}
+
+void
+combus_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v)
+{
+ panic(__func__);
+}
+
+void
+combus_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v)
+{
+ panic(__func__);
+}
+
+void
+combus_read_raw_2(bus_space_tag_t t, bus_space_handle_t h, bus_addr_t o,
+ u_int8_t *buf, bus_size_t len)
+{
+ panic(__func__);
+}
+
+void
+combus_write_raw_2(bus_space_tag_t t, bus_space_handle_t h, bus_addr_t o,
+ const u_int8_t *buf, bus_size_t len)
+{
+ panic(__func__);
+}
+
+void
+combus_read_raw_4(bus_space_tag_t t, bus_space_handle_t h, bus_addr_t o,
+ u_int8_t *buf, bus_size_t len)
+{
+ panic(__func__);
+}
+
+void
+combus_write_raw_4(bus_space_tag_t t, bus_space_handle_t h, bus_addr_t o,
+ const u_int8_t *buf, bus_size_t len)
+{
+ panic(__func__);
+}
+
+void
+combus_read_raw_8(bus_space_tag_t t, bus_space_handle_t h, bus_addr_t o,
+ u_int8_t *buf, bus_size_t len)
+{
+ panic(__func__);
+}
+
+void
+combus_write_raw_8(bus_space_tag_t t, bus_space_handle_t h, bus_addr_t o,
+ const u_int8_t *buf, bus_size_t len)
+{
+ panic(__func__);
+}
+
+int
+combus_space_map(bus_space_tag_t t, bus_addr_t offs, bus_size_t size,
+ int flags, bus_space_handle_t *bshp)
+{
+ if (ISSET(flags, BUS_SPACE_MAP_CACHEABLE))
+ offs +=
+ PHYS_TO_XKPHYS(0, CCA_CACHED) - PHYS_TO_XKPHYS(0, CCA_NC);
+ *bshp = t->bus_base + offs;
+ return 0;
+}
+
+void
+combus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size)
+{
+}
+
+int
+combus_space_region(bus_space_tag_t t, bus_space_handle_t bsh,
+ bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)
+{
+ *nbshp = bsh + offset;
+ return (0);
+}
+
+void *
+combus_space_vaddr(bus_space_tag_t t, bus_space_handle_t h)
+{
+ return (void *)h;
+}
+
+/*
+ * combus bus_dma helpers.
+ */
+
+bus_addr_t
+combus_pa_to_device(paddr_t pa)
+{
+ return (bus_addr_t)pa;
+}
+
+paddr_t
+combus_device_to_pa(bus_addr_t addr)
+{
+ return (paddr_t)addr;
+}
+
+bus_size_t
+combus_get_read_reg(bus_size_t o)
+{
+ if (lcr && LCR_DLAB)
+ switch(o) {
+ case com_dlbl:
+ return (bus_size_t)0x80;
+ case com_dlbh:
+ return (bus_size_t)0x88;
+ }
+
+ return (bus_size_t)(o << 3);
+}
+
+bus_size_t
+combus_get_write_reg(bus_size_t o, u_int8_t v)
+{
+ if (o == com_lcr)
+ lcr = v;
+
+ switch(o) {
+ case com_data:
+ return (bus_size_t)0x40;
+ case com_fifo:
+ return (bus_size_t)0x50;
+ }
+
+ if (lcr && LCR_DLAB)
+ switch(o) {
+ case com_dlbl:
+ return (bus_size_t)0x80;
+ case com_dlbh:
+ return (bus_size_t)0x88;
+ }
+
+ return (bus_size_t)(o << 3);
+}
diff --git a/sys/arch/octeon/dev/combusvar.h b/sys/arch/octeon/dev/combusvar.h
new file mode 100644
index 00000000000..ef6a8790b1d
--- /dev/null
+++ b/sys/arch/octeon/dev/combusvar.h
@@ -0,0 +1,43 @@
+/* $OpenBSD: combusvar.h,v 1.1 2010/10/01 16:13:59 syuu Exp $ */
+
+/*
+ * Copyright (c) 2001-2003 Opsycon AB (www.opsycon.se / www.opsycon.com)
+ *
+ * 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.
+ *
+ */
+
+#ifndef _COMBUSVAR_H_
+#define _COMBUSVAR_H_
+
+#include <machine/bus.h>
+
+struct combus_attach_args {
+ char *cba_name;
+
+ bus_space_tag_t cba_iot;
+ bus_space_tag_t cba_memt;
+ bus_addr_t cba_baseaddr;
+ int cba_intr;
+};
+
+#endif /* _COMBUSVAR_H_ */
diff --git a/sys/arch/octeon/dev/mainbus.c b/sys/arch/octeon/dev/mainbus.c
index 4f4477f9935..35db2b195b5 100644
--- a/sys/arch/octeon/dev/mainbus.c
+++ b/sys/arch/octeon/dev/mainbus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mainbus.c,v 1.1 2010/09/20 06:32:30 syuu Exp $ */
+/* $OpenBSD: mainbus.c,v 1.2 2010/10/01 16:13:59 syuu Exp $ */
/*
* Copyright (c) 2001-2003 Opsycon AB (www.opsycon.se / www.opsycon.com)
@@ -77,6 +77,10 @@ mainbus_attach(struct device *parent, struct device *self, void *aux)
caa.caa_maa.maa_name = "clock";
config_found(self, &caa.caa_maa, mainbus_print);
+ /* uart I/O */
+ caa.caa_maa.maa_name = "combus";
+ config_found(self, &caa.caa_maa, mainbus_print);
+
/* on-board I/O */
caa.caa_maa.maa_name = "obio";
config_found(self, &caa.caa_maa, mainbus_print);
diff --git a/sys/arch/octeon/dev/obio.c b/sys/arch/octeon/dev/obio.c
index f1cfda2458d..347f8db3553 100644
--- a/sys/arch/octeon/dev/obio.c
+++ b/sys/arch/octeon/dev/obio.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: obio.c,v 1.1 2010/09/20 06:32:30 syuu Exp $ */
+/* $OpenBSD: obio.c,v 1.2 2010/10/01 16:13:59 syuu Exp $ */
/*
* Copyright (c) 2000-2004 Opsycon AB (www.opsycon.se)
@@ -27,8 +27,8 @@
*/
/*
- * This is a combined macebus/crimebus driver. It handles configuration of all
- * devices on the processor bus.
+ * This is a obio driver.
+ * It handles configuration of all devices on the processor bus except UART.
*/
#include <sys/param.h>
@@ -165,8 +165,7 @@ uint64_t obio_imask[MAXCPUS][NIPLS];
#define OBIODEV(name, addr, i) \
{ name, &obio_tag, &obio_tag, &obio_bus_dma_tag, addr, i }
struct obio_attach_args obio_children[] = {
- OBIODEV("com", OCTEON_UART0_BASE, CIU_INT_UART0),
- OBIODEV("com", OCTEON_UART1_BASE, CIU_INT_UART1),
+ OBIODEV("dummy", 0x0, 0x0)
};
#undef OBIODEV
@@ -224,6 +223,8 @@ obioattach(struct device *parent, struct device *self, void *aux)
return;
}
+ printf("\n");
+
bus_space_write_8(&obio_tag, obio_h, CIU_INT0_EN0, 0);
bus_space_write_8(&obio_tag, obio_h, CIU_INT1_EN0, 0);
bus_space_write_8(&obio_tag, obio_h, CIU_INT2_EN0, 0);
@@ -428,8 +429,7 @@ obio_intr_establish(int irq, int level,
ih->ih.ih_arg = ih_arg;
ih->ih.ih_level = level;
ih->ih.ih_irq = irq;
- evcount_attach(&ih->ih.ih_count, ih_what, (void *)&ih->ih.ih_irq,
- &evcount_intr);
+ evcount_attach(&ih->ih.ih_count, ih_what, (void *)&ih->ih.ih_irq);
s = splhigh();
diff --git a/sys/arch/octeon/octeon/machdep.c b/sys/arch/octeon/octeon/machdep.c
index e5749c3863d..b387bad8aa6 100644
--- a/sys/arch/octeon/octeon/machdep.c
+++ b/sys/arch/octeon/octeon/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.2 2010/09/21 06:21:00 syuu Exp $ */
+/* $OpenBSD: machdep.c,v 1.3 2010/10/01 16:13:59 syuu Exp $ */
/*
* Copyright (c) 2009, 2010 Miodrag Vallat.
@@ -141,6 +141,9 @@ vaddr_t mips_init(__register_t, __register_t, __register_t, __register_t);
boolean_t is_memory_range(paddr_t, psize_t, psize_t);
void octeon_memory_init(void);
+cons_decl(com_oct);
+struct consdev octcons = cons_init(com_oct);
+
#define btoc(x) (((x)+PAGE_MASK)>>PAGE_SHIFT)
void
@@ -280,6 +283,11 @@ mips_init(__register_t a0, __register_t a1, __register_t a2 __unused,
bzero(edata, end - edata);
/*
+ * Set up early console output.
+ */
+ cn_tab = &octcons;
+
+ /*
* Reserve space for the symbol table, if it exists.
*/
ssym = (char *)(vaddr_t)*(int32_t *)end;