diff options
Diffstat (limited to 'roms/skiboot/include/pel.h')
-rw-r--r-- | roms/skiboot/include/pel.h | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/roms/skiboot/include/pel.h b/roms/skiboot/include/pel.h new file mode 100644 index 000000000..a0df7cc3c --- /dev/null +++ b/roms/skiboot/include/pel.h @@ -0,0 +1,168 @@ +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later +/* Copyright 2013-2014 IBM Corp. */ + +#ifndef __PEL_H +#define __PEL_H + +#include <compiler.h> +#include <errorlog.h> + +/* Data Structures for PEL data. */ + +#define PRIVATE_HEADER_SECTION_SIZE 48 +#define USER_HEADER_SECTION_SIZE 24 +#define SRC_SECTION_SIZE 80 +#define SRC_SUBSECTION_SIZE 4 +#define SRC_LENGTH 72 +#define OPAL_MAX_SRC_BYTES 32 +#define EXTENDED_HEADER_SECTION_SIZE 76 +#define MTMS_SECTION_SIZE 28 +#define IO_EVENT_SECTION_SIZE 16 + +#define OPAL_ELOG_VERSION 1 +#define OPAL_ELOG_SST 0 +#define OPAL_SRC_MAX_WORD_COUNT 8 + +#define OPAL_SRC_FORMAT 0x80 +#define OPAL_FAILING_SUBSYSTEM 0x82 + +#define OPAL_SYS_MODEL_LEN 8 +#define OPAL_SYS_SERIAL_LEN 12 +#define OPAL_VER_LEN 16 +#define OPAL_SYMPID_LEN 80 +#define OPAL_RC_NONE 0 + +#define OPAL_IO_MAX_RPC_DATA 216 +#define OPAL_SRC_SEC_VER 0x02 +#define OPAL_EXT_HRD_VER 0x01 + +/* Error log reporting action */ +#define ERRL_ACTION_REPORT 0x2000 +#define ERRL_ACTION_NONE 0x0000 + +enum elogSectionId { + ELOG_SID_PRIVATE_HEADER = 0x5048, /* PH */ + ELOG_SID_USER_HEADER = 0x5548, /* UH */ + ELOG_SID_EXTENDED_HEADER = 0x4548, /* EH */ + ELOG_SID_PRIMARY_SRC = 0x5053, /* PS */ + ELOG_SID_MACHINE_TYPE = 0x4D54, /* MT */ + ELOG_SID_SECONDARY_SRC = 0x5353, /* SS */ + ELOG_SID_CALL_HOME = 0x4348, /* CH */ + ELOG_SID_DUMP_LOCATOR = 0x4448, /* DH */ + ELOG_SID_SOFTWARE_ERROR = 0x5357, /* SW */ + ELOG_SID_PARTITION = 0x4C50, /* LP */ + ELOG_SID_LOGICAL_RESOURCE = 0x4C52, /* LR */ + ELOG_SID_HMC_ID = 0x484D, /* HM */ + ELOG_SID_EPOW = 0x4550, /* EP */ + ELOG_SID_IO_EVENT = 0x4945, /* IE */ + ELOG_SID_MFG_INFORMATION = 0x4D49, /* MI */ + ELOG_SID_USER_DEFINED = 0x5544 /* UD */ +}; + + +struct opal_v6_header { + __be16 id; /* section id */ + __be16 length; /* section length */ + uint8_t version; /* section version */ + uint8_t subtype; /* section sub-type id */ + __be16 component_id; /* component id of section creator */ +} __packed; + +/* opal_srctype */ +#define OPAL_SRC_TYPE_ERROR 0xBB + +#define OPAL_CID_SAPPHIRE 'K' /* creator ID for sapphire log */ +#define OPAL_CID_POWERNV 'P' /* creator ID for powernv log */ + +/* Origin of error, elog_origin */ +#define ORG_SAPPHIRE 1 +#define ORG_POWERNV 2 + +/* MAX time for error log commit */ +#define ERRORLOG_TIMEOUT_INTERVAL 180 + +/*struct opal_private head section_ */ +struct opal_private_header_section { + + struct opal_v6_header v6header; + __be32 create_date; + __be32 create_time; + __be32 commit_date; + __be32 commit_time; + + uint8_t creator_id; /* subsystem component id */ + __be16 reserved_0; + uint8_t section_count; /* number of sections in log */ + __be32 reserved_1; + __be32 creator_subid_hi; + __be32 creator_subid_lo; + __be32 plid; /* platform log id */ + __be32 log_entry_id; /* Unique log entry id */ +} __packed; + +/* opal user header section */ +struct opal_user_header_section { + + struct opal_v6_header v6header; + + uint8_t subsystem_id; /* subsystem id */ + uint8_t event_scope; + uint8_t event_severity; + uint8_t event_type; /* error/event severity */ + + __be32 reserved_0; + __be16 reserved_1; + __be16 action_flags; /* error action code */ + __be32 reserved_2; +} __packed; + +struct opal_src_section { + struct opal_v6_header v6header; + uint8_t version; + uint8_t flags; + uint8_t reserved_0; + uint8_t wordcount; + __be16 reserved_1; + __be16 srclength; + __be32 hexwords[OPAL_SRC_MAX_WORD_COUNT]; + char srcstring[OPAL_MAX_SRC_BYTES]; +} __packed; + +struct opal_extended_header_section { + struct opal_v6_header v6header; + char model[OPAL_SYS_MODEL_LEN]; + char serial_no[OPAL_SYS_SERIAL_LEN]; + char opal_release_version[OPAL_VER_LEN]; + char opal_subsys_version[OPAL_VER_LEN]; + __be16 reserved_0; + __be32 extended_header_date; + __be32 extended_header_time; + __be16 reserved_1; + uint8_t reserved_2; + uint8_t opal_symid_len; + char opalsymid[OPAL_SYMPID_LEN]; +} __packed; + +/* opal MTMS section */ +struct opal_mtms_section { + struct opal_v6_header v6header; + char model[OPAL_SYS_MODEL_LEN]; + char serial_no[OPAL_SYS_SERIAL_LEN]; +} __packed; + +/* User defined section */ +struct opal_user_section { + struct opal_v6_header v6header; + char dump[1]; +} __packed; + +/* The minimum size of a PEL record */ +#define PEL_MIN_SIZE (PRIVATE_HEADER_SECTION_SIZE + USER_HEADER_SECTION_SIZE \ + + SRC_SECTION_SIZE + EXTENDED_HEADER_SECTION_SIZE \ + + MTMS_SECTION_SIZE) + +size_t pel_size(struct errorlog *elog_data); +int create_pel_log(struct errorlog *elog_data, char *pel_buffer, + size_t pel_buffer_size) __warn_unused_result; + +#endif |