home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-sparc64 / oplib.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  11.3 KB  |  357 lines

  1. /* $Id: oplib.h,v 1.14 2001/12/19 00:29:51 davem Exp $
  2.  * oplib.h:  Describes the interface and available routines in the
  3.  *           Linux Prom library.
  4.  *
  5.  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  6.  * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  7.  */
  8.  
  9. #ifndef __SPARC64_OPLIB_H
  10. #define __SPARC64_OPLIB_H
  11.  
  12. #include <asm/openprom.h>
  13.  
  14. /* OBP version string. */
  15. extern char prom_version[];
  16.  
  17. /* Root node of the prom device tree, this stays constant after
  18.  * initialization is complete.
  19.  */
  20. extern int prom_root_node;
  21.  
  22. /* PROM stdin and stdout */
  23. extern int prom_stdin, prom_stdout;
  24.  
  25. /* /chosen node of the prom device tree, this stays constant after
  26.  * initialization is complete.
  27.  */
  28. extern int prom_chosen_node;
  29.  
  30. /* Helper values and strings in arch/sparc64/kernel/head.S */
  31. extern const char prom_peer_name[];
  32. extern const char prom_compatible_name[];
  33. extern const char prom_root_compatible[];
  34. extern const char prom_finddev_name[];
  35. extern const char prom_chosen_path[];
  36. extern const char prom_getprop_name[];
  37. extern const char prom_mmu_name[];
  38. extern const char prom_callmethod_name[];
  39. extern const char prom_translate_name[];
  40. extern const char prom_map_name[];
  41. extern const char prom_unmap_name[];
  42. extern int prom_mmu_ihandle_cache;
  43. extern unsigned int prom_boot_mapped_pc;
  44. extern unsigned int prom_boot_mapping_mode;
  45. extern unsigned long prom_boot_mapping_phys_high, prom_boot_mapping_phys_low;
  46.  
  47. struct linux_mlist_p1275 {
  48.     struct linux_mlist_p1275 *theres_more;
  49.     unsigned long start_adr;
  50.     unsigned long num_bytes;
  51. };
  52.  
  53. struct linux_mem_p1275 {
  54.     struct linux_mlist_p1275 **p1275_totphys;
  55.     struct linux_mlist_p1275 **p1275_prommap;
  56.     struct linux_mlist_p1275 **p1275_available; /* What we can use */
  57. };
  58.  
  59. /* The functions... */
  60.  
  61. /* You must call prom_init() before using any of the library services,
  62.  * preferably as early as possible.  Pass it the romvec pointer.
  63.  */
  64. extern void prom_init(void *cif_handler, void *cif_stack);
  65.  
  66. /* Boot argument acquisition, returns the boot command line string. */
  67. extern char *prom_getbootargs(void);
  68.  
  69. /* Device utilities. */
  70.  
  71. /* Device operations. */
  72.  
  73. /* Open the device described by the passed string.  Note, that the format
  74.  * of the string is different on V0 vs. V2->higher proms.  The caller must
  75.  * know what he/she is doing!  Returns the device descriptor, an int.
  76.  */
  77. extern int prom_devopen(const char *device_string);
  78.  
  79. /* Close a previously opened device described by the passed integer
  80.  * descriptor.
  81.  */
  82. extern int prom_devclose(int device_handle);
  83.  
  84. /* Do a seek operation on the device described by the passed integer
  85.  * descriptor.
  86.  */
  87. extern void prom_seek(int device_handle, unsigned int seek_hival,
  88.               unsigned int seek_lowval);
  89.  
  90. /* Miscellaneous routines, don't really fit in any category per se. */
  91.  
  92. /* Reboot the machine with the command line passed. */
  93. extern void prom_reboot(const char *boot_command);
  94.  
  95. /* Evaluate the forth string passed. */
  96. extern void prom_feval(const char *forth_string);
  97.  
  98. /* Enter the prom, with possibility of continuation with the 'go'
  99.  * command in newer proms.
  100.  */
  101. extern void prom_cmdline(void);
  102.  
  103. /* Enter the prom, with no chance of continuation for the stand-alone
  104.  * which calls this.
  105.  */
  106. extern void prom_halt(void) __attribute__ ((noreturn));
  107.  
  108. /* Halt and power-off the machine. */
  109. extern void prom_halt_power_off(void) __attribute__ ((noreturn));
  110.  
  111. /* Set the PROM 'sync' callback function to the passed function pointer.
  112.  * When the user gives the 'sync' command at the prom prompt while the
  113.  * kernel is still active, the prom will call this routine.
  114.  *
  115.  */
  116. typedef int (*callback_func_t)(long *cmd);
  117. extern void prom_setcallback(callback_func_t func_ptr);
  118.  
  119. /* Acquire the IDPROM of the root node in the prom device tree.  This
  120.  * gets passed a buffer where you would like it stuffed.  The return value
  121.  * is the format type of this idprom or 0xff on error.
  122.  */
  123. extern unsigned char prom_get_idprom(char *idp_buffer, int idpbuf_size);
  124.  
  125. /* Character operations to/from the console.... */
  126.  
  127. /* Non-blocking get character from console. */
  128. extern int prom_nbgetchar(void);
  129.  
  130. /* Non-blocking put character to console. */
  131. extern int prom_nbputchar(char character);
  132.  
  133. /* Blocking get character from console. */
  134. extern char prom_getchar(void);
  135.  
  136. /* Blocking put character to console. */
  137. extern void prom_putchar(char character);
  138.  
  139. /* Prom's internal routines, don't use in kernel/boot code. */
  140. extern void prom_printf(const char *fmt, ...);
  141. extern void prom_write(const char *buf, unsigned int len);
  142.  
  143. /* Query for input device type */
  144.  
  145. enum prom_input_device {
  146.     PROMDEV_IKBD,            /* input from keyboard */
  147.     PROMDEV_ITTYA,            /* input from ttya */
  148.     PROMDEV_ITTYB,            /* input from ttyb */
  149.     PROMDEV_IRSC,            /* input from rsc */
  150.     PROMDEV_IVCONS,            /* input from virtual-console */
  151.     PROMDEV_I_UNK,
  152. };
  153.  
  154. extern enum prom_input_device prom_query_input_device(void);
  155.  
  156. /* Query for output device type */
  157.  
  158. enum prom_output_device {
  159.     PROMDEV_OSCREEN,        /* to screen */
  160.     PROMDEV_OTTYA,            /* to ttya */
  161.     PROMDEV_OTTYB,            /* to ttyb */
  162.     PROMDEV_ORSC,            /* to rsc */
  163.     PROMDEV_OVCONS,            /* to virtual-console */
  164.     PROMDEV_O_UNK,
  165. };
  166.  
  167. extern enum prom_output_device prom_query_output_device(void);
  168.  
  169. /* Multiprocessor operations... */
  170. #ifdef CONFIG_SMP
  171. /* Start the CPU with the given device tree node at the passed program
  172.  * counter with the given arg passed in via register %o0.
  173.  */
  174. extern void prom_startcpu(int cpunode, unsigned long pc, unsigned long arg);
  175.  
  176. /* Start the CPU with the given cpu ID at the passed program
  177.  * counter with the given arg passed in via register %o0.
  178.  */
  179. extern void prom_startcpu_cpuid(int cpuid, unsigned long pc, unsigned long arg);
  180.  
  181. /* Stop the CPU with the given cpu ID.  */
  182. extern void prom_stopcpu_cpuid(int cpuid);
  183.  
  184. /* Stop the current CPU. */
  185. extern void prom_stopself(void);
  186.  
  187. /* Idle the current CPU. */
  188. extern void prom_idleself(void);
  189.  
  190. /* Resume the CPU with the passed device tree node. */
  191. extern void prom_resumecpu(int cpunode);
  192. #endif
  193.  
  194. /* Power management interfaces. */
  195.  
  196. /* Put the current CPU to sleep. */
  197. extern void prom_sleepself(void);
  198.  
  199. /* Put the entire system to sleep. */
  200. extern int prom_sleepsystem(void);
  201.  
  202. /* Initiate a wakeup event. */
  203. extern int prom_wakeupsystem(void);
  204.  
  205. /* MMU and memory related OBP interfaces. */
  206.  
  207. /* Get unique string identifying SIMM at given physical address. */
  208. extern int prom_getunumber(int syndrome_code,
  209.                unsigned long phys_addr,
  210.                char *buf, int buflen);
  211.  
  212. /* Retain physical memory to the caller across soft resets. */
  213. extern unsigned long prom_retain(const char *name,
  214.                  unsigned long pa_low, unsigned long pa_high,
  215.                  long size, long align);
  216.  
  217. /* Load explicit I/D TLB entries into the calling processor. */
  218. extern long prom_itlb_load(unsigned long index,
  219.                unsigned long tte_data,
  220.                unsigned long vaddr);
  221.  
  222. extern long prom_dtlb_load(unsigned long index,
  223.                unsigned long tte_data,
  224.                unsigned long vaddr);
  225.  
  226. /* Map/Unmap client program address ranges.  First the format of
  227.  * the mapping mode argument.
  228.  */
  229. #define PROM_MAP_WRITE    0x0001 /* Writable */
  230. #define PROM_MAP_READ    0x0002 /* Readable - sw */
  231. #define PROM_MAP_EXEC    0x0004 /* Executable - sw */
  232. #define PROM_MAP_LOCKED    0x0010 /* Locked, use i/dtlb load calls for this instead */
  233. #define PROM_MAP_CACHED    0x0020 /* Cacheable in both L1 and L2 caches */
  234. #define PROM_MAP_SE    0x0040 /* Side-Effects */
  235. #define PROM_MAP_GLOB    0x0080 /* Global */
  236. #define PROM_MAP_IE    0x0100 /* Invert-Endianness */
  237. #define PROM_MAP_DEFAULT (PROM_MAP_WRITE | PROM_MAP_READ | PROM_MAP_EXEC | PROM_MAP_CACHED)
  238.  
  239. extern int prom_map(int mode, unsigned long size,
  240.             unsigned long vaddr, unsigned long paddr);
  241. extern void prom_unmap(unsigned long size, unsigned long vaddr);
  242.  
  243.  
  244. /* PROM device tree traversal functions... */
  245.  
  246. #ifdef PROMLIB_INTERNAL
  247.  
  248. /* Internal version of prom_getchild. */
  249. extern int __prom_getchild(int parent_node);
  250.  
  251. /* Internal version of prom_getsibling. */
  252. extern int __prom_getsibling(int node);
  253.  
  254. #endif
  255.  
  256. /* Get the child node of the given node, or zero if no child exists. */
  257. extern int prom_getchild(int parent_node);
  258.  
  259. /* Get the next sibling node of the given node, or zero if no further
  260.  * siblings exist.
  261.  */
  262. extern int prom_getsibling(int node);
  263.  
  264. /* Get the length, at the passed node, of the given property type.
  265.  * Returns -1 on error (ie. no such property at this node).
  266.  */
  267. extern int prom_getproplen(int thisnode, const char *property);
  268.  
  269. /* Fetch the requested property using the given buffer.  Returns
  270.  * the number of bytes the prom put into your buffer or -1 on error.
  271.  */
  272. extern int prom_getproperty(int thisnode, const char *property,
  273.                 char *prop_buffer, int propbuf_size);
  274.  
  275. /* Acquire an integer property. */
  276. extern int prom_getint(int node, const char *property);
  277.  
  278. /* Acquire an integer property, with a default value. */
  279. extern int prom_getintdefault(int node, const char *property, int defval);
  280.  
  281. /* Acquire a boolean property, 0=FALSE 1=TRUE. */
  282. extern int prom_getbool(int node, const char *prop);
  283.  
  284. /* Acquire a string property, null string on error. */
  285. extern void prom_getstring(int node, const char *prop, char *buf, int bufsize);
  286.  
  287. /* Does the passed node have the given "name"? YES=1 NO=0 */
  288. extern int prom_nodematch(int thisnode, const char *name);
  289.  
  290. /* Puts in buffer a prom name in the form name@x,y or name (x for which_io 
  291.  * and y for first regs phys address
  292.  */
  293. extern int prom_getname(int node, char *buf, int buflen);
  294.  
  295. /* Search all siblings starting at the passed node for "name" matching
  296.  * the given string.  Returns the node on success, zero on failure.
  297.  */
  298. extern int prom_searchsiblings(int node_start, const char *name);
  299.  
  300. /* Return the first property type, as a string, for the given node.
  301.  * Returns a null string on error. Buffer should be at least 32B long.
  302.  */
  303. extern char *prom_firstprop(int node, char *buffer);
  304.  
  305. /* Returns the next property after the passed property for the given
  306.  * node.  Returns null string on failure. Buffer should be at least 32B long.
  307.  */
  308. extern char *prom_nextprop(int node, const char *prev_property, char *buffer);
  309.  
  310. /* Returns 1 if the specified node has given property. */
  311. extern int prom_node_has_property(int node, const char *property);
  312.  
  313. /* Returns phandle of the path specified */
  314. extern int prom_finddevice(const char *name);
  315.  
  316. /* Set the indicated property at the given node with the passed value.
  317.  * Returns the number of bytes of your value that the prom took.
  318.  */
  319. extern int prom_setprop(int node, const char *prop_name, char *prop_value,
  320.             int value_size);
  321.             
  322. extern int prom_pathtoinode(const char *path);
  323. extern int prom_inst2pkg(int);
  324.  
  325. /* CPU probing helpers.  */
  326. int cpu_find_by_instance(int instance, int *prom_node, int *mid);
  327. int cpu_find_by_mid(int mid, int *prom_node);
  328.  
  329. /* Client interface level routines. */
  330. extern void prom_set_trap_table(unsigned long tba);
  331. extern void prom_set_trap_table_sun4v(unsigned long tba, unsigned long mmfsa);
  332.  
  333. extern long p1275_cmd(const char *, long, ...);
  334.                    
  335.  
  336. #if 0
  337. #define P1275_SIZE(x) ((((long)((x) / 32)) << 32) | (x))
  338. #else
  339. #define P1275_SIZE(x) x
  340. #endif
  341.  
  342. /* We support at most 16 input and 1 output argument */
  343. #define P1275_ARG_NUMBER        0
  344. #define P1275_ARG_IN_STRING        1
  345. #define P1275_ARG_OUT_BUF        2
  346. #define P1275_ARG_OUT_32B        3
  347. #define P1275_ARG_IN_FUNCTION        4
  348. #define P1275_ARG_IN_BUF        5
  349. #define P1275_ARG_IN_64B        6
  350.  
  351. #define P1275_IN(x) ((x) & 0xf)
  352. #define P1275_OUT(x) (((x) << 4) & 0xf0)
  353. #define P1275_INOUT(i,o) (P1275_IN(i)|P1275_OUT(o))
  354. #define P1275_ARG(n,x) ((x) << ((n)*3 + 8))
  355.  
  356. #endif /* !(__SPARC64_OPLIB_H) */
  357.