text: // 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);
  
  #endif	/* __OPAL_DUMP_H */
  