| // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later |
| /* Copyright 2013-2015 IBM Corp. */ |
| |
| #ifndef __OPAL_DUMP_H |
| #define __OPAL_DUMP_H |
| |
| /* |
| * Dump region ids |
| * |
| * 0x01 - 0x3F : OPAL |
| * 0x40 - 0x7F : Reserved for future use |
| * 0x80 - 0xFF : Kernel |
| * |
| */ |
| #define DUMP_REGION_OPAL_START 0x01 |
| #define DUMP_REGION_OPAL_END 0x3F |
| #define DUMP_REGION_HOST_START OPAL_DUMP_REGION_HOST_START |
| #define DUMP_REGION_HOST_END OPAL_DUMP_REGION_HOST_END |
| |
| #define DUMP_REGION_CONSOLE 0x01 |
| #define DUMP_REGION_HBRT_LOG 0x02 |
| #define DUMP_REGION_OPAL_MEMORY 0x03 |
| #define DUMP_REGION_KERNEL 0x80 |
| |
| /* Mainstore memory to be captured by FSP SYSDUMP */ |
| #define DUMP_TYPE_SYSDUMP 0xF5 |
| /* Mainstore memory to preserve during IPL */ |
| #define DUMP_TYPE_MPIPL 0x00 |
| |
| /* |
| * Memory Dump Source Table |
| * |
| * Format of this table is same as Memory Dump Source Table (MDST) |
| * defined in HDAT spec. |
| */ |
| struct mdst_table { |
| __be64 addr; |
| uint8_t data_region; /* DUMP_REGION_* */ |
| uint8_t dump_type; /* DUMP_TYPE_* */ |
| __be16 reserved; |
| __be32 size; |
| } __packed; |
| |
| /* Memory dump destination table (MDDT) */ |
| struct mddt_table { |
| __be64 addr; |
| uint8_t data_region; |
| uint8_t dump_type; |
| __be16 reserved; |
| __be32 size; |
| } __packed; |
| |
| /* |
| * Memory dump result table (MDRT) |
| * |
| * List of the memory ranges that have been included in the dump. This table is |
| * filled by hostboot and passed to OPAL on second boot. OPAL/payload will use |
| * this table to extract the dump. |
| */ |
| struct mdrt_table { |
| __be64 src_addr; |
| __be64 dest_addr; |
| uint8_t data_region; |
| uint8_t dump_type; |
| __be16 reserved; |
| __be32 size; |
| __be64 padding; |
| } __packed; |
| |
| /* |
| * Processor Dump Area |
| * |
| * This contains the information needed for having processor |
| * state captured during a platform dump. |
| */ |
| struct proc_dump_area { |
| __be32 thread_size; /* Size of each thread register entry */ |
| #define PROC_DUMP_AREA_FORMAT_P9 0x1 /* P9 format */ |
| uint8_t version; /* P9 - 0x1 */ |
| uint8_t reserved[11]; |
| __be64 alloc_addr; /* Destination memory to place register data */ |
| __be32 reserved2; |
| __be32 alloc_size; /* Allocated size */ |
| __be64 dest_addr; /* Destination address */ |
| __be32 reserved3; |
| __be32 act_size; /* Actual data size */ |
| } __packed; |
| |
| struct proc_reg_data_hdr { |
| /* PIR value of the thread */ |
| __be32 pir; |
| /* 0x00 - 0x0F - The corresponding stop state of the core */ |
| uint8_t core_state; |
| uint8_t reserved[3]; |
| |
| uint32_t offset; /* Offset to Register Entries array */ |
| uint32_t ecnt; /* Number of entries */ |
| uint32_t esize; /* Alloc size of each array entry in bytes */ |
| uint32_t eactsz; /* Actual size of each array entry in bytes */ |
| } __packed; |
| |
| /* Architected register data content */ |
| #define ARCH_REG_TYPE_GPR 0x01 |
| #define ARCH_REG_TYPE_SPR 0x02 |
| struct proc_reg_data { |
| uint32_t reg_type; /* ARCH_REG_TYPE_* */ |
| uint32_t reg_num; |
| uint64_t reg_val; |
| } __packed; |
| |
| /* Metadata to capture before triggering MPIPL */ |
| struct mpipl_metadata { |
| /* Crashing PIR is required to create OPAL dump */ |
| uint32_t crashing_pir; |
| /* Kernel expects OPAL to presrve tag and pass it back via OPAL API */ |
| uint64_t kernel_tag; |
| /* Post MPIPL kernel boot memory size */ |
| uint64_t boot_mem_size; |
| } __packed; |
| |
| /* init opal dump */ |
| extern void opal_mpipl_init(void); |
| |
| /* Save metadata before triggering MPIPL */ |
| void opal_mpipl_save_crashing_pir(void); |
| |
| /* Reserve memory to capture OPAL dump */ |
| extern void opal_mpipl_reserve_mem(void); |
| |
| /* Check MPIPL enabled or not */ |
| extern bool is_mpipl_enabled(void); |
| |
| #endif /* __OPAL_DUMP_H */ |