Module Name: src Committed By: tsutsui Date: Sun Apr 29 07:17:12 UTC 2012
Modified Files: src/sys/arch/x68k/conf: GENERIC INSTALL files.x68k majors.x68k src/sys/arch/x68k/x68k: locore.s vectors.s Added Files: src/sys/arch/x68k/dev: com_intio.c Removed Files: src/sys/arch/x68k/dev: com.c comreg.h Log Message: Finally switch PSX16550 fast serial board driver to using MI com(4) driver. Based on isaki@'s patch and debugged by both isaki@ and tsutsui@. PSX16550 specific hardware infomation is taken from Human68k's PSXIO driver: http://retropc.net/x68000/software/hardware/psx16550/ XXX1: TL16C550C seems to have some timing critical issue around THRE interrupt XXX2: auto hardware flow control of TL16C550 is not implemented in MI com(4) To generate a diff of this commit: cvs rdiff -u -r1.160 -r1.161 src/sys/arch/x68k/conf/GENERIC cvs rdiff -u -r1.94 -r1.95 src/sys/arch/x68k/conf/INSTALL cvs rdiff -u -r1.77 -r1.78 src/sys/arch/x68k/conf/files.x68k cvs rdiff -u -r1.25 -r1.26 src/sys/arch/x68k/conf/majors.x68k cvs rdiff -u -r1.57 -r0 src/sys/arch/x68k/dev/com.c cvs rdiff -u -r0 -r1.1 src/sys/arch/x68k/dev/com_intio.c cvs rdiff -u -r1.4 -r0 src/sys/arch/x68k/dev/comreg.h cvs rdiff -u -r1.108 -r1.109 src/sys/arch/x68k/x68k/locore.s cvs rdiff -u -r1.16 -r1.17 src/sys/arch/x68k/x68k/vectors.s Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/x68k/conf/GENERIC diff -u src/sys/arch/x68k/conf/GENERIC:1.160 src/sys/arch/x68k/conf/GENERIC:1.161 --- src/sys/arch/x68k/conf/GENERIC:1.160 Sat Mar 10 21:51:57 2012 +++ src/sys/arch/x68k/conf/GENERIC Sun Apr 29 07:17:11 2012 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC,v 1.160 2012/03/10 21:51:57 joerg Exp $ +# $NetBSD: GENERIC,v 1.161 2012/04/29 07:17:11 tsutsui Exp $ # # GENERIC machine description file # @@ -22,7 +22,7 @@ include "arch/x68k/conf/std.x68k" options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.160 $" +#ident "GENERIC-$Revision: 1.161 $" maxusers 8 @@ -290,8 +290,8 @@ pseudo-device bell # OPM bell powsw0 at mfp0 # Front switch #powsw1 at mfp0 # External power switch -xcom0 at mainbus0 # NS16550 fast serial -xcom1 at mainbus0 +com0 at intio0 addr 0xefff00 intr 240 # PSX16550, port1 +com1 at intio0 addr 0xefff10 intr 241 # PSX16550, port2 ## Audio device vs0 at intio0 addr 0xe92000 dma 3 dmaintr 106 Index: src/sys/arch/x68k/conf/INSTALL diff -u src/sys/arch/x68k/conf/INSTALL:1.94 src/sys/arch/x68k/conf/INSTALL:1.95 --- src/sys/arch/x68k/conf/INSTALL:1.94 Sun Dec 18 05:49:33 2011 +++ src/sys/arch/x68k/conf/INSTALL Sun Apr 29 07:17:11 2012 @@ -1,4 +1,4 @@ -# $NetBSD: INSTALL,v 1.94 2011/12/18 05:49:33 dholland Exp $ +# $NetBSD: INSTALL,v 1.95 2012/04/29 07:17:11 tsutsui Exp $ # # INSTALL -- installation kernel. @@ -8,7 +8,7 @@ include "arch/x68k/conf/std.x68k" #options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "INSTALL-$Revision: 1.94 $" +#ident "INSTALL-$Revision: 1.95 $" makeoptions COPTS="-Os" # Optimise for space. Implies -O2 @@ -258,8 +258,8 @@ zstty0 at zsc0 channel 0 # built-in RS- sram0 at intio0 addr 0xed0000 # battery-backuped static RAM #pseudo-device bell # OPM bell -#xcom0 at mainbus0 # NS16550 fast serial -#xcom1 at mainbus0 +#com0 at intio0 addr 0xefff00 intr 240 # PSX16550, port1 +#com1 at intio0 addr 0xefff10 intr 241 # PSX16550, port2 ## Audio device #vs0 at intio0 addr 0xe92000 dma 3 dmaintr 106 Index: src/sys/arch/x68k/conf/files.x68k diff -u src/sys/arch/x68k/conf/files.x68k:1.77 src/sys/arch/x68k/conf/files.x68k:1.78 --- src/sys/arch/x68k/conf/files.x68k:1.77 Sun Nov 27 09:00:32 2011 +++ src/sys/arch/x68k/conf/files.x68k Sun Apr 29 07:17:11 2012 @@ -1,4 +1,4 @@ -# $NetBSD: files.x68k,v 1.77 2011/11/27 09:00:32 isaki Exp $ +# $NetBSD: files.x68k,v 1.78 2012/04/29 07:17:11 tsutsui Exp $ # # new style config file for x68k architecture # @@ -51,10 +51,6 @@ include "arch/m68k/fpe/files.fpe" # 68060 software support package include "arch/m68k/060sp/files.060sp" -device xcom: tty -attach xcom at mainbus -file arch/x68k/dev/com.c xcom needs-count - # graphic devices define grfb { addr = -1 } @@ -149,6 +145,9 @@ device par attach par at intio file arch/x68k/dev/par.c par needs-flag +attach com at intio with com_intio +file arch/x68k/dev/com_intio.c com_intio + # # SCSI drivers # Index: src/sys/arch/x68k/conf/majors.x68k diff -u src/sys/arch/x68k/conf/majors.x68k:1.25 src/sys/arch/x68k/conf/majors.x68k:1.26 --- src/sys/arch/x68k/conf/majors.x68k:1.25 Sat Nov 19 12:27:43 2011 +++ src/sys/arch/x68k/conf/majors.x68k Sun Apr 29 07:17:11 2012 @@ -1,4 +1,4 @@ -# $NetBSD: majors.x68k,v 1.25 2011/11/19 12:27:43 isaki Exp $ +# $NetBSD: majors.x68k,v 1.26 2012/04/29 07:17:11 tsutsui Exp $ # # Device majors for x68k # @@ -19,7 +19,7 @@ device-major zstty char 12 zstty device-major ite char 13 ite device-major kbd char 14 kbd device-major ms char 15 ms -device-major xcom char 16 xcom +device-major com char 16 com device-major audio char 17 audio device-major fd char 18 block 2 fd device-major vnd char 19 block 6 vnd Index: src/sys/arch/x68k/x68k/locore.s diff -u src/sys/arch/x68k/x68k/locore.s:1.108 src/sys/arch/x68k/x68k/locore.s:1.109 --- src/sys/arch/x68k/x68k/locore.s:1.108 Thu Dec 22 15:33:30 2011 +++ src/sys/arch/x68k/x68k/locore.s Sun Apr 29 07:17:12 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.s,v 1.108 2011/12/22 15:33:30 tsutsui Exp $ */ +/* $NetBSD: locore.s,v 1.109 2012/04/29 07:17:12 tsutsui Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -504,35 +504,6 @@ ENTRY_NOPROFILE(spurintr) /* level 0 */ ENTRY_NOPROFILE(kbdtimer) rte -ENTRY_NOPROFILE(com0trap) -#include "com.h" - INTERRUPT_SAVEREG -#if NXCOM > 0 - addql #1,_C_LABEL(idepth) - movel #0,%sp@- - jbsr _C_LABEL(comintr) - addql #4,%sp - subql #1,_C_LABEL(idepth) -#endif - CPUINFO_INCREMENT(CI_NINTR) - INTERRUPT_RESTOREREG - addql #1,_C_LABEL(intrcnt)+36 - jra rei - -ENTRY_NOPROFILE(com1trap) - INTERRUPT_SAVEREG -#if NXCOM > 1 - addql #1,_C_LABEL(idepth) - movel #1,%sp@- - jbsr _C_LABEL(comintr) - addql #4,%sp - subql #1,_C_LABEL(idepth) -#endif - CPUINFO_INCREMENT(CI_NINTR) - INTERRUPT_RESTOREREG - addql #1,_C_LABEL(intrcnt)+36 - jra rei - ENTRY_NOPROFILE(intiotrap) addql #1,_C_LABEL(idepth) INTERRUPT_SAVEREG Index: src/sys/arch/x68k/x68k/vectors.s diff -u src/sys/arch/x68k/x68k/vectors.s:1.16 src/sys/arch/x68k/x68k/vectors.s:1.17 --- src/sys/arch/x68k/x68k/vectors.s:1.16 Tue Feb 8 20:20:26 2011 +++ src/sys/arch/x68k/x68k/vectors.s Sun Apr 29 07:17:12 2012 @@ -1,4 +1,4 @@ -| $NetBSD: vectors.s,v 1.16 2011/02/08 20:20:26 rmind Exp $ +| $NetBSD: vectors.s,v 1.17 2012/04/29 07:17:12 tsutsui Exp $ | Copyright (c) 1988 University of Utah | Copyright (c) 1990, 1993 @@ -198,8 +198,8 @@ GLOBAL(vectab) BADTRAP16 /* 192-207: user interrupt vectors */ BADTRAP16 /* 208-223: user interrupt vectors */ BADTRAP16 /* 224-239: user interrupt vectors */ - VECTOR(com0trap) /* 240: unassigned, reserved */ - VECTOR(com1trap) /* 241: unassigned, reserved */ + VECTOR(intiotrap) /* 240: PSX16550, port1 */ + VECTOR(intiotrap) /* 241: PSX16550, port2 */ VECTOR(intiotrap) /* 242: unassigned, reserved */ VECTOR(intiotrap) /* 243: unassigned, reserved */ VECTOR(intiotrap) /* 244: unassigned, reserved */ Added files: Index: src/sys/arch/x68k/dev/com_intio.c diff -u /dev/null src/sys/arch/x68k/dev/com_intio.c:1.1 --- /dev/null Sun Apr 29 07:17:12 2012 +++ src/sys/arch/x68k/dev/com_intio.c Sun Apr 29 07:17:12 2012 @@ -0,0 +1,130 @@ +/* $NetBSD: com_intio.c,v 1.1 2012/04/29 07:17:12 tsutsui Exp $ */ + +/* + * Copyright (c) 2009 Tetsuya Isaki. 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. + * + * 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. + */ + +/* + * PSX16550, High-speed RS-232C board + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: com_intio.c,v 1.1 2012/04/29 07:17:12 tsutsui Exp $"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/tty.h> +#include <sys/device.h> +#include <sys/bus.h> + +#include <dev/ic/comreg.h> +#include <dev/ic/comvar.h> + +#include <machine/cpu.h> + +#include <arch/x68k/dev/intiovar.h> + +#define COM_PSX16550_FREQ (22118400 / 2) +#define COM_PSX16550_SIZE (COM_NPORTS << 1) +#define COM_PSX16550_REG_VECT com_scratch + +static int com_intio_match(device_t, cfdata_t, void *); +static void com_intio_attach(device_t, device_t, void *); + +CFATTACH_DECL_NEW(com_intio, sizeof(struct com_softc), + com_intio_match, com_intio_attach, NULL, NULL); + +static int +com_intio_match(device_t parent, cfdata_t cf, void *aux) +{ + struct intio_attach_args *ia = aux; + bus_space_tag_t iot; + bus_space_handle_t ioh; + int iobase; + int rv; + + /* Check whether the board is inserted or not */ + if (badaddr((void *)IIOV(ia->ia_addr))) + return 0; + + ia->ia_size = COM_PSX16550_SIZE; + if (intio_map_allocate_region(parent, ia, INTIO_MAP_TESTONLY) < 0) + return 0; + + iot = ia->ia_bst; + iobase = ia->ia_addr; + + /* if it's in use as console, it's there. */ + if (com_is_console(iot, iobase, NULL)) + return 1; + + if (bus_space_map(iot, iobase, ia->ia_size, + BUS_SPACE_MAP_SHIFTED_ODD, &ioh)) + return 0; + + rv = comprobe1(iot, ioh); + bus_space_unmap(iot, ioh, ia->ia_size); + + return rv; +} + +static void +com_intio_attach(device_t parent, device_t self, void *aux) +{ + struct com_softc *sc = device_private(self); + struct intio_attach_args *ia = aux; + bus_space_tag_t iot; + bus_space_handle_t ioh; + int iobase; + + intio_map_allocate_region(parent, ia, INTIO_MAP_ALLOCATE); + + sc->sc_dev = self; + iot = ia->ia_bst; + iobase = ia->ia_addr; + if (bus_space_map(iot, iobase, ia->ia_size, + BUS_SPACE_MAP_SHIFTED_ODD, &ioh)) { + aprint_error(": can't map I/O space\n"); + return; + } + + /* check and set interrupt vector */ + if (ia->ia_intr < 16 || ia->ia_intr > 255) { + aprint_error(": invalid intr vector (0x%02x)\n", ia->ia_intr); + return; + } + bus_space_write_1(iot, ioh, COM_PSX16550_REG_VECT, ia->ia_intr); + + sc->sc_frequency = COM_PSX16550_FREQ; + COM_INIT_REGS(sc->sc_regs, iot, ioh, iobase); + + /* PSX16550 uses MCR_DRS to switch interrupt priority level */ + SET(sc->sc_mcr, MCR_DRS); /* 0: ipl2 / 1: ipl4 */ + + com_attach_subr(sc); + + if (intio_intr_establish(ia->ia_intr, device_xname(self), + comintr, sc)) + aprint_error_dev(self, "can't establish interrupt handler\n"); +}