OPAL MPIPL APIs

#define OPAL_MPIPL_UPDATE                      173
#define OPAL_MPIPL_REGISTER_TAG                174
#define OPAL_MPIPL_QUERY_TAG                   175

These calls are used for MPIPL (Memory Preserving Initial Program Load).

It is an OPTIONAL part of the OPAL spec.

If a platform supports MPIPL, then we will have “/ibm,opal/dump” node in device tree (see Dump (MPIPL) Device Tree Binding).

OPAL_MPIPL_UPDATE

Linux kernel will use this call to register/unregister MPIPL.

#define OPAL_MPIPL_UPDATE                      173

int64_t opal_mpipl_update(enum mpipl_ops ops, u64 src, u64 dest, u64 size)

/* MPIPL update operations */
enum mpipl_ops {
     OPAL_MPIPL_ADD_RANGE            = 0,
     OPAL_MPIPL_REMOVE_RANGE         = 1,
     OPAL_MPIPL_REMOVE_ALL           = 2,
     OPAL_MPIPL_FREE_PRESERVED_MEMORY= 3,
};

ops :

OPAL_MPIPL_ADD_RANGE

Add new entry to MPIPL table. Kernel will send src, dest and size. During MPIPL content from source address is moved to destination address. src = Source start address dest = Destination start address size = size

OPAL_MPIPL_REMOVE_RANGE

Remove kernel requested entry from MPIPL table. src = Source start address dest = Destination start address size = ignore

OPAL_MPIPL_REMOVE_ALL

Remove all kernel passed entry from MPIPL table. src = ignore dest = ignore size = ignore

OPAL_MPIPL_FREE_PRESERVED_MEMORY

Post MPIPL, kernel will indicate OPAL that it has processed dump and it can clear/release metadata area. src = ignore dest = ignore size = ignore

Return Values

OPAL_SUCCESS

Operation success

OPAL_PARAMETER

Invalid parameter

OPAL_RESOURCE

Ran out of space in MDST/MDDT table to add new entry

OPAL_HARDWARE

Platform does not support fadump

OPAL_MPIPL_REGISTER_TAG

Kernel will use this API to register tags during MPIPL registration. It expects OPAL to preserve these tags across MPIPL. Post MPIPL Linux kernel will use opal_mpipl_query_tag call to retrieve these tags.

opal_mpipl_register_tag(enum opal_mpipl_tags tag, uint64_t tag_val)

tag:
 OPAL_MPIPL_TAG_KERNEL
   During first boot, kernel will setup its metadata area and asks
   OPAL to preserve metadata area pointer across MPIPL. Post MPIPL
   kernel requests OPAL to provide metadata pointer and it will use
   that pointer to retrieve metadata and create dump.

 OPAL_MPIPL_TAG_BOOT_MEM
   During MPIPL registration kernel will specify how much memory
   firmware can use for Post MPIPL load. Post MPIPL petitboot kernel
   will query for this tag to get boot memory size.

Return Values

OPAL_SUCCESS

Operation success

OPAL_PARAMETER

Invalid parameter

OPAL_MPIPL_QUERY_TAG

Post MPIPL linux kernel will call this API to get metadata tag. And use this tag to retrieve metadata information and generate dump.

 #define OPAL_MPIPL_QUERY_TAG                 175

 uint64_t opal_mpipl_query_tag(enum opal_mpipl_tags tag, uint64_t *tag_val)

 enum opal_mpipl_tags {
      OPAL_MPIPL_TAG_CPU      = 0,
      OPAL_MPIPL_TAG_OPAL     = 1,
      OPAL_MPIPL_TAG_KERNEL   = 2,
      OPAL_MPIPL_TAG_BOOT_MEM = 3,
 };

tag :
   OPAL_MPIPL_TAG_CPU
     Pointer to CPU register data content metadata area
   OPAL_MPIPL_TAG_OPAL
     Pointer to OPAL metadata area
   OPAL_MPIPL_TAG_KERNEL
     During first boot, kernel will setup its metadata area and asks
     OPAL to preserve metadata area pointer across MPIPL. Post MPIPL
     kernel calls this API to get metadata pointer and it will use
     that pointer to retrieve metadata and create dump.
   OPAL_MPIPL_TAG_BOOT_MEM
     During MPIPL registration kernel will specify how much memory
     firmware can use for Post MPIPL load. Post MPIPL petitboot kernel
     will query for this tag to get boot memory size.

Return Values

OPAL_SUCCESS

Operation success

OPAL_PARAMETER

Invalid parameter