1 /*        $NetBSD: arcbios.h,v 1.11 2017/06/22 16:46:53 flxd Exp $    */
2 /*        $OpenBSD: arcbios.h,v 1.1 1998/01/29 15:06:22 pefo Exp $    */
3 
4 /*-
5  * Copyright (c) 1996 M. Warner Losh.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #include <sys/types.h>
33 
34 typedef struct arc_sid
35 {
36           char vendor[8];
37           char prodid[8];
38 } arc_sid_t;
39 
40 typedef enum arc_config_class
41 {
42           arc_SystemClass,
43           arc_ProcessorClass,
44           arc_CacheClass,
45           arc_AdapterClass,
46           arc_ControllerClass,
47           arc_PeripheralClass,
48           arc_MemoryClass
49 } arc_config_class_t;
50 
51 typedef enum arc_config_type
52 {
53           arc_System,
54 
55           arc_CentralProcessor,
56           arc_FloatingPointProcessor,
57 
58           arc_PrimaryIcache,
59           arc_PrimaryDcache,
60           arc_SecondaryIcache,
61           arc_SecondaryDcache,
62           arc_SecondaryCache,
63 
64           arc_EisaAdapter,              /* Eisa adapter         */
65           arc_TcAdapter,                          /* TURBOchannel adapter */
66           arc_ScsiAdapter,              /* SCSI adapter         */
67           arc_DtiAdapter,                         /* AccessBus adapter    */
68           arc_MultiFunctionAdapter,
69 
70           arc_DiskController,
71           arc_TapeController,
72           arc_CdromController,
73           arc_WormController,
74           arc_SerialController,
75           arc_NetworkController,
76           arc_DisplayController,
77           arc_ParallelController,
78           arc_PointerController,
79           arc_KeyboardController,
80           arc_AudioController,
81           arc_OtherController,                    /* denotes a controller not otherwise defined */
82 
83           arc_DiskPeripheral,
84           arc_FloppyDiskPeripheral,
85           arc_TapePeripheral,
86           arc_ModemPeripheral,
87           arc_MonitorPeripheral,
88           arc_PrinterPeripheral,
89           arc_PointerPeripheral,
90           arc_KeyboardPeripheral,
91           arc_TerminalPeripheral,
92           arc_OtherPeripheral,                    /* denotes a peripheral not otherwise defined   */
93           arc_LinePeripheral,
94           arc_NetworkPeripheral,
95 
96           arc_SystemMemory
97 } arc_config_type_t;
98 
99 typedef u_char arc_dev_flags_t;
100 
101 /* Wonder how this is aligned... */
102 typedef struct arc_config
103 {
104           arc_config_class_t  class;              /* Likely these three all */
105           arc_config_type_t   type;               /* need to be uchar to make */
106           arc_dev_flags_t               flags;              /* the alignment right */
107           uint16_t            version;
108           uint16_t            revision;
109           uint32_t            key;
110           uint32_t            affinity_mask;
111           uint32_t            config_data_len;
112           uint32_t            id_len;
113           char                          *id;
114 } arc_config_t;
115 
116 typedef enum arc_status
117 {
118           arc_ESUCCESS,                           /* Success                   */
119           arc_E2BIG,                              /* Arg list too long         */
120           arc_EACCES,                             /* No such file or directory */
121           arc_EAGAIN,                             /* Try again                 */
122           arc_EBADF,                              /* Bad file number           */
123           arc_EBUSY,                              /* Device or resource busy   */
124           arc_EFAULT,                             /* Bad address               */
125           arc_EINVAL,                             /* Invalid argument          */
126           arc_EIO,                      /* I/O error                 */
127           arc_EISDIR,                             /* Is a directory            */
128           arc_EMFILE,                             /* Too many open files       */
129           arc_EMLINK,                             /* Too many links            */
130           arc_ENAMETOOLONG,             /* File name too long        */
131           arc_ENODEV,                             /* No such device            */
132           arc_ENOENT,                             /* No such file or directory */
133           arc_ENOEXEC,                            /* Exec format error         */
134           arc_ENOMEM,                             /* Out of memory             */
135           arc_ENOSPC,                             /* No space left on device   */
136           arc_ENOTDIR,                            /* Not a directory           */
137           arc_ENOTTY,                             /* Not a typewriter          */
138           arc_ENXIO,                              /* No such device or address */
139           arc_EROFS,                              /* Read-only file system     */
140 } arc_status_t;
141 
142 #ifdef arc
143 typedef enum {
144           ExeceptionBlock,
145           SystemParameterBlock,
146           FreeMemory,
147           BadMemory,
148           LoadedProgram,
149           FirmwareTemporary,
150           FirmwarePermanent,
151           FreeContigous
152 } MEMORYTYPE;
153 #endif
154 #ifdef sgi /* note: SGI's systems have different order of types. */
155   typedef enum {
156           ExeceptionBlock,
157           SystemParameterBlock,
158           FreeContigous,
159           FreeMemory,
160           BadMemory,
161           LoadedProgram,
162           FirmwareTemporary,
163           FirmwarePermanent,
164   } MEMORYTYPE;
165 #endif
166 
167 typedef struct arc_mem {
168           MEMORYTYPE          Type;               /* Memory chunk type */
169           uint32_t  BasePage; /* Page no, first page */
170           uint32_t  PageCount;          /* Number of pages */
171 } arc_mem_t;
172 
173 typedef void *arc_time_t; /* XXX */
174 
175 typedef struct arc_dsp_stat {
176           uint16_t  CursorXPosition;
177           uint16_t  CursorYPosition;
178           uint16_t  CursorMaxXPosition;
179           uint16_t  CursorMaxYPosition;
180           u_char              ForegroundColor;
181           u_char              BackgroundColor;
182           u_char              HighIntensity;
183           u_char              Underscored;
184           u_char              ReverseVideo;
185 } arc_dsp_stat_t;
186 
187 typedef void *arc_dirent_t; /* XXX */
188 typedef uint32_t arc_open_mode_t; /* XXX */
189 typedef uint32_t arc_seek_mode_t; /* XXX */
190 typedef uint32_t arc_mount_t; /* XXX */
191 
192 typedef struct arc_calls
193 {
194           arc_status_t (*load)(                   /* Load 1 */
195                     char *,                       /* Image to load */
196                     uint32_t,           /* top address */
197                     uint32_t *,                   /* Entry address */
198                     uint32_t *);                  /* Low address */
199 
200           arc_status_t (*invoke)(                 /* Invoke 2 */
201                     uint32_t,           /* Entry Address */
202                     uint32_t,           /* Stack Address */
203                     uint32_t,           /* Argc */
204                     char **,            /* argv */
205                     char **);           /* envp */
206 
207           arc_status_t (*execute)(      /* Execute 3 */
208                     char *,                       /* Image path */
209                     uint32_t,           /* Argc */
210                     char **,            /* argv */
211                     char **);           /* envp */
212 
213           void (*halt)(void)
214               __attribute__((__noreturn__));      /* Halt 4 */
215 
216           void (*power_down)(void)
217               __attribute__((__noreturn__));      /* PowerDown 5 */
218 
219           void (*restart)(void)
220               __attribute__((__noreturn__));      /* Restart 6 */
221 
222           void (*reboot)(void)
223               __attribute__((__noreturn__));      /* Reboot 7 */
224 
225           void (*enter_interactive_mode)(void)
226               __attribute__((__noreturn__));      /* EnterInteractiveMode 8 */
227 
228           void (*return_from_main)(void)
229               __attribute__((__noreturn__));      /* ReturnFromMain 9 */
230 
231           arc_config_t *(*get_peer)(    /* GetPeer 10 */
232                     arc_config_t *);    /* Component */
233 
234           arc_config_t *(*get_child)(   /* GetChild 11 */
235                     arc_config_t *);    /* Component */
236 
237           arc_config_t *(*get_parent)(  /* GetParent 12 */
238                     arc_config_t *);    /* Component */
239 
240           arc_status_t (*get_config_data)( /* GetConfigurationData 13 */
241                     void *,             /* Configuration Data */
242                     arc_config_t *);    /* Component */
243 
244           arc_config_t *(*add_child)(   /* AddChild 14 */
245                     arc_config_t *,               /* Component */
246                     arc_config_t *);    /* New Component */
247 
248           arc_status_t (*delete_component)( /* DeleteComponent 15 */
249                     arc_config_t *);    /* Component */
250 
251           arc_config_t *(*get_component)( /* GetComponent 16 */
252                     char *);            /* Path */
253 
254           arc_status_t (*save_config)(void); /* SaveConfiguration 17 */
255 
256           arc_sid_t *(*get_system_id)(void); /* GetSystemId 18 */
257 
258           arc_mem_t *(*get_memory_descriptor)( /* GetMemoryDescriptor 19 */
259                     arc_mem_t *);                 /* MemoryDescriptor */
260 
261 #ifdef arc
262           void (*signal)(                         /* Signal 20 */
263                     uint32_t,           /* Signal number */
264 /**/                void *);            /* Handler */
265 #endif
266 #ifdef sgi
267           void *unused;
268 #endif
269 
270           arc_time_t *(*get_time)(void);          /* GetTime 21 */
271 
272           uint32_t (*get_relative_time)(void); /* GetRelativeTime 22 */
273 
274           arc_status_t (*get_dir_entry)(          /* GetDirectoryEntry 23 */
275                     uint32_t,           /* FileId */
276                     arc_dirent_t *,               /* Directory entry */
277                     uint32_t,           /* Length */
278                     uint32_t *);                  /* Count */
279 
280           arc_status_t (*open)(                   /* Open 24 */
281                     char *,                       /* Path */
282                     arc_open_mode_t,    /* Open mode */
283                     uint32_t *);                  /* FileId */
284 
285           arc_status_t (*close)(                  /* Close 25 */
286                     uint32_t);                    /* FileId */
287 
288           arc_status_t (*read)(                   /* Read 26 */
289                     uint32_t,           /* FileId */
290                     void *,             /* Buffer */
291                     uint32_t,           /* Length */
292                     uint32_t *);                  /* Count */
293 
294           arc_status_t (*get_read_status)( /* GetReadStatus 27 */
295                     uint32_t);                    /* FileId */
296 
297           arc_status_t (*write)(                  /* Write 28 */
298                     uint32_t,           /* FileId */
299                     void *,             /* Buffer */
300                     uint32_t,           /* Length */
301                     uint32_t *);                  /* Count */
302 
303           arc_status_t (*seek)(                   /* Seek 29 */
304                     uint32_t,           /* FileId */
305                     int64_t *,                    /* Offset */
306                     arc_seek_mode_t);   /* Mode */
307 
308           arc_status_t (*mount)(                  /* Mount 30 */
309                     char *,                       /* Path */
310                     arc_mount_t);                 /* Operation */
311 
312           const char *(*getenv)(                  /* GetEnvironmentVariable 31 */
313                     const char *);                /* Variable */
314 
315           arc_status_t (*putenv)(                 /* SetEnvironmentVariable 32 */
316                     char *,                       /* Variable */
317                     char *);            /* Value */
318 
319           arc_status_t (*get_file_info)(void);    /* GetFileInformation 33 */
320 
321           arc_status_t (*set_file_info)(void);    /* SetFileInformation 34 */
322 
323           void (*flush_all_caches)(void);         /* FlushAllCaches 35 */
324 
325           /* note: the followings don't exist on SGI */
326 #ifdef arc
327           arc_status_t (*test_unicode)( /* TestUnicodeCharacter 36 */
328                     uint32_t,           /* FileId */
329                     uint16_t);                    /* UnicodeCharacter */
330 
331           arc_dsp_stat_t *(*get_display_status)( /* GetDisplayStatus 37 */
332                     uint32_t);                    /* FileId */
333 #endif
334 } arc_calls_t;
335 
336 #define ARC_PARAM_BLK_MAGIC   0x53435241
337 #define ARC_PARAM_BLK_MAGIC_BUG         0x41524353          /* This is wrong... but req */
338 
339 typedef struct arc_param_blk
340 {
341           uint32_t  magic;              /* Magic Number */
342           uint32_t  length;             /* Length of parameter block */
343           uint16_t  version;  /* ?? */
344           uint16_t  revision; /* ?? */
345 /**/      void *              restart_block;      /* ?? */
346 /**/      void *              debug_block;        /* Debugging info -- unused */
347 /**/      void *              general_exp_vect; /* ?? */
348 /**/      void *              tlb_miss_exp_vect; /* ?? */
349           uint32_t  firmware_length; /* Size of Firmware jumptable in bytes */
350           arc_calls_t         *firmware_vect;     /* Firmware jumptable */
351           uint32_t  vendor_length;      /* Size of Vendor specific jumptable */
352 /**/      void *              vendor_vect;        /* Vendor specific jumptable */
353           uint32_t  adapter_count;      /* ?? */
354           uint32_t  adapter0_type;      /* ?? */
355           uint32_t  adapter0_length; /* ?? */
356 /**/      void *              adapter0_vect;      /* ?? */
357 } arc_param_blk_t;
358 
359 #define ArcBiosBase ((arc_param_blk_t *) 0x80001000)
360 #define ArcBios (ArcBiosBase->firmware_vect)
361 
362 /*
363  * All functions except bios_ident() should be called only if
364  *        bios_ident() returns >= 0.
365  */
366 int bios_ident(void);
367 void bios_init_console(void);
368 int bios_configure_memory(int *, phys_ram_seg_t *, int *);
369 void bios_save_info(void);
370 #ifdef arc
371 void bios_display_info(int *, int *, int *, int *);
372 #endif
373 
374 extern char arc_vendor_id[sizeof(((arc_sid_t *)0)->vendor) + 1];
375 extern unsigned char arc_product_id[sizeof(((arc_sid_t *)0)->prodid)];
376 extern char arc_id[64 + 1];
377 extern char arc_displayc_id[64 + 1];
378 extern arc_dsp_stat_t arc_displayinfo;
379 extern int arc_cpu_l2cache_size;
380