aboutsummaryrefslogtreecommitdiff
path: root/core/opal-dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/opal-dump.c')
-rw-r--r--core/opal-dump.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/core/opal-dump.c b/core/opal-dump.c
index 6aefefd..fb8ff9f 100644
--- a/core/opal-dump.c
+++ b/core/opal-dump.c
@@ -16,6 +16,7 @@
#define pr_fmt(fmt) "DUMP: " fmt
+#include <chip.h>
#include <cpu.h>
#include <device.h>
#include <mem-map.h>
@@ -31,9 +32,16 @@
#include "hdata/spira.h"
+/* XXX Ideally we should use HDAT provided data (proc_dump_area->thread_size).
+ * But we are not getting this data durig boot. Hence lets reserve fixed
+ * memory for architected registers data collection.
+ */
+#define ARCH_REGS_DATA_SIZE_PER_CHIP (512 * 1024)
+
/* Actual address of MDST and MDDT table */
#define MDST_TABLE_BASE (SKIBOOT_BASE + MDST_TABLE_OFF)
#define MDDT_TABLE_BASE (SKIBOOT_BASE + MDDT_TABLE_OFF)
+#define PROC_DUMP_AREA_BASE (SKIBOOT_BASE + PROC_DUMP_AREA_OFF)
static struct spira_ntuple *ntuple_mdst;
static struct spira_ntuple *ntuple_mddt;
@@ -214,6 +222,8 @@ static int opal_mpipl_remove_entry_mddt(bool remove_all, u8 region, u64 dest)
static void opal_mpipl_register(void)
{
u64 opal_dest, opal_size;
+ u64 arch_regs_dest, arch_regs_size;
+ struct proc_dump_area *proc_dump = (void *)(PROC_DUMP_AREA_BASE);
/* Get OPAL runtime size */
if (!dt_find_property(opal_node, "opal-runtime-size")) {
@@ -233,6 +243,24 @@ static void opal_mpipl_register(void)
/* Add OPAL reservation detail to MDST/MDDT table */
opal_mpipl_add_entry(DUMP_REGION_OPAL_MEMORY,
SKIBOOT_BASE, opal_dest, opal_size);
+
+ /* Thread size check */
+ if (proc_dump->thread_size != 0) {
+ prlog(PR_INFO, "Thread register entry size is available, "
+ "but not supported.\n");
+ }
+
+ /* Calculate memory to capture CPU register data */
+ arch_regs_dest = opal_dest + opal_size;
+ arch_regs_size = nr_chips() * ARCH_REGS_DATA_SIZE_PER_CHIP;
+
+ /* Reserve memory used to capture architected register state */
+ mem_reserve_fw("ibm,firmware-arch-registers",
+ arch_regs_dest, arch_regs_size);
+ proc_dump->alloc_addr = arch_regs_dest | HRMOR_BIT;
+ proc_dump->alloc_size = arch_regs_size;
+ prlog(PR_NOTICE, "Architected register dest addr : 0x%llx, "
+ "size : 0x%llx\n", arch_regs_dest, arch_regs_size);
}
static int payload_mpipl_register(u64 src, u64 dest, u64 size)