From: Gregory CLEMENT <gregory.clement@bootlin.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 7/7] MIPS: bootm: Add support for Vcore III linux kernel
Date: Fri, 14 Dec 2018 11:43:35 +0100 [thread overview]
Message-ID: <87pnu4jsmg.fsf@bootlin.com> (raw)
In-Reply-To: <292f4943-fb7d-9f48-fb3e-978169ef6575@gmail.com> (Daniel Schwierzeck's message of "Mon, 10 Dec 2018 18:30:40 +0100")
Hi Daniel,
On lun., déc. 10 2018, Daniel Schwierzeck <daniel.schwierzeck@gmail.com> wrote:
> Am 05.12.18 um 18:10 schrieb Gregory CLEMENT:
>> The kernels built for the Vcore III linux kernel have different
>> expectation in the way the data were passed.
>>
>> Unlike with yamon, the command line is expected to be a single string
>> passed in argv[1]. An other expectation is that the arguments are located
>> in the cached address space.
>>
>> However, like yamon, they expect that rd_start and rd_size was passed by
>> the bootloader in the command line of the kernel, and besides that it
>> also wait for the root=/dev/ram0.
>
>
>
>>
>> Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
>> ---
>> arch/mips/lib/bootm.c | 78 ++++++++++++++++++++++++++++++++-----------
>> 1 file changed, 58 insertions(+), 20 deletions(-)
>>
>> diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c
>> index deca5189e3..a3831c28a4 100644
>> --- a/arch/mips/lib/bootm.c
>> +++ b/arch/mips/lib/bootm.c
>> @@ -15,6 +15,11 @@ DECLARE_GLOBAL_DATA_PTR;
>> #define LINUX_MAX_ENVS 256
>> #define LINUX_MAX_ARGS 256
>>
>> +enum legacy_boot_type {
>> + LEGACY_BOOT_YAML,
>> + LEGACY_BOOT_VCORE,
>> +};
>> +
>> static int linux_argc;
>> static char **linux_argv;
>> static char *linux_argp;
>> @@ -44,22 +49,47 @@ void arch_lmb_reserve(struct lmb *lmb)
>> lmb_reserve(lmb, sp, gd->ram_top - sp);
>> }
>>
>> -static void linux_cmdline_init(void)
>> +static void linux_cmdline_init(enum legacy_boot_type boot_type)
>> {
>> + switch (boot_type) {
>> + /*
>> + * Vcore III linux kernels expect arguments in the cached
>> + * address space. They also expect the command line being a
>> + * single string in the first argument
>> + */
>> + case LEGACY_BOOT_VCORE:
>> + linux_argv = (char **)(gd->bd->bi_boot_params);
>> + linux_argp = (char *)(linux_argv + LINUX_MAX_ARGS);
>> + linux_argv[1] = linux_argp;
>> + break;
>> + case LEGACY_BOOT_YAML:
>> + /* fall-through */
>> + default:
>> + linux_argv = (char **)UNCACHED_SDRAM(gd->bd->bi_boot_params);
>> + linux_argp = (char *)(linux_argv + LINUX_MAX_ARGS);
>> + }
>> linux_argc = 1;
>> - linux_argv = (char **)UNCACHED_SDRAM(gd->bd->bi_boot_params);
>> linux_argv[0] = 0;
>> - linux_argp = (char *)(linux_argv + LINUX_MAX_ARGS);
>> }
>>
>> -static void linux_cmdline_set(const char *value, size_t len)
>> +static void linux_cmdline_set(const char *value, size_t len,
>> + enum legacy_boot_type boot_type)
>> {
>> - linux_argv[linux_argc] = linux_argp;
>> memcpy(linux_argp, value, len);
>> - linux_argp[len] = 0;
>> -
>> + switch (boot_type) {
>> + case LEGACY_BOOT_VCORE:
>> + linux_argv[linux_argc] = linux_argp;
>> + linux_argp[len] = 0;
>> + linux_argc++;
>> + break;
>> + case LEGACY_BOOT_YAML:
>> + /* fall-through */
>> + default:
>> + linux_argp[len] = ' ';
>> + linux_argp[len + 1] = 0;
>> + linux_argc = 2;
>> + }
>> linux_argp += len + 1;
>> - linux_argc++;
>> }
>>
>> static void linux_cmdline_dump(void)
>> @@ -73,12 +103,11 @@ static void linux_cmdline_dump(void)
>> debug(" arg %03d: %s\n", i, linux_argv[i]);
>> }
>>
>> -static void linux_cmdline_legacy(bootm_headers_t *images)
>> +static void linux_cmdline_legacy(bootm_headers_t *images,
>> + enum legacy_boot_type boot_type)
>> {
>> const char *bootargs, *next, *quote;
>> -
>> - linux_cmdline_init();
>> -
>> + linux_cmdline_init(boot_type);
>> bootargs = env_get("bootargs");
>> if (!bootargs)
>> return;
>> @@ -104,7 +133,7 @@ static void linux_cmdline_legacy(bootm_headers_t *images)
>> if (!next)
>> next = bootargs + strlen(bootargs);
>>
>> - linux_cmdline_set(bootargs, next - bootargs);
>> + linux_cmdline_set(bootargs, next - bootargs, boot_type);
>>
>> if (*next)
>> next++;
>> @@ -113,7 +142,8 @@ static void linux_cmdline_legacy(bootm_headers_t *images)
>> }
>> }
>>
>> -static void linux_cmdline_append(bootm_headers_t *images)
>> +static void linux_cmdline_append(bootm_headers_t *images,
>> + enum legacy_boot_type boot_type)
>> {
>> char buf[24];
>> ulong mem, rd_start, rd_size;
>> @@ -121,7 +151,7 @@ static void linux_cmdline_append(bootm_headers_t *images)
>> /* append mem */
>> mem = gd->ram_size >> 20;
>> sprintf(buf, "mem=%luM", mem);
>> - linux_cmdline_set(buf, strlen(buf));
>> + linux_cmdline_set(buf, strlen(buf), boot_type);
>>
>> /* append rd_start and rd_size */
>> rd_start = images->initrd_start;
>> @@ -129,9 +159,13 @@ static void linux_cmdline_append(bootm_headers_t *images)
>>
>> if (rd_size) {
>> sprintf(buf, "rd_start=0x%08lX", rd_start);
>> - linux_cmdline_set(buf, strlen(buf));
>> + linux_cmdline_set(buf, strlen(buf), boot_type);
>> sprintf(buf, "rd_size=0x%lX", rd_size);
>> - linux_cmdline_set(buf, strlen(buf));
>> + linux_cmdline_set(buf, strlen(buf), boot_type);
>> + if (boot_type == LEGACY_BOOT_VCORE) {
>> + sprintf(buf, "root=/dev/ram0");
>> + linux_cmdline_set(buf, strlen(buf), boot_type);
>> + }
>
> if possible, add this via the bootargs environment variable from your
> boot script
It is not straightforward to put in the environment variable because it
depend of the fact there is ramdisk or not, but as requested I will
remove this part.
>
>> }
>> }
>>
>> @@ -276,11 +310,15 @@ static void boot_prep_linux(bootm_headers_t *images)
>> boot_reloc_fdt(images);
>> boot_setup_fdt(images);
>> } else {
>> - if (CONFIG_IS_ENABLED(MIPS_BOOT_CMDLINE_LEGACY)) {
>> - linux_cmdline_legacy(images);
>> + if (CONFIG_IS_ENABLED(SOC_VCOREIII)) {
>> + linux_cmdline_legacy(images, LEGACY_BOOT_VCORE);
>> + linux_cmdline_append(images, LEGACY_BOOT_VCORE);
>> + linux_cmdline_dump();
>
> as mentioned in the last review, please add this in a generic way. I
> want to avoid SoC specific code in this file. You should add a Kconfig
> symbol like CONFIG_MIPS_BOOT_CMDLINE_SINGLESTRING and imply this in your
> SoC or board config. I think you could also use the U-Boot bootargs
> buffer directly or make a copy for the kernel. There is no need to hack
> the linux_cmdline_* functions.
OK I will use a more generic KConfig symbol.
Gregory
>
>> + } else if (CONFIG_IS_ENABLED(MIPS_BOOT_CMDLINE_LEGACY)) {
>> + linux_cmdline_legacy(images, 0);
>>
>> if (!CONFIG_IS_ENABLED(MIPS_BOOT_ENV_LEGACY))
>> - linux_cmdline_append(images);
>> + linux_cmdline_append(images, LEGACY_BOOT_YAML);
>>
>> linux_cmdline_dump();
>> }
>>
>
> --
> - Daniel
--
Gregory Clement, Bootlin
Embedded Linux and Kernel engineering
http://bootlin.com
prev parent reply other threads:[~2018-12-14 10:43 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-05 17:10 [U-Boot] [PATCH v3 0/7] ] Add support for the SoCs found in Microsemi switches Gregory CLEMENT
2018-12-05 17:10 ` [U-Boot] [PATCH v3 1/7] MIPS: move create_tlb() in an proper header: mipsregs.h Gregory CLEMENT
2018-12-05 17:10 ` [U-Boot] [PATCH v3 2/7] MIPS: Allow to prefetch and lock instructions into cache Gregory CLEMENT
2018-12-05 17:10 ` [U-Boot] [PATCH v3 3/7] MSCC: add support for Ocelot SoCs Gregory CLEMENT
2018-12-10 16:57 ` Daniel Schwierzeck
2018-12-13 14:05 ` Gregory CLEMENT
2018-12-13 14:55 ` Daniel Schwierzeck
2018-12-05 17:10 ` [U-Boot] [PATCH v3 4/7] MSCC: add support for Luton SoCs Gregory CLEMENT
2018-12-10 17:03 ` Daniel Schwierzeck
2018-12-13 14:29 ` Gregory CLEMENT
2018-12-05 17:10 ` [U-Boot] [PATCH v3 5/7] MSCC: add board support for the Ocelots based evaluation boards Gregory CLEMENT
2018-12-10 17:17 ` Daniel Schwierzeck
2018-12-13 14:43 ` Gregory CLEMENT
2018-12-05 17:10 ` [U-Boot] [PATCH v3 6/7] MSCC: add board support for the Luton based evaluation board Gregory CLEMENT
2018-12-05 17:10 ` [U-Boot] [PATCH v3 7/7] MIPS: bootm: Add support for Vcore III linux kernel Gregory CLEMENT
2018-12-10 17:30 ` Daniel Schwierzeck
2018-12-14 10:43 ` Gregory CLEMENT [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87pnu4jsmg.fsf@bootlin.com \
--to=gregory.clement@bootlin.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.