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-powerpc / rtas.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  7.5 KB  |  234 lines

  1. #ifndef _POWERPC_RTAS_H
  2. #define _POWERPC_RTAS_H
  3. #ifdef __KERNEL__
  4.  
  5. #include <linux/spinlock.h>
  6. #include <asm/page.h>
  7.  
  8. /*
  9.  * Definitions for talking to the RTAS on CHRP machines.
  10.  *
  11.  * Copyright (C) 2001 Peter Bergner
  12.  * Copyright (C) 2001 PPC 64 Team, IBM Corp
  13.  *
  14.  * This program is free software; you can redistribute it and/or
  15.  * modify it under the terms of the GNU General Public License
  16.  * as published by the Free Software Foundation; either version
  17.  * 2 of the License, or (at your option) any later version.
  18.  */
  19.  
  20. #define RTAS_UNKNOWN_SERVICE (-1)
  21. #define RTAS_INSTANTIATE_MAX (1UL<<30) /* Don't instantiate rtas at/above this value */
  22.  
  23. /* Buffer size for ppc_rtas system call. */
  24. #define RTAS_RMOBUF_MAX (64 * 1024)
  25.  
  26. /* RTAS return status codes */
  27. #define RTAS_BUSY        -2    /* RTAS Busy */
  28. #define RTAS_EXTENDED_DELAY_MIN    9900
  29. #define RTAS_EXTENDED_DELAY_MAX    9905
  30.  
  31. /*
  32.  * In general to call RTAS use rtas_token("string") to lookup
  33.  * an RTAS token for the given string (e.g. "event-scan").
  34.  * To actually perform the call use
  35.  *    ret = rtas_call(token, n_in, n_out, ...)
  36.  * Where n_in is the number of input parameters and
  37.  *       n_out is the number of output parameters
  38.  *
  39.  * If the "string" is invalid on this system, RTAS_UNKNOWN_SERVICE
  40.  * will be returned as a token.  rtas_call() does look for this
  41.  * token and error out gracefully so rtas_call(rtas_token("str"), ...)
  42.  * may be safely used for one-shot calls to RTAS.
  43.  *
  44.  */
  45.  
  46. typedef u32 rtas_arg_t;
  47.  
  48. struct rtas_args {
  49.     u32 token;
  50.     u32 nargs;
  51.     u32 nret; 
  52.     rtas_arg_t args[16];
  53.     rtas_arg_t *rets;     /* Pointer to return values in args[]. */
  54. };  
  55.  
  56. extern struct rtas_args rtas_stop_self_args;
  57.  
  58. struct rtas_t {
  59.     unsigned long entry;        /* physical address pointer */
  60.     unsigned long base;        /* physical address pointer */
  61.     unsigned long size;
  62.     spinlock_t lock;
  63.     struct rtas_args args;
  64.     struct device_node *dev;    /* virtual address pointer */
  65. };
  66.  
  67. /* RTAS event classes */
  68. #define RTAS_INTERNAL_ERROR        0x80000000 /* set bit 0 */
  69. #define RTAS_EPOW_WARNING        0x40000000 /* set bit 1 */
  70. #define RTAS_POWERMGM_EVENTS        0x20000000 /* set bit 2 */
  71. #define RTAS_HOTPLUG_EVENTS        0x10000000 /* set bit 3 */
  72. #define RTAS_EVENT_SCAN_ALL_EVENTS    0xf0000000
  73.  
  74. /* RTAS event severity */
  75. #define RTAS_SEVERITY_FATAL        0x5
  76. #define RTAS_SEVERITY_ERROR        0x4
  77. #define RTAS_SEVERITY_ERROR_SYNC    0x3
  78. #define RTAS_SEVERITY_WARNING        0x2
  79. #define RTAS_SEVERITY_EVENT        0x1
  80. #define RTAS_SEVERITY_NO_ERROR        0x0
  81.  
  82. /* RTAS event disposition */
  83. #define RTAS_DISP_FULLY_RECOVERED    0x0
  84. #define RTAS_DISP_LIMITED_RECOVERY    0x1
  85. #define RTAS_DISP_NOT_RECOVERED        0x2
  86.  
  87. /* RTAS event initiator */
  88. #define RTAS_INITIATOR_UNKNOWN        0x0
  89. #define RTAS_INITIATOR_CPU        0x1
  90. #define RTAS_INITIATOR_PCI        0x2
  91. #define RTAS_INITIATOR_ISA        0x3
  92. #define RTAS_INITIATOR_MEMORY        0x4
  93. #define RTAS_INITIATOR_POWERMGM        0x5
  94.  
  95. /* RTAS event target */
  96. #define RTAS_TARGET_UNKNOWN        0x0
  97. #define RTAS_TARGET_CPU            0x1
  98. #define RTAS_TARGET_PCI            0x2
  99. #define RTAS_TARGET_ISA            0x3
  100. #define RTAS_TARGET_MEMORY        0x4
  101. #define RTAS_TARGET_POWERMGM        0x5
  102.  
  103. /* RTAS event type */
  104. #define RTAS_TYPE_RETRY            0x01
  105. #define RTAS_TYPE_TCE_ERR        0x02
  106. #define RTAS_TYPE_INTERN_DEV_FAIL    0x03
  107. #define RTAS_TYPE_TIMEOUT        0x04
  108. #define RTAS_TYPE_DATA_PARITY        0x05
  109. #define RTAS_TYPE_ADDR_PARITY        0x06
  110. #define RTAS_TYPE_CACHE_PARITY        0x07
  111. #define RTAS_TYPE_ADDR_INVALID        0x08
  112. #define RTAS_TYPE_ECC_UNCORR        0x09
  113. #define RTAS_TYPE_ECC_CORR        0x0a
  114. #define RTAS_TYPE_EPOW            0x40
  115. #define RTAS_TYPE_PLATFORM        0xE0
  116. #define RTAS_TYPE_IO            0xE1
  117. #define RTAS_TYPE_INFO            0xE2
  118. #define RTAS_TYPE_DEALLOC        0xE3
  119. #define RTAS_TYPE_DUMP            0xE4
  120. /* I don't add PowerMGM events right now, this is a different topic */ 
  121. #define RTAS_TYPE_PMGM_POWER_SW_ON    0x60
  122. #define RTAS_TYPE_PMGM_POWER_SW_OFF    0x61
  123. #define RTAS_TYPE_PMGM_LID_OPEN        0x62
  124. #define RTAS_TYPE_PMGM_LID_CLOSE    0x63
  125. #define RTAS_TYPE_PMGM_SLEEP_BTN    0x64
  126. #define RTAS_TYPE_PMGM_WAKE_BTN        0x65
  127. #define RTAS_TYPE_PMGM_BATTERY_WARN    0x66
  128. #define RTAS_TYPE_PMGM_BATTERY_CRIT    0x67
  129. #define RTAS_TYPE_PMGM_SWITCH_TO_BAT    0x68
  130. #define RTAS_TYPE_PMGM_SWITCH_TO_AC    0x69
  131. #define RTAS_TYPE_PMGM_KBD_OR_MOUSE    0x6a
  132. #define RTAS_TYPE_PMGM_ENCLOS_OPEN    0x6b
  133. #define RTAS_TYPE_PMGM_ENCLOS_CLOSED    0x6c
  134. #define RTAS_TYPE_PMGM_RING_INDICATE    0x6d
  135. #define RTAS_TYPE_PMGM_LAN_ATTENTION    0x6e
  136. #define RTAS_TYPE_PMGM_TIME_ALARM    0x6f
  137. #define RTAS_TYPE_PMGM_CONFIG_CHANGE    0x70
  138. #define RTAS_TYPE_PMGM_SERVICE_PROC    0x71
  139.  
  140. struct rtas_error_log {
  141.     unsigned long version:8;        /* Architectural version */
  142.     unsigned long severity:3;        /* Severity level of error */
  143.     unsigned long disposition:2;        /* Degree of recovery */
  144.     unsigned long extended:1;        /* extended log present? */
  145.     unsigned long /* reserved */ :2;    /* Reserved for future use */
  146.     unsigned long initiator:4;        /* Initiator of event */
  147.     unsigned long target:4;            /* Target of failed operation */
  148.     unsigned long type:8;            /* General event or error*/
  149.     unsigned long extended_log_length:32;    /* length in bytes */
  150.     unsigned char buffer[1];
  151. };
  152.  
  153. /*
  154.  * This can be set by the rtas_flash module so that it can get called
  155.  * as the absolutely last thing before the kernel terminates.
  156.  */
  157. extern void (*rtas_flash_term_hook)(int);
  158.  
  159. extern struct rtas_t rtas;
  160.  
  161. extern void enter_rtas(unsigned long);
  162. extern int rtas_token(const char *service);
  163. extern int rtas_call(int token, int, int, int *, ...);
  164. extern void rtas_restart(char *cmd);
  165. extern void rtas_power_off(void);
  166. extern void rtas_halt(void);
  167. extern void rtas_os_term(char *str);
  168. extern int rtas_get_sensor(int sensor, int index, int *state);
  169. extern int rtas_get_power_level(int powerdomain, int *level);
  170. extern int rtas_set_power_level(int powerdomain, int level, int *setlevel);
  171. extern int rtas_set_indicator(int indicator, int index, int new_value);
  172. extern void rtas_progress(char *s, unsigned short hex);
  173. extern void rtas_initialize(void);
  174.  
  175. struct rtc_time;
  176. extern unsigned long rtas_get_boot_time(void);
  177. extern void rtas_get_rtc_time(struct rtc_time *rtc_time);
  178. extern int rtas_set_rtc_time(struct rtc_time *rtc_time);
  179.  
  180. /* Given an RTAS status code of 9900..9905 compute the hinted delay */
  181. unsigned int rtas_extended_busy_delay_time(int status);
  182. static inline int rtas_is_extended_busy(int status)
  183. {
  184.     return status >= 9900 && status <= 9909;
  185. }
  186.  
  187. extern void pSeries_log_error(char *buf, unsigned int err_type, int fatal);
  188.  
  189. /* Error types logged.  */
  190. #define ERR_FLAG_ALREADY_LOGGED    0x0
  191. #define ERR_FLAG_BOOT        0x1     /* log was pulled from NVRAM on boot */
  192. #define ERR_TYPE_RTAS_LOG    0x2    /* from rtas event-scan */
  193. #define ERR_TYPE_KERNEL_PANIC    0x4    /* from panic() */
  194.  
  195. /* All the types and not flags */
  196. #define ERR_TYPE_MASK    (ERR_TYPE_RTAS_LOG | ERR_TYPE_KERNEL_PANIC)
  197.  
  198. #define RTAS_DEBUG KERN_DEBUG "RTAS: "
  199.  
  200. #define RTAS_ERROR_LOG_MAX 2048
  201.  
  202. /*
  203.  * Return the firmware-specified size of the error log buffer
  204.  *  for all rtas calls that require an error buffer argument.
  205.  *  This includes 'check-exception' and 'rtas-last-error'.
  206.  */
  207. extern int rtas_get_error_log_max(void);
  208.  
  209. /* Event Scan Parameters */
  210. #define EVENT_SCAN_ALL_EVENTS    0xf0000000
  211. #define SURVEILLANCE_TOKEN    9000
  212. #define LOG_NUMBER        64        /* must be a power of two */
  213. #define LOG_NUMBER_MASK        (LOG_NUMBER-1)
  214.  
  215. /* Some RTAS ops require a data buffer and that buffer must be < 4G.
  216.  * Rather than having a memory allocator, just use this buffer
  217.  * (get the lock first), make the RTAS call.  Copy the data instead
  218.  * of holding the buffer for long.
  219.  */
  220.  
  221. #define RTAS_DATA_BUF_SIZE 4096
  222. extern spinlock_t rtas_data_buf_lock;
  223. extern char rtas_data_buf[RTAS_DATA_BUF_SIZE];
  224.  
  225. extern void rtas_stop_self(void);
  226.  
  227. /* RMO buffer reserved for user-space RTAS use */
  228. extern unsigned long rtas_rmo_buf;
  229.  
  230. #define GLOBAL_INTERRUPT_QUEUE 9005
  231.  
  232. #endif /* __KERNEL__ */
  233. #endif /* _POWERPC_RTAS_H */
  234.