aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasant Hegde <hegdevasant@linux.vnet.ibm.com>2019-07-12 16:47:48 +0530
committerOliver O'Halloran <oohall@gmail.com>2019-08-15 17:53:23 +1000
commit4f94bda6a3b9fe2dca8da11e1fb337ea2629be20 (patch)
tree61b54ce2c0bdf5ad3cb9f35e394b3ae918353ed5
parent1ba3198bcdac8965c4e4c9364b08b888600d9324 (diff)
downloadskiboot-4f94bda6a3b9fe2dca8da11e1fb337ea2629be20.zip
skiboot-4f94bda6a3b9fe2dca8da11e1fb337ea2629be20.tar.gz
skiboot-4f94bda6a3b9fe2dca8da11e1fb337ea2629be20.tar.bz2
MPIPL: Define OPAL metadata area
We want to save some information (like crashing CPU PIR, kernel tags, etc) before triggering MPIPL. Post MPIPL we will use this information to retrieve dump metadata and create dump. MDRT table doesn't need 64K. Hence split MDRT table to accommodate metadata area. Finally define metadata structure. Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com> [oliver: rebased] Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
-rw-r--r--core/opal-dump.c13
-rw-r--r--include/mem-map.h8
-rw-r--r--include/opal-dump.h10
3 files changed, 30 insertions, 1 deletions
diff --git a/core/opal-dump.c b/core/opal-dump.c
index 3d61f50..56d6ba3 100644
--- a/core/opal-dump.c
+++ b/core/opal-dump.c
@@ -37,6 +37,8 @@ static struct spira_ntuple *ntuple_mdst;
static struct spira_ntuple *ntuple_mddt;
static struct spira_ntuple *ntuple_mdrt;
+static struct mpipl_metadata *mpipl_metadata;
+
static int opal_mpipl_add_entry(u8 region, u64 src, u64 dest, u64 size)
{
int i, max_cnt;
@@ -134,6 +136,17 @@ void opal_mpipl_init(void)
ntuple_mddt = &(spirah.ntuples.mdump_dst);
ntuple_mdrt = &(spirah.ntuples.mdump_res);
+ /* Get metadata area pointer */
+ mpipl_metadata = (void *)(DUMP_METADATA_AREA_BASE);
+
+ /* Clear OPAL metadata area */
+ if (sizeof(struct mpipl_metadata) > DUMP_METADATA_AREA_SIZE) {
+ prlog(PR_ERR, "INSUFFICIENT OPAL METADATA AREA\n");
+ prlog(PR_ERR, "INCREASE OPAL MEDTADATA AREA SIZE\n");
+ assert(false);
+ }
+ memset(mpipl_metadata, 0, sizeof(struct mpipl_metadata));
+
/* Clear MDST and MDDT table */
memset(mdst_base, 0, MDST_TABLE_SIZE);
ntuple_mdst->act_cnt = 0;
diff --git a/include/mem-map.h b/include/mem-map.h
index ac3f432..20aa495 100644
--- a/include/mem-map.h
+++ b/include/mem-map.h
@@ -93,7 +93,13 @@
* memory after moving memory content from source to destination memory.
*/
#define MDRT_TABLE_BASE (SKIBOOT_BASE + 0x01c00000)
-#define MDRT_TABLE_SIZE 0x00010000
+#define MDRT_TABLE_SIZE 0x00008000
+
+/* This is our dump metadata area. We will use this memory to save metadata
+ * (like crashing CPU details, payload tags) before triggering MPIPL.
+ */
+#define DUMP_METADATA_AREA_BASE (SKIBOOT_BASE + 0x01c08000)
+#define DUMP_METADATA_AREA_SIZE 0x8000
/* Total size of the above area
*
diff --git a/include/opal-dump.h b/include/opal-dump.h
index c05e810..77e505c 100644
--- a/include/opal-dump.h
+++ b/include/opal-dump.h
@@ -107,6 +107,16 @@ struct proc_reg_data {
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);