xref: /netbsd/sys/arch/sun2/dev/zs_any.c (revision 451ebb23)
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