1/* $NetBSD: arcbios.h,v 1.12 2008/04/28 20:23:47 martin 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 */ 80struct 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 */ 105struct 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 270struct arcbios_sysid { 271 char VendorId[ARCBIOS_SYSID_FIELDLEN]; 272 char ProductId[ARCBIOS_SYSID_FIELDLEN]; 273}; 274 275/* 276 * ARC memory descriptor 277 */ 278struct 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 */ 307struct 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 */ 322struct 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 */ 366long arcbios_Load(char *, u_long, u_long, u_long *); 367long arcbios_Invoke(u_long, u_long, u_long, char **, char **); 368long arcbios_Execute(char *, u_long, char **, char **); 369void arcbios_Halt(void) __dead; 370void arcbios_PowerDown(void) __dead; 371void arcbios_Restart(void) __dead; 372void arcbios_Reboot(void) __dead; 373void arcbios_EnterInteractiveMode(void) __dead; 374void arcbios_ReturnFromMain(void) __dead; /* not on sgimips */ 375void * arcbios_GetPeer(void *); 376void * arcbios_GetChild(void *); 377void * arcbios_GetParent(void *); 378long arcbios_GetConfigurationData(void *, void *); 379void * arcbios_AddChild(void *, void *); 380long arcbios_DeleteComponent(void *); 381void * arcbios_GetComponent(char *); 382long arcbios_SaveConfiguration(void); 383void * arcbios_GetSystemId(void); 384void * arcbios_GetMemoryDescriptor(void *); 385void arcbios_Signal(u_long, void *); /* not on sgimips */ 386void * arcbios_GetTime(void); 387u_long arcbios_GetRelativeTime(void); 388 389long arcbios_GetDirectoryEntry(u_long, void *, u_long, u_long *); 390long arcbios_Open(const char *, u_long, u_long *); 391long arcbios_Close(u_long); 392long arcbios_Read(u_long, void *, u_long, u_long *); 393long arcbios_GetReadStatus(u_long); 394long arcbios_Write(u_long, void *, u_long, u_long *); 395long arcbios_Seek(u_long, int64_t *, u_long); 396long arcbios_Mount(char *, u_long); 397const char * 398 arcbios_GetEnvironmentVariable(const char *); 399long arcbios_SetEnvironmentVariable(const char *, const char *); 400long arcbios_GetFileInformation(u_long, void *); 401long arcbios_SetFileInformation(u_long, u_long, u_long); 402void arcbios_FlushAllCaches(void); 403paddr_t arcbios_TestUnicode(u_long, uint16_t); /* not on sgimips */ 404void * arcbios_GetDisplayStatus(u_long); /* not on sgimips */ 405 406#endif /* _KERNEL || _STANDALONE */ 407 408#endif /* _ARCBIOS_H_ */ 409