diff options
Diffstat (limited to 'arch/powerpc/include/asm/rtas.h')
| -rw-r--r-- | arch/powerpc/include/asm/rtas.h | 128 | 
1 files changed, 95 insertions, 33 deletions
diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rtas.h index 9bd52c65e66..b390f55b0df 100644 --- a/arch/powerpc/include/asm/rtas.h +++ b/arch/powerpc/include/asm/rtas.h @@ -150,19 +150,53 @@ struct rtas_suspend_me_data {  #define RTAS_VECTOR_EXTERNAL_INTERRUPT	0x500  struct rtas_error_log { -	unsigned long version:8;		/* Architectural version */ -	unsigned long severity:3;		/* Severity level of error */ -	unsigned long disposition:2;		/* Degree of recovery */ -	unsigned long extended:1;		/* extended log present? */ -	unsigned long /* reserved */ :2;	/* Reserved for future use */ -	unsigned long initiator:4;		/* Initiator of event */ -	unsigned long target:4;			/* Target of failed operation */ -	unsigned long type:8;			/* General event or error*/ -	unsigned long extended_log_length:32;	/* length in bytes */ -	unsigned char buffer[1];		/* Start of extended log */ +	/* Byte 0 */ +	uint8_t		byte0;			/* Architectural version */ + +	/* Byte 1 */ +	uint8_t		byte1; +	/* XXXXXXXX +	 * XXX		3: Severity level of error +	 *    XX	2: Degree of recovery +	 *      X	1: Extended log present? +	 *       XX	2: Reserved +	 */ + +	/* Byte 2 */ +	uint8_t		byte2; +	/* XXXXXXXX +	 * XXXX		4: Initiator of event +	 *     XXXX	4: Target of failed operation +	 */ +	uint8_t		byte3;			/* General event or error*/ +	__be32		extended_log_length;	/* length in bytes */ +	unsigned char	buffer[1];		/* Start of extended log */  						/* Variable length.      */  }; +static inline uint8_t rtas_error_severity(const struct rtas_error_log *elog) +{ +	return (elog->byte1 & 0xE0) >> 5; +} + +static inline uint8_t rtas_error_disposition(const struct rtas_error_log *elog) +{ +	return (elog->byte1 & 0x18) >> 3; +} + +static inline uint8_t rtas_error_extended(const struct rtas_error_log *elog) +{ +	return (elog->byte1 & 0x04) >> 2; +} + +#define rtas_error_type(x)	((x)->byte3) + +static inline +uint32_t rtas_error_extended_log_length(const struct rtas_error_log *elog) +{ +	return be32_to_cpu(elog->extended_log_length); +} +  #define RTAS_V6EXT_LOG_FORMAT_EVENT_LOG	14  #define RTAS_V6EXT_COMPANY_ID_IBM	(('I' << 24) | ('B' << 16) | ('M' << 8)) @@ -172,32 +206,35 @@ struct rtas_error_log {   */  struct rtas_ext_event_log_v6 {  	/* Byte 0 */ -	uint32_t log_valid:1;		/* 1:Log valid */ -	uint32_t unrecoverable_error:1;	/* 1:Unrecoverable error */ -	uint32_t recoverable_error:1;	/* 1:recoverable (correctable	*/ -					/*   or successfully retried)	*/ -	uint32_t degraded_operation:1;	/* 1:Unrecoverable err, bypassed*/ -					/*   - degraded operation (e.g.	*/ -					/*   CPU or mem taken off-line)	*/ -	uint32_t predictive_error:1; -	uint32_t new_log:1;		/* 1:"New" log (Always 1 for	*/ -					/*   data returned from RTAS	*/ -	uint32_t big_endian:1;		/* 1: Big endian */ -	uint32_t :1;			/* reserved */ +	uint8_t byte0; +	/* XXXXXXXX +	 * X		1: Log valid +	 *  X		1: Unrecoverable error +	 *   X		1: Recoverable (correctable or successfully retried) +	 *    X		1: Bypassed unrecoverable error (degraded operation) +	 *     X	1: Predictive error +	 *      X	1: "New" log (always 1 for data returned from RTAS) +	 *       X	1: Big Endian +	 *        X	1: Reserved +	 */ +  	/* Byte 1 */ -	uint32_t :8;			/* reserved */ +	uint8_t byte1;			/* reserved */ +  	/* Byte 2 */ -	uint32_t powerpc_format:1;	/* Set to 1 (indicating log is	*/ -					/* in PowerPC format		*/ -	uint32_t :3;			/* reserved */ -	uint32_t log_format:4;		/* Log format indicator. Define	*/ -					/* format used for byte 12-2047	*/ +	uint8_t byte2; +	/* XXXXXXXX +	 * X		1: Set to 1 (indicating log is in PowerPC format) +	 *  XXX		3: Reserved +	 *     XXXX	4: Log format used for bytes 12-2047 +	 */ +  	/* Byte 3 */ -	uint32_t :8;			/* reserved */ +	uint8_t byte3;			/* reserved */  	/* Byte 4-11 */  	uint8_t reserved[8];		/* reserved */  	/* Byte 12-15 */ -	uint32_t company_id;		/* Company ID of the company	*/ +	__be32  company_id;		/* Company ID of the company	*/  					/* that defines the format for	*/  					/* the vendor specific log type	*/  	/* Byte 16-end of log */ @@ -205,6 +242,18 @@ struct rtas_ext_event_log_v6 {  					/* Variable length.		*/  }; +static +inline uint8_t rtas_ext_event_log_format(struct rtas_ext_event_log_v6 *ext_log) +{ +	return ext_log->byte2 & 0x0F; +} + +static +inline uint32_t rtas_ext_event_company_id(struct rtas_ext_event_log_v6 *ext_log) +{ +	return be32_to_cpu(ext_log->company_id); +} +  /* pSeries event log format */  /* Two bytes ASCII section IDs */ @@ -227,14 +276,26 @@ struct rtas_ext_event_log_v6 {  /* Vendor specific Platform Event Log Format, Version 6, section header */  struct pseries_errorlog { -	uint16_t id;			/* 0x00 2-byte ASCII section ID	*/ -	uint16_t length;		/* 0x02 Section length in bytes	*/ +	__be16 id;			/* 0x00 2-byte ASCII section ID	*/ +	__be16 length;			/* 0x02 Section length in bytes	*/  	uint8_t version;		/* 0x04 Section version		*/  	uint8_t subtype;		/* 0x05 Section subtype		*/ -	uint16_t creator_component;	/* 0x06 Creator component ID	*/ +	__be16 creator_component;	/* 0x06 Creator component ID	*/  	uint8_t data[];			/* 0x08 Start of section data	*/  }; +static +inline uint16_t pseries_errorlog_id(struct pseries_errorlog *sect) +{ +	return be16_to_cpu(sect->id); +} + +static +inline uint16_t pseries_errorlog_length(struct pseries_errorlog *sect) +{ +	return be16_to_cpu(sect->length); +} +  struct pseries_errorlog *get_pseries_errorlog(struct rtas_error_log *log,  					      uint16_t section_id); @@ -283,6 +344,7 @@ extern void pSeries_log_error(char *buf, unsigned int err_type, int fatal);  #ifdef CONFIG_PPC_PSERIES  extern int pseries_devicetree_update(s32 scope); +extern void post_mobility_fixup(void);  #endif  #ifdef CONFIG_PPC_RTAS_DAEMON  | 
