Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
powerpc
include
asm
rtas.h
Go to the documentation of this file.
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 (1ULL<<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
arch_spinlock_t
lock
;
62
struct
rtas_args
args
;
63
struct
device_node
*
dev
;
/* virtual address pointer */
64
};
65
66
struct
rtas_suspend_me_data {
67
atomic_t
working;
/* number of cpus accessing this struct */
68
atomic_t
done
;
69
int
token
;
/* ibm,suspend-me */
70
atomic_t
error
;
71
struct
completion
*
complete
;
/* wait on this until working == 0 */
72
};
73
74
/* RTAS event classes */
75
#define RTAS_INTERNAL_ERROR 0x80000000
/* set bit 0 */
76
#define RTAS_EPOW_WARNING 0x40000000
/* set bit 1 */
77
#define RTAS_HOTPLUG_EVENTS 0x10000000
/* set bit 3 */
78
#define RTAS_IO_EVENTS 0x08000000
/* set bit 4 */
79
#define RTAS_EVENT_SCAN_ALL_EVENTS 0xffffffff
80
81
/* RTAS event severity */
82
#define RTAS_SEVERITY_FATAL 0x5
83
#define RTAS_SEVERITY_ERROR 0x4
84
#define RTAS_SEVERITY_ERROR_SYNC 0x3
85
#define RTAS_SEVERITY_WARNING 0x2
86
#define RTAS_SEVERITY_EVENT 0x1
87
#define RTAS_SEVERITY_NO_ERROR 0x0
88
89
/* RTAS event disposition */
90
#define RTAS_DISP_FULLY_RECOVERED 0x0
91
#define RTAS_DISP_LIMITED_RECOVERY 0x1
92
#define RTAS_DISP_NOT_RECOVERED 0x2
93
94
/* RTAS event initiator */
95
#define RTAS_INITIATOR_UNKNOWN 0x0
96
#define RTAS_INITIATOR_CPU 0x1
97
#define RTAS_INITIATOR_PCI 0x2
98
#define RTAS_INITIATOR_ISA 0x3
99
#define RTAS_INITIATOR_MEMORY 0x4
100
#define RTAS_INITIATOR_POWERMGM 0x5
101
102
/* RTAS event target */
103
#define RTAS_TARGET_UNKNOWN 0x0
104
#define RTAS_TARGET_CPU 0x1
105
#define RTAS_TARGET_PCI 0x2
106
#define RTAS_TARGET_ISA 0x3
107
#define RTAS_TARGET_MEMORY 0x4
108
#define RTAS_TARGET_POWERMGM 0x5
109
110
/* RTAS event type */
111
#define RTAS_TYPE_RETRY 0x01
112
#define RTAS_TYPE_TCE_ERR 0x02
113
#define RTAS_TYPE_INTERN_DEV_FAIL 0x03
114
#define RTAS_TYPE_TIMEOUT 0x04
115
#define RTAS_TYPE_DATA_PARITY 0x05
116
#define RTAS_TYPE_ADDR_PARITY 0x06
117
#define RTAS_TYPE_CACHE_PARITY 0x07
118
#define RTAS_TYPE_ADDR_INVALID 0x08
119
#define RTAS_TYPE_ECC_UNCORR 0x09
120
#define RTAS_TYPE_ECC_CORR 0x0a
121
#define RTAS_TYPE_EPOW 0x40
122
#define RTAS_TYPE_PLATFORM 0xE0
123
#define RTAS_TYPE_IO 0xE1
124
#define RTAS_TYPE_INFO 0xE2
125
#define RTAS_TYPE_DEALLOC 0xE3
126
#define RTAS_TYPE_DUMP 0xE4
127
/* I don't add PowerMGM events right now, this is a different topic */
128
#define RTAS_TYPE_PMGM_POWER_SW_ON 0x60
129
#define RTAS_TYPE_PMGM_POWER_SW_OFF 0x61
130
#define RTAS_TYPE_PMGM_LID_OPEN 0x62
131
#define RTAS_TYPE_PMGM_LID_CLOSE 0x63
132
#define RTAS_TYPE_PMGM_SLEEP_BTN 0x64
133
#define RTAS_TYPE_PMGM_WAKE_BTN 0x65
134
#define RTAS_TYPE_PMGM_BATTERY_WARN 0x66
135
#define RTAS_TYPE_PMGM_BATTERY_CRIT 0x67
136
#define RTAS_TYPE_PMGM_SWITCH_TO_BAT 0x68
137
#define RTAS_TYPE_PMGM_SWITCH_TO_AC 0x69
138
#define RTAS_TYPE_PMGM_KBD_OR_MOUSE 0x6a
139
#define RTAS_TYPE_PMGM_ENCLOS_OPEN 0x6b
140
#define RTAS_TYPE_PMGM_ENCLOS_CLOSED 0x6c
141
#define RTAS_TYPE_PMGM_RING_INDICATE 0x6d
142
#define RTAS_TYPE_PMGM_LAN_ATTENTION 0x6e
143
#define RTAS_TYPE_PMGM_TIME_ALARM 0x6f
144
#define RTAS_TYPE_PMGM_CONFIG_CHANGE 0x70
145
#define RTAS_TYPE_PMGM_SERVICE_PROC 0x71
146
147
/* RTAS check-exception vector offset */
148
#define RTAS_VECTOR_EXTERNAL_INTERRUPT 0x500
149
150
struct
rtas_error_log {
151
unsigned
long
version
:8;
/* Architectural version */
152
unsigned
long
severity:3;
/* Severity level of error */
153
unsigned
long
disposition:2;
/* Degree of recovery */
154
unsigned
long
extended:1;
/* extended log present? */
155
unsigned
long
/* reserved */
:2;
/* Reserved for future use */
156
unsigned
long
initiator
:4;
/* Initiator of event */
157
unsigned
long
target
:4;
/* Target of failed operation */
158
unsigned
long
type
:8;
/* General event or error*/
159
unsigned
long
extended_log_length:32;
/* length in bytes */
160
unsigned
char
buffer
[1];
/* Start of extended log */
161
/* Variable length. */
162
};
163
164
#define RTAS_V6EXT_LOG_FORMAT_EVENT_LOG 14
165
166
#define RTAS_V6EXT_COMPANY_ID_IBM (('I' << 24) | ('B' << 16) | ('M' << 8))
167
168
/* RTAS general extended event log, Version 6. The extended log starts
169
* from "buffer" field of struct rtas_error_log defined above.
170
*/
171
struct
rtas_ext_event_log_v6 {
172
/* Byte 0 */
173
uint32_t
log_valid:1;
/* 1:Log valid */
174
uint32_t
unrecoverable_error:1;
/* 1:Unrecoverable error */
175
uint32_t
recoverable_error:1;
/* 1:recoverable (correctable */
176
/* or successfully retried) */
177
uint32_t
degraded_operation:1;
/* 1:Unrecoverable err, bypassed*/
178
/* - degraded operation (e.g. */
179
/* CPU or mem taken off-line) */
180
uint32_t
predictive_error:1;
181
uint32_t
new_log:1;
/* 1:"New" log (Always 1 for */
182
/* data returned from RTAS */
183
uint32_t
big_endian:1;
/* 1: Big endian */
184
uint32_t
:1;
/* reserved */
185
/* Byte 1 */
186
uint32_t
:8;
/* reserved */
187
/* Byte 2 */
188
uint32_t
powerpc_format:1;
/* Set to 1 (indicating log is */
189
/* in PowerPC format */
190
uint32_t
:3;
/* reserved */
191
uint32_t
log_format:4;
/* Log format indicator. Define */
192
/* format used for byte 12-2047 */
193
/* Byte 3 */
194
uint32_t
:8;
/* reserved */
195
/* Byte 4-11 */
196
uint8_t
reserved
[8];
/* reserved */
197
/* Byte 12-15 */
198
uint32_t
company_id;
/* Company ID of the company */
199
/* that defines the format for */
200
/* the vendor specific log type */
201
/* Byte 16-end of log */
202
uint8_t
vendor_log[1];
/* Start of vendor specific log */
203
/* Variable length. */
204
};
205
206
/* pSeries event log format */
207
208
/* Two bytes ASCII section IDs */
209
#define PSERIES_ELOG_SECT_ID_PRIV_HDR (('P' << 8) | 'H')
210
#define PSERIES_ELOG_SECT_ID_USER_HDR (('U' << 8) | 'H')
211
#define PSERIES_ELOG_SECT_ID_PRIMARY_SRC (('P' << 8) | 'S')
212
#define PSERIES_ELOG_SECT_ID_EXTENDED_UH (('E' << 8) | 'H')
213
#define PSERIES_ELOG_SECT_ID_FAILING_MTMS (('M' << 8) | 'T')
214
#define PSERIES_ELOG_SECT_ID_SECONDARY_SRC (('S' << 8) | 'S')
215
#define PSERIES_ELOG_SECT_ID_DUMP_LOCATOR (('D' << 8) | 'H')
216
#define PSERIES_ELOG_SECT_ID_FW_ERROR (('S' << 8) | 'W')
217
#define PSERIES_ELOG_SECT_ID_IMPACT_PART_ID (('L' << 8) | 'P')
218
#define PSERIES_ELOG_SECT_ID_LOGIC_RESOURCE_ID (('L' << 8) | 'R')
219
#define PSERIES_ELOG_SECT_ID_HMC_ID (('H' << 8) | 'M')
220
#define PSERIES_ELOG_SECT_ID_EPOW (('E' << 8) | 'P')
221
#define PSERIES_ELOG_SECT_ID_IO_EVENT (('I' << 8) | 'E')
222
#define PSERIES_ELOG_SECT_ID_MANUFACT_INFO (('M' << 8) | 'I')
223
#define PSERIES_ELOG_SECT_ID_CALL_HOME (('C' << 8) | 'H')
224
#define PSERIES_ELOG_SECT_ID_USER_DEF (('U' << 8) | 'D')
225
226
/* Vendor specific Platform Event Log Format, Version 6, section header */
227
struct
pseries_errorlog {
228
uint16_t
id
;
/* 0x00 2-byte ASCII section ID */
229
uint16_t
length
;
/* 0x02 Section length in bytes */
230
uint8_t
version
;
/* 0x04 Section version */
231
uint8_t
subtype
;
/* 0x05 Section subtype */
232
uint16_t
creator_component;
/* 0x06 Creator component ID */
233
uint8_t
data
[];
/* 0x08 Start of section data */
234
};
235
236
struct
pseries_errorlog *
get_pseries_errorlog
(
struct
rtas_error_log *
log
,
237
uint16_t
section_id);
238
239
/*
240
* This can be set by the rtas_flash module so that it can get called
241
* as the absolutely last thing before the kernel terminates.
242
*/
243
extern
void
(*
rtas_flash_term_hook
)(
int
);
244
245
extern
struct
rtas_t
rtas
;
246
247
extern
void
enter_rtas(
unsigned
long
);
248
extern
int
rtas_token
(
const
char
*
service
);
249
extern
int
rtas_service_present
(
const
char
*
service
);
250
extern
int
rtas_call
(
int
token
,
int
,
int
,
int
*, ...);
251
extern
void
rtas_restart
(
char
*
cmd
);
252
extern
void
rtas_power_off
(
void
);
253
extern
void
rtas_halt
(
void
);
254
extern
void
rtas_os_term
(
char
*
str
);
255
extern
int
rtas_get_sensor
(
int
sensor,
int
index
,
int
*
state
);
256
extern
int
rtas_get_power_level
(
int
powerdomain
,
int
*
level
);
257
extern
int
rtas_set_power_level
(
int
powerdomain
,
int
level
,
int
*setlevel);
258
extern
bool
rtas_indicator_present
(
int
token
,
int
*maxindex);
259
extern
int
rtas_set_indicator
(
int
indicator
,
int
index
,
int
new_value);
260
extern
int
rtas_set_indicator_fast
(
int
indicator
,
int
index
,
int
new_value);
261
extern
void
rtas_progress
(
char
*
s
,
unsigned
short
hex);
262
extern
void
rtas_initialize
(
void
);
263
extern
int
rtas_suspend_cpu(
struct
rtas_suspend_me_data *
data
);
264
extern
int
rtas_suspend_last_cpu(
struct
rtas_suspend_me_data *
data
);
265
extern
int
rtas_ibm_suspend_me
(
struct
rtas_args *);
266
267
struct
rtc_time
;
268
extern
unsigned
long
rtas_get_boot_time
(
void
);
269
extern
void
rtas_get_rtc_time
(
struct
rtc_time
*
rtc_time
);
270
extern
int
rtas_set_rtc_time
(
struct
rtc_time
*
rtc_time
);
271
272
extern
unsigned
int
rtas_busy_delay_time
(
int
status
);
273
extern
unsigned
int
rtas_busy_delay
(
int
status
);
274
275
extern
int
early_init_dt_scan_rtas
(
unsigned
long
node
,
276
const
char
*uname,
int
depth
,
void
*
data
);
277
278
extern
void
pSeries_log_error
(
char
*
buf
,
unsigned
int
err_type,
int
fatal
);
279
280
#ifdef CONFIG_PPC_RTAS_DAEMON
281
extern
void
rtas_cancel_event_scan
(
void
);
282
#else
283
static
inline
void
rtas_cancel_event_scan
(
void
) { }
284
#endif
285
286
/* Error types logged. */
287
#define ERR_FLAG_ALREADY_LOGGED 0x0
288
#define ERR_FLAG_BOOT 0x1
/* log was pulled from NVRAM on boot */
289
#define ERR_TYPE_RTAS_LOG 0x2
/* from rtas event-scan */
290
#define ERR_TYPE_KERNEL_PANIC 0x4
/* from die()/panic() */
291
#define ERR_TYPE_KERNEL_PANIC_GZ 0x8
/* ditto, compressed */
292
293
/* All the types and not flags */
294
#define ERR_TYPE_MASK \
295
(ERR_TYPE_RTAS_LOG | ERR_TYPE_KERNEL_PANIC | ERR_TYPE_KERNEL_PANIC_GZ)
296
297
#define RTAS_DEBUG KERN_DEBUG "RTAS: "
298
299
#define RTAS_ERROR_LOG_MAX 2048
300
301
/*
302
* Return the firmware-specified size of the error log buffer
303
* for all rtas calls that require an error buffer argument.
304
* This includes 'check-exception' and 'rtas-last-error'.
305
*/
306
extern
int
rtas_get_error_log_max(
void
);
307
308
/* Event Scan Parameters */
309
#define EVENT_SCAN_ALL_EVENTS 0xf0000000
310
#define SURVEILLANCE_TOKEN 9000
311
#define LOG_NUMBER 64
/* must be a power of two */
312
#define LOG_NUMBER_MASK (LOG_NUMBER-1)
313
314
/* Some RTAS ops require a data buffer and that buffer must be < 4G.
315
* Rather than having a memory allocator, just use this buffer
316
* (get the lock first), make the RTAS call. Copy the data instead
317
* of holding the buffer for long.
318
*/
319
320
#define RTAS_DATA_BUF_SIZE 4096
321
extern
spinlock_t
rtas_data_buf_lock;
322
extern
char
rtas_data_buf[RTAS_DATA_BUF_SIZE];
323
324
/* RMO buffer reserved for user-space RTAS use */
325
extern
unsigned
long
rtas_rmo_buf
;
326
327
#define GLOBAL_INTERRUPT_QUEUE 9005
328
339
static
inline
u32
rtas_config_addr(
int
busno,
int
devfn
,
int
reg
)
340
{
341
return
((reg & 0xf00) << 20) | ((busno & 0xff) << 16) |
342
(devfn << 8) | (reg & 0xff);
343
}
344
345
extern
void
__cpuinit
rtas_give_timebase
(
void
);
346
extern
void
__cpuinit
rtas_take_timebase
(
void
);
347
348
#ifdef CONFIG_PPC_RTAS
349
static
inline
int
page_is_rtas_user_buf(
unsigned
long
pfn)
350
{
351
unsigned
long
paddr
= (pfn <<
PAGE_SHIFT
);
352
if
(paddr >=
rtas_rmo_buf
&& paddr < (
rtas_rmo_buf
+ RTAS_RMOBUF_MAX))
353
return
1;
354
return
0;
355
}
356
#else
357
static
inline
int
page_is_rtas_user_buf(
unsigned
long
pfn) {
return
0;}
358
#endif
359
360
extern
int
call_rtas(
const
char
*,
int
,
int
,
unsigned
long
*, ...);
361
362
#endif
/* __KERNEL__ */
363
#endif
/* _POWERPC_RTAS_H */
Generated on Thu Jan 10 2013 13:13:28 for Linux Kernel by
1.8.2