Annotation of sys/arch/alpha/alpha/dec_kn300.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: dec_kn300.c,v 1.2 2007/03/21 22:10:57 martin Exp $ */
2: /* $NetBSD: dec_kn300.c,v 1.34 2007/03/04 15:18:10 yamt Exp $ */
3:
4: /*
5: * Copyright (c) 1998 by Matthew Jacob
6: * NASA AMES Research Center.
7: * All rights reserved.
8: *
9: * Redistribution and use in source and binary forms, with or without
10: * modification, are permitted provided that the following conditions
11: * are met:
12: * 1. Redistributions of source code must retain the above copyright
13: * notice immediately at the beginning of the file, without modification,
14: * this list of conditions, and the following disclaimer.
15: * 2. Redistributions in binary form must reproduce the above copyright
16: * notice, this list of conditions and the following disclaimer in the
17: * documentation and/or other materials provided with the distribution.
18: * 3. The name of the author may not be used to endorse or promote products
19: * derived from this software without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
25: * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: */
33:
34: #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
35: #include <sys/param.h>
36: #include <sys/systm.h>
37: #include <sys/device.h>
38: #include <sys/termios.h>
39: #include <sys/conf.h>
40: #include <dev/cons.h>
41:
42: #include <machine/rpb.h>
43: #include <machine/autoconf.h>
44: #include <machine/frame.h>
45: #include <machine/cpuconf.h>
46:
47: #include <dev/ic/comreg.h>
48: #include <dev/ic/comvar.h>
49:
50: #include <dev/isa/isareg.h>
51: #include <dev/isa/isavar.h>
52: #include <dev/ic/i8042reg.h>
53: #include <dev/ic/pckbcvar.h>
54: #include <dev/pci/pcireg.h>
55: #include <dev/pci/pcivar.h>
56:
57: #include <alpha/mcbus/mcbusreg.h>
58: #include <alpha/mcbus/mcbusvar.h>
59: #include <alpha/pci/mcpciareg.h>
60: #include <alpha/pci/mcpciavar.h>
61: #include <alpha/pci/pci_kn300.h>
62:
63: #include <scsi/scsi_all.h>
64: #include <scsi/scsiconf.h>
65:
66: #include "pckbd.h"
67:
68: #ifndef CONSPEED
69: #define CONSPEED TTYDEF_SPEED
70: #endif
71: static int comcnrate = CONSPEED;
72:
73: #ifdef DEBUG
74: int bootdev_debug;
75: #define DPRINTF(x) if (bootdev_debug) printf x
76: #else
77: #define DPRINTF(x)
78: #endif
79:
80: void dec_kn300_init (void);
81: void dec_kn300_cons_init (void);
82: static void dec_kn300_device_register (struct device *, void *);
83:
84: #ifdef KGDB
85: #include <machine/db_machdep.h>
86:
87: static const char *kgdb_devlist[] = {
88: "com",
89: NULL,
90: };
91: #endif /* KGDB */
92:
93: #define ALPHASERVER_4100 "AlphaServer 4100"
94:
95: const struct alpha_variation_table dec_kn300_variations[] = {
96: { 0, ALPHASERVER_4100 },
97: { 0, NULL },
98: };
99:
100: void
101: dec_kn300_init()
102: {
103: u_int64_t variation;
104: int cachesize;
105:
106: platform.family = ALPHASERVER_4100;
107:
108: if ((platform.model = alpha_dsr_sysname()) == NULL) {
109: variation = hwrpb->rpb_variation & SV_ST_MASK;
110: if ((platform.model = alpha_variation_name(variation,
111: dec_kn300_variations)) == NULL)
112: platform.model = alpha_unknown_sysname();
113: }
114:
115: platform.iobus = "mcbus";
116: platform.cons_init = dec_kn300_cons_init;
117: platform.device_register = dec_kn300_device_register;
118:
119: /*
120: * Determine B-cache size by looking at the primary (console)
121: * MCPCIA's WHOAMI register.
122: */
123: mcpcia_init();
124:
125: if (mcbus_primary.mcbus_valid) {
126: switch (mcbus_primary.mcbus_bcache) {
127: default:
128: case CPU_BCache_0MB:
129: /* No B-cache or invalid; default to 1MB. */
130: /* FALLTHROUGH */
131:
132: case CPU_BCache_1MB:
133: cachesize = (1 * 1024 * 1024);
134: break;
135:
136: case CPU_BCache_2MB:
137: cachesize = (2 * 1024 * 1024);
138: break;
139:
140: case CPU_BCache_4MB:
141: cachesize = (4 * 1024 * 1024);
142: break;
143: }
144: } else {
145: /* Default to 1MB. */
146: cachesize = (1 * 1024 * 1024);
147: }
148: }
149:
150: void
151: dec_kn300_cons_init()
152: {
153: struct ctb *ctb;
154: struct mcpcia_config *ccp;
155: extern struct mcpcia_config mcpcia_console_configuration;
156:
157: ccp = &mcpcia_console_configuration;
158: /* It's already initialized. */
159:
160: ctb = (struct ctb *)(((char *)hwrpb) + hwrpb->rpb_ctb_off);
161:
162: switch (ctb->ctb_term_type) {
163: case CTB_PRINTERPORT:
164: /* serial console ... */
165: /*
166: * Delay to allow PROM putchars to complete.
167: * FIFO depth * character time,
168: * character time = (1000000 / (defaultrate / 10))
169: */
170: DELAY(160000000 / comcnrate);
171: if (comcnattach(&ccp->cc_iot, 0x3f8, comcnrate,
172: COM_FREQ,
173: (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8)) {
174: panic("can't init serial console");
175:
176: }
177: break;
178:
179: case CTB_GRAPHICS:
180: #if NPCKBD > 0
181: /* display console ... */
182: /* XXX */
183: (void) pckbc_cnattach(&ccp->cc_iot, IO_KBD, KBCMDP,
184: PCKBC_KBD_SLOT);
185:
186: if (CTB_TURBOSLOT_TYPE(ctb->ctb_turboslot) ==
187: CTB_TURBOSLOT_TYPE_ISA)
188: isa_display_console(&ccp->cc_iot, &ccp->cc_memt);
189: else
190: pci_display_console(&ccp->cc_iot, &ccp->cc_memt,
191: &ccp->cc_pc, CTB_TURBOSLOT_BUS(ctb->ctb_turboslot),
192: CTB_TURBOSLOT_SLOT(ctb->ctb_turboslot), 0);
193: #else
194: panic("not configured to use display && keyboard console");
195: #endif
196: break;
197:
198: default:
199: printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type);
200: printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot);
201:
202: panic("consinit: unknown console type %ld",
203: ctb->ctb_term_type);
204: }
205: #ifdef KGDB
206: /* Attach the KGDB device. */
207: alpha_kgdb_init(kgdb_devlist, &ccp->cc_iot);
208: #endif /* KGDB */
209: }
210:
211: static void
212: dec_kn300_device_register(dev, aux)
213: struct device *dev;
214: void *aux;
215: {
216: static int found, initted, diskboot, netboot;
217: static struct device *primarydev, *pcidev, *ctrlrdev;
218: struct bootdev_data *b = bootdev_data;
219: struct device *parent = dev->dv_parent;
220: struct cfdata *cf = dev->dv_cfdata;
221: struct cfdriver *cd = cf->cf_driver;
222:
223: if (found)
224: return;
225:
226: if (!initted) {
227: diskboot = (strncasecmp(b->protocol, "SCSI", 4) == 0);
228: netboot = (strncasecmp(b->protocol, "BOOTP", 5) == 0) ||
229: (strncasecmp(b->protocol, "MOP", 3) == 0);
230:
231: DPRINTF(("proto:%s bus:%d slot:%d chan:%d", b->protocol,
232: b->bus, b->slot, b->channel));
233: if (b->remote_address)
234: printf(" remote_addr:%s", b->remote_address);
235: DPRINTF((" un:%d bdt:%d", b->unit, b->boot_dev_type));
236: if (b->ctrl_dev_type)
237: DPRINTF((" cdt:%s\n", b->ctrl_dev_type));
238: else
239: DPRINTF(("\n"));
240: DPRINTF(("diskboot = %d, netboot = %d\n", diskboot, netboot));
241: initted = 1;
242: }
243:
244: if (primarydev == NULL) {
245: if (strcmp(cd->cd_name, "mcpcia"))
246: return;
247: else {
248: struct mcbus_dev_attach_args *ma = aux;
249:
250: if (b->bus != ma->ma_mid - 4)
251: return;
252: primarydev = dev;
253: DPRINTF(("\nprimarydev = %s\n", dev->dv_xname));
254: return;
255: }
256: }
257:
258: if (pcidev == NULL) {
259: if (strcmp(cd->cd_name, "pci"))
260: return;
261: /*
262: * Try to find primarydev anywhere in the ancestry. This is
263: * necessary if the PCI bus is hidden behind a bridge.
264: */
265: else {
266: struct pcibus_attach_args *pba = aux;
267:
268: if ((b->slot / 1000) != pba->pba_bus)
269: return;
270:
271: pcidev = dev;
272: DPRINTF(("\npcidev = %s\n", dev->dv_xname));
273: return;
274: }
275: }
276:
277: if (ctrlrdev == NULL) {
278: if (parent != pcidev)
279: return;
280: else {
281: struct pci_attach_args *pa = aux;
282: int slot;
283:
284: slot = pa->pa_bus * 1000 + pa->pa_function * 100 +
285: pa->pa_device;
286: if (b->slot != slot)
287: return;
288:
289: if (netboot) {
290: booted_device = dev;
291: DPRINTF(("\nbooted_device = %s\n", dev->dv_xname));
292: found = 1;
293: } else {
294: ctrlrdev = dev;
295: DPRINTF(("\nctrlrdev = %s\n", dev->dv_xname));
296: }
297: return;
298: }
299: }
300:
301: if (!diskboot)
302: return;
303:
304: if (strcmp(cd->cd_name, "sd") ||
305: strcmp(cd->cd_name, "st") ||
306: strcmp(cd->cd_name, "cd")) {
307: struct scsi_attach_args *sa = aux;
308: struct scsi_link *periph = sa->sa_sc_link;
309: int unit;
310:
311: if (parent->dv_parent != ctrlrdev)
312: return;
313:
314: unit = periph->target * 100 + periph->lun;
315: if (b->unit != unit)
316: return;
317:
318: /* we've found it! */
319: booted_device = dev;
320: DPRINTF(("\nbooted_device = %s\n", dev->dv_xname));
321: found = 1;
322: }
323: }
CVSweb