xref: /openbsd-src/sys/arch/alpha/tc/tcasic.c (revision 2b0358df1d88d06ef4139321dd05bd5e05d91eaf)
1 /* $OpenBSD: tcasic.c,v 1.15 2006/06/15 20:08:29 brad Exp $ */
2 /* $NetBSD: tcasic.c,v 1.36 2001/08/23 01:16:52 nisimura Exp $ */
3 
4 /*
5  * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
6  * All rights reserved.
7  *
8  * Author: Chris G. Demetriou
9  *
10  * Permission to use, copy, modify and distribute this software and
11  * its documentation is hereby granted, provided that both the copyright
12  * notice and this permission notice appear in all copies of the
13  * software, derivative works or modified versions, and any portions
14  * thereof, and that both notices appear in supporting documentation.
15  *
16  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
18  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19  *
20  * Carnegie Mellon requests users of this software to return to
21  *
22  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
23  *  School of Computer Science
24  *  Carnegie Mellon University
25  *  Pittsburgh PA 15213-3890
26  *
27  * any improvements or extensions that they make and grant Carnegie the
28  * rights to redistribute these changes.
29  */
30 
31 #include <sys/param.h>
32 #include <sys/systm.h>
33 #include <sys/device.h>
34 
35 #include <machine/autoconf.h>
36 #include <machine/rpb.h>
37 #include <machine/cpu.h>
38 
39 #include <dev/tc/tcvar.h>
40 #include <alpha/tc/tc_conf.h>
41 
42 /* Definition of the driver for autoconfig. */
43 int	tcasicmatch(struct device *, void *, void *);
44 void	tcasicattach(struct device *, struct device *, void *);
45 
46 struct cfattach tcasic_ca = {
47 	sizeof (struct device), tcasicmatch, tcasicattach,
48 };
49 
50 struct cfdriver tcasic_cd = {
51 	NULL, "tcasic", DV_DULL,
52 };
53 
54 
55 int	tcasicprint(void *, const char *);
56 
57 /* There can be only one. */
58 int	tcasicfound;
59 
60 int
61 tcasicmatch(parent, cfdata, aux)
62 	struct device *parent;
63 	void *cfdata, *aux;
64 {
65 	struct mainbus_attach_args *ma = aux;
66 
67         /* Make sure that we're looking for a TurboChannel ASIC. */
68         if (strcmp(ma->ma_name, tcasic_cd.cd_name))
69                 return (0);
70 
71 	if (tcasicfound)
72 		return (0);
73 
74 	return (1);
75 }
76 
77 void
78 tcasicattach(parent, self, aux)
79 	struct device *parent;
80 	struct device *self;
81 	void *aux;
82 {
83 	struct tcbus_attach_args tba;
84 	void (*intr_setup)(void);
85 	void (*iointr)(void *, unsigned long);
86 
87 	printf("\n");
88 	tcasicfound = 1;
89 
90 	switch (cputype) {
91 #ifdef DEC_3000_500
92 	case ST_DEC_3000_500:
93 
94 		intr_setup = tc_3000_500_intr_setup;
95 		iointr = tc_3000_500_iointr;
96 
97 		tba.tba_speed = TC_SPEED_25_MHZ;
98 		tba.tba_nslots = tc_3000_500_nslots;
99 		tba.tba_slots = tc_3000_500_slots;
100 		if (hwrpb->rpb_variation & SV_GRAPHICS) {
101 			tba.tba_nbuiltins = tc_3000_500_graphics_nbuiltins;
102 			tba.tba_builtins = tc_3000_500_graphics_builtins;
103 		} else {
104 			tba.tba_nbuiltins = tc_3000_500_nographics_nbuiltins;
105 			tba.tba_builtins = tc_3000_500_nographics_builtins;
106 		}
107 		tba.tba_intr_establish = tc_3000_500_intr_establish;
108 		tba.tba_intr_disestablish = tc_3000_500_intr_disestablish;
109 		tba.tba_get_dma_tag = tc_dma_get_tag_3000_500;
110 
111 		/* Do 3000/500-specific DMA setup now. */
112 		tc_dma_init_3000_500(tc_3000_500_nslots);
113 		break;
114 #endif /* DEC_3000_500 */
115 
116 #ifdef DEC_3000_300
117 	case ST_DEC_3000_300:
118 
119 		intr_setup = tc_3000_300_intr_setup;
120 		iointr = tc_3000_300_iointr;
121 
122 		tba.tba_speed = TC_SPEED_12_5_MHZ;
123 		tba.tba_nslots = tc_3000_300_nslots;
124 		tba.tba_slots = tc_3000_300_slots;
125 		tba.tba_nbuiltins = tc_3000_300_nbuiltins;
126 		tba.tba_builtins = tc_3000_300_builtins;
127 		tba.tba_intr_establish = tc_3000_300_intr_establish;
128 		tba.tba_intr_disestablish = tc_3000_300_intr_disestablish;
129 		tba.tba_get_dma_tag = tc_dma_get_tag_3000_300;
130 		break;
131 #endif /* DEC_3000_300 */
132 
133 	default:
134 		panic("tcasicattach: bad cputype");
135 	}
136 
137 	tba.tba_busname = "tc";
138 	tba.tba_memt = tc_bus_mem_init(NULL);
139 
140 	tc_dma_init();
141 
142 	(*intr_setup)();
143 
144 	/* They all come in at 0x800. */
145 	scb_set(0x800, iointr, NULL);
146 
147 	config_found(self, &tba, tcasicprint);
148 }
149 
150 int
151 tcasicprint(aux, pnp)
152 	void *aux;
153 	const char *pnp;
154 {
155 
156 	/* only TCs can attach to tcasics; easy. */
157 	if (pnp)
158 		printf("tc at %s", pnp);
159 	return (UNCONF);
160 }
161 
162 #ifdef notyet
163 
164 #include "wsdisplay.h"
165 
166 #if NWSDISPLAY > 0
167 
168 #include "sfb.h"
169 #include "sfbp.h"
170 #include "cfb.h"
171 #include "mfb.h"
172 #include "tfb.h"
173 #include "px.h"
174 #include "pxg.h"
175 
176 extern void	sfb_cnattach(tc_addr_t);
177 extern void	sfbp_cnattach(tc_addr_t);
178 extern void	cfb_cnattach(tc_addr_t);
179 extern void	mfb_cnattach(tc_addr_t);
180 extern void	tfb_cnattach(tc_addr_t);
181 extern void	px_cnattach(tc_addr_t);
182 extern void	pxg_cnattach(tc_addr_t);
183 extern int	tc_checkslot(tc_addr_t, char *);
184 
185 struct cnboards {
186 	const char	*cb_tcname;
187 	void	(*cb_cnattach)(tc_addr_t);
188 } static const cnboards[] = {
189 #if NSFB > 0
190 	{ "PMAGB-BA", sfb_cnattach },
191 #endif
192 #if NSFBP > 0
193 	{ "PMAGD   ", sfbp_cnattach },
194 #endif
195 #if NCFB > 0
196 	{ "PMAG-BA ", cfb_cnattach },
197 #endif
198 #if NMFB > 0
199 	{ "PMAG-AA ", mfb_cnattach },
200 #endif
201 #if NTFB > 0
202 	{ "PMAG-JA ", tfb_cnattach },
203 #endif
204 #if NPX > 0
205 	{ "PMAG-CA ", px_cnattach },
206 #endif
207 #if NPXG > 0
208 	{ "PMAG-DA ", pxg_cnattach },
209 	{ "PMAG-FA ", pxg_cnattach },
210 	{ "PMAG-FB ", pxg_cnattach },
211 	{ "PMAGB-FA", pxg_cnattach },
212 	{ "PMAGB-FB", pxg_cnattach },
213 #endif
214 };
215 
216 /*
217  * tc_fb_cnattach --
218  *	Attempt to attach the appropriate display driver to the
219  * output console.
220  */
221 int
222 tc_fb_cnattach(tcaddr)
223 	tc_addr_t tcaddr;
224 {
225 	char tcname[TC_ROM_LLEN];
226 	int i;
227 
228 	if (tc_badaddr(tcaddr) || (tc_checkslot(tcaddr, tcname) == 0))
229 		return (EINVAL);
230 
231 	for (i = 0; i < sizeof(cnboards) / sizeof(cnboards[0]); i++)
232 		if (strncmp(tcname, cnboards[i].cb_tcname, TC_ROM_LLEN) == 0)
233 			break;
234 
235 	if (i == sizeof(cnboards) / sizeof(cnboards[0]))
236 		return (ENXIO);
237 
238 	(cnboards[i].cb_cnattach)(tcaddr);
239 	return (0);
240 }
241 #endif /* if NWSDISPLAY > 0 */
242 
243 #else
244 
245 int
246 tc_fb_cnattach(tcaddr)
247 	tc_addr_t tcaddr;
248 {
249 		return (ENXIO);
250 }
251 #endif
252