sgiarcs.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:16k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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