Annotation of sys/arch/sgi/stand/boot/arcbios.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: arcbios.c,v 1.4 2004/10/20 12:49:15 pefo Exp $ */
2: /*-
3: * Copyright (c) 1996 M. Warner Losh. All rights reserved.
4: * Copyright (c) 1996-2004 Opsycon AB. All rights reserved.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: * 1. Redistributions of source code must retain the above copyright
10: * notice, this list of conditions and the following disclaimer.
11: * 2. Redistributions in binary form must reproduce the above copyright
12: * notice, this list of conditions and the following disclaimer in the
13: * documentation and/or other materials provided with the distribution.
14: *
15: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
16: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
19: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25: * SUCH DAMAGE.
26: */
27:
28: #include <sys/param.h>
29: #include <lib/libkern/libkern.h>
30: #include <machine/autoconf.h>
31: #include <mips64/arcbios.h>
32: #include <mips64/archtype.h>
33: #include <stand.h>
34:
35: #define USE_SGI_PARTITIONS 1
36:
37: void bios_configure_memory(void);
38: int bios_get_system_type(void);
39: const char *bios_get_path_component(const char *, char *, int *);
40:
41: arc_dsp_stat_t displayinfo; /* Save area for display status info. */
42:
43: static struct systypes {
44: char *sys_vend; /* Vendor ID if name is ambigous */
45: char *sys_name; /* May be left NULL if name is sufficient */
46: int sys_type;
47: } sys_types[] = {
48: { NULL, "PICA-61", ACER_PICA_61 },
49: { NULL, "NEC-R94", ACER_PICA_61 },
50: { NULL, "DESKTECH-TYNE", DESKSTATION_TYNE },
51: { NULL, "DESKTECH-ARCStation I", DESKSTATION_RPC44 },
52: { NULL, "Microsoft-Jazz", MAGNUM },
53: { NULL, "RM200PCI", SNI_RM200 },
54: { NULL, "SGI-IP17", SGI_CRIMSON },
55: { NULL, "SGI-IP19", SGI_ONYX },
56: { NULL, "SGI-IP20", SGI_INDIGO },
57: { NULL, "SGI-IP21", SGI_POWER },
58: { NULL, "SGI-IP22", SGI_INDY },
59: { NULL, "SGI-IP25", SGI_POWER10 },
60: { NULL, "SGI-IP26", SGI_POWERI },
61: { NULL, "SGI-IP32", SGI_O2 },
62: };
63:
64: #define KNOWNSYSTEMS (sizeof(sys_types) / sizeof(struct systypes))
65:
66: /*
67: * ARC Bios trampoline code.
68: */
69: #define ARC_Call(Name,Offset) \
70: __asm__("\n" \
71: " .text\n" \
72: " .ent " #Name "\n" \
73: " .align 3\n" \
74: " .set noreorder\n" \
75: " .globl " #Name "\n" \
76: #Name":\n" \
77: " lw $2, 0xffffffff80001020\n"\
78: " lw $2," #Offset "($2)\n"\
79: " jr $2\n" \
80: " nop\n" \
81: " .end " #Name "\n" );
82:
83: ARC_Call(Bios_Load, 0x00);
84: ARC_Call(Bios_Invoke, 0x04);
85: ARC_Call(Bios_Execute, 0x08);
86: ARC_Call(Bios_Halt, 0x0c);
87: ARC_Call(Bios_PowerDown, 0x10);
88: ARC_Call(Bios_Restart, 0x14);
89: ARC_Call(Bios_Reboot, 0x18);
90: ARC_Call(Bios_EnterInteractiveMode, 0x1c);
91: ARC_Call(Bios_Unused1, 0x20);
92: ARC_Call(Bios_GetPeer, 0x24);
93: ARC_Call(Bios_GetChild, 0x28);
94: ARC_Call(Bios_GetParent, 0x2c);
95: ARC_Call(Bios_GetConfigurationData, 0x30);
96: ARC_Call(Bios_AddChild, 0x34);
97: ARC_Call(Bios_DeleteComponent, 0x38);
98: ARC_Call(Bios_GetComponent, 0x3c);
99: ARC_Call(Bios_SaveConfiguration, 0x40);
100: ARC_Call(Bios_GetSystemId, 0x44);
101: ARC_Call(Bios_GetMemoryDescriptor, 0x48);
102: ARC_Call(Bios_Unused2, 0x4c);
103: ARC_Call(Bios_GetTime, 0x50);
104: ARC_Call(Bios_GetRelativeTime, 0x54);
105: ARC_Call(Bios_GetDirectoryEntry, 0x58);
106: ARC_Call(Bios_Open, 0x5c);
107: ARC_Call(Bios_Close, 0x60);
108: ARC_Call(Bios_Read, 0x64);
109: ARC_Call(Bios_GetReadStatus, 0x68);
110: ARC_Call(Bios_Write, 0x6c);
111: ARC_Call(Bios_Seek, 0x70);
112: ARC_Call(Bios_Mount, 0x74);
113: ARC_Call(Bios_GetEnvironmentVariable, 0x78);
114: ARC_Call(Bios_SetEnvironmentVariable, 0x7c);
115: ARC_Call(Bios_GetFileInformation, 0x80);
116: ARC_Call(Bios_SetFileInformation, 0x84);
117: ARC_Call(Bios_FlushAllCaches, 0x88);
118: ARC_Call(Bios_TestUnicodeCharacter, 0x8c);
119: ARC_Call(Bios_GetDisplayStatus, 0x90);
120:
121: /*
122: * Simple getchar/putchar interface.
123: */
124:
125: int
126: getchar()
127: {
128: char buf[4];
129: int cnt;
130:
131: if (Bios_Read(0, &buf[0], 1, &cnt) != 0)
132: return(-1);
133: return(buf[0] & 255);
134: }
135:
136: void
137: putchar(c)
138: char c;
139: {
140: char buf[4];
141: int cnt;
142:
143: if (c == '\n') {
144: buf[0] = '\r';
145: buf[1] = c;
146: cnt = 2;
147: if (displayinfo.CursorYPosition < displayinfo.CursorMaxYPosition)
148: displayinfo.CursorYPosition++;
149: }
150: else {
151: buf[0] = c;
152: cnt = 1;
153: }
154: Bios_Write(1, &buf[0], cnt, &cnt);
155: }
156:
157: void
158: bios_putstring(s)
159: char *s;
160: {
161: while (*s) {
162: putchar(*s++);
163: }
164: }
165:
166: /*
167: * Find out system type.
168: */
169: int
170: bios_get_system_type()
171: {
172: arc_config_t *cf;
173: arc_sid_t *sid;
174: int i;
175:
176: if ((ArcBiosBase32->magic != ARC_PARAM_BLK_MAGIC) &&
177: (ArcBiosBase32->magic != ARC_PARAM_BLK_MAGIC_BUG)) {
178: return(-1); /* This is not an ARC system */
179: }
180:
181: sid = (arc_sid_t *)Bios_GetSystemId();
182: cf = (arc_config_t *)Bios_GetChild(NULL);
183: if (cf) {
184: for (i = 0; i < KNOWNSYSTEMS; i++) {
185: if (strcmp(sys_types[i].sys_name, (char *)cf->id) != 0)
186: continue;
187: if (sys_types[i].sys_vend &&
188: strncmp(sys_types[i].sys_vend, sid->vendor, 8) != 0)
189: continue;
190: return (sys_types[i].sys_type); /* Found it. */
191: }
192: }
193:
194: bios_putstring("UNIDENTIFIED SYSTEM `");
195: if (cf)
196: bios_putstring((char *)cf->id);
197: else
198: bios_putstring("????????");
199: bios_putstring("' VENDOR `");
200: sid->vendor[8] = 0;
201: bios_putstring(sid->vendor);
202: bios_putstring("'. Please contact OpenBSD (www.openbsd.org).\n");
203: bios_putstring("Reset system to restart!\n");
204: while(1);
205: }
206:
207: /*
208: * Return geometry of the display. Used by pccons.c to set up the
209: * display configuration.
210: */
211: void
212: bios_display_info(xpos, ypos, xsize, ysize)
213: int *xpos;
214: int *ypos;
215: int *xsize;
216: int *ysize;
217: {
218: #ifdef __arc__
219: *xpos = displayinfo.CursorXPosition;
220: *ypos = displayinfo.CursorYPosition;
221: *xsize = displayinfo.CursorMaxXPosition;
222: *ysize = displayinfo.CursorMaxYPosition;
223: #endif
224: }
225:
226:
227: /*
228: * Decompose the device pathname and find driver.
229: * Returns pointer to remaining filename path in file.
230: */
231: int
232: devopen(struct open_file *f, const char *fname, char **file)
233: {
234: const char *cp, *ncp, *ecp;
235: struct devsw *dp;
236: int partition = 0;
237: char namebuf[256];
238: char devname[32];
239: int rc, i, n;
240:
241: ecp = cp = fname;
242:
243: /*
244: * Scan the component list and find device and partition.
245: */
246: while ((ncp = bios_get_path_component(cp, namebuf, &i)) != NULL) {
247: if ((strcmp(namebuf, "partition") == 0) ||
248: (strcmp(namebuf, "partition") == 0)) {
249: partition = i;
250: if (USE_SGI_PARTITIONS)
251: ecp = ncp;
252: } else
253: ecp = ncp;
254:
255: /* XXX do this with a table if more devs are added */
256: if (strcmp(namebuf, "scsi") == 0)
257: strncpy(devname, namebuf, sizeof(devname));
258:
259: cp = ncp;
260: }
261:
262: memcpy(namebuf, fname, ecp - fname);
263: namebuf[ecp - fname] = '\0';
264:
265: /*
266: * Dig out the driver.
267: */
268: dp = devsw;
269: n = ndevs;
270: while(n--) {
271: if (strcmp (devname, dp->dv_name) == 0) {
272: rc = (dp->dv_open)(f, namebuf, partition, 0);
273: if (!rc) {
274: f->f_dev = dp;
275: if (file && *cp != '\0')
276: *file = (char *)cp;
277: }
278: return (rc);
279: }
280: dp++;
281: }
282: return ENXIO;
283: }
284:
285: const char *
286: bios_get_path_component(const char *p, char *comp, int *no)
287: {
288: while (*p && *p != '(') {
289: *comp++ = *p++;
290: }
291: *comp = '\0';
292:
293: if (*p == NULL)
294: return NULL;
295:
296: *no = 0;
297: p++;
298: while (*p && *p != ')') {
299: if (*p >= '0' && *p <= '9')
300: *no = *no * 10 + *p++ - '0';
301: else
302: return NULL;
303: }
304: return ++p;
305: }
CVSweb