aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/include/asm/rtas.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/include/asm/rtas.h')
-rw-r--r--arch/powerpc/include/asm/rtas.h127
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
152struct rtas_error_log { 152struct 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
177static inline uint8_t rtas_error_severity(const struct rtas_error_log *elog)
178{
179 return (elog->byte1 & 0xE0) >> 5;
180}
181
182static inline uint8_t rtas_error_disposition(const struct rtas_error_log *elog)
183{
184 return (elog->byte1 & 0x18) >> 3;
185}
186
187static 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
194static inline
195uint32_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 */
173struct rtas_ext_event_log_v6 { 207struct 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
245static
246inline uint8_t rtas_ext_event_log_format(struct rtas_ext_event_log_v6 *ext_log)
247{
248 return ext_log->byte2 & 0x0F;
249}
250
251static
252inline 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 */
229struct pseries_errorlog { 278struct 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
287static
288inline uint16_t pseries_errorlog_id(struct pseries_errorlog *sect)
289{
290 return be16_to_cpu(sect->id);
291}
292
293static
294inline uint16_t pseries_errorlog_length(struct pseries_errorlog *sect)
295{
296 return be16_to_cpu(sect->length);
297}
298
238struct pseries_errorlog *get_pseries_errorlog(struct rtas_error_log *log, 299struct pseries_errorlog *get_pseries_errorlog(struct rtas_error_log *log,
239 uint16_t section_id); 300 uint16_t section_id);
240 301