diff options
Diffstat (limited to 'arch/powerpc/include/asm/rtas.h')
-rw-r--r-- | arch/powerpc/include/asm/rtas.h | 127 |
1 files changed, 94 insertions, 33 deletions
diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rtas.h index a0e1add01ef5..b390f55b0df1 100644 --- a/arch/powerpc/include/asm/rtas.h +++ b/arch/powerpc/include/asm/rtas.h | |||
@@ -150,19 +150,53 @@ struct rtas_suspend_me_data { | |||
150 | #define RTAS_VECTOR_EXTERNAL_INTERRUPT 0x500 | 150 | #define RTAS_VECTOR_EXTERNAL_INTERRUPT 0x500 |
151 | 151 | ||
152 | struct rtas_error_log { | 152 | struct rtas_error_log { |
153 | unsigned long version:8; /* Architectural version */ | 153 | /* Byte 0 */ |
154 | unsigned long severity:3; /* Severity level of error */ | 154 | uint8_t byte0; /* Architectural version */ |
155 | unsigned long disposition:2; /* Degree of recovery */ | 155 | |
156 | unsigned long extended:1; /* extended log present? */ | 156 | /* Byte 1 */ |
157 | unsigned long /* reserved */ :2; /* Reserved for future use */ | 157 | uint8_t byte1; |
158 | unsigned long initiator:4; /* Initiator of event */ | 158 | /* XXXXXXXX |
159 | unsigned long target:4; /* Target of failed operation */ | 159 | * XXX 3: Severity level of error |
160 | unsigned long type:8; /* General event or error*/ | 160 | * XX 2: Degree of recovery |
161 | unsigned long extended_log_length:32; /* length in bytes */ | 161 | * X 1: Extended log present? |
162 | unsigned char buffer[1]; /* Start of extended log */ | 162 | * XX 2: Reserved |
163 | */ | ||
164 | |||
165 | /* Byte 2 */ | ||
166 | uint8_t byte2; | ||
167 | /* XXXXXXXX | ||
168 | * XXXX 4: Initiator of event | ||
169 | * XXXX 4: Target of failed operation | ||
170 | */ | ||
171 | uint8_t byte3; /* General event or error*/ | ||
172 | __be32 extended_log_length; /* length in bytes */ | ||
173 | unsigned char buffer[1]; /* Start of extended log */ | ||
163 | /* Variable length. */ | 174 | /* Variable length. */ |
164 | }; | 175 | }; |
165 | 176 | ||
177 | static inline uint8_t rtas_error_severity(const struct rtas_error_log *elog) | ||
178 | { | ||
179 | return (elog->byte1 & 0xE0) >> 5; | ||
180 | } | ||
181 | |||
182 | static inline uint8_t rtas_error_disposition(const struct rtas_error_log *elog) | ||
183 | { | ||
184 | return (elog->byte1 & 0x18) >> 3; | ||
185 | } | ||
186 | |||
187 | static inline uint8_t rtas_error_extended(const struct rtas_error_log *elog) | ||
188 | { | ||
189 | return (elog->byte1 & 0x04) >> 2; | ||
190 | } | ||
191 | |||
192 | #define rtas_error_type(x) ((x)->byte3) | ||
193 | |||
194 | static inline | ||
195 | uint32_t rtas_error_extended_log_length(const struct rtas_error_log *elog) | ||
196 | { | ||
197 | return be32_to_cpu(elog->extended_log_length); | ||
198 | } | ||
199 | |||
166 | #define RTAS_V6EXT_LOG_FORMAT_EVENT_LOG 14 | 200 | #define RTAS_V6EXT_LOG_FORMAT_EVENT_LOG 14 |
167 | 201 | ||
168 | #define RTAS_V6EXT_COMPANY_ID_IBM (('I' << 24) | ('B' << 16) | ('M' << 8)) | 202 | #define RTAS_V6EXT_COMPANY_ID_IBM (('I' << 24) | ('B' << 16) | ('M' << 8)) |
@@ -172,32 +206,35 @@ struct rtas_error_log { | |||
172 | */ | 206 | */ |
173 | struct rtas_ext_event_log_v6 { | 207 | struct rtas_ext_event_log_v6 { |
174 | /* Byte 0 */ | 208 | /* Byte 0 */ |
175 | uint32_t log_valid:1; /* 1:Log valid */ | 209 | uint8_t byte0; |
176 | uint32_t unrecoverable_error:1; /* 1:Unrecoverable error */ | 210 | /* XXXXXXXX |
177 | uint32_t recoverable_error:1; /* 1:recoverable (correctable */ | 211 | * X 1: Log valid |
178 | /* or successfully retried) */ | 212 | * X 1: Unrecoverable error |
179 | uint32_t degraded_operation:1; /* 1:Unrecoverable err, bypassed*/ | 213 | * X 1: Recoverable (correctable or successfully retried) |
180 | /* - degraded operation (e.g. */ | 214 | * X 1: Bypassed unrecoverable error (degraded operation) |
181 | /* CPU or mem taken off-line) */ | 215 | * X 1: Predictive error |
182 | uint32_t predictive_error:1; | 216 | * X 1: "New" log (always 1 for data returned from RTAS) |
183 | uint32_t new_log:1; /* 1:"New" log (Always 1 for */ | 217 | * X 1: Big Endian |
184 | /* data returned from RTAS */ | 218 | * X 1: Reserved |
185 | uint32_t big_endian:1; /* 1: Big endian */ | 219 | */ |
186 | uint32_t :1; /* reserved */ | 220 | |
187 | /* Byte 1 */ | 221 | /* Byte 1 */ |
188 | uint32_t :8; /* reserved */ | 222 | uint8_t byte1; /* reserved */ |
223 | |||
189 | /* Byte 2 */ | 224 | /* Byte 2 */ |
190 | uint32_t powerpc_format:1; /* Set to 1 (indicating log is */ | 225 | uint8_t byte2; |
191 | /* in PowerPC format */ | 226 | /* XXXXXXXX |
192 | uint32_t :3; /* reserved */ | 227 | * X 1: Set to 1 (indicating log is in PowerPC format) |
193 | uint32_t log_format:4; /* Log format indicator. Define */ | 228 | * XXX 3: Reserved |
194 | /* format used for byte 12-2047 */ | 229 | * XXXX 4: Log format used for bytes 12-2047 |
230 | */ | ||
231 | |||
195 | /* Byte 3 */ | 232 | /* Byte 3 */ |
196 | uint32_t :8; /* reserved */ | 233 | uint8_t byte3; /* reserved */ |
197 | /* Byte 4-11 */ | 234 | /* Byte 4-11 */ |
198 | uint8_t reserved[8]; /* reserved */ | 235 | uint8_t reserved[8]; /* reserved */ |
199 | /* Byte 12-15 */ | 236 | /* Byte 12-15 */ |
200 | uint32_t company_id; /* Company ID of the company */ | 237 | __be32 company_id; /* Company ID of the company */ |
201 | /* that defines the format for */ | 238 | /* that defines the format for */ |
202 | /* the vendor specific log type */ | 239 | /* the vendor specific log type */ |
203 | /* Byte 16-end of log */ | 240 | /* Byte 16-end of log */ |
@@ -205,6 +242,18 @@ struct rtas_ext_event_log_v6 { | |||
205 | /* Variable length. */ | 242 | /* Variable length. */ |
206 | }; | 243 | }; |
207 | 244 | ||
245 | static | ||
246 | inline uint8_t rtas_ext_event_log_format(struct rtas_ext_event_log_v6 *ext_log) | ||
247 | { | ||
248 | return ext_log->byte2 & 0x0F; | ||
249 | } | ||
250 | |||
251 | static | ||
252 | inline uint32_t rtas_ext_event_company_id(struct rtas_ext_event_log_v6 *ext_log) | ||
253 | { | ||
254 | return be32_to_cpu(ext_log->company_id); | ||
255 | } | ||
256 | |||
208 | /* pSeries event log format */ | 257 | /* pSeries event log format */ |
209 | 258 | ||
210 | /* Two bytes ASCII section IDs */ | 259 | /* Two bytes ASCII section IDs */ |
@@ -227,14 +276,26 @@ struct rtas_ext_event_log_v6 { | |||
227 | 276 | ||
228 | /* Vendor specific Platform Event Log Format, Version 6, section header */ | 277 | /* Vendor specific Platform Event Log Format, Version 6, section header */ |
229 | struct pseries_errorlog { | 278 | struct pseries_errorlog { |
230 | uint16_t id; /* 0x00 2-byte ASCII section ID */ | 279 | __be16 id; /* 0x00 2-byte ASCII section ID */ |
231 | uint16_t length; /* 0x02 Section length in bytes */ | 280 | __be16 length; /* 0x02 Section length in bytes */ |
232 | uint8_t version; /* 0x04 Section version */ | 281 | uint8_t version; /* 0x04 Section version */ |
233 | uint8_t subtype; /* 0x05 Section subtype */ | 282 | uint8_t subtype; /* 0x05 Section subtype */ |
234 | uint16_t creator_component; /* 0x06 Creator component ID */ | 283 | __be16 creator_component; /* 0x06 Creator component ID */ |
235 | uint8_t data[]; /* 0x08 Start of section data */ | 284 | uint8_t data[]; /* 0x08 Start of section data */ |
236 | }; | 285 | }; |
237 | 286 | ||
287 | static | ||
288 | inline uint16_t pseries_errorlog_id(struct pseries_errorlog *sect) | ||
289 | { | ||
290 | return be16_to_cpu(sect->id); | ||
291 | } | ||
292 | |||
293 | static | ||
294 | inline uint16_t pseries_errorlog_length(struct pseries_errorlog *sect) | ||
295 | { | ||
296 | return be16_to_cpu(sect->length); | ||
297 | } | ||
298 | |||
238 | struct pseries_errorlog *get_pseries_errorlog(struct rtas_error_log *log, | 299 | struct pseries_errorlog *get_pseries_errorlog(struct rtas_error_log *log, |
239 | uint16_t section_id); | 300 | uint16_t section_id); |
240 | 301 | ||