[U-Boot] [PATCH] bootz: fix silent console
Simon Glass
sjg at chromium.org
Tue Nov 25 15:03:45 CET 2014
Hi Markus,
On 25 November 2014 at 01:31, Markus Niebel <list-09_u-boot at tqsc.de> wrote:
> Hello Simon,
>
> Am 20.11.2014 um 20:15 schrieb Simon Glass:
>> Hi Markus,
>>
>> On 18 November 2014 12:52, Markus Niebel <list-09_u-boot at tqsc.de> wrote:
>>> From: Markus Niebel <Markus.Niebel at tq-group.com>
>>>
>>> fixup was lost during split between command code and logic.
>>>
>>> Signed-off-by: Markus Niebel <Markus.Niebel at tq-group.com>
>>> ---
>>> common/bootm.c | 2 +-
>>> common/cmd_bootm.c | 6 ++++++
>>> include/bootm.h | 2 ++
>>> 3 files changed, 9 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/common/bootm.c b/common/bootm.c
>>> index 6b3ea8c..94b9503 100644
>>> --- a/common/bootm.c
>>> +++ b/common/bootm.c
>>> @@ -467,7 +467,7 @@ ulong bootm_disable_interrupts(void)
>>> #define CONSOLE_ARG "console="
>>> #define CONSOLE_ARG_LEN (sizeof(CONSOLE_ARG) - 1)
>>>
>>> -static void fixup_silent_linux(void)
>>> +void fixup_silent_linux(void)
>>> {
>>> char *buf;
>>> const char *env_val;
>>> diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
>>> index 6723360..d3e410a 100644
>>> --- a/common/cmd_bootm.c
>>> +++ b/common/cmd_bootm.c
>>> @@ -596,6 +596,12 @@ int do_bootz(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>>> * disable interrupts ourselves
>>> */
>>> bootm_disable_interrupts();
>>> +#if defined(CONFIG_SILENT_CONSOLE) && !defined(CONFIG_SILENT_U_BOOT_ONLY)
>>> + /*
>>> + * same goes for fixup_silent_linux
>>> + */
>>> + fixup_silent_linux();
>>> +#endif
>>>
>>> images.os.os = IH_OS_LINUX;
>>> ret = do_bootm_states(cmdtp, flag, argc, argv,
>>> diff --git a/include/bootm.h b/include/bootm.h
>>> index b3d1a62..8e094b3 100644
>>> --- a/include/bootm.h
>>> +++ b/include/bootm.h
>>> @@ -50,6 +50,8 @@ ulong bootm_disable_interrupts(void);
>>>
>>> /* This is a special function used by booti/bootz */
>>> int bootm_find_ramdisk_fdt(int flag, int argc, char * const argv[]);
>>> +/* This function is used also used by bootz */
>>> +void fixup_silent_linux(void);
>>>
>>> int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
>>> int states, bootm_headers_t *images, int boot_progress);
>>
>> Quite a bit of effort was expended trying to join this code back
>> together rather than having two separate code paths for bootm and
>> bootz.
>
> I Understand
>
>>
>> Since this is cmdline-related, I suggest something like this:
>>
>> - Enable BOOTM_STATE_OS_CMDLINE for all archs in do_bootm()
>> - Call fixup_silent_linux() in do_bootm_states() when processing
>> BOOTM_STATE_OS_CMDLINE
>> - Add BOOTM_STATE_OS_CMDLINE to the do_bootm_states() call in do_bootz()
>>
>
> I read through the code to find out, what the implications of your
> suggestions were. Since I'm not very familiar with this piece of code,
> please correct me, If i'm wrong:
>
> - rename the arch specific do_bootm_linux to arch_bootm_linux
> - implement a generic version of do_bootm_linux inside bootm_os.c
> - call arch_bootm_linux from generic do_bootm_linux
> - move the call to fixup_silent_linux to new do_bootm_linux for the
> BOOTM_STATE_OS_CMDLINE case
> - mask BOOTM_STATE_OS_CMDLINE before calling arch_bootm_linux for all but
> MIPS and PPC
>
> because this seems a bit intrusive I'm not sure. But if this is the wy to go, I
> will prepare a patch.
Yes that sounds complicated. But copying code in multiple places is
how the image/bootm support got so ugly, and it was a big effort to
fix it up. So I'd really like to avoid copying code.
But it should be a lot easier than that.
In do_boot() there is:
return do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START |
BOOTM_STATE_FINDOS | BOOTM_STATE_FINDOTHER |
BOOTM_STATE_LOADOS |
#if defined(CONFIG_PPC) || defined(CONFIG_MIPS)
BOOTM_STATE_OS_CMDLINE |
#endif
BOOTM_STATE_OS_PREP | BOOTM_STATE_OS_FAKE_GO |
BOOTM_STATE_OS_GO, &images, 1);
}
You should be able to remove the #ifdef.
Then in do_bootm_states() there is:
/* Load the OS */
if (!ret && (states & BOOTM_STATE_LOADOS)) {
...
#if defined(CONFIG_SILENT_CONSOLE) && !defined(CONFIG_SILENT_U_BOOT_ONLY)
if (images->os.os == IH_OS_LINUX)
fixup_silent_linux();
#endif
}
And later:
if (!ret && (states & BOOTM_STATE_OS_CMDLINE))
ret = boot_fn(BOOTM_STATE_OS_CMDLINE, argc, argv, images);
You should be able to move the '#if defined' code to inside this if ()
- so that fixup_silent_linux() happens in the CMDLINE stage instead of
the LOADOS stage.
Then in do_bootz(), add BOOTM_STATE_OS_CMDLINE to the call to do_bootm_states().
Then bootm and bootz will still go along exactly the same code path.
The tricky bit is that of course this does affect each arch - you need
to make sure that each do_bootm_linux() function in
arch/xxx/lib/bootm.c will handle BOOTM_STATE_OS_CMDLINE (and return 0,
not -1). At a glance I can see that ARM returns -1 - it will need to
return 0.
Also each function in boot_os[] needs to do the same. I looked at most
of them and they check for BOOTM_STATE_OS_GO and return 0 for anything
else, so should be OK. Maybe do_bootm_standalone() will need to do so
too.
>
>> Or similar...that way we keep bootm and bootz in sync. The separate
>> call to bootm_disable_interrupts() is unfortunate but is a problem for
>> another day.
>>
>> Regards,
>> Simon
>>
> Regards,
> Markus
Regards,
Simon
More information about the U-Boot
mailing list