diff mbox series

[v9,09/25] hdata: Create /ibm, opal/dump device tree node

Message ID 20190712111802.23560-10-hegdevasant@linux.vnet.ibm.com
State Accepted
Headers show
Series MPIPL support | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch success Successfully applied on branch master (4db38a36b31045f0a116d388ddeac850b38c8680)
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot success Test snowpatch/job/snowpatch-skiboot on branch master
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot-dco success Signed-off-by present

Commit Message

Vasant Hegde July 12, 2019, 11:17 a.m. UTC
We use MPIPL system parameter to detect whether MPIPL is supported or not.
If its supported create new device tree node (/ibm,opal/dump) to pass all
dump related information to kernel. This patch creates new node and populates
below properties:
  - compatible   - dump version (ibm,opal-dump)
  - fw-load-area - Memory used by OPAL to load kernel/initrd from PNOR
                   (KERNEL_LOAD_BASE & INITRAMFS_LOAD_BASE).
                   This is the temporary memory used by OPAL during boot.
		   Later Linux kernel is free to use this memory. During
		   MPIPL boot also OPAL will overwrite this memory.

		   OPAL will advertise these memory details to kernel.
		   If kernel is using these memory and needs these memory
		   content for proper dump creation, then it has to reserve
		   destination memory to preserve these memory ranges.
		   Also kernel should pass this detail during registration.
		   During MPIPL firmware will take care of preserving memory
		   and post MPIPL kernel can create proper dump.

Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
---
 hdata/spira.c | 21 +++++++++++++++++++++
 hdata/spira.h |  1 +
 2 files changed, 22 insertions(+)
diff mbox series

Patch

diff --git a/hdata/spira.c b/hdata/spira.c
index b5ec20db9..58aee742f 100644
--- a/hdata/spira.c
+++ b/hdata/spira.c
@@ -934,6 +934,23 @@  static void dt_init_secureboot_node(const struct iplparams_sysparams *sysparams)
 	dt_add_property_cells(node, "hw-key-hash-size", hw_key_hash_size);
 }
 
+static void add_opal_dump_node(void)
+{
+	u64 fw_load_area[4];
+	struct dt_node *node;
+
+	opal_node = dt_new_check(dt_root, "ibm,opal");
+	node = dt_new(opal_node, "dump");
+	assert(node);
+	dt_add_property_string(node, "compatible", "ibm,opal-dump");
+
+	fw_load_area[0] = cpu_to_be64((u64)KERNEL_LOAD_BASE);
+	fw_load_area[1] = cpu_to_be64(KERNEL_LOAD_SIZE);
+	fw_load_area[2] = cpu_to_be64((u64)INITRAMFS_LOAD_BASE);
+	fw_load_area[3] = cpu_to_be64(INITRAMFS_LOAD_SIZE);
+	dt_add_property(node, "fw-load-area", fw_load_area, sizeof(fw_load_area));
+}
+
 static void add_iplparams_sys_params(const void *iplp, struct dt_node *node)
 {
 	const struct iplparams_sysparams *p;
@@ -1021,6 +1038,10 @@  static void add_iplparams_sys_params(const void *iplp, struct dt_node *node)
 	if (sys_attributes & SYS_ATTR_RISK_LEVEL)
 		dt_add_property(node, "elevated-risk-level", NULL, 0);
 
+	/* Populate OPAL dump node */
+	if (sys_attributes & SYS_ATTR_MPIPL_SUPPORTED)
+		add_opal_dump_node();
+
 	if (version >= 0x60 && proc_gen >= proc_gen_p9)
 		dt_init_secureboot_node(p);
 }
diff --git a/hdata/spira.h b/hdata/spira.h
index 84bbcfee0..d29632821 100644
--- a/hdata/spira.h
+++ b/hdata/spira.h
@@ -364,6 +364,7 @@  struct iplparams_sysparams {
 	__be32		sys_eco_mode;
 #define SYS_ATTR_MULTIPLE_TPM PPC_BIT32(0)
 #define SYS_ATTR_RISK_LEVEL PPC_BIT32(3)
+#define SYS_ATTR_MPIPL_SUPPORTED PPC_BIT32(4)
 	__be32		sys_attributes;
 	__be32		mem_scrubbing;
 	__be16		cur_spl_value;