Annotation of sys/arch/alpha/tc/tcasic.c, Revision 1.1.1.1
1.1 nbrk 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
CVSweb