1384740dcSRalf Baechle /* 2384740dcSRalf Baechle * This file is subject to the terms and conditions of the GNU General Public 3384740dcSRalf Baechle * License. See the file "COPYING" in the main directory of this archive 4384740dcSRalf Baechle * for more details. 5384740dcSRalf Baechle * 6384740dcSRalf Baechle * ARC firmware interface defines. 7384740dcSRalf Baechle * 879add627SJustin P. Mattock * Copyright (C) 1996 David S. Miller (davem@davemloft.net) 9384740dcSRalf Baechle * Copyright (C) 1999, 2001 Ralf Baechle (ralf@gnu.org) 10384740dcSRalf Baechle * Copyright (C) 1999 Silicon Graphics, Inc. 11384740dcSRalf Baechle */ 12384740dcSRalf Baechle #ifndef _ASM_SGIARCS_H 13384740dcSRalf Baechle #define _ASM_SGIARCS_H 14384740dcSRalf Baechle 15ce6c0a59SThomas Bogendoerfer #include <linux/kernel.h> 16ce6c0a59SThomas Bogendoerfer 17384740dcSRalf Baechle #include <asm/types.h> 18384740dcSRalf Baechle #include <asm/fw/arc/types.h> 19384740dcSRalf Baechle 20384740dcSRalf Baechle /* Various ARCS error codes. */ 21384740dcSRalf Baechle #define PROM_ESUCCESS 0x00 22384740dcSRalf Baechle #define PROM_E2BIG 0x01 23384740dcSRalf Baechle #define PROM_EACCESS 0x02 24384740dcSRalf Baechle #define PROM_EAGAIN 0x03 25384740dcSRalf Baechle #define PROM_EBADF 0x04 26384740dcSRalf Baechle #define PROM_EBUSY 0x05 27384740dcSRalf Baechle #define PROM_EFAULT 0x06 28384740dcSRalf Baechle #define PROM_EINVAL 0x07 29384740dcSRalf Baechle #define PROM_EIO 0x08 30384740dcSRalf Baechle #define PROM_EISDIR 0x09 31384740dcSRalf Baechle #define PROM_EMFILE 0x0a 32384740dcSRalf Baechle #define PROM_EMLINK 0x0b 33384740dcSRalf Baechle #define PROM_ENAMETOOLONG 0x0c 34384740dcSRalf Baechle #define PROM_ENODEV 0x0d 35384740dcSRalf Baechle #define PROM_ENOENT 0x0e 36384740dcSRalf Baechle #define PROM_ENOEXEC 0x0f 37384740dcSRalf Baechle #define PROM_ENOMEM 0x10 38384740dcSRalf Baechle #define PROM_ENOSPC 0x11 39384740dcSRalf Baechle #define PROM_ENOTDIR 0x12 40384740dcSRalf Baechle #define PROM_ENOTTY 0x13 41384740dcSRalf Baechle #define PROM_ENXIO 0x14 42384740dcSRalf Baechle #define PROM_EROFS 0x15 43384740dcSRalf Baechle /* SGI ARCS specific errno's. */ 44384740dcSRalf Baechle #define PROM_EADDRNOTAVAIL 0x1f 45384740dcSRalf Baechle #define PROM_ETIMEDOUT 0x20 46384740dcSRalf Baechle #define PROM_ECONNABORTED 0x21 47384740dcSRalf Baechle #define PROM_ENOCONNECT 0x22 48384740dcSRalf Baechle 49384740dcSRalf Baechle /* Device classes, types, and identifiers for prom 50384740dcSRalf Baechle * device inventory queries. 51384740dcSRalf Baechle */ 52384740dcSRalf Baechle enum linux_devclass { 53384740dcSRalf Baechle system, processor, cache, adapter, controller, peripheral, memory 54384740dcSRalf Baechle }; 55384740dcSRalf Baechle 56384740dcSRalf Baechle enum linux_devtypes { 57384740dcSRalf Baechle /* Generic stuff. */ 58384740dcSRalf Baechle Arc, Cpu, Fpu, 59384740dcSRalf Baechle 60384740dcSRalf Baechle /* Primary insn and data caches. */ 61384740dcSRalf Baechle picache, pdcache, 62384740dcSRalf Baechle 63384740dcSRalf Baechle /* Secondary insn, data, and combined caches. */ 64384740dcSRalf Baechle sicache, sdcache, sccache, 65384740dcSRalf Baechle 66384740dcSRalf Baechle memdev, eisa_adapter, tc_adapter, scsi_adapter, dti_adapter, 67384740dcSRalf Baechle multifunc_adapter, dsk_controller, tp_controller, cdrom_controller, 68384740dcSRalf Baechle worm_controller, serial_controller, net_controller, disp_controller, 69384740dcSRalf Baechle parallel_controller, ptr_controller, kbd_controller, audio_controller, 70384740dcSRalf Baechle misc_controller, disk_peripheral, flpy_peripheral, tp_peripheral, 71384740dcSRalf Baechle modem_peripheral, monitor_peripheral, printer_peripheral, 72384740dcSRalf Baechle ptr_peripheral, kbd_peripheral, term_peripheral, line_peripheral, 73384740dcSRalf Baechle net_peripheral, misc_peripheral, anon 74384740dcSRalf Baechle }; 75384740dcSRalf Baechle 76384740dcSRalf Baechle enum linux_identifier { 77384740dcSRalf Baechle bogus, ronly, removable, consin, consout, input, output 78384740dcSRalf Baechle }; 79384740dcSRalf Baechle 80384740dcSRalf Baechle /* A prom device tree component. */ 81384740dcSRalf Baechle struct linux_component { 82384740dcSRalf Baechle enum linux_devclass class; /* node class */ 83384740dcSRalf Baechle enum linux_devtypes type; /* node type */ 84384740dcSRalf Baechle enum linux_identifier iflags; /* node flags */ 85384740dcSRalf Baechle USHORT vers; /* node version */ 86384740dcSRalf Baechle USHORT rev; /* node revision */ 87384740dcSRalf Baechle ULONG key; /* completely magic */ 88384740dcSRalf Baechle ULONG amask; /* XXX affinity mask??? */ 89384740dcSRalf Baechle ULONG cdsize; /* size of configuration data */ 90384740dcSRalf Baechle ULONG ilen; /* length of string identifier */ 91384740dcSRalf Baechle _PULONG iname; /* string identifier */ 92384740dcSRalf Baechle }; 93384740dcSRalf Baechle typedef struct linux_component pcomponent; 94384740dcSRalf Baechle 95384740dcSRalf Baechle struct linux_sysid { 96384740dcSRalf Baechle char vend[8], prod[8]; 97384740dcSRalf Baechle }; 98384740dcSRalf Baechle 99384740dcSRalf Baechle /* ARCS prom memory descriptors. */ 100384740dcSRalf Baechle enum arcs_memtypes { 101384740dcSRalf Baechle arcs_eblock, /* exception block */ 102384740dcSRalf Baechle arcs_rvpage, /* ARCS romvec page */ 103384740dcSRalf Baechle arcs_fcontig, /* Contiguous and free */ 104384740dcSRalf Baechle arcs_free, /* Generic free memory */ 105384740dcSRalf Baechle arcs_bmem, /* Borken memory, don't use */ 106384740dcSRalf Baechle arcs_prog, /* A loaded program resides here */ 107384740dcSRalf Baechle arcs_atmp, /* ARCS temporary storage area, wish Sparc OpenBoot told this */ 108384740dcSRalf Baechle arcs_aperm, /* ARCS permanent storage... */ 109384740dcSRalf Baechle }; 110384740dcSRalf Baechle 111384740dcSRalf Baechle /* ARC has slightly different types than ARCS */ 112384740dcSRalf Baechle enum arc_memtypes { 113384740dcSRalf Baechle arc_eblock, /* exception block */ 114384740dcSRalf Baechle arc_rvpage, /* romvec page */ 115384740dcSRalf Baechle arc_free, /* Generic free memory */ 116384740dcSRalf Baechle arc_bmem, /* Borken memory, don't use */ 117384740dcSRalf Baechle arc_prog, /* A loaded program resides here */ 118384740dcSRalf Baechle arc_atmp, /* temporary storage area */ 119384740dcSRalf Baechle arc_aperm, /* permanent storage */ 120384740dcSRalf Baechle arc_fcontig, /* Contiguous and free */ 121384740dcSRalf Baechle }; 122384740dcSRalf Baechle 123384740dcSRalf Baechle union linux_memtypes { 124384740dcSRalf Baechle enum arcs_memtypes arcs; 125384740dcSRalf Baechle enum arc_memtypes arc; 126384740dcSRalf Baechle }; 127384740dcSRalf Baechle 128384740dcSRalf Baechle struct linux_mdesc { 129384740dcSRalf Baechle union linux_memtypes type; 130384740dcSRalf Baechle ULONG base; 131384740dcSRalf Baechle ULONG pages; 132384740dcSRalf Baechle }; 133384740dcSRalf Baechle 134384740dcSRalf Baechle /* Time of day descriptor. */ 135384740dcSRalf Baechle struct linux_tinfo { 136384740dcSRalf Baechle unsigned short yr; 137384740dcSRalf Baechle unsigned short mnth; 138384740dcSRalf Baechle unsigned short day; 139384740dcSRalf Baechle unsigned short hr; 140384740dcSRalf Baechle unsigned short min; 141384740dcSRalf Baechle unsigned short sec; 142384740dcSRalf Baechle unsigned short msec; 143384740dcSRalf Baechle }; 144384740dcSRalf Baechle 145384740dcSRalf Baechle /* ARCS virtual dirents. */ 146384740dcSRalf Baechle struct linux_vdirent { 147384740dcSRalf Baechle ULONG namelen; 148384740dcSRalf Baechle unsigned char attr; 14992a76f6dSAdam Buchbinder char fname[32]; /* XXX empirical, should be a define */ 150384740dcSRalf Baechle }; 151384740dcSRalf Baechle 152384740dcSRalf Baechle /* Other stuff for files. */ 153384740dcSRalf Baechle enum linux_omode { 154384740dcSRalf Baechle rdonly, wronly, rdwr, wronly_creat, rdwr_creat, 155384740dcSRalf Baechle wronly_ssede, rdwr_ssede, dirent, dirent_creat 156384740dcSRalf Baechle }; 157384740dcSRalf Baechle 158384740dcSRalf Baechle enum linux_seekmode { 159384740dcSRalf Baechle absolute, relative 160384740dcSRalf Baechle }; 161384740dcSRalf Baechle 162384740dcSRalf Baechle enum linux_mountops { 163384740dcSRalf Baechle media_load, media_unload 164384740dcSRalf Baechle }; 165384740dcSRalf Baechle 166384740dcSRalf Baechle /* This prom has a bolixed design. */ 167384740dcSRalf Baechle struct linux_bigint { 168384740dcSRalf Baechle #ifdef __MIPSEL__ 169384740dcSRalf Baechle u32 lo; 170384740dcSRalf Baechle s32 hi; 171384740dcSRalf Baechle #else /* !(__MIPSEL__) */ 172384740dcSRalf Baechle s32 hi; 173384740dcSRalf Baechle u32 lo; 174384740dcSRalf Baechle #endif 175384740dcSRalf Baechle }; 176384740dcSRalf Baechle 177384740dcSRalf Baechle struct linux_finfo { 178384740dcSRalf Baechle struct linux_bigint begin; 179384740dcSRalf Baechle struct linux_bigint end; 180384740dcSRalf Baechle struct linux_bigint cur; 181384740dcSRalf Baechle enum linux_devtypes dtype; 182384740dcSRalf Baechle unsigned long namelen; 183384740dcSRalf Baechle unsigned char attr; 18492a76f6dSAdam Buchbinder char name[32]; /* XXX empirical, should be define */ 185384740dcSRalf Baechle }; 186384740dcSRalf Baechle 187384740dcSRalf Baechle /* This describes the vector containing function pointers to the ARC 188384740dcSRalf Baechle firmware functions. */ 189384740dcSRalf Baechle struct linux_romvec { 190384740dcSRalf Baechle LONG load; /* Load an executable image. */ 191384740dcSRalf Baechle LONG invoke; /* Invoke a standalong image. */ 192384740dcSRalf Baechle LONG exec; /* Load and begin execution of a 193384740dcSRalf Baechle standalone image. */ 194384740dcSRalf Baechle LONG halt; /* Halt the machine. */ 195384740dcSRalf Baechle LONG pdown; /* Power down the machine. */ 196384740dcSRalf Baechle LONG restart; /* XXX soft reset??? */ 197384740dcSRalf Baechle LONG reboot; /* Reboot the machine. */ 198384740dcSRalf Baechle LONG imode; /* Enter PROM interactive mode. */ 199384740dcSRalf Baechle LONG _unused1; /* Was ReturnFromMain(). */ 200384740dcSRalf Baechle 201384740dcSRalf Baechle /* PROM device tree interface. */ 202384740dcSRalf Baechle LONG next_component; 203384740dcSRalf Baechle LONG child_component; 204384740dcSRalf Baechle LONG parent_component; 205384740dcSRalf Baechle LONG component_data; 206384740dcSRalf Baechle LONG child_add; 207384740dcSRalf Baechle LONG comp_del; 208384740dcSRalf Baechle LONG component_by_path; 209384740dcSRalf Baechle 210384740dcSRalf Baechle /* Misc. stuff. */ 211384740dcSRalf Baechle LONG cfg_save; 212384740dcSRalf Baechle LONG get_sysid; 213384740dcSRalf Baechle 214384740dcSRalf Baechle /* Probing for memory. */ 215384740dcSRalf Baechle LONG get_mdesc; 216384740dcSRalf Baechle LONG _unused2; /* was Signal() */ 217384740dcSRalf Baechle 218384740dcSRalf Baechle LONG get_tinfo; 219384740dcSRalf Baechle LONG get_rtime; 220384740dcSRalf Baechle 221384740dcSRalf Baechle /* File type operations. */ 222384740dcSRalf Baechle LONG get_vdirent; 223384740dcSRalf Baechle LONG open; 224384740dcSRalf Baechle LONG close; 225384740dcSRalf Baechle LONG read; 226384740dcSRalf Baechle LONG get_rstatus; 227384740dcSRalf Baechle LONG write; 228384740dcSRalf Baechle LONG seek; 229384740dcSRalf Baechle LONG mount; 230384740dcSRalf Baechle 231384740dcSRalf Baechle /* Dealing with firmware environment variables. */ 232384740dcSRalf Baechle LONG get_evar; 233384740dcSRalf Baechle LONG set_evar; 234384740dcSRalf Baechle 235384740dcSRalf Baechle LONG get_finfo; 236384740dcSRalf Baechle LONG set_finfo; 237384740dcSRalf Baechle 238384740dcSRalf Baechle /* Miscellaneous. */ 239384740dcSRalf Baechle LONG cache_flush; 240384740dcSRalf Baechle LONG TestUnicodeCharacter; /* ARC; not sure if ARCS too */ 241384740dcSRalf Baechle LONG GetDisplayStatus; 242384740dcSRalf Baechle }; 243384740dcSRalf Baechle 244384740dcSRalf Baechle /* The SGI ARCS parameter block is in a fixed location for standalone 245384740dcSRalf Baechle * programs to access PROM facilities easily. 246384740dcSRalf Baechle */ 247384740dcSRalf Baechle typedef struct _SYSTEM_PARAMETER_BLOCK { 248384740dcSRalf Baechle ULONG magic; /* magic cookie */ 249384740dcSRalf Baechle #define PROMBLOCK_MAGIC 0x53435241 250384740dcSRalf Baechle 251384740dcSRalf Baechle ULONG len; /* length of parm block */ 252384740dcSRalf Baechle USHORT ver; /* ARCS firmware version */ 253384740dcSRalf Baechle USHORT rev; /* ARCS firmware revision */ 254384740dcSRalf Baechle _PLONG rs_block; /* Restart block. */ 255384740dcSRalf Baechle _PLONG dbg_block; /* Debug block. */ 256384740dcSRalf Baechle _PLONG gevect; /* XXX General vector??? */ 257384740dcSRalf Baechle _PLONG utlbvect; /* XXX UTLB vector??? */ 258384740dcSRalf Baechle ULONG rveclen; /* Size of romvec struct. */ 259384740dcSRalf Baechle _PVOID romvec; /* Function interface. */ 260384740dcSRalf Baechle ULONG pveclen; /* Length of private vector. */ 261384740dcSRalf Baechle _PVOID pvector; /* Private vector. */ 262384740dcSRalf Baechle ULONG adap_cnt; /* Adapter count. */ 263384740dcSRalf Baechle ULONG adap_typ0; /* First adapter type. */ 264384740dcSRalf Baechle ULONG adap_vcnt0; /* Adapter 0 vector count. */ 265384740dcSRalf Baechle _PVOID adap_vector; /* Adapter 0 vector ptr. */ 266384740dcSRalf Baechle ULONG adap_typ1; /* Second adapter type. */ 267384740dcSRalf Baechle ULONG adap_vcnt1; /* Adapter 1 vector count. */ 268384740dcSRalf Baechle _PVOID adap_vector1; /* Adapter 1 vector ptr. */ 269384740dcSRalf Baechle /* More adapter vectors go here... */ 270384740dcSRalf Baechle } SYSTEM_PARAMETER_BLOCK, *PSYSTEM_PARAMETER_BLOCK; 271384740dcSRalf Baechle 272384740dcSRalf Baechle #define PROMBLOCK ((PSYSTEM_PARAMETER_BLOCK) (int)0xA0001000) 273384740dcSRalf Baechle #define ROMVECTOR ((struct linux_romvec *) (long)(PROMBLOCK)->romvec) 274384740dcSRalf Baechle 275384740dcSRalf Baechle /* Cache layout parameter block. */ 276384740dcSRalf Baechle union linux_cache_key { 277384740dcSRalf Baechle struct param { 278384740dcSRalf Baechle #ifdef __MIPSEL__ 279384740dcSRalf Baechle unsigned short size; 280384740dcSRalf Baechle unsigned char lsize; 281384740dcSRalf Baechle unsigned char bsize; 282384740dcSRalf Baechle #else /* !(__MIPSEL__) */ 283384740dcSRalf Baechle unsigned char bsize; 284384740dcSRalf Baechle unsigned char lsize; 285384740dcSRalf Baechle unsigned short size; 286384740dcSRalf Baechle #endif 287384740dcSRalf Baechle } info; 288384740dcSRalf Baechle unsigned long allinfo; 289384740dcSRalf Baechle }; 290384740dcSRalf Baechle 291384740dcSRalf Baechle /* Configuration data. */ 292384740dcSRalf Baechle struct linux_cdata { 293384740dcSRalf Baechle char *name; 294384740dcSRalf Baechle int mlen; 295384740dcSRalf Baechle enum linux_devtypes type; 296384740dcSRalf Baechle }; 297384740dcSRalf Baechle 298384740dcSRalf Baechle /* Common SGI ARCS firmware file descriptors. */ 299384740dcSRalf Baechle #define SGIPROM_STDIN 0 300384740dcSRalf Baechle #define SGIPROM_STDOUT 1 301384740dcSRalf Baechle 302384740dcSRalf Baechle /* Common SGI ARCS firmware file types. */ 303384740dcSRalf Baechle #define SGIPROM_ROFILE 0x01 /* read-only file */ 304384740dcSRalf Baechle #define SGIPROM_HFILE 0x02 /* hidden file */ 305384740dcSRalf Baechle #define SGIPROM_SFILE 0x04 /* System file */ 306384740dcSRalf Baechle #define SGIPROM_AFILE 0x08 /* Archive file */ 307384740dcSRalf Baechle #define SGIPROM_DFILE 0x10 /* Directory file */ 308384740dcSRalf Baechle #define SGIPROM_DELFILE 0x20 /* Deleted file */ 309384740dcSRalf Baechle 310384740dcSRalf Baechle /* SGI ARCS boot record information. */ 311384740dcSRalf Baechle struct sgi_partition { 312384740dcSRalf Baechle unsigned char flag; 313384740dcSRalf Baechle #define SGIPART_UNUSED 0x00 314384740dcSRalf Baechle #define SGIPART_ACTIVE 0x80 315384740dcSRalf Baechle 316384740dcSRalf Baechle unsigned char shead, ssect, scyl; /* unused */ 317384740dcSRalf Baechle unsigned char systype; /* OS type, Irix or NT */ 318384740dcSRalf Baechle unsigned char ehead, esect, ecyl; /* unused */ 319384740dcSRalf Baechle unsigned char rsect0, rsect1, rsect2, rsect3; 320384740dcSRalf Baechle unsigned char tsect0, tsect1, tsect2, tsect3; 321384740dcSRalf Baechle }; 322384740dcSRalf Baechle 323384740dcSRalf Baechle #define SGIBBLOCK_MAGIC 0xaa55 324384740dcSRalf Baechle #define SGIBBLOCK_MAXPART 0x0004 325384740dcSRalf Baechle 326384740dcSRalf Baechle struct sgi_bootblock { 327384740dcSRalf Baechle unsigned char _unused[446]; 328384740dcSRalf Baechle struct sgi_partition partitions[SGIBBLOCK_MAXPART]; 329384740dcSRalf Baechle unsigned short magic; 330384740dcSRalf Baechle }; 331384740dcSRalf Baechle 332384740dcSRalf Baechle /* BIOS parameter block. */ 333384740dcSRalf Baechle struct sgi_bparm_block { 334384740dcSRalf Baechle unsigned short bytes_sect; /* bytes per sector */ 335384740dcSRalf Baechle unsigned char sect_clust; /* sectors per cluster */ 336384740dcSRalf Baechle unsigned short sect_resv; /* reserved sectors */ 337384740dcSRalf Baechle unsigned char nfats; /* # of allocation tables */ 338384740dcSRalf Baechle unsigned short nroot_dirents; /* # of root directory entries */ 339384740dcSRalf Baechle unsigned short sect_volume; /* sectors in volume */ 340384740dcSRalf Baechle unsigned char media_type; /* media descriptor */ 341384740dcSRalf Baechle unsigned short sect_fat; /* sectors per allocation table */ 342384740dcSRalf Baechle unsigned short sect_track; /* sectors per track */ 343384740dcSRalf Baechle unsigned short nheads; /* # of heads */ 344384740dcSRalf Baechle unsigned short nhsects; /* # of hidden sectors */ 345384740dcSRalf Baechle }; 346384740dcSRalf Baechle 347384740dcSRalf Baechle struct sgi_bsector { 348384740dcSRalf Baechle unsigned char jmpinfo[3]; 349384740dcSRalf Baechle unsigned char manuf_name[8]; 350384740dcSRalf Baechle struct sgi_bparm_block info; 351384740dcSRalf Baechle }; 352384740dcSRalf Baechle 353384740dcSRalf Baechle /* Debugging block used with SGI symmon symbolic debugger. */ 354384740dcSRalf Baechle #define SMB_DEBUG_MAGIC 0xfeeddead 355384740dcSRalf Baechle struct linux_smonblock { 356384740dcSRalf Baechle unsigned long magic; 357384740dcSRalf Baechle void (*handler)(void); /* Breakpoint routine. */ 358384740dcSRalf Baechle unsigned long dtable_base; /* Base addr of dbg table. */ 359384740dcSRalf Baechle int (*printf)(const char *fmt, ...); 360384740dcSRalf Baechle unsigned long btable_base; /* Breakpoint table. */ 361384740dcSRalf Baechle unsigned long mpflushreqs; /* SMP cache flush request list. */ 362384740dcSRalf Baechle unsigned long ntab; /* Name table. */ 363384740dcSRalf Baechle unsigned long stab; /* Symbol table. */ 364384740dcSRalf Baechle int smax; /* Max # of symbols. */ 365384740dcSRalf Baechle }; 366384740dcSRalf Baechle 367384740dcSRalf Baechle /* 368384740dcSRalf Baechle * Macros for calling a 32-bit ARC implementation from 64-bit code 369384740dcSRalf Baechle */ 370384740dcSRalf Baechle 3710e2794b0SRalf Baechle #if defined(CONFIG_64BIT) && defined(CONFIG_FW_ARC32) 372384740dcSRalf Baechle 373ce6c0a59SThomas Bogendoerfer extern long call_o32(long vec, void *stack, ...); 374ce6c0a59SThomas Bogendoerfer 375ce6c0a59SThomas Bogendoerfer extern u64 o32_stk[4096]; 376ce6c0a59SThomas Bogendoerfer #define O32_STK (&o32_stk[ARRAY_SIZE(o32_stk)]) 377384740dcSRalf Baechle 378384740dcSRalf Baechle #define ARC_CALL0(dest) \ 379384740dcSRalf Baechle ({ long __res; \ 380384740dcSRalf Baechle long __vec = (long) romvec->dest; \ 381ce6c0a59SThomas Bogendoerfer __res = call_o32(__vec, O32_STK); \ 382ce6c0a59SThomas Bogendoerfer __res; \ 383384740dcSRalf Baechle }) 384384740dcSRalf Baechle 385384740dcSRalf Baechle #define ARC_CALL1(dest, a1) \ 386384740dcSRalf Baechle ({ long __res; \ 387ce6c0a59SThomas Bogendoerfer int __a1 = (int) (long) (a1); \ 388384740dcSRalf Baechle long __vec = (long) romvec->dest; \ 389ce6c0a59SThomas Bogendoerfer __res = call_o32(__vec, O32_STK, __a1); \ 390ce6c0a59SThomas Bogendoerfer __res; \ 391384740dcSRalf Baechle }) 392384740dcSRalf Baechle 393384740dcSRalf Baechle #define ARC_CALL2(dest, a1, a2) \ 394384740dcSRalf Baechle ({ long __res; \ 395ce6c0a59SThomas Bogendoerfer int __a1 = (int) (long) (a1); \ 396ce6c0a59SThomas Bogendoerfer int __a2 = (int) (long) (a2); \ 397384740dcSRalf Baechle long __vec = (long) romvec->dest; \ 398ce6c0a59SThomas Bogendoerfer __res = call_o32(__vec, O32_STK, __a1, __a2); \ 399384740dcSRalf Baechle __res; \ 400384740dcSRalf Baechle }) 401384740dcSRalf Baechle 402384740dcSRalf Baechle #define ARC_CALL3(dest, a1, a2, a3) \ 403384740dcSRalf Baechle ({ long __res; \ 404ce6c0a59SThomas Bogendoerfer int __a1 = (int) (long) (a1); \ 405ce6c0a59SThomas Bogendoerfer int __a2 = (int) (long) (a2); \ 406ce6c0a59SThomas Bogendoerfer int __a3 = (int) (long) (a3); \ 407384740dcSRalf Baechle long __vec = (long) romvec->dest; \ 408ce6c0a59SThomas Bogendoerfer __res = call_o32(__vec, O32_STK, __a1, __a2, __a3); \ 409384740dcSRalf Baechle __res; \ 410384740dcSRalf Baechle }) 411384740dcSRalf Baechle 412384740dcSRalf Baechle #define ARC_CALL4(dest, a1, a2, a3, a4) \ 413384740dcSRalf Baechle ({ long __res; \ 414ce6c0a59SThomas Bogendoerfer int __a1 = (int) (long) (a1); \ 415ce6c0a59SThomas Bogendoerfer int __a2 = (int) (long) (a2); \ 416ce6c0a59SThomas Bogendoerfer int __a3 = (int) (long) (a3); \ 417ce6c0a59SThomas Bogendoerfer int __a4 = (int) (long) (a4); \ 418384740dcSRalf Baechle long __vec = (long) romvec->dest; \ 419ce6c0a59SThomas Bogendoerfer __res = call_o32(__vec, O32_STK, __a1, __a2, __a3, __a4); \ 420384740dcSRalf Baechle __res; \ 421384740dcSRalf Baechle }) 422384740dcSRalf Baechle 423384740dcSRalf Baechle #define ARC_CALL5(dest, a1, a2, a3, a4, a5) \ 424384740dcSRalf Baechle ({ long __res; \ 425ce6c0a59SThomas Bogendoerfer int __a1 = (int) (long) (a1); \ 426ce6c0a59SThomas Bogendoerfer int __a2 = (int) (long) (a2); \ 427ce6c0a59SThomas Bogendoerfer int __a3 = (int) (long) (a3); \ 428ce6c0a59SThomas Bogendoerfer int __a4 = (int) (long) (a4); \ 429ce6c0a59SThomas Bogendoerfer int __a5 = (int) (long) (a5); \ 430384740dcSRalf Baechle long __vec = (long) romvec->dest; \ 431ce6c0a59SThomas Bogendoerfer __res = call_o32(__vec, O32_STK, __a1, __a2, __a3, __a4, __a5); \ 432384740dcSRalf Baechle __res; \ 433384740dcSRalf Baechle }) 434384740dcSRalf Baechle 4350e2794b0SRalf Baechle #endif /* defined(CONFIG_64BIT) && defined(CONFIG_FW_ARC32) */ 436384740dcSRalf Baechle 4370e2794b0SRalf Baechle #if (defined(CONFIG_32BIT) && defined(CONFIG_FW_ARC32)) || \ 4380e2794b0SRalf Baechle (defined(CONFIG_64BIT) && defined(CONFIG_FW_ARC64)) 439384740dcSRalf Baechle 440384740dcSRalf Baechle #define ARC_CALL0(dest) \ 441384740dcSRalf Baechle ({ long __res; \ 442384740dcSRalf Baechle long (*__vec)(void) = (void *) romvec->dest; \ 443384740dcSRalf Baechle \ 444384740dcSRalf Baechle __res = __vec(); \ 445384740dcSRalf Baechle __res; \ 446384740dcSRalf Baechle }) 447384740dcSRalf Baechle 448384740dcSRalf Baechle #define ARC_CALL1(dest, a1) \ 449384740dcSRalf Baechle ({ long __res; \ 450384740dcSRalf Baechle long __a1 = (long) (a1); \ 451384740dcSRalf Baechle long (*__vec)(long) = (void *) romvec->dest; \ 452384740dcSRalf Baechle \ 453384740dcSRalf Baechle __res = __vec(__a1); \ 454384740dcSRalf Baechle __res; \ 455384740dcSRalf Baechle }) 456384740dcSRalf Baechle 457384740dcSRalf Baechle #define ARC_CALL2(dest, a1, a2) \ 458384740dcSRalf Baechle ({ long __res; \ 459384740dcSRalf Baechle long __a1 = (long) (a1); \ 460384740dcSRalf Baechle long __a2 = (long) (a2); \ 461384740dcSRalf Baechle long (*__vec)(long, long) = (void *) romvec->dest; \ 462384740dcSRalf Baechle \ 463384740dcSRalf Baechle __res = __vec(__a1, __a2); \ 464384740dcSRalf Baechle __res; \ 465384740dcSRalf Baechle }) 466384740dcSRalf Baechle 467384740dcSRalf Baechle #define ARC_CALL3(dest, a1, a2, a3) \ 468384740dcSRalf Baechle ({ long __res; \ 469384740dcSRalf Baechle long __a1 = (long) (a1); \ 470384740dcSRalf Baechle long __a2 = (long) (a2); \ 471384740dcSRalf Baechle long __a3 = (long) (a3); \ 472384740dcSRalf Baechle long (*__vec)(long, long, long) = (void *) romvec->dest; \ 473384740dcSRalf Baechle \ 474384740dcSRalf Baechle __res = __vec(__a1, __a2, __a3); \ 475384740dcSRalf Baechle __res; \ 476384740dcSRalf Baechle }) 477384740dcSRalf Baechle 478384740dcSRalf Baechle #define ARC_CALL4(dest, a1, a2, a3, a4) \ 479384740dcSRalf Baechle ({ long __res; \ 480384740dcSRalf Baechle long __a1 = (long) (a1); \ 481384740dcSRalf Baechle long __a2 = (long) (a2); \ 482384740dcSRalf Baechle long __a3 = (long) (a3); \ 483384740dcSRalf Baechle long __a4 = (long) (a4); \ 484384740dcSRalf Baechle long (*__vec)(long, long, long, long) = (void *) romvec->dest; \ 485384740dcSRalf Baechle \ 486384740dcSRalf Baechle __res = __vec(__a1, __a2, __a3, __a4); \ 487384740dcSRalf Baechle __res; \ 488384740dcSRalf Baechle }) 489384740dcSRalf Baechle 490384740dcSRalf Baechle #define ARC_CALL5(dest, a1, a2, a3, a4, a5) \ 491384740dcSRalf Baechle ({ long __res; \ 492384740dcSRalf Baechle long __a1 = (long) (a1); \ 493384740dcSRalf Baechle long __a2 = (long) (a2); \ 494384740dcSRalf Baechle long __a3 = (long) (a3); \ 495384740dcSRalf Baechle long __a4 = (long) (a4); \ 496384740dcSRalf Baechle long __a5 = (long) (a5); \ 497384740dcSRalf Baechle long (*__vec)(long, long, long, long, long); \ 498384740dcSRalf Baechle __vec = (void *) romvec->dest; \ 499384740dcSRalf Baechle \ 500384740dcSRalf Baechle __res = __vec(__a1, __a2, __a3, __a4, __a5); \ 501384740dcSRalf Baechle __res; \ 502384740dcSRalf Baechle }) 503384740dcSRalf Baechle #endif /* both kernel and ARC either 32-bit or 64-bit */ 504384740dcSRalf Baechle 505384740dcSRalf Baechle #endif /* _ASM_SGIARCS_H */ 506