Message ID | 20180529094348.4147-1-michael.gray@lantisproject.com |
---|---|
State | Changes Requested |
Delegated to: | John Crispin |
Headers | show |
Series | [OpenWrt-Devel,v2] mvebu: fix broken console on WRT32X (venom) | expand |
On 29/05/18 11:43, michael.gray@lantisproject.com wrote: > From: Michael Gray <michael.gray@lantisproject.com> > > The console bootarg is being corrupted on boot, causing various issues > including broken sysupgrade. > Utilising the bootargs mangle patch from other targets, hardcode the console > arguments and fetch the rootfs from the bootloader. > > Kernel command line: console=ttyS0,115200 root=/dev/mtdblock8 > > Bootloader command line (ignored): console= root=/dev/mtdblock8 > > Please cherry pick to 18.06 too > > Signed-off-by: Michael Gray <michael.gray@lantisproject.com> Hi, did you verify if this break other boards ? also there are a lot of code style errors like missing orthographic spacing, c++ style comments and so on. can you link the original patch please ? John > --- > > changes since v1: > - Modified patch 006 to be mvebu specific. Now passes the bootloader cmdline > on if no append-rootblock stanza is found > --- > target/linux/mvebu/config-4.14 | 1 + > .../arm/boot/dts/armada-385-linksys-venom.dts | 6 + > ...Mangle-bootloader-s-kernel-arguments.patch | 201 ++++++++++++++++++ > 3 files changed, 208 insertions(+) > create mode 100644 target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch > > diff --git a/target/linux/mvebu/config-4.14 b/target/linux/mvebu/config-4.14 > index a48a3c8c5e..694ecdfb82 100644 > --- a/target/linux/mvebu/config-4.14 > +++ b/target/linux/mvebu/config-4.14 > @@ -42,6 +42,7 @@ CONFIG_ARM_APPENDED_DTB=y > CONFIG_ARM_ATAG_DTB_COMPAT=y > # CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set > CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y > +CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE=y > CONFIG_ARM_CPU_SUSPEND=y > CONFIG_ARM_CRYPTO=y > CONFIG_ARM_ERRATA_720789=y > diff --git a/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts b/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts > index ea44c8f0d2..00a4ee9f39 100644 > --- a/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts > +++ b/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts > @@ -46,7 +46,13 @@ > model = "Linksys WRT32X"; > compatible = "linksys,venom", "linksys,armada385", "marvell,armada385", > "marvell,armada380"; > + > + chosen { > + bootargs = "console=ttyS0,115200"; > + stdout-path = "serial0:115200n8"; > + append-rootblock = "root=/dev/mtdblock"; > }; > +}; > > &expander0 { > wan_amber@0 { > diff --git a/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch b/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch > new file mode 100644 > index 0000000000..53275607e0 > --- /dev/null > +++ b/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch > @@ -0,0 +1,201 @@ > +From 71270226b14733a4b1f2cde58ea9265caa50b38d Mon Sep 17 00:00:00 2001 > +From: Adrian Panella <ianchi74@outlook.com> > +Date: Thu, 9 Mar 2017 09:37:17 +0100 > +Subject: [PATCH 67/69] generic: Mangle bootloader's kernel arguments > + > +The command-line arguments provided by the boot loader will be > +appended to a new device tree property: bootloader-args. > +If there is a property "append-rootblock" in DT under /chosen > +and a root= option in bootloaders command line it will be parsed > +and added to DT bootargs with the form: <append-rootblock>XX. > +Only command line ATAG will be processed, the rest of the ATAGs > +sent by bootloader will be ignored. > +This is usefull in dual boot systems, to get the current root partition > +without afecting the rest of the system. > + > +Signed-off-by: Adrian Panella <ianchi74@outlook.com> > + > +This patch has been modified to be mvebu specific. The original patch > +did not pass the bootloader cmdline on if no append-rootblock stanza > +was found, resulting in blank cmdline and failure to boot. > + > +Signed-off-by: Michael Gray <michael.gray@lantisproject.com> > +--- > + arch/arm/Kconfig | 11 +++++ > + arch/arm/boot/compressed/atags_to_fdt.c | 72 ++++++++++++++++++++++++++++++++- > + init/main.c | 16 ++++++++ > + 3 files changed, 98 insertions(+), 1 deletion(-) > + > +--- a/arch/arm/Kconfig > ++++ b/arch/arm/Kconfig > +@@ -1948,6 +1948,17 @@ config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEN > + The command-line arguments provided by the boot loader will be > + appended to the the device tree bootargs property. > + > ++config ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE > ++ bool "Append rootblock parsing bootloader's kernel arguments" > ++ help > ++ The command-line arguments provided by the boot loader will be > ++ appended to a new device tree property: bootloader-args. > ++ If there is a property "append-rootblock" in DT under /chosen > ++ and a root= option in bootloaders command line it will be parsed > ++ and added to DT bootargs with the form: <append-rootblock>XX. > ++ Only command line ATAG will be processed, the rest of the ATAGs > ++ sent by bootloader will be ignored. > ++ > + endchoice > + > + config CMDLINE > +--- a/arch/arm/boot/compressed/atags_to_fdt.c > ++++ b/arch/arm/boot/compressed/atags_to_fdt.c > +@@ -3,6 +3,8 @@ > + > + #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND) > + #define do_extend_cmdline 1 > ++#elif defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) > ++#define do_extend_cmdline 1 > + #else > + #define do_extend_cmdline 0 > + #endif > +@@ -66,6 +68,65 @@ static uint32_t get_cell_size(const void > + return cell_size; > + } > + > ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) > ++ > ++static char *append_rootblock(char *dest, const char *str, int len, void *fdt) > ++{ > ++ char *ptr, *end; > ++ char *root="root="; > ++ int i, l; > ++ const char *rootblock; > ++ > ++ //ARM doesn't have __HAVE_ARCH_STRSTR, so search manually > ++ ptr = str - 1; > ++ > ++ do { > ++ //first find an 'r' at the begining or after a space > ++ do { > ++ ptr++; > ++ ptr = strchr(ptr, 'r'); > ++ if(!ptr) return dest; > ++ > ++ } while (ptr != str && *(ptr-1) != ' '); > ++ > ++ //then check for the rest > ++ for(i = 1; i <= 4; i++) > ++ if(*(ptr+i) != *(root+i)) break; > ++ > ++ } while (i != 5); > ++ > ++ end = strchr(ptr, ' '); > ++ end = end ? (end - 1) : (strchr(ptr, 0) - 1); > ++ > ++ //find partition number (assumes format root=/dev/mtdXX | /dev/mtdblockXX | yy:XX ) > ++ for( i = 0; end >= ptr && *end >= '0' && *end <= '9'; end--, i++); > ++ ptr = end + 1; > ++ > ++ /* if append-rootblock property is set use it to append to command line */ > ++ rootblock = getprop(fdt, "/chosen", "append-rootblock", &l); > ++ if(rootblock != NULL) { > ++ if(*dest != ' ') { > ++ *dest = ' '; > ++ dest++; > ++ len++; > ++ } > ++ if (len + l + i <= COMMAND_LINE_SIZE) { > ++ memcpy(dest, rootblock, l); > ++ dest += l - 1; > ++ memcpy(dest, ptr, i); > ++ dest += i; > ++ } > ++ } else { > ++ len = strlen(str); > ++ if (len + 1 < COMMAND_LINE_SIZE) { > ++ memcpy(dest, str, len); > ++ dest += len; > ++ } > ++ } > ++ return dest; > ++} > ++#endif > ++ > + static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) > + { > + char cmdline[COMMAND_LINE_SIZE]; > +@@ -85,12 +140,21 @@ static void merge_fdt_bootargs(void *fdt > + > + /* and append the ATAG_CMDLINE */ > + if (fdt_cmdline) { > ++ > ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) > ++ //save original bootloader args > ++ //and append ubi.mtd with root partition number to current cmdline > ++ setprop_string(fdt, "/chosen", "bootloader-args", fdt_cmdline); > ++ ptr = append_rootblock(ptr, fdt_cmdline, len, fdt); > ++ > ++#else > + len = strlen(fdt_cmdline); > + if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) { > + *ptr++ = ' '; > + memcpy(ptr, fdt_cmdline, len); > + ptr += len; > + } > ++#endif > + } > + *ptr = '\0'; > + > +@@ -147,7 +211,9 @@ int atags_to_fdt(void *atag_list, void * > + else > + setprop_string(fdt, "/chosen", "bootargs", > + atag->u.cmdline.cmdline); > +- } else if (atag->hdr.tag == ATAG_MEM) { > ++ } > ++#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE > ++ else if (atag->hdr.tag == ATAG_MEM) { > + if (memcount >= sizeof(mem_reg_property)/4) > + continue; > + if (!atag->u.mem.size) > +@@ -186,6 +252,10 @@ int atags_to_fdt(void *atag_list, void * > + setprop(fdt, "/memory", "reg", mem_reg_property, > + 4 * memcount * memsize); > + } > ++#else > ++ > ++ } > ++#endif > + > + return fdt_pack(fdt); > + } > +--- a/init/main.c > ++++ b/init/main.c > +@@ -89,6 +89,10 @@ > + #include <asm/sections.h> > + #include <asm/cacheflush.h> > + > ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) > ++#include <linux/of.h> > ++#endif > ++ > + static int kernel_init(void *); > + > + extern void init_IRQ(void); > +@@ -540,6 +544,18 @@ asmlinkage __visible void __init start_k > + page_alloc_init(); > + > + pr_notice("Kernel command line: %s\n", boot_command_line); > ++ > ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) > ++ //Show bootloader's original command line for reference > ++ if(of_chosen) { > ++ const char *prop = of_get_property(of_chosen, "bootloader-args", NULL); > ++ if(prop) > ++ pr_notice("Bootloader command line (ignored): %s\n", prop); > ++ else > ++ pr_notice("Bootloader command line not present\n"); > ++ } > ++#endif > ++ > + parse_early_param(); > + after_dashes = parse_args("Booting kernel", > + static_command_line, __start___param,
On Fri, Jun 1, 2018 at 4:37 PM, John Crispin <john@phrozen.org> wrote: > > > > On 29/05/18 11:43, michael.gray@lantisproject.com wrote: >> >> From: Michael Gray <michael.gray@lantisproject.com> >> >> The console bootarg is being corrupted on boot, causing various issues >> including broken sysupgrade. >> Utilising the bootargs mangle patch from other targets, hardcode the console >> arguments and fetch the rootfs from the bootloader. >> >> Kernel command line: console=ttyS0,115200 root=/dev/mtdblock8 >> >> Bootloader command line (ignored): console= root=/dev/mtdblock8 >> >> Please cherry pick to 18.06 too >> >> Signed-off-by: Michael Gray <michael.gray@lantisproject.com> > > > Hi, > did you verify if this break other boards ? also there are a lot of code style errors like missing orthographic spacing, c++ style comments and so on. can you link the original patch please ? > John > Hi John, I was able to personally test WRT1900ACv1, WRT3200ACM and WRT32X (board in patch). Another forum user was able to test WRT1200AC and confirm ok. I was not able to test anything other than Cortexa9. Original patch: https://git.openwrt.org/?p=openwrt/openwrt.git;a=blob;f=target/linux/ipq806x/patches-4.14/0067-generic-Mangle-bootloader-s-kernel-arguments.patch;h=c7123eac52c8fa87e5d24f48e6ccb4e51402ec5b;hb=HEAD Michael > > >> --- >> >> changes since v1: >> - Modified patch 006 to be mvebu specific. Now passes the bootloader cmdline >> on if no append-rootblock stanza is found >> --- >> target/linux/mvebu/config-4.14 | 1 + >> .../arm/boot/dts/armada-385-linksys-venom.dts | 6 + >> ...Mangle-bootloader-s-kernel-arguments.patch | 201 ++++++++++++++++++ >> 3 files changed, 208 insertions(+) >> create mode 100644 target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch >> >> diff --git a/target/linux/mvebu/config-4.14 b/target/linux/mvebu/config-4.14 >> index a48a3c8c5e..694ecdfb82 100644 >> --- a/target/linux/mvebu/config-4.14 >> +++ b/target/linux/mvebu/config-4.14 >> @@ -42,6 +42,7 @@ CONFIG_ARM_APPENDED_DTB=y >> CONFIG_ARM_ATAG_DTB_COMPAT=y >> # CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set >> CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y >> +CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE=y >> CONFIG_ARM_CPU_SUSPEND=y >> CONFIG_ARM_CRYPTO=y >> CONFIG_ARM_ERRATA_720789=y >> diff --git a/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts b/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts >> index ea44c8f0d2..00a4ee9f39 100644 >> --- a/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts >> +++ b/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts >> @@ -46,7 +46,13 @@ >> model = "Linksys WRT32X"; >> compatible = "linksys,venom", "linksys,armada385", "marvell,armada385", >> "marvell,armada380"; >> + >> + chosen { >> + bootargs = "console=ttyS0,115200"; >> + stdout-path = "serial0:115200n8"; >> + append-rootblock = "root=/dev/mtdblock"; >> }; >> +}; >> &expander0 { >> wan_amber@0 { >> diff --git a/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch b/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch >> new file mode 100644 >> index 0000000000..53275607e0 >> --- /dev/null >> +++ b/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch >> @@ -0,0 +1,201 @@ >> +From 71270226b14733a4b1f2cde58ea9265caa50b38d Mon Sep 17 00:00:00 2001 >> +From: Adrian Panella <ianchi74@outlook.com> >> +Date: Thu, 9 Mar 2017 09:37:17 +0100 >> +Subject: [PATCH 67/69] generic: Mangle bootloader's kernel arguments >> + >> +The command-line arguments provided by the boot loader will be >> +appended to a new device tree property: bootloader-args. >> +If there is a property "append-rootblock" in DT under /chosen >> +and a root= option in bootloaders command line it will be parsed >> +and added to DT bootargs with the form: <append-rootblock>XX. >> +Only command line ATAG will be processed, the rest of the ATAGs >> +sent by bootloader will be ignored. >> +This is usefull in dual boot systems, to get the current root partition >> +without afecting the rest of the system. >> + >> +Signed-off-by: Adrian Panella <ianchi74@outlook.com> >> + >> +This patch has been modified to be mvebu specific. The original patch >> +did not pass the bootloader cmdline on if no append-rootblock stanza >> +was found, resulting in blank cmdline and failure to boot. >> + >> +Signed-off-by: Michael Gray <michael.gray@lantisproject.com> >> +--- >> + arch/arm/Kconfig | 11 +++++ >> + arch/arm/boot/compressed/atags_to_fdt.c | 72 ++++++++++++++++++++++++++++++++- >> + init/main.c | 16 ++++++++ >> + 3 files changed, 98 insertions(+), 1 deletion(-) >> + >> +--- a/arch/arm/Kconfig >> ++++ b/arch/arm/Kconfig >> +@@ -1948,6 +1948,17 @@ config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEN >> + The command-line arguments provided by the boot loader will be >> + appended to the the device tree bootargs property. >> + >> ++config ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE >> ++ bool "Append rootblock parsing bootloader's kernel arguments" >> ++ help >> ++ The command-line arguments provided by the boot loader will be >> ++ appended to a new device tree property: bootloader-args. >> ++ If there is a property "append-rootblock" in DT under /chosen >> ++ and a root= option in bootloaders command line it will be parsed >> ++ and added to DT bootargs with the form: <append-rootblock>XX. >> ++ Only command line ATAG will be processed, the rest of the ATAGs >> ++ sent by bootloader will be ignored. >> ++ >> + endchoice >> + >> + config CMDLINE >> +--- a/arch/arm/boot/compressed/atags_to_fdt.c >> ++++ b/arch/arm/boot/compressed/atags_to_fdt.c >> +@@ -3,6 +3,8 @@ >> + >> + #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND) >> + #define do_extend_cmdline 1 >> ++#elif defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) >> ++#define do_extend_cmdline 1 >> + #else >> + #define do_extend_cmdline 0 >> + #endif >> +@@ -66,6 +68,65 @@ static uint32_t get_cell_size(const void >> + return cell_size; >> + } >> + >> ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) >> ++ >> ++static char *append_rootblock(char *dest, const char *str, int len, void *fdt) >> ++{ >> ++ char *ptr, *end; >> ++ char *root="root="; >> ++ int i, l; >> ++ const char *rootblock; >> ++ >> ++ //ARM doesn't have __HAVE_ARCH_STRSTR, so search manually >> ++ ptr = str - 1; >> ++ >> ++ do { >> ++ //first find an 'r' at the begining or after a space >> ++ do { >> ++ ptr++; >> ++ ptr = strchr(ptr, 'r'); >> ++ if(!ptr) return dest; >> ++ >> ++ } while (ptr != str && *(ptr-1) != ' '); >> ++ >> ++ //then check for the rest >> ++ for(i = 1; i <= 4; i++) >> ++ if(*(ptr+i) != *(root+i)) break; >> ++ >> ++ } while (i != 5); >> ++ >> ++ end = strchr(ptr, ' '); >> ++ end = end ? (end - 1) : (strchr(ptr, 0) - 1); >> ++ >> ++ //find partition number (assumes format root=/dev/mtdXX | /dev/mtdblockXX | yy:XX ) >> ++ for( i = 0; end >= ptr && *end >= '0' && *end <= '9'; end--, i++); >> ++ ptr = end + 1; >> ++ >> ++ /* if append-rootblock property is set use it to append to command line */ >> ++ rootblock = getprop(fdt, "/chosen", "append-rootblock", &l); >> ++ if(rootblock != NULL) { >> ++ if(*dest != ' ') { >> ++ *dest = ' '; >> ++ dest++; >> ++ len++; >> ++ } >> ++ if (len + l + i <= COMMAND_LINE_SIZE) { >> ++ memcpy(dest, rootblock, l); >> ++ dest += l - 1; >> ++ memcpy(dest, ptr, i); >> ++ dest += i; >> ++ } >> ++ } else { >> ++ len = strlen(str); >> ++ if (len + 1 < COMMAND_LINE_SIZE) { >> ++ memcpy(dest, str, len); >> ++ dest += len; >> ++ } >> ++ } >> ++ return dest; >> ++} >> ++#endif >> ++ >> + static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) >> + { >> + char cmdline[COMMAND_LINE_SIZE]; >> +@@ -85,12 +140,21 @@ static void merge_fdt_bootargs(void *fdt >> + >> + /* and append the ATAG_CMDLINE */ >> + if (fdt_cmdline) { >> ++ >> ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) >> ++ //save original bootloader args >> ++ //and append ubi.mtd with root partition number to current cmdline >> ++ setprop_string(fdt, "/chosen", "bootloader-args", fdt_cmdline); >> ++ ptr = append_rootblock(ptr, fdt_cmdline, len, fdt); >> ++ >> ++#else >> + len = strlen(fdt_cmdline); >> + if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) { >> + *ptr++ = ' '; >> + memcpy(ptr, fdt_cmdline, len); >> + ptr += len; >> + } >> ++#endif >> + } >> + *ptr = '\0'; >> + >> +@@ -147,7 +211,9 @@ int atags_to_fdt(void *atag_list, void * >> + else >> + setprop_string(fdt, "/chosen", "bootargs", >> + atag->u.cmdline.cmdline); >> +- } else if (atag->hdr.tag == ATAG_MEM) { >> ++ } >> ++#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE >> ++ else if (atag->hdr.tag == ATAG_MEM) { >> + if (memcount >= sizeof(mem_reg_property)/4) >> + continue; >> + if (!atag->u.mem.size) >> +@@ -186,6 +252,10 @@ int atags_to_fdt(void *atag_list, void * >> + setprop(fdt, "/memory", "reg", mem_reg_property, >> + 4 * memcount * memsize); >> + } >> ++#else >> ++ >> ++ } >> ++#endif >> + >> + return fdt_pack(fdt); >> + } >> +--- a/init/main.c >> ++++ b/init/main.c >> +@@ -89,6 +89,10 @@ >> + #include <asm/sections.h> >> + #include <asm/cacheflush.h> >> + >> ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) >> ++#include <linux/of.h> >> ++#endif >> ++ >> + static int kernel_init(void *); >> + >> + extern void init_IRQ(void); >> +@@ -540,6 +544,18 @@ asmlinkage __visible void __init start_k >> + page_alloc_init(); >> + >> + pr_notice("Kernel command line: %s\n", boot_command_line); >> ++ >> ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) >> ++ //Show bootloader's original command line for reference >> ++ if(of_chosen) { >> ++ const char *prop = of_get_property(of_chosen, "bootloader-args", NULL); >> ++ if(prop) >> ++ pr_notice("Bootloader command line (ignored): %s\n", prop); >> ++ else >> ++ pr_notice("Bootloader command line not present\n"); >> ++ } >> ++#endif >> ++ >> + parse_early_param(); >> + after_dashes = parse_args("Booting kernel", >> + static_command_line, __start___param, > >
diff --git a/target/linux/mvebu/config-4.14 b/target/linux/mvebu/config-4.14 index a48a3c8c5e..694ecdfb82 100644 --- a/target/linux/mvebu/config-4.14 +++ b/target/linux/mvebu/config-4.14 @@ -42,6 +42,7 @@ CONFIG_ARM_APPENDED_DTB=y CONFIG_ARM_ATAG_DTB_COMPAT=y # CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y +CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE=y CONFIG_ARM_CPU_SUSPEND=y CONFIG_ARM_CRYPTO=y CONFIG_ARM_ERRATA_720789=y diff --git a/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts b/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts index ea44c8f0d2..00a4ee9f39 100644 --- a/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts +++ b/target/linux/mvebu/files-4.14/arch/arm/boot/dts/armada-385-linksys-venom.dts @@ -46,7 +46,13 @@ model = "Linksys WRT32X"; compatible = "linksys,venom", "linksys,armada385", "marvell,armada385", "marvell,armada380"; + + chosen { + bootargs = "console=ttyS0,115200"; + stdout-path = "serial0:115200n8"; + append-rootblock = "root=/dev/mtdblock"; }; +}; &expander0 { wan_amber@0 { diff --git a/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch b/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch new file mode 100644 index 0000000000..53275607e0 --- /dev/null +++ b/target/linux/mvebu/patches-4.14/006-mvebu-Mangle-bootloader-s-kernel-arguments.patch @@ -0,0 +1,201 @@ +From 71270226b14733a4b1f2cde58ea9265caa50b38d Mon Sep 17 00:00:00 2001 +From: Adrian Panella <ianchi74@outlook.com> +Date: Thu, 9 Mar 2017 09:37:17 +0100 +Subject: [PATCH 67/69] generic: Mangle bootloader's kernel arguments + +The command-line arguments provided by the boot loader will be +appended to a new device tree property: bootloader-args. +If there is a property "append-rootblock" in DT under /chosen +and a root= option in bootloaders command line it will be parsed +and added to DT bootargs with the form: <append-rootblock>XX. +Only command line ATAG will be processed, the rest of the ATAGs +sent by bootloader will be ignored. +This is usefull in dual boot systems, to get the current root partition +without afecting the rest of the system. + +Signed-off-by: Adrian Panella <ianchi74@outlook.com> + +This patch has been modified to be mvebu specific. The original patch +did not pass the bootloader cmdline on if no append-rootblock stanza +was found, resulting in blank cmdline and failure to boot. + +Signed-off-by: Michael Gray <michael.gray@lantisproject.com> +--- + arch/arm/Kconfig | 11 +++++ + arch/arm/boot/compressed/atags_to_fdt.c | 72 ++++++++++++++++++++++++++++++++- + init/main.c | 16 ++++++++ + 3 files changed, 98 insertions(+), 1 deletion(-) + +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -1948,6 +1948,17 @@ config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEN + The command-line arguments provided by the boot loader will be + appended to the the device tree bootargs property. + ++config ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE ++ bool "Append rootblock parsing bootloader's kernel arguments" ++ help ++ The command-line arguments provided by the boot loader will be ++ appended to a new device tree property: bootloader-args. ++ If there is a property "append-rootblock" in DT under /chosen ++ and a root= option in bootloaders command line it will be parsed ++ and added to DT bootargs with the form: <append-rootblock>XX. ++ Only command line ATAG will be processed, the rest of the ATAGs ++ sent by bootloader will be ignored. ++ + endchoice + + config CMDLINE +--- a/arch/arm/boot/compressed/atags_to_fdt.c ++++ b/arch/arm/boot/compressed/atags_to_fdt.c +@@ -3,6 +3,8 @@ + + #if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND) + #define do_extend_cmdline 1 ++#elif defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) ++#define do_extend_cmdline 1 + #else + #define do_extend_cmdline 0 + #endif +@@ -66,6 +68,65 @@ static uint32_t get_cell_size(const void + return cell_size; + } + ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) ++ ++static char *append_rootblock(char *dest, const char *str, int len, void *fdt) ++{ ++ char *ptr, *end; ++ char *root="root="; ++ int i, l; ++ const char *rootblock; ++ ++ //ARM doesn't have __HAVE_ARCH_STRSTR, so search manually ++ ptr = str - 1; ++ ++ do { ++ //first find an 'r' at the begining or after a space ++ do { ++ ptr++; ++ ptr = strchr(ptr, 'r'); ++ if(!ptr) return dest; ++ ++ } while (ptr != str && *(ptr-1) != ' '); ++ ++ //then check for the rest ++ for(i = 1; i <= 4; i++) ++ if(*(ptr+i) != *(root+i)) break; ++ ++ } while (i != 5); ++ ++ end = strchr(ptr, ' '); ++ end = end ? (end - 1) : (strchr(ptr, 0) - 1); ++ ++ //find partition number (assumes format root=/dev/mtdXX | /dev/mtdblockXX | yy:XX ) ++ for( i = 0; end >= ptr && *end >= '0' && *end <= '9'; end--, i++); ++ ptr = end + 1; ++ ++ /* if append-rootblock property is set use it to append to command line */ ++ rootblock = getprop(fdt, "/chosen", "append-rootblock", &l); ++ if(rootblock != NULL) { ++ if(*dest != ' ') { ++ *dest = ' '; ++ dest++; ++ len++; ++ } ++ if (len + l + i <= COMMAND_LINE_SIZE) { ++ memcpy(dest, rootblock, l); ++ dest += l - 1; ++ memcpy(dest, ptr, i); ++ dest += i; ++ } ++ } else { ++ len = strlen(str); ++ if (len + 1 < COMMAND_LINE_SIZE) { ++ memcpy(dest, str, len); ++ dest += len; ++ } ++ } ++ return dest; ++} ++#endif ++ + static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline) + { + char cmdline[COMMAND_LINE_SIZE]; +@@ -85,12 +140,21 @@ static void merge_fdt_bootargs(void *fdt + + /* and append the ATAG_CMDLINE */ + if (fdt_cmdline) { ++ ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) ++ //save original bootloader args ++ //and append ubi.mtd with root partition number to current cmdline ++ setprop_string(fdt, "/chosen", "bootloader-args", fdt_cmdline); ++ ptr = append_rootblock(ptr, fdt_cmdline, len, fdt); ++ ++#else + len = strlen(fdt_cmdline); + if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) { + *ptr++ = ' '; + memcpy(ptr, fdt_cmdline, len); + ptr += len; + } ++#endif + } + *ptr = '\0'; + +@@ -147,7 +211,9 @@ int atags_to_fdt(void *atag_list, void * + else + setprop_string(fdt, "/chosen", "bootargs", + atag->u.cmdline.cmdline); +- } else if (atag->hdr.tag == ATAG_MEM) { ++ } ++#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE ++ else if (atag->hdr.tag == ATAG_MEM) { + if (memcount >= sizeof(mem_reg_property)/4) + continue; + if (!atag->u.mem.size) +@@ -186,6 +252,10 @@ int atags_to_fdt(void *atag_list, void * + setprop(fdt, "/memory", "reg", mem_reg_property, + 4 * memcount * memsize); + } ++#else ++ ++ } ++#endif + + return fdt_pack(fdt); + } +--- a/init/main.c ++++ b/init/main.c +@@ -89,6 +89,10 @@ + #include <asm/sections.h> + #include <asm/cacheflush.h> + ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) ++#include <linux/of.h> ++#endif ++ + static int kernel_init(void *); + + extern void init_IRQ(void); +@@ -540,6 +544,18 @@ asmlinkage __visible void __init start_k + page_alloc_init(); + + pr_notice("Kernel command line: %s\n", boot_command_line); ++ ++#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE) ++ //Show bootloader's original command line for reference ++ if(of_chosen) { ++ const char *prop = of_get_property(of_chosen, "bootloader-args", NULL); ++ if(prop) ++ pr_notice("Bootloader command line (ignored): %s\n", prop); ++ else ++ pr_notice("Bootloader command line not present\n"); ++ } ++#endif ++ + parse_early_param(); + after_dashes = parse_args("Booting kernel", + static_command_line, __start___param,