Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux.git] / arch / powerpc / include / asm / rtas.h
index a0e1add01ef5804d00d105c5d3ba12e608be5f03..b390f55b0df1371fd020550de5ef7bc800ceb94c 100644 (file)
@@ -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);