1 /*        $NetBSD: arcbios.h,v 1.13 2011/02/20 08:02:46 matt Exp $    */
2 
3 /*-
4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jason R. Thorpe.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, 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  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*
33  * The ARC BIOS (which is similar, but not 100% compatible with SGI ARCS)
34  * specification can be found at:
35  *
36  *        http://www.microsoft.com/hwdev/download/respec/riscspec.zip
37  */
38 
39 #ifndef _ARCBIOS_H_
40 #define _ARCBIOS_H_
41 
42 #define   ARCBIOS_STDIN                 0
43 #define   ARCBIOS_STDOUT                1
44 
45 #define   ARCBIOS_PAGESIZE    4096
46 
47 /* ARC BIOS status codes. */
48 #define   ARCBIOS_ESUCCESS    0         /* Success */
49 #define   ARCBIOS_E2BIG                 1         /* argument list too long */
50 #define   ARCBIOS_EACCES                2         /* permission denied */
51 #define   ARCBIOS_EAGAIN                3         /* resource temporarily unavailable */
52 #define   ARCBIOS_EBADF                 4         /* bad file number */
53 #define   ARCBIOS_EBUSY                 5         /* device or resource busy */
54 #define   ARCBIOS_EFAULT                6         /* bad address */
55 #define   ARCBIOS_EINVAL                7         /* invalid argument */
56 #define   ARCBIOS_EIO                   8         /* I/O error */
57 #define   ARCBIOS_EISDIR                9         /* is a directory */
58 #define   ARCBIOS_EMFILE                10        /* too many open files */
59 #define   ARCBIOS_EMLINK                11        /* too many links */
60 #define   ARCBIOS_ENAMETOOLONG          12        /* file name too long */
61 #define   ARCBIOS_ENODEV                13        /* no such device */
62 #define   ARCBIOS_ENOENT                14        /* no such file or directory */
63 #define   ARCBIOS_ENOEXEC               15        /* exec format error */
64 #define   ARCBIOS_ENOMEM                16        /* out of memory */
65 #define   ARCBIOS_ENOSPC                17        /* no space left on device */
66 #define   ARCBIOS_ENOTDIR               18        /* not a directory */
67 #define   ARCBIOS_ENOTTY                19        /* not a typewriter */
68 #define   ARCBIOS_ENXIO                 20        /* media not loaded */
69 #define   ARCBIOS_EROFS                 21        /* read-only file system */
70 #if defined(sgimips)
71 #define   ARCBIOS_EADDRNOTAVAIL         31        /* address not available */
72 #define   ARCBIOS_ETIMEDOUT   32        /* operation timed out */
73 #define   ARCBIOS_ECONNABORTED          33        /* connection aborted */
74 #define   ARCBIOS_ENOCONNECT  34        /* not connected */
75 #endif /* sgimips */
76 
77 /*
78  * 4.2.2: System Parameter Block
79  */
80 struct arcbios_spb {
81           uint32_t  SPBSignature;
82           uint32_t  SPBLength;
83           uint16_t  Version;
84           uint16_t  Revision;
85           int32_t             RestartBlock;
86           int32_t             DebugBlock;
87           int32_t             GEVector;
88           int32_t             UTLBMissVector;
89           uint32_t  FirmwareVectorLength;
90           int32_t             FirmwareVector;
91           uint32_t  PrivateVectorLength;
92           int32_t             PrivateVector;
93           uint32_t  AdapterCount;
94           uint32_t  AdapterType;
95           uint32_t  AdapterVectorLength;
96           int32_t             AdapterVector;
97 };
98 
99 #define   ARCBIOS_SPB_SIGNATURE         0x53435241          /* A R C S */
100 #define   ARCBIOS_SPB_SIGNATURE_1       0x41524353          /* S C R A */
101 
102 /*
103  * 4.2.5: System Configuration Data
104  */
105 struct arcbios_component {
106           uint32_t  Class;
107           uint32_t  Type;
108           uint32_t  Flags;
109           uint16_t  Version;
110           uint16_t  Revision;
111           uint32_t  Key;
112           uint32_t  AffinityMask;
113           uint32_t  ConfigurationDataSize;
114           uint32_t  IdentifierLength;
115           int32_t             Identifier;
116 };
117 
118 /*
119  * SGI ARCS likes to be `special', so it moved some of the class/type
120  * numbers around from the ARC standard definitions.
121  */
122 #if defined(sgimips)
123 /* Component Class */
124 #define   COMPONENT_CLASS_SystemClass             0
125 #define   COMPONENT_CLASS_ProcessorClass                    1
126 #define   COMPONENT_CLASS_CacheClass              2
127 #define   COMPONENT_CLASS_MemoryClass             3
128 #define   COMPONENT_CLASS_AdapterClass            4
129 #define   COMPONENT_CLASS_ControllerClass                   5
130 #define   COMPONENT_CLASS_PeripheralClass                   6
131 #else
132 /* Component Class */
133 #define   COMPONENT_CLASS_SystemClass             0
134 #define   COMPONENT_CLASS_ProcessorClass                    1
135 #define   COMPONENT_CLASS_CacheClass              2
136 #define   COMPONENT_CLASS_AdapterClass            3
137 #define   COMPONENT_CLASS_ControllerClass                   4
138 #define   COMPONENT_CLASS_PeripheralClass                   5
139 #define   COMPONENT_CLASS_MemoryClass             6
140 #endif
141 
142 /* Component Types */
143 #if defined(sgimips)
144 /* System Class */
145 #define   COMPONENT_TYPE_ARC                      0
146 
147 /* Processor Class */
148 #define   COMPONENT_TYPE_CPU                      1
149 #define   COMPONENT_TYPE_FPU                      2
150 
151 /* Cache Class */
152 #define   COMPONENT_TYPE_PrimaryICache            3
153 #define   COMPONENT_TYPE_PrimaryDCache            4
154 #define   COMPONENT_TYPE_SecondaryICache                    5
155 #define   COMPONENT_TYPE_SecondaryDCache                    6
156 #define   COMPONENT_TYPE_SecondaryCache           7
157 
158 /* Memory Class */
159 #define   COMPONENT_TYPE_MemoryUnit               8
160 
161 /* Adapter Class */
162 #define   COMPONENT_TYPE_EISAAdapter              9
163 #define   COMPONENT_TYPE_TCAdapter                10
164 #define   COMPONENT_TYPE_SCSIAdapter              11
165 #define   COMPONENT_TYPE_DTIAdapter               12
166 #define   COMPONENT_TYPE_MultiFunctionAdapter     13
167 
168 /* Controller Class */
169 #define   COMPONENT_TYPE_DiskController           14
170 #define   COMPONENT_TYPE_TapeController           15
171 #define   COMPONENT_TYPE_CDROMController                    16
172 #define   COMPONENT_TYPE_WORMController           17
173 #define   COMPONENT_TYPE_SerialController                   18
174 #define   COMPONENT_TYPE_NetworkController        19
175 #define   COMPONENT_TYPE_DisplayController        20
176 #define   COMPONENT_TYPE_ParallelController       21
177 #define   COMPONENT_TYPE_PointerController        22
178 #define   COMPONENT_TYPE_KeyboardController       23
179 #define   COMPONENT_TYPE_AudioController                    24
180 #define   COMPONENT_TYPE_OtherController                    25
181 
182 /* Peripheral Class */
183 #define   COMPONENT_TYPE_DiskPeripheral           26
184 #define   COMPONENT_TYPE_FloppyDiskPeripheral     27
185 #define   COMPONENT_TYPE_TapePeripheral           28
186 #define   COMPONENT_TYPE_ModemPeripheral                    29
187 #define   COMPONENT_TYPE_MonitorPeripheral        30
188 #define   COMPONENT_TYPE_PrinterPeripheral        31
189 #define   COMPONENT_TYPE_PointerPeripheral        32
190 #define   COMPONENT_TYPE_KeyboardPeripheral       33
191 #define   COMPONENT_TYPE_TerminalPeripheral       34
192 #define   COMPONENT_TYPE_LinePeripheral           35
193 #define   COMPONENT_TYPE_NetworkPeripheral        36
194 #define   COMPONENT_TYPE_OtherPeripheral                    37
195 #else /* not sgimips */
196 /* System Class */
197 #define   COMPONENT_TYPE_ARC                      0
198 
199 /* Processor Class */
200 #define   COMPONENT_TYPE_CPU                      1
201 #define   COMPONENT_TYPE_FPU                      2
202 
203 /* Cache Class */
204 #define   COMPONENT_TYPE_PrimaryICache            3
205 #define   COMPONENT_TYPE_PrimaryDCache            4
206 #define   COMPONENT_TYPE_SecondaryICache                    5
207 #define   COMPONENT_TYPE_SecondaryDCache                    6
208 #define   COMPONENT_TYPE_SecondaryCache           7
209 
210 /* Adapter Class */
211 #define   COMPONENT_TYPE_EISAAdapter              8
212 #define   COMPONENT_TYPE_TCAdapter                9
213 #define   COMPONENT_TYPE_SCSIAdapter              10
214 #define   COMPONENT_TYPE_DTIAdapter               11
215 #define   COMPONENT_TYPE_MultiFunctionAdapter     12
216 
217 /* Controller Class */
218 #define   COMPONENT_TYPE_DiskController           13
219 #define   COMPONENT_TYPE_TapeController           14
220 #define   COMPONENT_TYPE_CDROMController                    15
221 #define   COMPONENT_TYPE_WORMController           16
222 #define   COMPONENT_TYPE_SerialController                   17
223 #define   COMPONENT_TYPE_NetworkController        18
224 #define   COMPONENT_TYPE_DisplayController        19
225 #define   COMPONENT_TYPE_ParallelController       20
226 #define   COMPONENT_TYPE_PointerController        21
227 #define   COMPONENT_TYPE_KeyboardController       22
228 #define   COMPONENT_TYPE_AudioController                    23
229 #define   COMPONENT_TYPE_OtherController                    24
230 
231 /* Peripheral Class */
232 #define   COMPONENT_TYPE_DiskPeripheral           25
233 #define   COMPONENT_TYPE_FloppyDiskPeripheral     26
234 #define   COMPONENT_TYPE_TapePeripheral           27
235 #define   COMPONENT_TYPE_ModemPeripheral                    28
236 #define   COMPONENT_TYPE_MonitorPeripheral        29
237 #define   COMPONENT_TYPE_PrinterPeripheral        30
238 #define   COMPONENT_TYPE_PointerPeripheral        31
239 #define   COMPONENT_TYPE_KeyboardPeripheral       32
240 #define   COMPONENT_TYPE_TerminalPeripheral       33
241 #define   COMPONENT_TYPE_OtherPeripheral                    34
242 #define   COMPONENT_TYPE_LinePeripheral           35
243 #define   COMPONENT_TYPE_NetworkPeripheral        36
244 
245 /* Memory Class */
246 #define   COMPONENT_TYPE_MemoryUnit               37
247 #endif
248 
249 /* Component flags */
250 #define   COMPONENT_FLAG_Failed                             1
251 #define   COMPONENT_FLAG_ReadOnly                           2
252 #define   COMPONENT_FLAG_Removable                4
253 #define   COMPONENT_FLAG_ConsoleIn                8
254 #define   COMPONENT_FLAG_ConsoleOut               16
255 #define   COMPONENT_FLAG_Input                              32
256 #define   COMPONENT_FLAG_Output                             64
257 
258 /* Key for Cache: */
259 #define   COMPONENT_KEY_Cache_CacheSize(x)                                      \
260           (ARCBIOS_PAGESIZE << ((x) & 0xffff))
261 #define   COMPONENT_KEY_Cache_LineSize(x)                                                 \
262           (1U << (((x) >> 16) & 0xff))
263 #define   COMPONENT_KEY_Cache_RefillSize(x)                                     \
264           (((x) >> 24) & 0xff)
265 
266 /*
267  * ARC system ID
268  */
269 #define   ARCBIOS_SYSID_FIELDLEN                  8
270 struct arcbios_sysid {
271           char                VendorId[ARCBIOS_SYSID_FIELDLEN];
272           char                ProductId[ARCBIOS_SYSID_FIELDLEN];
273 };
274 
275 /*
276  * ARC memory descriptor
277  */
278 struct arcbios_mem {
279           uint32_t  Type;
280           uint32_t  BasePage;
281           uint32_t  PageCount;
282 };
283 
284 #if defined(sgimips)
285 #define   ARCBIOS_MEM_ExceptionBlock              0
286 #define   ARCBIOS_MEM_SystemParameterBlock        1
287 #define   ARCBIOS_MEM_FreeContiguous              2
288 #define   ARCBIOS_MEM_FreeMemory                            3
289 #define   ARCBIOS_MEM_BadMemory                             4
290 #define   ARCBIOS_MEM_LoadedProgram               5
291 #define   ARCBIOS_MEM_FirmwareTemporary           6
292 #define   ARCBIOS_MEM_FirmwarePermanent           7
293 #elif defined(arc)
294 #define   ARCBIOS_MEM_ExceptionBlock              0
295 #define   ARCBIOS_MEM_SystemParameterBlock        1
296 #define   ARCBIOS_MEM_FreeMemory                            2
297 #define   ARCBIOS_MEM_BadMemory                             3
298 #define   ARCBIOS_MEM_LoadedProgram               4
299 #define   ARCBIOS_MEM_FirmwareTemporary           5
300 #define   ARCBIOS_MEM_FirmwarePermanent           6
301 #define   ARCBIOS_MEM_FreeContiguous              7
302 #endif
303 
304 /*
305  * ARC display status
306  */
307 struct arcbios_dsp_stat {
308           uint16_t  CursorXPosition;
309           uint16_t  CursorYPosition;
310           uint16_t  CursorMaxXPosition;
311           uint16_t  CursorMaxYPosition;
312           uint8_t             ForegroundColor;
313           uint8_t             BackgroundColor;
314           uint8_t             HighIntensity;
315           uint8_t             Underscored;
316           uint8_t             ReverseVideo;
317 };
318 
319 /*
320  * ARC firmware vector
321  */
322 struct arcbios_fv {
323           int32_t             Load;
324           int32_t             Invoke;
325           int32_t             Execute;
326           int32_t             Halt;
327           int32_t             PowerDown;
328           int32_t             Restart;
329           int32_t             Reboot;
330           int32_t             EnterInteractiveMode;
331           int32_t             ReturnFromMain;               /* not on sgimips */
332           int32_t             GetPeer;
333           int32_t             GetChild;
334           int32_t             GetParent;
335           int32_t             GetConfigurationData;
336           int32_t             AddChild;
337           int32_t             DeleteComponent;
338           int32_t             GetComponent;
339           int32_t             SaveConfiguration;
340           int32_t             GetSystemId;
341           int32_t             GetMemoryDescriptor;
342           int32_t             Signal;                       /* not on sgimips */
343           int32_t             GetTime;
344           int32_t             GetRelativeTime;
345           int32_t             GetDirectoryEntry;
346           int32_t             Open;
347           int32_t             Close;
348           int32_t             Read;
349           int32_t             GetReadStatus;
350           int32_t             Write;
351           int32_t             Seek;
352           int32_t             Mount;
353           int32_t             GetEnvironmentVariable;
354           int32_t             SetEnvironmentVariable;
355           int32_t             GetFileInformation;
356           int32_t             SetFileInformation;
357           int32_t             FlushAllCaches;
358           int32_t             TestUnicode;                  /* not on sgimips */
359           int32_t             GetDisplayStatus;   /* not on sgimips */
360 };
361 
362 #if defined(_KERNEL) || defined(_STANDALONE)
363 /*
364  * ARC firmware vector calls
365  */
366 long      arcbios_Load(char *, u_long, u_long, u_long *);
367 long      arcbios_Invoke(u_long, u_long, u_long, char **, char **);
368 long      arcbios_Execute(char *, u_long, char **, char **);
369 void      arcbios_Halt(void) __dead;
370 void      arcbios_PowerDown(void) __dead;
371 void      arcbios_Restart(void) __dead;
372 void      arcbios_Reboot(void) __dead;
373 void      arcbios_EnterInteractiveMode(void) __dead;
374 void      arcbios_ReturnFromMain(void) __dead;              /* not on sgimips */
375 void *    arcbios_GetPeer(void *);
376 void *    arcbios_GetChild(void *);
377 void *    arcbios_GetParent(void *);
378 long      arcbios_GetConfigurationData(void *, void *);
379 void *    arcbios_AddChild(void *, void *);
380 long      arcbios_DeleteComponent(void *);
381 void *    arcbios_GetComponent(char *);
382 long      arcbios_SaveConfiguration(void);
383 void *    arcbios_GetSystemId(void);
384 void *    arcbios_GetMemoryDescriptor(void *);
385 void      arcbios_Signal(u_long, void *);                             /* not on sgimips */
386 void *    arcbios_GetTime(void);
387 u_long    arcbios_GetRelativeTime(void);
388 
389 long      arcbios_GetDirectoryEntry(u_long, void *, u_long, u_long *);
390 long      arcbios_Open(const char *, u_long, u_long *);
391 long      arcbios_Close(u_long);
392 long      arcbios_Read(u_long, void *, u_long, u_long *);
393 long      arcbios_GetReadStatus(u_long);
394 long      arcbios_Write(u_long, void *, u_long, u_long *);
395 long      arcbios_Seek(u_long, int64_t *, u_long);
396 long      arcbios_Mount(char *, u_long);
397 const char *
398           arcbios_GetEnvironmentVariable(const char *);
399 long      arcbios_SetEnvironmentVariable(const char *, const char *);
400 long      arcbios_GetFileInformation(u_long, void *);
401 long      arcbios_SetFileInformation(u_long, u_long, u_long);
402 void      arcbios_FlushAllCaches(void);
403 paddr_t   arcbios_TestUnicode(u_long, uint16_t);            /* not on sgimips */
404 void *    arcbios_GetDisplayStatus(u_long);                 /* not on sgimips */
405 
406 #endif /* _KERNEL || _STANDALONE */
407 
408 #endif /* _ARCBIOS_H_ */
409