diff options
author | Takuya ASADA <syuu@cvs.openbsd.org> | 2010-10-01 16:14:00 +0000 |
---|---|---|
committer | Takuya ASADA <syuu@cvs.openbsd.org> | 2010-10-01 16:14:00 +0000 |
commit | 156590809a25ba5d258293fef25b0c81babff906 (patch) | |
tree | cabb06a1397594d1436da405df6740a6a0de8d76 /sys/arch | |
parent | 1210de267195b96e611c471f8f6ad9ed3c07d72b (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/RAMDISK | 7 | ||||
-rw-r--r-- | sys/arch/octeon/conf/files.octeon | 9 | ||||
-rw-r--r-- | sys/arch/octeon/dev/com_oct.c | 108 | ||||
-rw-r--r-- | sys/arch/octeon/dev/combus.c | 371 | ||||
-rw-r--r-- | sys/arch/octeon/dev/combusvar.h | 43 | ||||
-rw-r--r-- | sys/arch/octeon/dev/mainbus.c | 6 | ||||
-rw-r--r-- | sys/arch/octeon/dev/obio.c | 14 | ||||
-rw-r--r-- | sys/arch/octeon/octeon/machdep.c | 10 |
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; |