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