Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[PATCH] m68k: generalize uboot command line support

0 views
Skip to first unread message

Greg Ungerer

unread,
Sep 8, 2016, 9:10:30 PM9/8/16
to linux...@vger.kernel.org, Greg Ungerer
The uboot command line support needs to be used by both MMU and no-MMU
setups, but currently we only have the code in the no-MMU code paths.
Move the uboot command line processing code into its own file. Add
appropriate calls to it from both the MMU and no-MMU arch setup code.

Signed-off-by: Greg Ungerer <ge...@linux-m68k.org>
---
arch/m68k/include/asm/bootinfo.h | 4 ++
arch/m68k/kernel/Makefile | 1 +
arch/m68k/kernel/setup_mm.c | 3 ++
arch/m68k/kernel/setup_no.c | 79 +----------------------------
arch/m68k/kernel/uboot.c | 107 +++++++++++++++++++++++++++++++++++++++
5 files changed, 117 insertions(+), 77 deletions(-)
create mode 100644 arch/m68k/kernel/uboot.c

diff --git a/arch/m68k/include/asm/bootinfo.h b/arch/m68k/include/asm/bootinfo.h
index 8e21326..f679843 100644
--- a/arch/m68k/include/asm/bootinfo.h
+++ b/arch/m68k/include/asm/bootinfo.h
@@ -22,6 +22,10 @@ extern void save_bootinfo(const struct bi_record *bi);
static inline void save_bootinfo(const struct bi_record *bi) {}
#endif

+#ifdef CONFIG_UBOOT
+void process_uboot_commandline(char *commandp, int size);
+#endif
+
#endif /* __ASSEMBLY__ */


diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile
index e47778f..8a1c4d3 100644
--- a/arch/m68k/kernel/Makefile
+++ b/arch/m68k/kernel/Makefile
@@ -24,6 +24,7 @@ obj-$(CONFIG_HAS_DMA) += dma.o

obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
obj-$(CONFIG_BOOTINFO_PROC) += bootinfo_proc.o
+obj-$(CONFIG_UBOOT) += uboot.o

obj-$(CONFIG_EARLY_PRINTK) += early_printk.o

diff --git a/arch/m68k/kernel/setup_mm.c b/arch/m68k/kernel/setup_mm.c
index 9afad2b..6f6ffb3 100644
--- a/arch/m68k/kernel/setup_mm.c
+++ b/arch/m68k/kernel/setup_mm.c
@@ -274,6 +274,9 @@ void __init setup_arch(char **cmdline_p)
strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE);
m68k_command_line[CL_SIZE - 1] = 0;
#endif /* CONFIG_BOOTPARAM */
+#if defined(CONFIG_UBOOT)
+ process_uboot_commandline(&m68k_command_line[0], CL_SIZE);
+#endif
*cmdline_p = m68k_command_line;
memcpy(boot_command_line, *cmdline_p, CL_SIZE);

diff --git a/arch/m68k/kernel/setup_no.c b/arch/m68k/kernel/setup_no.c
index 9309789..72d272e 100644
--- a/arch/m68k/kernel/setup_no.c
+++ b/arch/m68k/kernel/setup_no.c
@@ -34,6 +34,7 @@
#include <linux/rtc.h>

#include <asm/setup.h>
+#include <asm/bootinfo.h>
#include <asm/irq.h>
#include <asm/machdep.h>
#include <asm/pgtable.h>
@@ -82,69 +83,6 @@ void (*mach_power_off)(void);
#define CPU_INSTR_PER_JIFFY 16
#endif

-#if defined(CONFIG_UBOOT)
-/*
- * parse_uboot_commandline
- *
- * Copies u-boot commandline arguments and store them in the proper linux
- * variables.
- *
- * Assumes:
- * _init_sp global contains the address in the stack pointer when the
- * kernel starts (see head.S::_start)
- *
- * U-Boot calling convention:
- * (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
- *
- * _init_sp can be parsed as such
- *
- * _init_sp+00 = u-boot cmd after jsr into kernel (skip)
- * _init_sp+04 = &kernel board_info (residual data)
- * _init_sp+08 = &initrd_start
- * _init_sp+12 = &initrd_end
- * _init_sp+16 = &cmd_start
- * _init_sp+20 = &cmd_end
- *
- * This also assumes that the memory locations pointed to are still
- * unmodified. U-boot places them near the end of external SDRAM.
- *
- * Argument(s):
- * commandp = the linux commandline arg container to fill.
- * size = the sizeof commandp.
- *
- * Returns:
- */
-static void __init parse_uboot_commandline(char *commandp, int size)
-{
- extern unsigned long _init_sp;
- unsigned long *sp;
- unsigned long uboot_kbd;
- unsigned long uboot_initrd_start, uboot_initrd_end;
- unsigned long uboot_cmd_start, uboot_cmd_end;
-
-
- sp = (unsigned long *)_init_sp;
- uboot_kbd = sp[1];
- uboot_initrd_start = sp[2];
- uboot_initrd_end = sp[3];
- uboot_cmd_start = sp[4];
- uboot_cmd_end = sp[5];
-
- if (uboot_cmd_start && uboot_cmd_end)
- strncpy(commandp, (const char *)uboot_cmd_start, size);
-#if defined(CONFIG_BLK_DEV_INITRD)
- if (uboot_initrd_start && uboot_initrd_end &&
- (uboot_initrd_end > uboot_initrd_start)) {
- initrd_start = uboot_initrd_start;
- initrd_end = uboot_initrd_end;
- ROOT_DEV = Root_RAM0;
- printk(KERN_INFO "initrd at 0x%lx:0x%lx\n",
- initrd_start, initrd_end);
- }
-#endif /* if defined(CONFIG_BLK_DEV_INITRD) */
-}
-#endif /* #if defined(CONFIG_UBOOT) */
-
void __init setup_arch(char **cmdline_p)
{
int bootmap_size;
@@ -165,20 +103,7 @@ void __init setup_arch(char **cmdline_p)
#endif /* CONFIG_BOOTPARAM */

#if defined(CONFIG_UBOOT)
- /* CONFIG_UBOOT and CONFIG_BOOTPARAM defined, concatenate cmdline */
- #if defined(CONFIG_BOOTPARAM)
- /* Add the whitespace separator */
- command_line[strlen(CONFIG_BOOTPARAM_STRING)] = ' ';
- /* Parse uboot command line into the rest of the buffer */
- parse_uboot_commandline(
- &command_line[(strlen(CONFIG_BOOTPARAM_STRING)+1)],
- (sizeof(command_line) -
- (strlen(CONFIG_BOOTPARAM_STRING)+1)));
- /* Only CONFIG_UBOOT defined, create cmdline */
- #else
- parse_uboot_commandline(&command_line[0], sizeof(command_line));
- #endif /* CONFIG_BOOTPARAM */
- command_line[sizeof(command_line) - 1] = 0;
+ process_uboot_commandline(&command_line[0], sizeof(command_line));
#endif /* CONFIG_UBOOT */

printk(KERN_INFO "\x0F\r\n\nuClinux/" CPU_NAME "\n");
diff --git a/arch/m68k/kernel/uboot.c b/arch/m68k/kernel/uboot.c
new file mode 100644
index 0000000..b3536a8
--- /dev/null
+++ b/arch/m68k/kernel/uboot.c
@@ -0,0 +1,107 @@
+/*
+ * uboot.c -- uboot arguments support
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/fb.h>
+#include <linux/module.h>
+#include <linux/mm.h>
+#include <linux/console.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/bootmem.h>
+#include <linux/seq_file.h>
+#include <linux/init.h>
+#include <linux/initrd.h>
+#include <linux/root_dev.h>
+#include <linux/rtc.h>
+
+#include <asm/setup.h>
+#include <asm/irq.h>
+#include <asm/machdep.h>
+#include <asm/pgtable.h>
+#include <asm/sections.h>
+
+/*
+ * parse_uboot_commandline
+ *
+ * Copies u-boot commandline arguments and store them in the proper linux
+ * variables.
+ *
+ * Assumes:
+ * _init_sp global contains the address in the stack pointer when the
+ * kernel starts (see head.S::_start)
+ *
+ * U-Boot calling convention:
+ * (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
+ *
+ * _init_sp can be parsed as such
+ *
+ * _init_sp+00 = u-boot cmd after jsr into kernel (skip)
+ * _init_sp+04 = &kernel board_info (residual data)
+ * _init_sp+08 = &initrd_start
+ * _init_sp+12 = &initrd_end
+ * _init_sp+16 = &cmd_start
+ * _init_sp+20 = &cmd_end
+ *
+ * This also assumes that the memory locations pointed to are still
+ * unmodified. U-boot places them near the end of external SDRAM.
+ *
+ * Argument(s):
+ * commandp = the linux commandline arg container to fill.
+ * size = the sizeof commandp.
+ *
+ * Returns:
+ */
+static void __init parse_uboot_commandline(char *commandp, int size)
+{
+ extern unsigned long _init_sp;
+ unsigned long *sp;
+ unsigned long uboot_kbd;
+ unsigned long uboot_initrd_start, uboot_initrd_end;
+ unsigned long uboot_cmd_start, uboot_cmd_end;
+
+ sp = (unsigned long *)_init_sp;
+ uboot_kbd = sp[1];
+ uboot_initrd_start = sp[2];
+ uboot_initrd_end = sp[3];
+ uboot_cmd_start = sp[4];
+ uboot_cmd_end = sp[5];
+
+ if (uboot_cmd_start && uboot_cmd_end)
+ strncpy(commandp, (const char *)uboot_cmd_start, size);
+#if defined(CONFIG_BLK_DEV_INITRD)
+ if (uboot_initrd_start && uboot_initrd_end &&
+ (uboot_initrd_end > uboot_initrd_start)) {
+ initrd_start = uboot_initrd_start;
+ initrd_end = uboot_initrd_end;
+ ROOT_DEV = Root_RAM0;
+ printk(KERN_INFO "initrd at 0x%lx:0x%lx\n",
+ initrd_start, initrd_end);
+ }
+#endif /* if defined(CONFIG_BLK_DEV_INITRD) */
+}
+
+__init void process_uboot_commandline(char *commandp, int size)
+{
+ int len, n;
+
+ n = strnlen(commandp, size);
+ commandp += n;
+ len = size - n;
+ if (len) {
+ /* Add the whitespace separator */
+ *commandp++ = ' ';
+ len--;
+ }
+
+ parse_uboot_commandline(commandp, len);
+ commandp[size - 1] = 0;
+}
--
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
the body of a message to majo...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

Geert Uytterhoeven

unread,
Sep 9, 2016, 2:31:50 AM9/9/16
to Greg Ungerer, Linux/m68k
Hi Greg,

On Fri, Sep 9, 2016 at 3:10 AM, Greg Ungerer <ge...@linux-m68k.org> wrote:
> --- a/arch/m68k/include/asm/bootinfo.h
> +++ b/arch/m68k/include/asm/bootinfo.h
> @@ -22,6 +22,10 @@ extern void save_bootinfo(const struct bi_record *bi);
> static inline void save_bootinfo(const struct bi_record *bi) {}
> #endif
>
> +#ifdef CONFIG_UBOOT
> +void process_uboot_commandline(char *commandp, int size);
> +#endif

What about providing a dummy for the !CONFIG_UBOOT case..

> --- a/arch/m68k/kernel/setup_mm.c
> +++ b/arch/m68k/kernel/setup_mm.c
> @@ -274,6 +274,9 @@ void __init setup_arch(char **cmdline_p)
> strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE);
> m68k_command_line[CL_SIZE - 1] = 0;
> #endif /* CONFIG_BOOTPARAM */
> +#if defined(CONFIG_UBOOT)
> + process_uboot_commandline(&m68k_command_line[0], CL_SIZE);
> +#endif

.. so you can drop the #if and #endif here?

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds

Greg Ungerer

unread,
Sep 9, 2016, 2:48:32 AM9/9/16
to Geert Uytterhoeven, Linux/m68k
Hi Geert,

On 09/09/16 16:20, Geert Uytterhoeven wrote:
> Hi Greg,
>
> On Fri, Sep 9, 2016 at 3:10 AM, Greg Ungerer <ge...@linux-m68k.org> wrote:
>> --- a/arch/m68k/include/asm/bootinfo.h
>> +++ b/arch/m68k/include/asm/bootinfo.h
>> @@ -22,6 +22,10 @@ extern void save_bootinfo(const struct bi_record *bi);
>> static inline void save_bootinfo(const struct bi_record *bi) {}
>> #endif
>>
>> +#ifdef CONFIG_UBOOT
>> +void process_uboot_commandline(char *commandp, int size);
>> +#endif
>
> What about providing a dummy for the !CONFIG_UBOOT case..
>
>> --- a/arch/m68k/kernel/setup_mm.c
>> +++ b/arch/m68k/kernel/setup_mm.c
>> @@ -274,6 +274,9 @@ void __init setup_arch(char **cmdline_p)
>> strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE);
>> m68k_command_line[CL_SIZE - 1] = 0;
>> #endif /* CONFIG_BOOTPARAM */
>> +#if defined(CONFIG_UBOOT)
>> + process_uboot_commandline(&m68k_command_line[0], CL_SIZE);
>> +#endif
>
> ... so you can drop the #if and #endif here?

Yep, good idea. I'll re-spin with that.

Thanks
Greg

Greg Ungerer

unread,
Sep 9, 2016, 3:13:58 AM9/9/16
to linux...@vger.kernel.org, Greg Ungerer
The uboot command line support needs to be used by both MMU and no-MMU
setups, but currently we only have the code in the no-MMU code paths.
Move the uboot command line processing code into its own file. Add
appropriate calls to it from both the MMU and no-MMU arch setup code.

Signed-off-by: Greg Ungerer <ge...@linux-m68k.org>
---
arch/m68k/include/asm/bootinfo.h | 6 +++
arch/m68k/kernel/Makefile | 1 +
arch/m68k/kernel/setup_mm.c | 1 +
arch/m68k/kernel/setup_no.c | 81 +----------------------------
arch/m68k/kernel/uboot.c | 107 +++++++++++++++++++++++++++++++++++++++
5 files changed, 117 insertions(+), 79 deletions(-)
create mode 100644 arch/m68k/kernel/uboot.c

diff --git a/arch/m68k/include/asm/bootinfo.h b/arch/m68k/include/asm/bootinfo.h
index 8e21326..81c91af 100644
--- a/arch/m68k/include/asm/bootinfo.h
+++ b/arch/m68k/include/asm/bootinfo.h
@@ -22,6 +22,12 @@ extern void save_bootinfo(const struct bi_record *bi);
static inline void save_bootinfo(const struct bi_record *bi) {}
#endif

+#ifdef CONFIG_UBOOT
+void process_uboot_commandline(char *commandp, int size);
+#else
+static inline void process_uboot_commandline(char *commandp, int size) {}
+#endif
+
#endif /* __ASSEMBLY__ */


diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile
index e47778f..8a1c4d3 100644
--- a/arch/m68k/kernel/Makefile
+++ b/arch/m68k/kernel/Makefile
@@ -24,6 +24,7 @@ obj-$(CONFIG_HAS_DMA) += dma.o

obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
obj-$(CONFIG_BOOTINFO_PROC) += bootinfo_proc.o
+obj-$(CONFIG_UBOOT) += uboot.o

obj-$(CONFIG_EARLY_PRINTK) += early_printk.o

diff --git a/arch/m68k/kernel/setup_mm.c b/arch/m68k/kernel/setup_mm.c
index 9afad2b..9f61f51 100644
--- a/arch/m68k/kernel/setup_mm.c
+++ b/arch/m68k/kernel/setup_mm.c
@@ -274,6 +274,7 @@ void __init setup_arch(char **cmdline_p)
strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE);
m68k_command_line[CL_SIZE - 1] = 0;
#endif /* CONFIG_BOOTPARAM */
+ process_uboot_commandline(&m68k_command_line[0], CL_SIZE);
*cmdline_p = m68k_command_line;
memcpy(boot_command_line, *cmdline_p, CL_SIZE);

diff --git a/arch/m68k/kernel/setup_no.c b/arch/m68k/kernel/setup_no.c
index 9309789..4bde2c1 100644
@@ -164,22 +102,7 @@ void __init setup_arch(char **cmdline_p)
command_line[sizeof(command_line) - 1] = 0;
#endif /* CONFIG_BOOTPARAM */

-#if defined(CONFIG_UBOOT)
- /* CONFIG_UBOOT and CONFIG_BOOTPARAM defined, concatenate cmdline */
- #if defined(CONFIG_BOOTPARAM)
- /* Add the whitespace separator */
- command_line[strlen(CONFIG_BOOTPARAM_STRING)] = ' ';
- /* Parse uboot command line into the rest of the buffer */
- parse_uboot_commandline(
- &command_line[(strlen(CONFIG_BOOTPARAM_STRING)+1)],
- (sizeof(command_line) -
- (strlen(CONFIG_BOOTPARAM_STRING)+1)));
- /* Only CONFIG_UBOOT defined, create cmdline */
- #else
- parse_uboot_commandline(&command_line[0], sizeof(command_line));
- #endif /* CONFIG_BOOTPARAM */
- command_line[sizeof(command_line) - 1] = 0;
-#endif /* CONFIG_UBOOT */
+ process_uboot_commandline(&command_line[0], sizeof(command_line));

Geert Uytterhoeven

unread,
Sep 9, 2016, 3:33:04 AM9/9/16
to Greg Ungerer, Linux/m68k
Hi Greg,

On Fri, Sep 9, 2016 at 9:13 AM, Greg Ungerer <ge...@linux-m68k.org> wrote:
> The uboot command line support needs to be used by both MMU and no-MMU
> setups, but currently we only have the code in the no-MMU code paths.
> Move the uboot command line processing code into its own file. Add
> appropriate calls to it from both the MMU and no-MMU arch setup code.
>
> Signed-off-by: Greg Ungerer <ge...@linux-m68k.org>

Acked-by: Geert Uytterhoeven <ge...@linux-m68k.org>

If you want me to take this through the m68k tree instead, just let me know.
Thanks!

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds

Greg Ungerer

unread,
Sep 9, 2016, 8:27:39 AM9/9/16
to Geert Uytterhoeven, Linux/m68k
Hi Geert,

On 09/09/16 17:33, Geert Uytterhoeven wrote:
> Hi Greg,
>
> On Fri, Sep 9, 2016 at 9:13 AM, Greg Ungerer <ge...@linux-m68k.org> wrote:
>> The uboot command line support needs to be used by both MMU and no-MMU
>> setups, but currently we only have the code in the no-MMU code paths.
>> Move the uboot command line processing code into its own file. Add
>> appropriate calls to it from both the MMU and no-MMU arch setup code.
>>
>> Signed-off-by: Greg Ungerer <ge...@linux-m68k.org>
>
> Acked-by: Geert Uytterhoeven <ge...@linux-m68k.org>
>
> If you want me to take this through the m68k tree instead, just let me know.
> Thanks!

Thanks. I have a few things queued (with the ColdFire 54411 MMU
changes) so I don't mind taking this one too.

Regards
Greg
0 new messages