From 7bd94a64cd5424e74ad49dbda65a15e83670268f Mon Sep 17 00:00:00 2001
From: Andrea Adami <andrea.adami@gmail.com>
Date: Mon, 17 Dec 2018 11:25:20 +0100
Subject: [PATCH] kexec-tools: fix non-device tree devices on mips

Add additional argument '--no-dtb' which disables device tree
search in currently loaded kernel.

Taken from LEDE-DEV:
https://patchwork.ozlabs.org/patch/852961/

Rebased for kexec-tools 2.0.18
Removed ppc change (unwanted ?)

Signed-off-by: Konstantin Kuzov <master.nosferatu@gmail.com>
Signed-off-by: Andrea Adami <andrea.adami@gmail.com>

---
Upstream-Status: Pending

 kexec/arch/mips/include/arch/options.h |  4 +-
 kexec/arch/mips/kexec-elf-mips.c       | 58 ++++++++++++++------------
 kexec/arch/mips/kexec-mips.c           |  4 ++
 kexec/arch/mips/kexec-mips.h           |  1 +
 4 files changed, 39 insertions(+), 28 deletions(-)

--- a/kexec/arch/mips/include/arch/options.h
+++ b/kexec/arch/mips/include/arch/options.h
@@ -6,6 +6,7 @@
 #define OPT_DTB 		(OPT_ARCH_MAX+1)
 #define OPT_RAMDISK		(OPT_ARCH_MAX+2)
 #define OPT_REUSE_CMDLINE	(OPT_ARCH_MAX+3)
+#define OPT_NO_DTB	(OPT_ARCH_MAX+4)
 
 /* Options relevant to the architecture (excluding loader-specific ones),
  * in this case none:
@@ -16,8 +17,8 @@
 	{"append",	 1, 0, OPT_APPEND}, \
 	{"dtb",		1, 0, OPT_DTB }, \
 	{"initrd",	1, 0, OPT_RAMDISK }, \
-	{ "reuse-cmdline", 0, NULL, OPT_REUSE_CMDLINE },
-
+	{ "reuse-cmdline", 0, NULL, OPT_REUSE_CMDLINE }, \
+	{"no-dtb",	0, 0, OPT_NO_DTB },
 
 #define KEXEC_ARCH_OPT_STR KEXEC_OPT_STR ""
 
--- a/kexec/arch/mips/kexec-elf-mips.c
+++ b/kexec/arch/mips/kexec-elf-mips.c
@@ -196,36 +196,38 @@ int elf_mips_load(int argc, char **argv,
 	else
 		cmdline_addr = 0;
 
-	/* MIPS systems that have been converted to use device tree
-	 * passed through UHI will use commandline in the DTB and
-	 * the DTB passed as a separate buffer. Note that
-	 * CMDLINE_PREFIX is skipped here intentionally, as it is
-	 * used only in the legacy method */
-
-	if (arch_options.dtb_file) {
-		dtb_buf = slurp_file(arch_options.dtb_file, &dtb_length);
-	} else {
-		create_flatten_tree(&dtb_buf, &dtb_length, cmdline_buf + strlen(CMDLINE_PREFIX));
-	}
-
-	if (arch_options.initrd_file) {
-		initrd_buf = slurp_file(arch_options.initrd_file, &initrd_size);
-
-		/* Create initrd entries in dtb - although at this time
-		 * they would not point to the correct location */
-		dtb_set_initrd(&dtb_buf, &dtb_length, (off_t)initrd_buf, (off_t)initrd_buf + initrd_size);
-
-		initrd_base = add_buffer(info, initrd_buf, initrd_size,
-					initrd_size, sizeof(void *),
-					_ALIGN_UP(kernel_addr + kernel_size + dtb_length,
-						pagesize), 0x0fffffff, 1);
-
-		/* Now that the buffer for initrd is prepared, update the dtb
-		 * with an appropriate location */
-		dtb_set_initrd(&dtb_buf, &dtb_length, initrd_base, initrd_base + initrd_size);
-
-		/* Add the initrd parameters to cmdline */
-		patch_initrd_info(cmdline_buf, initrd_base, initrd_size);
+	if (!arch_options.no_dtb) {
+		/* MIPS systems that have been converted to use device tree
+		 * passed through UHI will use commandline in the DTB and
+		 * the DTB passed as a separate buffer. Note that
+		 * CMDLINE_PREFIX is skipped here intentionally, as it is
+		 * used only in the legacy method */
+
+		if (arch_options.dtb_file) {
+			dtb_buf = slurp_file(arch_options.dtb_file, &dtb_length);
+		} else {
+			create_flatten_tree(&dtb_buf, &dtb_length, cmdline_buf + strlen(CMDLINE_PREFIX));
+		}
+
+		if (arch_options.initrd_file) {
+			initrd_buf = slurp_file(arch_options.initrd_file, &initrd_size);
+
+			/* Create initrd entries in dtb - although at this time
+		 	 * they would not point to the correct location */
+			dtb_set_initrd(&dtb_buf, &dtb_length, (off_t)initrd_buf, (off_t)initrd_buf + initrd_size);
+
+			initrd_base = add_buffer(info, initrd_buf, initrd_size,
+						initrd_size, sizeof(void *),
+						_ALIGN_UP(kernel_addr + kernel_size + dtb_length,
+							pagesize), 0x0fffffff, 1);
+
+			/* Now that the buffer for initrd is prepared, update the dtb
+		 	 * with an appropriate location */
+			dtb_set_initrd(&dtb_buf, &dtb_length, initrd_base, initrd_base + initrd_size);
+
+			/* Add the initrd parameters to cmdline */
+			patch_initrd_info(cmdline_buf, initrd_base, initrd_size);
+		}
 	}
 	/* This is a legacy method for commandline passing used
 	 * currently by Octeon CPUs only */
@@ -233,10 +235,11 @@ int elf_mips_load(int argc, char **argv,
 			sizeof(cmdline_buf), sizeof(void *),
 			cmdline_addr, 0x0fffffff, 1);
 
-	add_buffer(info, dtb_buf, dtb_length, dtb_length, 0,
-		_ALIGN_UP(kernel_addr + kernel_size, pagesize),
-		0x0fffffff, 1);
-
+	if (!arch_options.no_dtb) {
+		add_buffer(info, dtb_buf, dtb_length, dtb_length, 0,
+			_ALIGN_UP(kernel_addr + kernel_size, pagesize),
+			0x0fffffff, 1);
+	}
 	return 0;
 }
 
--- a/kexec/arch/mips/kexec-mips.c
+++ b/kexec/arch/mips/kexec-mips.c
@@ -90,6 +90,7 @@ void arch_usage(void)
 	"    --dtb=FILE            Use FILE as the device tree blob.\n"
 	"    --initrd=FILE         Use FILE as initial ramdisk.\n"
 	"    --reuse-cmdline       Use kernel command line from running system.\n"
+	"    --no-dtb              Don't try to find device tree.\n"
 	);
 }
 
@@ -127,6 +128,9 @@ int arch_process_options(int argc, char
 		case OPT_RAMDISK:
 			arch_options.initrd_file = optarg;
 			break;
+		case OPT_NO_DTB:
+			arch_options.no_dtb = 1;
+			break;
 		default:
 			break;
 		}
--- a/kexec/arch/mips/kexec-mips.h
+++ b/kexec/arch/mips/kexec-mips.h
@@ -22,6 +22,7 @@ struct arch_options_t {
 	char *dtb_file;
 	char *initrd_file;
 	int core_header_type;
+	int no_dtb;
 };
 
 extern struct memory_ranges usablemem_rgns;
