Path: blob/master/arch/powerpc/platforms/powernv/opal-fadump.h
26481 views
/* SPDX-License-Identifier: GPL-2.0-or-later */1/*2* Firmware-Assisted Dump support on POWER platform (OPAL).3*4* Copyright 2019, Hari Bathini, IBM Corporation.5*/67#ifndef _POWERNV_OPAL_FADUMP_H8#define _POWERNV_OPAL_FADUMP_H910#include <asm/reg.h>1112/*13* With kernel & initrd loaded at 512MB (with 256MB size), enforce a minimum14* boot memory size of 768MB to ensure f/w loading kernel and initrd doesn't15* mess with crash'ed kernel's memory during MPIPL.16*/17#define OPAL_FADUMP_MIN_BOOT_MEM (0x30000000UL)1819/*20* OPAL FADump metadata structure format version21*22* OPAL FADump kernel metadata structure stores kernel metadata needed to23* register-for/process crash dump. Format version is used to keep a tab on24* the changes in the structure format. The changes, if any, to the format25* are expected to be minimal and backward compatible.26*/27#define OPAL_FADUMP_VERSION 0x12829/*30* OPAL FADump kernel metadata31*32* The address of this structure will be registered with f/w for retrieving33* in the capture kernel to process the crash dump.34*/35struct opal_fadump_mem_struct {36u8 version;37u8 reserved[3];38__be16 region_cnt; /* number of regions */39__be16 registered_regions; /* Regions registered for MPIPL */40__be64 fadumphdr_addr;41struct opal_mpipl_region rgn[FADUMP_MAX_MEM_REGS];42} __packed;4344/*45* CPU state data46*47* CPU state data information is provided by f/w. The format for this data48* is defined in the HDAT spec. Version is used to keep a tab on the changes49* in this CPU state data format. Changes to this format are unlikely, but50* if there are any changes, please refer to latest HDAT specification.51*/52#define HDAT_FADUMP_CPU_DATA_VER 15354#define HDAT_FADUMP_CORE_INACTIVE (0x0F)5556/* HDAT thread header for register entries */57struct hdat_fadump_thread_hdr {58__be32 pir;59/* 0x00 - 0x0F - The corresponding stop state of the core */60u8 core_state;61u8 reserved[3];6263__be32 offset; /* Offset to Register Entries array */64__be32 ecnt; /* Number of entries */65__be32 esize; /* Alloc size of each array entry in bytes */66__be32 eactsz; /* Actual size of each array entry in bytes */67} __packed;6869/* Register types populated by f/w */70#define HDAT_FADUMP_REG_TYPE_GPR 0x0171#define HDAT_FADUMP_REG_TYPE_SPR 0x027273/* ID numbers used by f/w while populating certain registers */74#define HDAT_FADUMP_REG_ID_NIP 0x7D075#define HDAT_FADUMP_REG_ID_MSR 0x7D176#define HDAT_FADUMP_REG_ID_CCR 0x7D27778/* HDAT register entry. */79struct hdat_fadump_reg_entry {80__be32 reg_type;81__be32 reg_num;82__be64 reg_val;83} __packed;8485static inline void opal_fadump_set_regval_regnum(struct pt_regs *regs,86u32 reg_type, u32 reg_num,87u64 reg_val)88{89if (reg_type == HDAT_FADUMP_REG_TYPE_GPR) {90if (reg_num < 32)91regs->gpr[reg_num] = reg_val;92return;93}9495switch (reg_num) {96case SPRN_CTR:97regs->ctr = reg_val;98break;99case SPRN_LR:100regs->link = reg_val;101break;102case SPRN_XER:103regs->xer = reg_val;104break;105case SPRN_DAR:106regs->dar = reg_val;107break;108case SPRN_DSISR:109regs->dsisr = reg_val;110break;111case HDAT_FADUMP_REG_ID_NIP:112regs->nip = reg_val;113break;114case HDAT_FADUMP_REG_ID_MSR:115regs->msr = reg_val;116break;117case HDAT_FADUMP_REG_ID_CCR:118regs->ccr = reg_val;119break;120}121}122123static inline void opal_fadump_read_regs(char *bufp, unsigned int regs_cnt,124unsigned int reg_entry_size,125bool cpu_endian,126struct pt_regs *regs)127{128struct hdat_fadump_reg_entry *reg_entry;129u64 val;130int i;131132memset(regs, 0, sizeof(struct pt_regs));133134for (i = 0; i < regs_cnt; i++, bufp += reg_entry_size) {135reg_entry = (struct hdat_fadump_reg_entry *)bufp;136val = (cpu_endian ? be64_to_cpu(reg_entry->reg_val) :137(u64 __force)(reg_entry->reg_val));138opal_fadump_set_regval_regnum(regs,139be32_to_cpu(reg_entry->reg_type),140be32_to_cpu(reg_entry->reg_num),141val);142}143}144145#endif /* _POWERNV_OPAL_FADUMP_H */146147148