powerpc/fadump: pass additional parameters when fadump is active
authorHari Bathini <hbathini@linux.ibm.com>
Thu, 9 May 2024 11:57:55 +0000 (17:27 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 10 May 2024 06:36:10 +0000 (16:36 +1000)
Append the additional parameters passed/set in the dedicated parameter
area (RTAS_FADUMP_PARAM_AREA) to bootargs in fadump capture kernel.

Signed-off-by: Hari Bathini <hbathini@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20240509115755.519982-4-hbathini@linux.ibm.com
arch/powerpc/include/asm/fadump.h
arch/powerpc/kernel/fadump.c
arch/powerpc/kernel/prom.c

index 526a6a6473128a81ff5b0bdfd1e8315889fa2ca4..ef40c9b6972a6e72edec29d93cb713f1e5ea76c6 100644 (file)
@@ -19,12 +19,14 @@ extern int is_fadump_active(void);
 extern int should_fadump_crash(void);
 extern void crash_fadump(struct pt_regs *, const char *);
 extern void fadump_cleanup(void);
+extern void fadump_append_bootargs(void);
 
 #else  /* CONFIG_FA_DUMP */
 static inline int is_fadump_active(void) { return 0; }
 static inline int should_fadump_crash(void) { return 0; }
 static inline void crash_fadump(struct pt_regs *regs, const char *str) { }
 static inline void fadump_cleanup(void) { }
+static inline void fadump_append_bootargs(void) { }
 #endif /* !CONFIG_FA_DUMP */
 
 #if defined(CONFIG_FA_DUMP) || defined(CONFIG_PRESERVE_FA_DUMP)
index 6d35b09d6f3ad0e7780bd160b43a20e1139f0fbe..2276bacc4170de2d0bff24d7d00c995315d39551 100644 (file)
@@ -131,6 +131,41 @@ static int __init fadump_cma_init(void)
 static int __init fadump_cma_init(void) { return 1; }
 #endif /* CONFIG_CMA */
 
+/*
+ * Additional parameters meant for capture kernel are placed in a dedicated area.
+ * If this is capture kernel boot, append these parameters to bootargs.
+ */
+void __init fadump_append_bootargs(void)
+{
+       char *append_args;
+       size_t len;
+
+       if (!fw_dump.dump_active || !fw_dump.param_area_supported || !fw_dump.param_area)
+               return;
+
+       if (fw_dump.param_area >= fw_dump.boot_mem_top) {
+               if (memblock_reserve(fw_dump.param_area, COMMAND_LINE_SIZE)) {
+                       pr_warn("WARNING: Can't use additional parameters area!\n");
+                       fw_dump.param_area = 0;
+                       return;
+               }
+       }
+
+       append_args = (char *)fw_dump.param_area;
+       len = strlen(boot_command_line);
+
+       /*
+        * Too late to fail even if cmdline size exceeds. Truncate additional parameters
+        * to cmdline size and proceed anyway.
+        */
+       if (len + strlen(append_args) >= COMMAND_LINE_SIZE - 1)
+               pr_warn("WARNING: Appending parameters exceeds cmdline size. Truncating!\n");
+
+       pr_debug("Cmdline: %s\n", boot_command_line);
+       snprintf(boot_command_line + len, COMMAND_LINE_SIZE - len, " %s", append_args);
+       pr_info("Updated cmdline: %s\n", boot_command_line);
+}
+
 /* Scan the Firmware Assisted dump configuration details. */
 int __init early_init_dt_scan_fw_dump(unsigned long node, const char *uname,
                                      int depth, void *data)
index eb140ea6b6ffbc933af7b656aa70ecbecd109fe0..60819751e55e6c27516105f8f43f605be965e771 100644 (file)
@@ -813,6 +813,9 @@ void __init early_init_devtree(void *params)
         */
        of_scan_flat_dt(early_init_dt_scan_chosen_ppc, boot_command_line);
 
+       /* Append additional parameters passed for fadump capture kernel */
+       fadump_append_bootargs();
+
        /* Scan memory nodes and rebuild MEMBLOCKs */
        early_init_dt_scan_root();
        early_init_dt_scan_memory_ppc();