sgiarcs.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:16k
源码类别:

嵌入式Linux

开发平台:

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