oxnas: allow booting with legacy loaders
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
parent
02a9a74d17
commit
fe89f90119
4 changed files with 387 additions and 23 deletions
|
@ -23,6 +23,11 @@ CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
|
||||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||||
CONFIG_ARCH_WANT_LIBATA_LEDS=y
|
CONFIG_ARCH_WANT_LIBATA_LEDS=y
|
||||||
CONFIG_ARM=y
|
CONFIG_ARM=y
|
||||||
|
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 is not set
|
||||||
|
CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE=y
|
||||||
CONFIG_ARM_CPUIDLE=y
|
CONFIG_ARM_CPUIDLE=y
|
||||||
# CONFIG_ARM_CPU_SUSPEND is not set
|
# CONFIG_ARM_CPU_SUSPEND is not set
|
||||||
CONFIG_ARM_DMA_IOMMU_ALIGNMENT=8
|
CONFIG_ARM_DMA_IOMMU_ALIGNMENT=8
|
||||||
|
@ -51,7 +56,6 @@ CONFIG_CLKSRC_RPS_TIMER=y
|
||||||
CONFIG_CLONE_BACKWARDS=y
|
CONFIG_CLONE_BACKWARDS=y
|
||||||
CONFIG_CMDLINE="console=ttyS0,115200n8 earlyprintk=serial"
|
CONFIG_CMDLINE="console=ttyS0,115200n8 earlyprintk=serial"
|
||||||
CONFIG_COMMON_CLK=y
|
CONFIG_COMMON_CLK=y
|
||||||
# CONFIG_COMMON_CLK_PWM is not set
|
|
||||||
CONFIG_COMPACTION=y
|
CONFIG_COMPACTION=y
|
||||||
CONFIG_CONSOLE_POLL=y
|
CONFIG_CONSOLE_POLL=y
|
||||||
CONFIG_COREDUMP=y
|
CONFIG_COREDUMP=y
|
||||||
|
@ -79,6 +83,8 @@ CONFIG_CRC16=y
|
||||||
CONFIG_CRC32_SLICEBY8=y
|
CONFIG_CRC32_SLICEBY8=y
|
||||||
CONFIG_CRYPTO_DEFLATE=y
|
CONFIG_CRYPTO_DEFLATE=y
|
||||||
CONFIG_CRYPTO_LZO=y
|
CONFIG_CRYPTO_LZO=y
|
||||||
|
CONFIG_CRYPTO_RNG2=y
|
||||||
|
CONFIG_CRYPTO_WORKQUEUE=y
|
||||||
CONFIG_CRYPTO_XZ=y
|
CONFIG_CRYPTO_XZ=y
|
||||||
CONFIG_DCACHE_WORD_ACCESS=y
|
CONFIG_DCACHE_WORD_ACCESS=y
|
||||||
CONFIG_DEBUG_ICEDCC=y
|
CONFIG_DEBUG_ICEDCC=y
|
||||||
|
@ -86,6 +92,7 @@ CONFIG_DEBUG_LL=y
|
||||||
CONFIG_DEBUG_LL_INCLUDE="debug/icedcc.S"
|
CONFIG_DEBUG_LL_INCLUDE="debug/icedcc.S"
|
||||||
# CONFIG_DEBUG_UART_8250 is not set
|
# CONFIG_DEBUG_UART_8250 is not set
|
||||||
# CONFIG_DEBUG_USER is not set
|
# CONFIG_DEBUG_USER is not set
|
||||||
|
# CONFIG_DEFAULT_CFQ is not set
|
||||||
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=16
|
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=16
|
||||||
CONFIG_DETECT_HUNG_TASK=y
|
CONFIG_DETECT_HUNG_TASK=y
|
||||||
CONFIG_DIRECT_IO=y
|
CONFIG_DIRECT_IO=y
|
||||||
|
@ -173,7 +180,6 @@ CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||||
CONFIG_HAVE_UID16=y
|
CONFIG_HAVE_UID16=y
|
||||||
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
|
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
|
||||||
CONFIG_HOTPLUG_CPU=y
|
CONFIG_HOTPLUG_CPU=y
|
||||||
# CONFIG_HSU_DMA_PCI is not set
|
|
||||||
CONFIG_HZ_FIXED=0
|
CONFIG_HZ_FIXED=0
|
||||||
CONFIG_I2C=y
|
CONFIG_I2C=y
|
||||||
CONFIG_I2C_ALGOBIT=y
|
CONFIG_I2C_ALGOBIT=y
|
||||||
|
@ -187,6 +193,7 @@ CONFIG_IOMMU_IO_PGTABLE=y
|
||||||
CONFIG_IOMMU_IO_PGTABLE_LPAE=y
|
CONFIG_IOMMU_IO_PGTABLE_LPAE=y
|
||||||
# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set
|
# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set
|
||||||
CONFIG_IOMMU_SUPPORT=y
|
CONFIG_IOMMU_SUPPORT=y
|
||||||
|
CONFIG_IOSCHED_CFQ=y
|
||||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||||
# CONFIG_IP_MULTICAST is not set
|
# CONFIG_IP_MULTICAST is not set
|
||||||
CONFIG_IP_PNP=y
|
CONFIG_IP_PNP=y
|
||||||
|
@ -279,7 +286,6 @@ CONFIG_PCIEASPM_DEFAULT=y
|
||||||
# CONFIG_PCIEASPM_PERFORMANCE is not set
|
# CONFIG_PCIEASPM_PERFORMANCE is not set
|
||||||
# CONFIG_PCIEASPM_POWERSAVE is not set
|
# CONFIG_PCIEASPM_POWERSAVE is not set
|
||||||
CONFIG_PCIEPORTBUS=y
|
CONFIG_PCIEPORTBUS=y
|
||||||
# CONFIG_PCIE_IPROC is not set
|
|
||||||
CONFIG_PCIE_PME=y
|
CONFIG_PCIE_PME=y
|
||||||
# CONFIG_PCI_DOMAINS_GENERIC is not set
|
# CONFIG_PCI_DOMAINS_GENERIC is not set
|
||||||
CONFIG_PCI_OXNAS=y
|
CONFIG_PCI_OXNAS=y
|
||||||
|
@ -295,16 +301,12 @@ CONFIG_PM_CLK=y
|
||||||
CONFIG_POWER_RESET=y
|
CONFIG_POWER_RESET=y
|
||||||
# CONFIG_POWER_RESET_BRCMSTB is not set
|
# CONFIG_POWER_RESET_BRCMSTB is not set
|
||||||
CONFIG_POWER_RESET_GPIO=y
|
CONFIG_POWER_RESET_GPIO=y
|
||||||
# CONFIG_POWER_RESET_GPIO_RESTART is not set
|
|
||||||
# CONFIG_POWER_RESET_LTC2952 is not set
|
|
||||||
# CONFIG_POWER_RESET_SYSCON is not set
|
|
||||||
CONFIG_POWER_RESET_SYSCON_POWEROFF=y
|
CONFIG_POWER_RESET_SYSCON_POWEROFF=y
|
||||||
CONFIG_POWER_SUPPLY=y
|
CONFIG_POWER_SUPPLY=y
|
||||||
CONFIG_PPS=y
|
CONFIG_PPS=y
|
||||||
CONFIG_PRINTK_TIME=y
|
CONFIG_PRINTK_TIME=y
|
||||||
CONFIG_PTP_1588_CLOCK=y
|
CONFIG_PTP_1588_CLOCK=y
|
||||||
CONFIG_PWM=y
|
CONFIG_PWM=y
|
||||||
# CONFIG_PWM_FSL_FTM is not set
|
|
||||||
CONFIG_PWM_SYSFS=y
|
CONFIG_PWM_SYSFS=y
|
||||||
CONFIG_RAS=y
|
CONFIG_RAS=y
|
||||||
CONFIG_RATIONAL=y
|
CONFIG_RATIONAL=y
|
||||||
|
|
|
@ -23,6 +23,11 @@ CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
|
||||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||||
CONFIG_ARCH_WANT_LIBATA_LEDS=y
|
CONFIG_ARCH_WANT_LIBATA_LEDS=y
|
||||||
CONFIG_ARM=y
|
CONFIG_ARM=y
|
||||||
|
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 is not set
|
||||||
|
CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE=y
|
||||||
CONFIG_ARM_CPUIDLE=y
|
CONFIG_ARM_CPUIDLE=y
|
||||||
# CONFIG_ARM_CPU_SUSPEND is not set
|
# CONFIG_ARM_CPU_SUSPEND is not set
|
||||||
CONFIG_ARM_DMA_IOMMU_ALIGNMENT=8
|
CONFIG_ARM_DMA_IOMMU_ALIGNMENT=8
|
||||||
|
@ -35,6 +40,7 @@ CONFIG_ARM_SMMU=y
|
||||||
CONFIG_ARM_THUMB=y
|
CONFIG_ARM_THUMB=y
|
||||||
CONFIG_ARM_UNWIND=y
|
CONFIG_ARM_UNWIND=y
|
||||||
CONFIG_ATA_LEDS=y
|
CONFIG_ATA_LEDS=y
|
||||||
|
CONFIG_ATAGS=y
|
||||||
CONFIG_AUTO_ZRELADDR=y
|
CONFIG_AUTO_ZRELADDR=y
|
||||||
# CONFIG_BLK_DEV_INITRD is not set
|
# CONFIG_BLK_DEV_INITRD is not set
|
||||||
CONFIG_BLK_DEV_SD=y
|
CONFIG_BLK_DEV_SD=y
|
||||||
|
@ -50,6 +56,7 @@ CONFIG_CLKSRC_PROBE=y
|
||||||
CONFIG_CLKSRC_RPS_TIMER=y
|
CONFIG_CLKSRC_RPS_TIMER=y
|
||||||
CONFIG_CLONE_BACKWARDS=y
|
CONFIG_CLONE_BACKWARDS=y
|
||||||
CONFIG_CMDLINE="console=ttyS0,115200n8 earlyprintk=serial"
|
CONFIG_CMDLINE="console=ttyS0,115200n8 earlyprintk=serial"
|
||||||
|
CONFIG_CMDLINE_FROM_BOOTLOADER=y
|
||||||
CONFIG_COMMON_CLK=y
|
CONFIG_COMMON_CLK=y
|
||||||
CONFIG_COMPACTION=y
|
CONFIG_COMPACTION=y
|
||||||
CONFIG_CONSOLE_POLL=y
|
CONFIG_CONSOLE_POLL=y
|
||||||
|
@ -89,6 +96,7 @@ CONFIG_DEBUG_LL_INCLUDE="debug/icedcc.S"
|
||||||
# CONFIG_DEBUG_UART_8250 is not set
|
# CONFIG_DEBUG_UART_8250 is not set
|
||||||
# CONFIG_DEBUG_USER is not set
|
# CONFIG_DEBUG_USER is not set
|
||||||
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=16
|
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=16
|
||||||
|
CONFIG_DEPRECATED_PARAM_STRUCT=y
|
||||||
CONFIG_DETECT_HUNG_TASK=y
|
CONFIG_DETECT_HUNG_TASK=y
|
||||||
CONFIG_DIRECT_IO=y
|
CONFIG_DIRECT_IO=y
|
||||||
CONFIG_DMADEVICES=y
|
CONFIG_DMADEVICES=y
|
||||||
|
@ -100,13 +108,7 @@ CONFIG_DNOTIFY=y
|
||||||
CONFIG_DTC=y
|
CONFIG_DTC=y
|
||||||
CONFIG_DT_IDLE_STATES=y
|
CONFIG_DT_IDLE_STATES=y
|
||||||
CONFIG_DWMAC_GENERIC=y
|
CONFIG_DWMAC_GENERIC=y
|
||||||
# CONFIG_DWMAC_IPQ806X is not set
|
|
||||||
# CONFIG_DWMAC_LPC18XX is not set
|
|
||||||
# CONFIG_DWMAC_MESON is not set
|
|
||||||
CONFIG_DWMAC_OXNAS=y
|
CONFIG_DWMAC_OXNAS=y
|
||||||
# CONFIG_DWMAC_ROCKCHIP is not set
|
|
||||||
# CONFIG_DWMAC_SOCFPGA is not set
|
|
||||||
# CONFIG_DWMAC_STI is not set
|
|
||||||
# CONFIG_DWMAC_SUNXI is not set
|
# CONFIG_DWMAC_SUNXI is not set
|
||||||
# CONFIG_DW_DMAC_PCI is not set
|
# CONFIG_DW_DMAC_PCI is not set
|
||||||
CONFIG_EARLY_PRINTK=y
|
CONFIG_EARLY_PRINTK=y
|
||||||
|
@ -167,11 +169,6 @@ CONFIG_HAVE_FUNCTION_TRACER=y
|
||||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||||
CONFIG_HAVE_IDE=y
|
CONFIG_HAVE_IDE=y
|
||||||
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
||||||
CONFIG_HAVE_KERNEL_GZIP=y
|
|
||||||
CONFIG_HAVE_KERNEL_LZ4=y
|
|
||||||
CONFIG_HAVE_KERNEL_LZMA=y
|
|
||||||
CONFIG_HAVE_KERNEL_LZO=y
|
|
||||||
CONFIG_HAVE_KERNEL_XZ=y
|
|
||||||
CONFIG_HAVE_MEMBLOCK=y
|
CONFIG_HAVE_MEMBLOCK=y
|
||||||
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
||||||
CONFIG_HAVE_NET_DSA=y
|
CONFIG_HAVE_NET_DSA=y
|
||||||
|
@ -229,8 +226,6 @@ CONFIG_LDM_PARTITION=y
|
||||||
CONFIG_LIBFDT=y
|
CONFIG_LIBFDT=y
|
||||||
CONFIG_LOCKUP_DETECTOR=y
|
CONFIG_LOCKUP_DETECTOR=y
|
||||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||||
CONFIG_LZ4_COMPRESS=y
|
|
||||||
CONFIG_LZ4_DECOMPRESS=y
|
|
||||||
CONFIG_LZO_COMPRESS=y
|
CONFIG_LZO_COMPRESS=y
|
||||||
CONFIG_LZO_DECOMPRESS=y
|
CONFIG_LZO_DECOMPRESS=y
|
||||||
CONFIG_MACH_OX820=y
|
CONFIG_MACH_OX820=y
|
||||||
|
@ -305,7 +300,6 @@ CONFIG_PM=y
|
||||||
CONFIG_PM_CLK=y
|
CONFIG_PM_CLK=y
|
||||||
# CONFIG_PM_DEBUG is not set
|
# CONFIG_PM_DEBUG is not set
|
||||||
CONFIG_POWER_RESET=y
|
CONFIG_POWER_RESET=y
|
||||||
# CONFIG_POWER_RESET_BRCMSTB is not set
|
|
||||||
CONFIG_POWER_RESET_GPIO=y
|
CONFIG_POWER_RESET_GPIO=y
|
||||||
CONFIG_POWER_RESET_SYSCON_POWEROFF=y
|
CONFIG_POWER_RESET_SYSCON_POWEROFF=y
|
||||||
CONFIG_POWER_SUPPLY=y
|
CONFIG_POWER_SUPPLY=y
|
||||||
|
@ -339,14 +333,12 @@ CONFIG_SERIAL_8250_PCI=y
|
||||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=1
|
CONFIG_SERIAL_8250_RUNTIME_UARTS=1
|
||||||
# CONFIG_SERIAL_KGDB_NMI is not set
|
# CONFIG_SERIAL_KGDB_NMI is not set
|
||||||
CONFIG_SERIAL_OF_PLATFORM=y
|
CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
# CONFIG_SG_SPLIT is not set
|
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
CONFIG_SMP_ON_UP=y
|
CONFIG_SMP_ON_UP=y
|
||||||
CONFIG_SRCU=y
|
CONFIG_SRCU=y
|
||||||
CONFIG_STMMAC_ETH=y
|
CONFIG_STMMAC_ETH=y
|
||||||
CONFIG_STMMAC_PLATFORM=y
|
CONFIG_STMMAC_PLATFORM=y
|
||||||
# CONFIG_STRIP_ASM_SYMS is not set
|
# CONFIG_STRIP_ASM_SYMS is not set
|
||||||
# CONFIG_SUNXI_SRAM is not set
|
|
||||||
CONFIG_SWIOTLB=y
|
CONFIG_SWIOTLB=y
|
||||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||||
CONFIG_TREE_RCU=y
|
CONFIG_TREE_RCU=y
|
||||||
|
|
|
@ -0,0 +1,185 @@
|
||||||
|
Author: Adrian Panella <ianchi74@outlook.com>
|
||||||
|
Date: Fri Jun 10 19:10:15 2016 -0500
|
||||||
|
|
||||||
|
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>
|
||||||
|
|
||||||
|
--- a/arch/arm/Kconfig
|
||||||
|
+++ b/arch/arm/Kconfig
|
||||||
|
@@ -1928,6 +1928,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,59 @@ 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;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ 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
|
||||||
|
@@ -88,6 +88,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);
|
||||||
|
@@ -560,6 +564,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,
|
|
@ -0,0 +1,185 @@
|
||||||
|
Author: Adrian Panella <ianchi74@outlook.com>
|
||||||
|
Date: Fri Jun 10 19:10:15 2016 -0500
|
||||||
|
|
||||||
|
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>
|
||||||
|
|
||||||
|
--- a/arch/arm/Kconfig
|
||||||
|
+++ b/arch/arm/Kconfig
|
||||||
|
@@ -1928,6 +1928,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,59 @@ 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;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ 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
|
||||||
|
@@ -88,6 +88,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);
|
||||||
|
@@ -560,6 +564,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,
|
Loading…
Reference in a new issue