Home | History | Annotate | Line # | Download | only in arc
      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