[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