[LEDE-DEV] [PATCH] kexec-tools: fix non-device tree devices on mips

Konstantin Kuzov master.nosferatu at gmail.com
Tue Dec 26 03:47:56 PST 2017


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

Signed-off-by: Konstantin Kuzov <master.nosferatu at gmail.com>
---
 .../140-mips_disable_devicetree_support.patch      | 147 +++++++++++++++++++++
 1 file changed, 147 insertions(+)
 create mode 100644 package/boot/kexec-tools/patches/140-mips_disable_devicetree_support.patch

diff --git a/package/boot/kexec-tools/patches/140-mips_disable_devicetree_support.patch b/package/boot/kexec-tools/patches/140-mips_disable_devicetree_support.patch
new file mode 100644
index 0000000000..f862e2f58b
--- /dev/null
+++ b/package/boot/kexec-tools/patches/140-mips_disable_devicetree_support.patch
@@ -0,0 +1,147 @@
+diff -urN a/kexec/arch/mips/include/arch/options.h b/kexec/arch/mips/include/arch/options.h
+--- a/kexec/arch/mips/include/arch/options.h	2016-12-09 12:42:06.000000000 +0300
++++ b/kexec/arch/mips/include/arch/options.h	2017-12-20 13:19:37.327807439 +0300
+@@ -5,6 +5,7 @@
+ #define OPT_APPEND	(OPT_ARCH_MAX+0)
+ #define OPT_DTB		(OPT_ARCH_MAX+1)
+ #define OPT_RAMDISK	(OPT_ARCH_MAX+2)
++#define OPT_NO_DTB	(OPT_ARCH_MAX+3)
+ 
+ /* Options relevant to the architecture (excluding loader-specific ones),
+  * in this case none:
+@@ -14,7 +15,8 @@
+ 	{"command-line", 1, 0, OPT_APPEND}, \
+ 	{"append",	 1, 0, OPT_APPEND}, \
+ 	{"dtb",		1, 0, OPT_DTB }, \
+-	{"initrd",	1, 0, OPT_RAMDISK },
++	{"initrd",	1, 0, OPT_RAMDISK }, \
++	{"no-dtb",	0, 0, OPT_NO_DTB },
+ 
+ 
+ #define KEXEC_ARCH_OPT_STR KEXEC_OPT_STR ""
+diff -urN a/kexec/arch/mips/kexec-elf-mips.c b/kexec/arch/mips/kexec-elf-mips.c
+--- a/kexec/arch/mips/kexec-elf-mips.c	2016-12-09 12:42:06.000000000 +0300
++++ b/kexec/arch/mips/kexec-elf-mips.c	2017-12-14 09:08:28.793909864 +0300
+@@ -141,45 +141,49 @@
+ 	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, initrd_buf, 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);
++	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, initrd_buf, 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);
++		}
+ 	}
+ 
+-
+ 	/* This is a legacy method for commandline passing used
+ 	 * currently by Octeon CPUs only */
+ 	add_buffer(info, cmdline_buf, sizeof(cmdline_buf),
+ 			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;
+ }
+diff -urN a/kexec/arch/mips/kexec-mips.c b/kexec/arch/mips/kexec-mips.c
+--- a/kexec/arch/mips/kexec-mips.c	2017-12-14 09:07:45.775790753 +0300
++++ b/kexec/arch/mips/kexec-mips.c	2017-12-20 13:19:57.362395864 +0300
+@@ -83,6 +83,7 @@
+ 	"    --append=STRING       Set the kernel command line to STRING.\n"
+ 	"    --dtb=FILE            Use FILE as the device tree blob.\n"
+ 	"    --initrd=FILE         Use FILE as initial ramdisk.\n"
++	"    --no-dtb              Don't try to find device tree\n"
+ 	);
+ }
+ 
+@@ -115,6 +116,9 @@
+ 		case OPT_RAMDISK:
+ 			arch_options.initrd_file = optarg;
+ 			break;
++		case OPT_NO_DTB:
++			arch_options.no_dtb = 1;
++			break;
+ 		default:
+ 			break;
+ 		}
+diff -urN a/kexec/arch/mips/kexec-mips.h b/kexec/arch/mips/kexec-mips.h
+--- a/kexec/arch/mips/kexec-mips.h	2016-12-09 12:42:06.000000000 +0300
++++ b/kexec/arch/mips/kexec-mips.h	2017-12-14 09:08:28.794909844 +0300
+@@ -22,6 +22,7 @@
+ 	char *dtb_file;
+ 	char *initrd_file;
+ 	int core_header_type;
++	int no_dtb;
+ };
+ 
+ extern struct memory_ranges usablemem_rgns;
+diff -urN a/kexec/arch/ppc/ops.h b/kexec/arch/ppc/ops.h
+--- a/kexec/arch/ppc/ops.h	2016-12-09 12:42:06.000000000 +0300
++++ b/kexec/arch/ppc/ops.h	2017-12-20 13:19:12.232322959 +0300
+@@ -14,7 +14,6 @@
+ 
+ #define	COMMAND_LINE_SIZE	512
+ #define	MAX_PATH_LEN		256
+-#define	MAX_PROP_LEN		256 /* What should this be? */
+ 
+ typedef void (*kernel_entry_t)(unsigned long r3, unsigned long r4, void *r5);
+ 
-- 
2.14.1




More information about the Lede-dev mailing list