1*451ebb23Sfredette /* $NetBSD: zs_any.c,v 1.4 2001/06/27 17:41:03 fredette Exp $ */ 2ec984a04Sfredette 3ec984a04Sfredette /*- 4ec984a04Sfredette * Copyright (c) 1996 The NetBSD Foundation, Inc. 5ec984a04Sfredette * All rights reserved. 6ec984a04Sfredette * 7ec984a04Sfredette * This code is derived from software contributed to The NetBSD Foundation 8ec984a04Sfredette * by Gordon W. Ross and Matthew Fredette. 9ec984a04Sfredette * 10ec984a04Sfredette * Redistribution and use in source and binary forms, with or without 11ec984a04Sfredette * modification, are permitted provided that the following conditions 12ec984a04Sfredette * are met: 13ec984a04Sfredette * 1. Redistributions of source code must retain the above copyright 14ec984a04Sfredette * notice, this list of conditions and the following disclaimer. 15ec984a04Sfredette * 2. Redistributions in binary form must reproduce the above copyright 16ec984a04Sfredette * notice, this list of conditions and the following disclaimer in the 17ec984a04Sfredette * documentation and/or other materials provided with the distribution. 18ec984a04Sfredette * 3. All advertising materials mentioning features or use of this software 19ec984a04Sfredette * must display the following acknowledgement: 20ec984a04Sfredette * This product includes software developed by the NetBSD 21ec984a04Sfredette * Foundation, Inc. and its contributors. 22ec984a04Sfredette * 4. Neither the name of The NetBSD Foundation nor the names of its 23ec984a04Sfredette * contributors may be used to endorse or promote products derived 24ec984a04Sfredette * from this software without specific prior written permission. 25ec984a04Sfredette * 26ec984a04Sfredette * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27ec984a04Sfredette * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28ec984a04Sfredette * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29ec984a04Sfredette * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30ec984a04Sfredette * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31ec984a04Sfredette * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32ec984a04Sfredette * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33ec984a04Sfredette * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34ec984a04Sfredette * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35ec984a04Sfredette * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36ec984a04Sfredette * POSSIBILITY OF SUCH DAMAGE. 37ec984a04Sfredette */ 38ec984a04Sfredette 39ec984a04Sfredette /* 40ec984a04Sfredette * Zilog Z8530 Dual UART driver (machine-dependent part) 41ec984a04Sfredette * 42ec984a04Sfredette * Runs two serial lines per chip using slave drivers. 43ec984a04Sfredette * Plain tty/async lines use the zs_async slave. 44ec984a04Sfredette * Sun keyboard/mouse uses the zs_kbd/zs_ms slaves. 45ec984a04Sfredette */ 46ec984a04Sfredette 47d84d2c6cSlukem #include "opt_kgdb.h" 48d84d2c6cSlukem 49ec984a04Sfredette #include <sys/param.h> 50ec984a04Sfredette #include <sys/systm.h> 51ec984a04Sfredette #include <sys/conf.h> 52ec984a04Sfredette #include <sys/device.h> 53ec984a04Sfredette #include <sys/file.h> 54ec984a04Sfredette #include <sys/ioctl.h> 55ec984a04Sfredette #include <sys/kernel.h> 56ec984a04Sfredette #include <sys/proc.h> 57ec984a04Sfredette #include <sys/tty.h> 58ec984a04Sfredette #include <sys/time.h> 59ec984a04Sfredette #include <sys/syslog.h> 60ec984a04Sfredette 61ec984a04Sfredette #include <machine/autoconf.h> 62ec984a04Sfredette #include <machine/bus.h> 63ec984a04Sfredette #include <machine/z8530var.h> 64ec984a04Sfredette 65ec984a04Sfredette #ifdef KGDB 66ec984a04Sfredette #include <uvm/uvm_extern.h> 67ec984a04Sfredette 68ec984a04Sfredette #include <machine/idprom.h> 69ec984a04Sfredette #include <machine/pmap.h> 70ec984a04Sfredette #include <dev/sun/cons.h> 71ec984a04Sfredette #endif 72ec984a04Sfredette 73ec984a04Sfredette #include <sun2/sun2/machdep.h> 74ec984a04Sfredette #include <dev/ic/z8530reg.h> 75ec984a04Sfredette 76ec984a04Sfredette /**************************************************************** 77ec984a04Sfredette * Autoconfig 78ec984a04Sfredette ****************************************************************/ 79ec984a04Sfredette 80ec984a04Sfredette /* Definition of the driver for autoconfig. */ 81ec984a04Sfredette static int zs_any_match __P((struct device *, struct cfdata *, void *)); 82ec984a04Sfredette static void zs_any_attach __P((struct device *, struct device *, void *)); 83ec984a04Sfredette 84ec984a04Sfredette struct cfattach zs_obio_ca = { 85ec984a04Sfredette sizeof(struct zsc_softc), zs_any_match, zs_any_attach 86ec984a04Sfredette }; 87ec984a04Sfredette 88ec984a04Sfredette struct cfattach zs_obmem_ca = { 89ec984a04Sfredette sizeof(struct zsc_softc), zs_any_match, zs_any_attach 90ec984a04Sfredette }; 91ec984a04Sfredette 92ec984a04Sfredette struct cfattach zs_mbmem_ca = { 93ec984a04Sfredette sizeof(struct zsc_softc), zs_any_match, zs_any_attach 94ec984a04Sfredette }; 95ec984a04Sfredette 96ec984a04Sfredette /* 97ec984a04Sfredette * Is the zs chip present? 98ec984a04Sfredette */ 99ec984a04Sfredette static int 100ec984a04Sfredette zs_any_match(parent, cf, aux) 101ec984a04Sfredette struct device *parent; 102ec984a04Sfredette struct cfdata *cf; 103ec984a04Sfredette void *aux; 104ec984a04Sfredette { 105*451ebb23Sfredette struct mainbus_attach_args *ma = aux; 10670ba9292Sfredette bus_space_handle_t bh; 10770ba9292Sfredette int matched; 108ec984a04Sfredette 109ec984a04Sfredette /* Make sure there is something there... */ 110*451ebb23Sfredette if (bus_space_map(ma->ma_bustag, ma->ma_paddr, sizeof(struct zsdevice), 11170ba9292Sfredette 0, &bh)) 11270ba9292Sfredette return (0); 113*451ebb23Sfredette matched = (bus_space_peek_1(ma->ma_bustag, bh, 0, NULL) == 0); 114*451ebb23Sfredette bus_space_unmap(ma->ma_bustag, bh, sizeof(struct zsdevice)); 11570ba9292Sfredette if (!matched) 116ec984a04Sfredette return (0); 117ec984a04Sfredette 118ec984a04Sfredette /* Default interrupt priority (always splbio==2) */ 119*451ebb23Sfredette if (ma->ma_pri == -1) 120*451ebb23Sfredette ma->ma_pri = ZSHARD_PRI; 121ec984a04Sfredette 122ec984a04Sfredette return (1); 123ec984a04Sfredette } 124ec984a04Sfredette 125ec984a04Sfredette /* 126ec984a04Sfredette * Attach a found zs. 127ec984a04Sfredette */ 128ec984a04Sfredette static void 129ec984a04Sfredette zs_any_attach(parent, self, aux) 130ec984a04Sfredette struct device *parent; 131ec984a04Sfredette struct device *self; 132ec984a04Sfredette void *aux; 133ec984a04Sfredette { 134ec984a04Sfredette struct zsc_softc *zsc = (void *) self; 135*451ebb23Sfredette struct mainbus_attach_args *ma = aux; 136ec984a04Sfredette bus_space_handle_t bh; 137ec984a04Sfredette 138*451ebb23Sfredette zsc->zsc_bustag = ma->ma_bustag; 139*451ebb23Sfredette zsc->zsc_dmatag = ma->ma_dmatag; 140ec984a04Sfredette zsc->zsc_promunit = self->dv_unit; 141ec984a04Sfredette zsc->zsc_node = 0; 142ec984a04Sfredette 143ec984a04Sfredette /* Map in the device. */ 144*451ebb23Sfredette if (bus_space_map(ma->ma_bustag, ma->ma_paddr, sizeof(struct zsdevice), 145ec984a04Sfredette BUS_SPACE_MAP_LINEAR, &bh)) 146ec984a04Sfredette panic("zs_any_attach: can't map"); 147ec984a04Sfredette 148ec984a04Sfredette /* This is where we break the bus_space(9) abstraction: */ 149*451ebb23Sfredette zs_attach(zsc, (void *)bh, ma->ma_pri); 150*451ebb23Sfredette } 151*451ebb23Sfredette 152*451ebb23Sfredette int 153*451ebb23Sfredette zs_console_flags(promunit, node, channel) 154*451ebb23Sfredette int promunit; 155*451ebb23Sfredette int node; 156*451ebb23Sfredette int channel; 157*451ebb23Sfredette { 158*451ebb23Sfredette int cookie, flags = 0; 159*451ebb23Sfredette 160*451ebb23Sfredette /* 161*451ebb23Sfredette * Use `promunit' and `channel' to derive the PROM 162*451ebb23Sfredette * stdio handles that correspond to this device. 163*451ebb23Sfredette */ 164*451ebb23Sfredette if (promunit == 0) 165*451ebb23Sfredette cookie = PROMDEV_TTYA + channel; 166*451ebb23Sfredette else if (promunit == 1 && channel == 0) 167*451ebb23Sfredette cookie = PROMDEV_KBD; 168*451ebb23Sfredette else 169*451ebb23Sfredette cookie = -1; 170*451ebb23Sfredette 171*451ebb23Sfredette if (cookie == prom_stdin()) 172*451ebb23Sfredette flags |= ZS_HWFLAG_CONSOLE_INPUT; 173*451ebb23Sfredette 174*451ebb23Sfredette /* 175*451ebb23Sfredette * Prevent the keyboard from matching the output device 176*451ebb23Sfredette * (note that PROMDEV_KBD == PROMDEV_SCREEN == 0!). 177*451ebb23Sfredette */ 178*451ebb23Sfredette if (cookie != PROMDEV_KBD && cookie == prom_stdout()) 179*451ebb23Sfredette flags |= ZS_HWFLAG_CONSOLE_OUTPUT; 180*451ebb23Sfredette 181*451ebb23Sfredette return (flags); 182ec984a04Sfredette } 183ec984a04Sfredette 184ec984a04Sfredette #ifdef KGDB 185ec984a04Sfredette /* 186ec984a04Sfredette * Find a zs mapped by the PROM. Currently this only works to find 187ec984a04Sfredette * zs0 on obio. 188ec984a04Sfredette */ 189ec984a04Sfredette void * 190ec984a04Sfredette zs_find_prom(unit) 191ec984a04Sfredette int unit; 192ec984a04Sfredette { 193ec984a04Sfredette bus_addr_t zs0_phys; 194ec984a04Sfredette bus_space_handle_t bh; 19570ba9292Sfredette extern int sun68k_find_prom_map __P((bus_addr_t, bus_type_t, 19670ba9292Sfredette int, bus_space_handle_t *)); 197ec984a04Sfredette 198ec984a04Sfredette if (unit != 0) 199ec984a04Sfredette return (NULL); 200ec984a04Sfredette 201ec984a04Sfredette /* 202ec984a04Sfredette * The physical address of zs0 is model-dependent. 203ec984a04Sfredette */ 204ec984a04Sfredette zs0_phys = (cpu_machine_id == SUN2_MACH_120 ? 205ec984a04Sfredette 0x002000 : 0x7f2000); 206ec984a04Sfredette 20770ba9292Sfredette if (sun68k_find_prom_map(zs0_phys, PMAP_OBIO, sizeof(struct zsdevice), &bh)) 208ec984a04Sfredette return (NULL); 209ec984a04Sfredette 210ec984a04Sfredette return ((void*) bh); 211ec984a04Sfredette } 212ec984a04Sfredette #endif /* KGDB */ 213