home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / powerpc / include / asm / rtas.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  8.1 KB  |  248 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_NOT_SUSPENDABLE    -9004
  28. #define RTAS_BUSY        -2    /* RTAS Busy */
  29. #define RTAS_EXTENDED_DELAY_MIN    9900
  30. #define RTAS_EXTENDED_DELAY_MAX    9905
  31.  
  32. /*
  33.  * In general to call RTAS use rtas_token("string") to lookup
  34.  * an RTAS token for the given string (e.g. "event-scan").
  35.  * To actually perform the call use
  36.  *    ret = rtas_call(token, n_in, n_out, ...)
  37.  * Where n_in is the number of input parameters and
  38.  *       n_out is the number of output parameters
  39.  *
  40.  * If the "string" is invalid on this system, RTAS_UNKNOWN_SERVICE
  41.  * will be returned as a token.  rtas_call() does look for this
  42.  * token and error out gracefully so rtas_call(rtas_token("str"), ...)
  43.  * may be safely used for one-shot calls to RTAS.
  44.  *
  45.  */
  46.  
  47. typedef u32 rtas_arg_t;
  48.  
  49. struct rtas_args {
  50.     u32 token;
  51.     u32 nargs;
  52.     u32 nret; 
  53.     rtas_arg_t args[16];
  54.     rtas_arg_t *rets;     /* Pointer to return values in args[]. */
  55. };  
  56.  
  57. struct rtas_t {
  58.     unsigned long entry;        /* physical address pointer */
  59.     unsigned long base;        /* physical address pointer */
  60.     unsigned long size;
  61.     spinlock_t lock;
  62.     struct rtas_args args;
  63.     struct device_node *dev;    /* virtual address pointer */
  64. };
  65.  
  66. /* RTAS event classes */
  67. #define RTAS_INTERNAL_ERROR        0x80000000 /* set bit 0 */
  68. #define RTAS_EPOW_WARNING        0x40000000 /* set bit 1 */
  69. #define RTAS_POWERMGM_EVENTS        0x20000000 /* set bit 2 */
  70. #define RTAS_HOTPLUG_EVENTS        0x10000000 /* set bit 3 */
  71. #define RTAS_EVENT_SCAN_ALL_EVENTS    0xf0000000
  72.  
  73. /* RTAS event severity */
  74. #define RTAS_SEVERITY_FATAL        0x5
  75. #define RTAS_SEVERITY_ERROR        0x4
  76. #define RTAS_SEVERITY_ERROR_SYNC    0x3
  77. #define RTAS_SEVERITY_WARNING        0x2
  78. #define RTAS_SEVERITY_EVENT        0x1
  79. #define RTAS_SEVERITY_NO_ERROR        0x0
  80.  
  81. /* RTAS event disposition */
  82. #define RTAS_DISP_FULLY_RECOVERED    0x0
  83. #define RTAS_DISP_LIMITED_RECOVERY    0x1
  84. #define RTAS_DISP_NOT_RECOVERED        0x2
  85.  
  86. /* RTAS event initiator */
  87. #define RTAS_INITIATOR_UNKNOWN        0x0
  88. #define RTAS_INITIATOR_CPU        0x1
  89. #define RTAS_INITIATOR_PCI        0x2
  90. #define RTAS_INITIATOR_ISA        0x3
  91. #define RTAS_INITIATOR_MEMORY        0x4
  92. #define RTAS_INITIATOR_POWERMGM        0x5
  93.  
  94. /* RTAS event target */
  95. #define RTAS_TARGET_UNKNOWN        0x0
  96. #define RTAS_TARGET_CPU            0x1
  97. #define RTAS_TARGET_PCI            0x2
  98. #define RTAS_TARGET_ISA            0x3
  99. #define RTAS_TARGET_MEMORY        0x4
  100. #define RTAS_TARGET_POWERMGM        0x5
  101.  
  102. /* RTAS event type */
  103. #define RTAS_TYPE_RETRY            0x01
  104. #define RTAS_TYPE_TCE_ERR        0x02
  105. #define RTAS_TYPE_INTERN_DEV_FAIL    0x03
  106. #define RTAS_TYPE_TIMEOUT        0x04
  107. #define RTAS_TYPE_DATA_PARITY        0x05
  108. #define RTAS_TYPE_ADDR_PARITY        0x06
  109. #define RTAS_TYPE_CACHE_PARITY        0x07
  110. #define RTAS_TYPE_ADDR_INVALID        0x08
  111. #define RTAS_TYPE_ECC_UNCORR        0x09
  112. #define RTAS_TYPE_ECC_CORR        0x0a
  113. #define RTAS_TYPE_EPOW            0x40
  114. #define RTAS_TYPE_PLATFORM        0xE0
  115. #define RTAS_TYPE_IO            0xE1
  116. #define RTAS_TYPE_INFO            0xE2
  117. #define RTAS_TYPE_DEALLOC        0xE3
  118. #define RTAS_TYPE_DUMP            0xE4
  119. /* I don't add PowerMGM events right now, this is a different topic */ 
  120. #define RTAS_TYPE_PMGM_POWER_SW_ON    0x60
  121. #define RTAS_TYPE_PMGM_POWER_SW_OFF    0x61
  122. #define RTAS_TYPE_PMGM_LID_OPEN        0x62
  123. #define RTAS_TYPE_PMGM_LID_CLOSE    0x63
  124. #define RTAS_TYPE_PMGM_SLEEP_BTN    0x64
  125. #define RTAS_TYPE_PMGM_WAKE_BTN        0x65
  126. #define RTAS_TYPE_PMGM_BATTERY_WARN    0x66
  127. #define RTAS_TYPE_PMGM_BATTERY_CRIT    0x67
  128. #define RTAS_TYPE_PMGM_SWITCH_TO_BAT    0x68
  129. #define RTAS_TYPE_PMGM_SWITCH_TO_AC    0x69
  130. #define RTAS_TYPE_PMGM_KBD_OR_MOUSE    0x6a
  131. #define RTAS_TYPE_PMGM_ENCLOS_OPEN    0x6b
  132. #define RTAS_TYPE_PMGM_ENCLOS_CLOSED    0x6c
  133. #define RTAS_TYPE_PMGM_RING_INDICATE    0x6d
  134. #define RTAS_TYPE_PMGM_LAN_ATTENTION    0x6e
  135. #define RTAS_TYPE_PMGM_TIME_ALARM    0x6f
  136. #define RTAS_TYPE_PMGM_CONFIG_CHANGE    0x70
  137. #define RTAS_TYPE_PMGM_SERVICE_PROC    0x71
  138.  
  139. struct rtas_error_log {
  140.     unsigned long version:8;        /* Architectural version */
  141.     unsigned long severity:3;        /* Severity level of error */
  142.     unsigned long disposition:2;        /* Degree of recovery */
  143.     unsigned long extended:1;        /* extended log present? */
  144.     unsigned long /* reserved */ :2;    /* Reserved for future use */
  145.     unsigned long initiator:4;        /* Initiator of event */
  146.     unsigned long target:4;            /* Target of failed operation */
  147.     unsigned long type:8;            /* General event or error*/
  148.     unsigned long extended_log_length:32;    /* length in bytes */
  149.     unsigned char buffer[1];
  150. };
  151.  
  152. /*
  153.  * This can be set by the rtas_flash module so that it can get called
  154.  * as the absolutely last thing before the kernel terminates.
  155.  */
  156. extern void (*rtas_flash_term_hook)(int);
  157.  
  158. extern struct rtas_t rtas;
  159.  
  160. extern void enter_rtas(unsigned long);
  161. extern int rtas_token(const char *service);
  162. extern int rtas_service_present(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 int rtas_set_indicator_fast(int indicator, int index, int new_value);
  173. extern void rtas_progress(char *s, unsigned short hex);
  174. extern void rtas_initialize(void);
  175.  
  176. struct rtc_time;
  177. extern unsigned long rtas_get_boot_time(void);
  178. extern void rtas_get_rtc_time(struct rtc_time *rtc_time);
  179. extern int rtas_set_rtc_time(struct rtc_time *rtc_time);
  180.  
  181. extern unsigned int rtas_busy_delay_time(int status);
  182. extern unsigned int rtas_busy_delay(int status);
  183.  
  184. extern int early_init_dt_scan_rtas(unsigned long node,
  185.         const char *uname, int depth, void *data);
  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. /* RMO buffer reserved for user-space RTAS use */
  226. extern unsigned long rtas_rmo_buf;
  227.  
  228. #define GLOBAL_INTERRUPT_QUEUE 9005
  229.  
  230. /**
  231.  * rtas_config_addr - Format a busno, devfn and reg for RTAS.
  232.  * @busno: The bus number.
  233.  * @devfn: The device and function number as encoded by PCI_DEVFN().
  234.  * @reg: The register number.
  235.  *
  236.  * This function encodes the given busno, devfn and register number as
  237.  * required for RTAS calls that take a "config_addr" parameter.
  238.  * See PAPR requirement 7.3.4-1 for more info.
  239.  */
  240. static inline u32 rtas_config_addr(int busno, int devfn, int reg)
  241. {
  242.     return ((reg & 0xf00) << 20) | ((busno & 0xff) << 16) |
  243.             (devfn << 8) | (reg & 0xff);
  244. }
  245.  
  246. #endif /* __KERNEL__ */
  247. #endif /* _POWERPC_RTAS_H */
  248.