linux/arch/mips/include/asm/sgiarcs.h
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * ARC firmware interface defines.
   7 *
   8 * Copyright (C) 1996 David S. Miller (davem@davemloft.net)
   9 * Copyright (C) 1999, 2001 Ralf Baechle (ralf@gnu.org)
  10 * Copyright (C) 1999 Silicon Graphics, Inc.
  11 */
  12#ifndef _ASM_SGIARCS_H
  13#define _ASM_SGIARCS_H
  14
  15#include <linux/kernel.h>
  16
  17#include <asm/types.h>
  18#include <asm/fw/arc/types.h>
  19
  20/* Various ARCS error codes. */
  21#define PROM_ESUCCESS                   0x00
  22#define PROM_E2BIG                      0x01
  23#define PROM_EACCESS                    0x02
  24#define PROM_EAGAIN                     0x03
  25#define PROM_EBADF                      0x04
  26#define PROM_EBUSY                      0x05
  27#define PROM_EFAULT                     0x06
  28#define PROM_EINVAL                     0x07
  29#define PROM_EIO                        0x08
  30#define PROM_EISDIR                     0x09
  31#define PROM_EMFILE                     0x0a
  32#define PROM_EMLINK                     0x0b
  33#define PROM_ENAMETOOLONG               0x0c
  34#define PROM_ENODEV                     0x0d
  35#define PROM_ENOENT                     0x0e
  36#define PROM_ENOEXEC                    0x0f
  37#define PROM_ENOMEM                     0x10
  38#define PROM_ENOSPC                     0x11
  39#define PROM_ENOTDIR                    0x12
  40#define PROM_ENOTTY                     0x13
  41#define PROM_ENXIO                      0x14
  42#define PROM_EROFS                      0x15
  43/* SGI ARCS specific errno's. */
  44#define PROM_EADDRNOTAVAIL              0x1f
  45#define PROM_ETIMEDOUT                  0x20
  46#define PROM_ECONNABORTED               0x21
  47#define PROM_ENOCONNECT                 0x22
  48
  49/* Device classes, types, and identifiers for prom
  50 * device inventory queries.
  51 */
  52enum linux_devclass {
  53        system, processor, cache, adapter, controller, peripheral, memory
  54};
  55
  56enum linux_devtypes {
  57        /* Generic stuff. */
  58        Arc, Cpu, Fpu,
  59
  60        /* Primary insn and data caches. */
  61        picache, pdcache,
  62
  63        /* Secondary insn, data, and combined caches. */
  64        sicache, sdcache, sccache,
  65
  66        memdev, eisa_adapter, tc_adapter, scsi_adapter, dti_adapter,
  67        multifunc_adapter, dsk_controller, tp_controller, cdrom_controller,
  68        worm_controller, serial_controller, net_controller, disp_controller,
  69        parallel_controller, ptr_controller, kbd_controller, audio_controller,
  70        misc_controller, disk_peripheral, flpy_peripheral, tp_peripheral,
  71        modem_peripheral, monitor_peripheral, printer_peripheral,
  72        ptr_peripheral, kbd_peripheral, term_peripheral, line_peripheral,
  73        net_peripheral, misc_peripheral, anon
  74};
  75
  76enum linux_identifier {
  77        bogus, ronly, removable, consin, consout, input, output
  78};
  79
  80/* A prom device tree component. */
  81struct linux_component {
  82        enum linux_devclass     class;  /* node class */
  83        enum linux_devtypes     type;   /* node type */
  84        enum linux_identifier   iflags; /* node flags */
  85        USHORT                  vers;   /* node version */
  86        USHORT                  rev;    /* node revision */
  87        ULONG                   key;    /* completely magic */
  88        ULONG                   amask;  /* XXX affinity mask??? */
  89        ULONG                   cdsize; /* size of configuration data */
  90        ULONG                   ilen;   /* length of string identifier */
  91        _PULONG                 iname;  /* string identifier */
  92};
  93typedef struct linux_component pcomponent;
  94
  95struct linux_sysid {
  96        char vend[8], prod[8];
  97};
  98
  99/* ARCS prom memory descriptors. */
 100enum arcs_memtypes {
 101        arcs_eblock,  /* exception block */
 102        arcs_rvpage,  /* ARCS romvec page */
 103        arcs_fcontig, /* Contiguous and free */
 104        arcs_free,    /* Generic free memory */
 105        arcs_bmem,    /* Borken memory, don't use */
 106        arcs_prog,    /* A loaded program resides here */
 107        arcs_atmp,    /* ARCS temporary storage area, wish Sparc OpenBoot told this */
 108        arcs_aperm,   /* ARCS permanent storage... */
 109};
 110
 111/* ARC has slightly different types than ARCS */
 112enum arc_memtypes {
 113        arc_eblock,  /* exception block */
 114        arc_rvpage,  /* romvec page */
 115        arc_free,    /* Generic free memory */
 116        arc_bmem,    /* Borken memory, don't use */
 117        arc_prog,    /* A loaded program resides here */
 118        arc_atmp,    /* temporary storage area */
 119        arc_aperm,   /* permanent storage */
 120        arc_fcontig, /* Contiguous and free */
 121};
 122
 123union linux_memtypes {
 124    enum arcs_memtypes arcs;
 125    enum arc_memtypes arc;
 126};
 127
 128struct linux_mdesc {
 129        union linux_memtypes type;
 130        ULONG base;
 131        ULONG pages;
 132};
 133
 134/* Time of day descriptor. */
 135struct linux_tinfo {
 136        unsigned short yr;
 137        unsigned short mnth;
 138        unsigned short day;
 139        unsigned short hr;
 140        unsigned short min;
 141        unsigned short sec;
 142        unsigned short msec;
 143};
 144
 145/* ARCS virtual dirents. */
 146struct linux_vdirent {
 147        ULONG namelen;
 148        unsigned char attr;
 149        char fname[32]; /* XXX empirical, should be a define */
 150};
 151
 152/* Other stuff for files. */
 153enum linux_omode {
 154        rdonly, wronly, rdwr, wronly_creat, rdwr_creat,
 155        wronly_ssede, rdwr_ssede, dirent, dirent_creat
 156};
 157
 158enum linux_seekmode {
 159        absolute, relative
 160};
 161
 162enum linux_mountops {
 163        media_load, media_unload
 164};
 165
 166/* This prom has a bolixed design. */
 167struct linux_bigint {
 168#ifdef __MIPSEL__
 169        u32 lo;
 170        s32 hi;
 171#else /* !(__MIPSEL__) */
 172        s32 hi;
 173        u32 lo;
 174#endif
 175};
 176
 177struct linux_finfo {
 178        struct linux_bigint   begin;
 179        struct linux_bigint   end;
 180        struct linux_bigint   cur;
 181        enum linux_devtypes   dtype;
 182        unsigned long         namelen;
 183        unsigned char         attr;
 184        char                  name[32]; /* XXX empirical, should be define */
 185};
 186
 187/* This describes the vector containing function pointers to the ARC
 188   firmware functions.  */
 189struct linux_romvec {
 190        LONG    load;                   /* Load an executable image. */
 191        LONG    invoke;                 /* Invoke a standalong image. */
 192        LONG    exec;                   /* Load and begin execution of a
 193                                           standalone image. */
 194        LONG    halt;                   /* Halt the machine. */
 195        LONG    pdown;                  /* Power down the machine. */
 196        LONG    restart;                /* XXX soft reset??? */
 197        LONG    reboot;                 /* Reboot the machine. */
 198        LONG    imode;                  /* Enter PROM interactive mode. */
 199        LONG    _unused1;               /* Was ReturnFromMain(). */
 200
 201        /* PROM device tree interface. */
 202        LONG    next_component;
 203        LONG    child_component;
 204        LONG    parent_component;
 205        LONG    component_data;
 206        LONG    child_add;
 207        LONG    comp_del;
 208        LONG    component_by_path;
 209
 210        /* Misc. stuff. */
 211        LONG    cfg_save;
 212        LONG    get_sysid;
 213
 214        /* Probing for memory. */
 215        LONG    get_mdesc;
 216        LONG    _unused2;               /* was Signal() */
 217
 218        LONG    get_tinfo;
 219        LONG    get_rtime;
 220
 221        /* File type operations. */
 222        LONG    get_vdirent;
 223        LONG    open;
 224        LONG    close;
 225        LONG    read;
 226        LONG    get_rstatus;
 227        LONG    write;
 228        LONG    seek;
 229        LONG    mount;
 230
 231        /* Dealing with firmware environment variables. */
 232        LONG    get_evar;
 233        LONG    set_evar;
 234
 235        LONG    get_finfo;
 236        LONG    set_finfo;
 237
 238        /* Miscellaneous. */
 239        LONG    cache_flush;
 240        LONG    TestUnicodeCharacter;           /* ARC; not sure if ARCS too */
 241        LONG    GetDisplayStatus;
 242};
 243
 244/* The SGI ARCS parameter block is in a fixed location for standalone
 245 * programs to access PROM facilities easily.
 246 */
 247typedef struct _SYSTEM_PARAMETER_BLOCK {
 248        ULONG                   magic;          /* magic cookie */
 249#define PROMBLOCK_MAGIC      0x53435241
 250
 251        ULONG                   len;            /* length of parm block */
 252        USHORT                  ver;            /* ARCS firmware version */
 253        USHORT                  rev;            /* ARCS firmware revision */
 254        _PLONG                  rs_block;       /* Restart block. */
 255        _PLONG                  dbg_block;      /* Debug block. */
 256        _PLONG                  gevect;         /* XXX General vector??? */
 257        _PLONG                  utlbvect;       /* XXX UTLB vector??? */
 258        ULONG                   rveclen;        /* Size of romvec struct. */
 259        _PVOID                  romvec;         /* Function interface. */
 260        ULONG                   pveclen;        /* Length of private vector. */
 261        _PVOID                  pvector;        /* Private vector. */
 262        ULONG                   adap_cnt;       /* Adapter count. */
 263        ULONG                   adap_typ0;      /* First adapter type. */
 264        ULONG                   adap_vcnt0;     /* Adapter 0 vector count. */
 265        _PVOID                  adap_vector;    /* Adapter 0 vector ptr. */
 266        ULONG                   adap_typ1;      /* Second adapter type. */
 267        ULONG                   adap_vcnt1;     /* Adapter 1 vector count. */
 268        _PVOID                  adap_vector1;   /* Adapter 1 vector ptr. */
 269        /* More adapter vectors go here... */
 270} SYSTEM_PARAMETER_BLOCK, *PSYSTEM_PARAMETER_BLOCK;
 271
 272#define PROMBLOCK ((PSYSTEM_PARAMETER_BLOCK) (int)0xA0001000)
 273#define ROMVECTOR ((struct linux_romvec *) (long)(PROMBLOCK)->romvec)
 274
 275/* Cache layout parameter block. */
 276union linux_cache_key {
 277        struct param {
 278#ifdef __MIPSEL__
 279                unsigned short size;
 280                unsigned char lsize;
 281                unsigned char bsize;
 282#else /* !(__MIPSEL__) */
 283                unsigned char bsize;
 284                unsigned char lsize;
 285                unsigned short size;
 286#endif
 287        } info;
 288        unsigned long allinfo;
 289};
 290
 291/* Configuration data. */
 292struct linux_cdata {
 293        char *name;
 294        int mlen;
 295        enum linux_devtypes type;
 296};
 297
 298/* Common SGI ARCS firmware file descriptors. */
 299#define SGIPROM_STDIN     0
 300#define SGIPROM_STDOUT    1
 301
 302/* Common SGI ARCS firmware file types. */
 303#define SGIPROM_ROFILE    0x01  /* read-only file */
 304#define SGIPROM_HFILE     0x02  /* hidden file */
 305#define SGIPROM_SFILE     0x04  /* System file */
 306#define SGIPROM_AFILE     0x08  /* Archive file */
 307#define SGIPROM_DFILE     0x10  /* Directory file */
 308#define SGIPROM_DELFILE   0x20  /* Deleted file */
 309
 310/* SGI ARCS boot record information. */
 311struct sgi_partition {
 312        unsigned char flag;
 313#define SGIPART_UNUSED 0x00
 314#define SGIPART_ACTIVE 0x80
 315
 316        unsigned char shead, ssect, scyl; /* unused */
 317        unsigned char systype; /* OS type, Irix or NT */
 318        unsigned char ehead, esect, ecyl; /* unused */
 319        unsigned char rsect0, rsect1, rsect2, rsect3;
 320        unsigned char tsect0, tsect1, tsect2, tsect3;
 321};
 322
 323#define SGIBBLOCK_MAGIC   0xaa55
 324#define SGIBBLOCK_MAXPART 0x0004
 325
 326struct sgi_bootblock {
 327        unsigned char _unused[446];
 328        struct sgi_partition partitions[SGIBBLOCK_MAXPART];
 329        unsigned short magic;
 330};
 331
 332/* BIOS parameter block. */
 333struct sgi_bparm_block {
 334        unsigned short bytes_sect;    /* bytes per sector */
 335        unsigned char  sect_clust;    /* sectors per cluster */
 336        unsigned short sect_resv;     /* reserved sectors */
 337        unsigned char  nfats;         /* # of allocation tables */
 338        unsigned short nroot_dirents; /* # of root directory entries */
 339        unsigned short sect_volume;   /* sectors in volume */
 340        unsigned char  media_type;    /* media descriptor */
 341        unsigned short sect_fat;      /* sectors per allocation table */
 342        unsigned short sect_track;    /* sectors per track */
 343        unsigned short nheads;        /* # of heads */
 344        unsigned short nhsects;       /* # of hidden sectors */
 345};
 346
 347struct sgi_bsector {
 348        unsigned char   jmpinfo[3];
 349        unsigned char   manuf_name[8];
 350        struct sgi_bparm_block info;
 351};
 352
 353/* Debugging block used with SGI symmon symbolic debugger. */
 354#define SMB_DEBUG_MAGIC   0xfeeddead
 355struct linux_smonblock {
 356        unsigned long   magic;
 357        void            (*handler)(void);  /* Breakpoint routine. */
 358        unsigned long   dtable_base;       /* Base addr of dbg table. */
 359        int             (*printf)(const char *fmt, ...);
 360        unsigned long   btable_base;       /* Breakpoint table. */
 361        unsigned long   mpflushreqs;       /* SMP cache flush request list. */
 362        unsigned long   ntab;              /* Name table. */
 363        unsigned long   stab;              /* Symbol table. */
 364        int             smax;              /* Max # of symbols. */
 365};
 366
 367/*
 368 * Macros for calling a 32-bit ARC implementation from 64-bit code
 369 */
 370
 371#if defined(CONFIG_64BIT) && defined(CONFIG_FW_ARC32)
 372
 373extern long call_o32(long vec, void *stack, ...);
 374
 375extern u64 o32_stk[4096];
 376#define O32_STK (&o32_stk[ARRAY_SIZE(o32_stk)])
 377
 378#define ARC_CALL0(dest)                                                 \
 379({      long __res;                                                     \
 380        long __vec = (long) romvec->dest;                               \
 381        __res = call_o32(__vec, O32_STK);                               \
 382        __res;                                                          \
 383})
 384
 385#define ARC_CALL1(dest, a1)                                             \
 386({      long __res;                                                     \
 387        int  __a1 = (int) (long) (a1);                                  \
 388        long __vec = (long) romvec->dest;                               \
 389        __res = call_o32(__vec, O32_STK, __a1);                         \
 390        __res;                                                          \
 391})
 392
 393#define ARC_CALL2(dest, a1, a2)                                         \
 394({      long __res;                                                     \
 395        int  __a1 = (int) (long) (a1);                                  \
 396        int  __a2 = (int) (long) (a2);                                  \
 397        long __vec = (long) romvec->dest;                               \
 398        __res = call_o32(__vec, O32_STK, __a1, __a2);                   \
 399        __res;                                                          \
 400})
 401
 402#define ARC_CALL3(dest, a1, a2, a3)                                     \
 403({      long __res;                                                     \
 404        int  __a1 = (int) (long) (a1);                                  \
 405        int  __a2 = (int) (long) (a2);                                  \
 406        int  __a3 = (int) (long) (a3);                                  \
 407        long __vec = (long) romvec->dest;                               \
 408        __res = call_o32(__vec, O32_STK, __a1, __a2, __a3);             \
 409        __res;                                                          \
 410})
 411
 412#define ARC_CALL4(dest, a1, a2, a3, a4)                                 \
 413({      long __res;                                                     \
 414        int  __a1 = (int) (long) (a1);                                  \
 415        int  __a2 = (int) (long) (a2);                                  \
 416        int  __a3 = (int) (long) (a3);                                  \
 417        int  __a4 = (int) (long) (a4);                                  \
 418        long __vec = (long) romvec->dest;                               \
 419        __res = call_o32(__vec, O32_STK, __a1, __a2, __a3, __a4);       \
 420        __res;                                                          \
 421})
 422
 423#define ARC_CALL5(dest, a1, a2, a3, a4, a5)                             \
 424({      long __res;                                                     \
 425        int  __a1 = (int) (long) (a1);                                  \
 426        int  __a2 = (int) (long) (a2);                                  \
 427        int  __a3 = (int) (long) (a3);                                  \
 428        int  __a4 = (int) (long) (a4);                                  \
 429        int  __a5 = (int) (long) (a5);                                  \
 430        long __vec = (long) romvec->dest;                               \
 431        __res = call_o32(__vec, O32_STK, __a1, __a2, __a3, __a4, __a5); \
 432        __res;                                                          \
 433})
 434
 435#endif /* defined(CONFIG_64BIT) && defined(CONFIG_FW_ARC32) */
 436
 437#if (defined(CONFIG_32BIT) && defined(CONFIG_FW_ARC32)) ||              \
 438    (defined(CONFIG_64BIT) && defined(CONFIG_FW_ARC64))
 439
 440#define ARC_CALL0(dest)                                                 \
 441({      long __res;                                                     \
 442        long (*__vec)(void) = (void *) romvec->dest;                    \
 443                                                                        \
 444        __res = __vec();                                                \
 445        __res;                                                          \
 446})
 447
 448#define ARC_CALL1(dest, a1)                                             \
 449({      long __res;                                                     \
 450        long __a1 = (long) (a1);                                        \
 451        long (*__vec)(long) = (void *) romvec->dest;                    \
 452                                                                        \
 453        __res = __vec(__a1);                                            \
 454        __res;                                                          \
 455})
 456
 457#define ARC_CALL2(dest, a1, a2)                                         \
 458({      long __res;                                                     \
 459        long __a1 = (long) (a1);                                        \
 460        long __a2 = (long) (a2);                                        \
 461        long (*__vec)(long, long) = (void *) romvec->dest;              \
 462                                                                        \
 463        __res = __vec(__a1, __a2);                                      \
 464        __res;                                                          \
 465})
 466
 467#define ARC_CALL3(dest, a1, a2, a3)                                     \
 468({      long __res;                                                     \
 469        long __a1 = (long) (a1);                                        \
 470        long __a2 = (long) (a2);                                        \
 471        long __a3 = (long) (a3);                                        \
 472        long (*__vec)(long, long, long) = (void *) romvec->dest;        \
 473                                                                        \
 474        __res = __vec(__a1, __a2, __a3);                                \
 475        __res;                                                          \
 476})
 477
 478#define ARC_CALL4(dest, a1, a2, a3, a4)                                 \
 479({      long __res;                                                     \
 480        long __a1 = (long) (a1);                                        \
 481        long __a2 = (long) (a2);                                        \
 482        long __a3 = (long) (a3);                                        \
 483        long __a4 = (long) (a4);                                        \
 484        long (*__vec)(long, long, long, long) = (void *) romvec->dest;  \
 485                                                                        \
 486        __res = __vec(__a1, __a2, __a3, __a4);                          \
 487        __res;                                                          \
 488})
 489
 490#define ARC_CALL5(dest, a1, a2, a3, a4, a5)                             \
 491({      long __res;                                                     \
 492        long __a1 = (long) (a1);                                        \
 493        long __a2 = (long) (a2);                                        \
 494        long __a3 = (long) (a3);                                        \
 495        long __a4 = (long) (a4);                                        \
 496        long __a5 = (long) (a5);                                        \
 497        long (*__vec)(long, long, long, long, long);                    \
 498        __vec = (void *) romvec->dest;                                  \
 499                                                                        \
 500        __res = __vec(__a1, __a2, __a3, __a4, __a5);                    \
 501        __res;                                                          \
 502})
 503#endif /* both kernel and ARC either 32-bit or 64-bit */
 504
 505#endif /* _ASM_SGIARCS_H */
 506