/*      $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_ */