e0c47ee162
Deal with the need to save/restore T8 (CURLWP) across arcbios calls. Call arcbios with O32 ABI conventions even if kernel/bootloader is N32/N64.
409 lines
13 KiB
C
409 lines
13 KiB
C
/* $NetBSD: arcbios.h,v 1.13 2011/02/20 08:02:46 matt Exp $ */
|
|
|
|
/*-
|
|
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This code is derived from software contributed to The NetBSD Foundation
|
|
* by Jason R. Thorpe.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
/*
|
|
* The ARC BIOS (which is similar, but not 100% compatible with SGI ARCS)
|
|
* specification can be found at:
|
|
*
|
|
* http://www.microsoft.com/hwdev/download/respec/riscspec.zip
|
|
*/
|
|
|
|
#ifndef _ARCBIOS_H_
|
|
#define _ARCBIOS_H_
|
|
|
|
#define ARCBIOS_STDIN 0
|
|
#define ARCBIOS_STDOUT 1
|
|
|
|
#define ARCBIOS_PAGESIZE 4096
|
|
|
|
/* ARC BIOS status codes. */
|
|
#define ARCBIOS_ESUCCESS 0 /* Success */
|
|
#define ARCBIOS_E2BIG 1 /* argument list too long */
|
|
#define ARCBIOS_EACCES 2 /* permission denied */
|
|
#define ARCBIOS_EAGAIN 3 /* resource temporarily unavailable */
|
|
#define ARCBIOS_EBADF 4 /* bad file number */
|
|
#define ARCBIOS_EBUSY 5 /* device or resource busy */
|
|
#define ARCBIOS_EFAULT 6 /* bad address */
|
|
#define ARCBIOS_EINVAL 7 /* invalid argument */
|
|
#define ARCBIOS_EIO 8 /* I/O error */
|
|
#define ARCBIOS_EISDIR 9 /* is a directory */
|
|
#define ARCBIOS_EMFILE 10 /* too many open files */
|
|
#define ARCBIOS_EMLINK 11 /* too many links */
|
|
#define ARCBIOS_ENAMETOOLONG 12 /* file name too long */
|
|
#define ARCBIOS_ENODEV 13 /* no such device */
|
|
#define ARCBIOS_ENOENT 14 /* no such file or directory */
|
|
#define ARCBIOS_ENOEXEC 15 /* exec format error */
|
|
#define ARCBIOS_ENOMEM 16 /* out of memory */
|
|
#define ARCBIOS_ENOSPC 17 /* no space left on device */
|
|
#define ARCBIOS_ENOTDIR 18 /* not a directory */
|
|
#define ARCBIOS_ENOTTY 19 /* not a typewriter */
|
|
#define ARCBIOS_ENXIO 20 /* media not loaded */
|
|
#define ARCBIOS_EROFS 21 /* read-only file system */
|
|
#if defined(sgimips)
|
|
#define ARCBIOS_EADDRNOTAVAIL 31 /* address not available */
|
|
#define ARCBIOS_ETIMEDOUT 32 /* operation timed out */
|
|
#define ARCBIOS_ECONNABORTED 33 /* connection aborted */
|
|
#define ARCBIOS_ENOCONNECT 34 /* not connected */
|
|
#endif /* sgimips */
|
|
|
|
/*
|
|
* 4.2.2: System Parameter Block
|
|
*/
|
|
struct arcbios_spb {
|
|
uint32_t SPBSignature;
|
|
uint32_t SPBLength;
|
|
uint16_t Version;
|
|
uint16_t Revision;
|
|
int32_t RestartBlock;
|
|
int32_t DebugBlock;
|
|
int32_t GEVector;
|
|
int32_t UTLBMissVector;
|
|
uint32_t FirmwareVectorLength;
|
|
int32_t FirmwareVector;
|
|
uint32_t PrivateVectorLength;
|
|
int32_t PrivateVector;
|
|
uint32_t AdapterCount;
|
|
uint32_t AdapterType;
|
|
uint32_t AdapterVectorLength;
|
|
int32_t AdapterVector;
|
|
};
|
|
|
|
#define ARCBIOS_SPB_SIGNATURE 0x53435241 /* A R C S */
|
|
#define ARCBIOS_SPB_SIGNATURE_1 0x41524353 /* S C R A */
|
|
|
|
/*
|
|
* 4.2.5: System Configuration Data
|
|
*/
|
|
struct arcbios_component {
|
|
uint32_t Class;
|
|
uint32_t Type;
|
|
uint32_t Flags;
|
|
uint16_t Version;
|
|
uint16_t Revision;
|
|
uint32_t Key;
|
|
uint32_t AffinityMask;
|
|
uint32_t ConfigurationDataSize;
|
|
uint32_t IdentifierLength;
|
|
int32_t Identifier;
|
|
};
|
|
|
|
/*
|
|
* SGI ARCS likes to be `special', so it moved some of the class/type
|
|
* numbers around from the ARC standard definitions.
|
|
*/
|
|
#if defined(sgimips)
|
|
/* Component Class */
|
|
#define COMPONENT_CLASS_SystemClass 0
|
|
#define COMPONENT_CLASS_ProcessorClass 1
|
|
#define COMPONENT_CLASS_CacheClass 2
|
|
#define COMPONENT_CLASS_MemoryClass 3
|
|
#define COMPONENT_CLASS_AdapterClass 4
|
|
#define COMPONENT_CLASS_ControllerClass 5
|
|
#define COMPONENT_CLASS_PeripheralClass 6
|
|
#else
|
|
/* Component Class */
|
|
#define COMPONENT_CLASS_SystemClass 0
|
|
#define COMPONENT_CLASS_ProcessorClass 1
|
|
#define COMPONENT_CLASS_CacheClass 2
|
|
#define COMPONENT_CLASS_AdapterClass 3
|
|
#define COMPONENT_CLASS_ControllerClass 4
|
|
#define COMPONENT_CLASS_PeripheralClass 5
|
|
#define COMPONENT_CLASS_MemoryClass 6
|
|
#endif
|
|
|
|
/* Component Types */
|
|
#if defined(sgimips)
|
|
/* System Class */
|
|
#define COMPONENT_TYPE_ARC 0
|
|
|
|
/* Processor Class */
|
|
#define COMPONENT_TYPE_CPU 1
|
|
#define COMPONENT_TYPE_FPU 2
|
|
|
|
/* Cache Class */
|
|
#define COMPONENT_TYPE_PrimaryICache 3
|
|
#define COMPONENT_TYPE_PrimaryDCache 4
|
|
#define COMPONENT_TYPE_SecondaryICache 5
|
|
#define COMPONENT_TYPE_SecondaryDCache 6
|
|
#define COMPONENT_TYPE_SecondaryCache 7
|
|
|
|
/* Memory Class */
|
|
#define COMPONENT_TYPE_MemoryUnit 8
|
|
|
|
/* Adapter Class */
|
|
#define COMPONENT_TYPE_EISAAdapter 9
|
|
#define COMPONENT_TYPE_TCAdapter 10
|
|
#define COMPONENT_TYPE_SCSIAdapter 11
|
|
#define COMPONENT_TYPE_DTIAdapter 12
|
|
#define COMPONENT_TYPE_MultiFunctionAdapter 13
|
|
|
|
/* Controller Class */
|
|
#define COMPONENT_TYPE_DiskController 14
|
|
#define COMPONENT_TYPE_TapeController 15
|
|
#define COMPONENT_TYPE_CDROMController 16
|
|
#define COMPONENT_TYPE_WORMController 17
|
|
#define COMPONENT_TYPE_SerialController 18
|
|
#define COMPONENT_TYPE_NetworkController 19
|
|
#define COMPONENT_TYPE_DisplayController 20
|
|
#define COMPONENT_TYPE_ParallelController 21
|
|
#define COMPONENT_TYPE_PointerController 22
|
|
#define COMPONENT_TYPE_KeyboardController 23
|
|
#define COMPONENT_TYPE_AudioController 24
|
|
#define COMPONENT_TYPE_OtherController 25
|
|
|
|
/* Peripheral Class */
|
|
#define COMPONENT_TYPE_DiskPeripheral 26
|
|
#define COMPONENT_TYPE_FloppyDiskPeripheral 27
|
|
#define COMPONENT_TYPE_TapePeripheral 28
|
|
#define COMPONENT_TYPE_ModemPeripheral 29
|
|
#define COMPONENT_TYPE_MonitorPeripheral 30
|
|
#define COMPONENT_TYPE_PrinterPeripheral 31
|
|
#define COMPONENT_TYPE_PointerPeripheral 32
|
|
#define COMPONENT_TYPE_KeyboardPeripheral 33
|
|
#define COMPONENT_TYPE_TerminalPeripheral 34
|
|
#define COMPONENT_TYPE_LinePeripheral 35
|
|
#define COMPONENT_TYPE_NetworkPeripheral 36
|
|
#define COMPONENT_TYPE_OtherPeripheral 37
|
|
#else /* not sgimips */
|
|
/* System Class */
|
|
#define COMPONENT_TYPE_ARC 0
|
|
|
|
/* Processor Class */
|
|
#define COMPONENT_TYPE_CPU 1
|
|
#define COMPONENT_TYPE_FPU 2
|
|
|
|
/* Cache Class */
|
|
#define COMPONENT_TYPE_PrimaryICache 3
|
|
#define COMPONENT_TYPE_PrimaryDCache 4
|
|
#define COMPONENT_TYPE_SecondaryICache 5
|
|
#define COMPONENT_TYPE_SecondaryDCache 6
|
|
#define COMPONENT_TYPE_SecondaryCache 7
|
|
|
|
/* Adapter Class */
|
|
#define COMPONENT_TYPE_EISAAdapter 8
|
|
#define COMPONENT_TYPE_TCAdapter 9
|
|
#define COMPONENT_TYPE_SCSIAdapter 10
|
|
#define COMPONENT_TYPE_DTIAdapter 11
|
|
#define COMPONENT_TYPE_MultiFunctionAdapter 12
|
|
|
|
/* Controller Class */
|
|
#define COMPONENT_TYPE_DiskController 13
|
|
#define COMPONENT_TYPE_TapeController 14
|
|
#define COMPONENT_TYPE_CDROMController 15
|
|
#define COMPONENT_TYPE_WORMController 16
|
|
#define COMPONENT_TYPE_SerialController 17
|
|
#define COMPONENT_TYPE_NetworkController 18
|
|
#define COMPONENT_TYPE_DisplayController 19
|
|
#define COMPONENT_TYPE_ParallelController 20
|
|
#define COMPONENT_TYPE_PointerController 21
|
|
#define COMPONENT_TYPE_KeyboardController 22
|
|
#define COMPONENT_TYPE_AudioController 23
|
|
#define COMPONENT_TYPE_OtherController 24
|
|
|
|
/* Peripheral Class */
|
|
#define COMPONENT_TYPE_DiskPeripheral 25
|
|
#define COMPONENT_TYPE_FloppyDiskPeripheral 26
|
|
#define COMPONENT_TYPE_TapePeripheral 27
|
|
#define COMPONENT_TYPE_ModemPeripheral 28
|
|
#define COMPONENT_TYPE_MonitorPeripheral 29
|
|
#define COMPONENT_TYPE_PrinterPeripheral 30
|
|
#define COMPONENT_TYPE_PointerPeripheral 31
|
|
#define COMPONENT_TYPE_KeyboardPeripheral 32
|
|
#define COMPONENT_TYPE_TerminalPeripheral 33
|
|
#define COMPONENT_TYPE_OtherPeripheral 34
|
|
#define COMPONENT_TYPE_LinePeripheral 35
|
|
#define COMPONENT_TYPE_NetworkPeripheral 36
|
|
|
|
/* Memory Class */
|
|
#define COMPONENT_TYPE_MemoryUnit 37
|
|
#endif
|
|
|
|
/* Component flags */
|
|
#define COMPONENT_FLAG_Failed 1
|
|
#define COMPONENT_FLAG_ReadOnly 2
|
|
#define COMPONENT_FLAG_Removable 4
|
|
#define COMPONENT_FLAG_ConsoleIn 8
|
|
#define COMPONENT_FLAG_ConsoleOut 16
|
|
#define COMPONENT_FLAG_Input 32
|
|
#define COMPONENT_FLAG_Output 64
|
|
|
|
/* Key for Cache: */
|
|
#define COMPONENT_KEY_Cache_CacheSize(x) \
|
|
(ARCBIOS_PAGESIZE << ((x) & 0xffff))
|
|
#define COMPONENT_KEY_Cache_LineSize(x) \
|
|
(1U << (((x) >> 16) & 0xff))
|
|
#define COMPONENT_KEY_Cache_RefillSize(x) \
|
|
(((x) >> 24) & 0xff)
|
|
|
|
/*
|
|
* ARC system ID
|
|
*/
|
|
#define ARCBIOS_SYSID_FIELDLEN 8
|
|
struct arcbios_sysid {
|
|
char VendorId[ARCBIOS_SYSID_FIELDLEN];
|
|
char ProductId[ARCBIOS_SYSID_FIELDLEN];
|
|
};
|
|
|
|
/*
|
|
* ARC memory descriptor
|
|
*/
|
|
struct arcbios_mem {
|
|
uint32_t Type;
|
|
uint32_t BasePage;
|
|
uint32_t PageCount;
|
|
};
|
|
|
|
#if defined(sgimips)
|
|
#define ARCBIOS_MEM_ExceptionBlock 0
|
|
#define ARCBIOS_MEM_SystemParameterBlock 1
|
|
#define ARCBIOS_MEM_FreeContiguous 2
|
|
#define ARCBIOS_MEM_FreeMemory 3
|
|
#define ARCBIOS_MEM_BadMemory 4
|
|
#define ARCBIOS_MEM_LoadedProgram 5
|
|
#define ARCBIOS_MEM_FirmwareTemporary 6
|
|
#define ARCBIOS_MEM_FirmwarePermanent 7
|
|
#elif defined(arc)
|
|
#define ARCBIOS_MEM_ExceptionBlock 0
|
|
#define ARCBIOS_MEM_SystemParameterBlock 1
|
|
#define ARCBIOS_MEM_FreeMemory 2
|
|
#define ARCBIOS_MEM_BadMemory 3
|
|
#define ARCBIOS_MEM_LoadedProgram 4
|
|
#define ARCBIOS_MEM_FirmwareTemporary 5
|
|
#define ARCBIOS_MEM_FirmwarePermanent 6
|
|
#define ARCBIOS_MEM_FreeContiguous 7
|
|
#endif
|
|
|
|
/*
|
|
* ARC display status
|
|
*/
|
|
struct arcbios_dsp_stat {
|
|
uint16_t CursorXPosition;
|
|
uint16_t CursorYPosition;
|
|
uint16_t CursorMaxXPosition;
|
|
uint16_t CursorMaxYPosition;
|
|
uint8_t ForegroundColor;
|
|
uint8_t BackgroundColor;
|
|
uint8_t HighIntensity;
|
|
uint8_t Underscored;
|
|
uint8_t ReverseVideo;
|
|
};
|
|
|
|
/*
|
|
* ARC firmware vector
|
|
*/
|
|
struct arcbios_fv {
|
|
int32_t Load;
|
|
int32_t Invoke;
|
|
int32_t Execute;
|
|
int32_t Halt;
|
|
int32_t PowerDown;
|
|
int32_t Restart;
|
|
int32_t Reboot;
|
|
int32_t EnterInteractiveMode;
|
|
int32_t ReturnFromMain; /* not on sgimips */
|
|
int32_t GetPeer;
|
|
int32_t GetChild;
|
|
int32_t GetParent;
|
|
int32_t GetConfigurationData;
|
|
int32_t AddChild;
|
|
int32_t DeleteComponent;
|
|
int32_t GetComponent;
|
|
int32_t SaveConfiguration;
|
|
int32_t GetSystemId;
|
|
int32_t GetMemoryDescriptor;
|
|
int32_t Signal; /* not on sgimips */
|
|
int32_t GetTime;
|
|
int32_t GetRelativeTime;
|
|
int32_t GetDirectoryEntry;
|
|
int32_t Open;
|
|
int32_t Close;
|
|
int32_t Read;
|
|
int32_t GetReadStatus;
|
|
int32_t Write;
|
|
int32_t Seek;
|
|
int32_t Mount;
|
|
int32_t GetEnvironmentVariable;
|
|
int32_t SetEnvironmentVariable;
|
|
int32_t GetFileInformation;
|
|
int32_t SetFileInformation;
|
|
int32_t FlushAllCaches;
|
|
int32_t TestUnicode; /* not on sgimips */
|
|
int32_t GetDisplayStatus; /* not on sgimips */
|
|
};
|
|
|
|
#if defined(_KERNEL) || defined(_STANDALONE)
|
|
/*
|
|
* ARC firmware vector calls
|
|
*/
|
|
long arcbios_Load(char *, u_long, u_long, u_long *);
|
|
long arcbios_Invoke(u_long, u_long, u_long, char **, char **);
|
|
long arcbios_Execute(char *, u_long, char **, char **);
|
|
void arcbios_Halt(void) __dead;
|
|
void arcbios_PowerDown(void) __dead;
|
|
void arcbios_Restart(void) __dead;
|
|
void arcbios_Reboot(void) __dead;
|
|
void arcbios_EnterInteractiveMode(void) __dead;
|
|
void arcbios_ReturnFromMain(void) __dead; /* not on sgimips */
|
|
void * arcbios_GetPeer(void *);
|
|
void * arcbios_GetChild(void *);
|
|
void * arcbios_GetParent(void *);
|
|
long arcbios_GetConfigurationData(void *, void *);
|
|
void * arcbios_AddChild(void *, void *);
|
|
long arcbios_DeleteComponent(void *);
|
|
void * arcbios_GetComponent(char *);
|
|
long arcbios_SaveConfiguration(void);
|
|
void * arcbios_GetSystemId(void);
|
|
void * arcbios_GetMemoryDescriptor(void *);
|
|
void arcbios_Signal(u_long, void *); /* not on sgimips */
|
|
void * arcbios_GetTime(void);
|
|
u_long arcbios_GetRelativeTime(void);
|
|
|
|
long arcbios_GetDirectoryEntry(u_long, void *, u_long, u_long *);
|
|
long arcbios_Open(const char *, u_long, u_long *);
|
|
long arcbios_Close(u_long);
|
|
long arcbios_Read(u_long, void *, u_long, u_long *);
|
|
long arcbios_GetReadStatus(u_long);
|
|
long arcbios_Write(u_long, void *, u_long, u_long *);
|
|
long arcbios_Seek(u_long, int64_t *, u_long);
|
|
long arcbios_Mount(char *, u_long);
|
|
const char *
|
|
arcbios_GetEnvironmentVariable(const char *);
|
|
long arcbios_SetEnvironmentVariable(const char *, const char *);
|
|
long arcbios_GetFileInformation(u_long, void *);
|
|
long arcbios_SetFileInformation(u_long, u_long, u_long);
|
|
void arcbios_FlushAllCaches(void);
|
|
paddr_t arcbios_TestUnicode(u_long, uint16_t); /* not on sgimips */
|
|
void * arcbios_GetDisplayStatus(u_long); /* not on sgimips */
|
|
|
|
#endif /* _KERNEL || _STANDALONE */
|
|
|
|
#endif /* _ARCBIOS_H_ */
|