[U-Boot] [PATCH v3] PXE: FDT: Add support for fdt in PXE

Chander Kashyap chander.kashyap at linaro.org
Fri Sep 7 05:41:32 CEST 2012


Hi Jason

On 6 September 2012 21:07, Jason Hobbs <jason.hobbs at calxeda.com> wrote:
> Chander,
>
> Comments inline.
>
> On Thu, Sep 06, 2012 at 01:40:04AM -0400, Chander Kashyap wrote:
>> Now DT support is becomming common for all new SoC's. Hence it is better to
>> have option for getting specific FDT from the remote server.
>>
>> This patch adds support for new lable i.e. fdt. If fdt_addr is specified
>> then load fdt blob from the remote server to fdt_address.
>
> If a fdt label is provided AND fdt_addr is specified, then load the blob
> from the remote server to fdt_addr. fdt_addr alone still works on its
> own if the fdt_blob has already been loaded some other way
>
Yes will add it.
>>
>> Signed-off-by: Chander Kashyap <chander.kashyap at linaro.org>
>> ---
>> Changes in v2:
>>       - Removed the duplicate code.
>> changes in v3:
>>       - Added documentation for "fdt" lable in doc/README.pxe
>
> s/lable/label - fix globally
Will fix it
>
>>
>>  common/cmd_pxe.c |   23 +++++++++++++++++++++++
>>  doc/README.pxe   |   10 ++++++++--
>>  2 files changed, 31 insertions(+), 2 deletions(-)
>>
>> diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c
>> index 6b31dea..0c81e08 100644
>> --- a/common/cmd_pxe.c
>> +++ b/common/cmd_pxe.c
>> @@ -450,6 +450,7 @@ struct pxe_label {
>>       char *kernel;
>>       char *append;
>>       char *initrd;
>> +     char *fdt;
>>       int attempted;
>>       int localboot;
>>       struct list_head list;
>> @@ -517,6 +518,9 @@ static void label_destroy(struct pxe_label *label)
>>       if (label->initrd)
>>               free(label->initrd);
>>
>> +     if (label->fdt)
>> +             free(label->fdt);
>> +
>>       free(label);
>>  }
>>
>> @@ -541,6 +545,9 @@ static void label_print(void *data)
>>
>>       if (label->initrd)
>>               printf("\t\tinitrd: %s\n", label->initrd);
>> +
>> +     if (label->fdt)
>> +             printf("\tfdt: %s\n", label->fdt);
>>  }
>>
>>  /*
>> @@ -633,6 +640,15 @@ static void label_boot(struct pxe_label *label)
>>        */
>>       bootm_argv[3] = getenv("fdt_addr");
>>
>> +     /* if fdt label is defined then get fdt from server */
>> +     if (bootm_argv[3] && label->fdt) {
>> +             if (get_relfile_envaddr(label->fdt, "fdt_addr") < 0) {
>> +                     printf("Skipping %s for failure retrieving fdt\n",
>> +                                     label->name);
>> +                     return;
>> +             }
>> +     }
>> +
>>       if (bootm_argv[3])
>>               bootm_argc = 4;
>>
>> @@ -658,6 +674,7 @@ enum token_type {
>>       T_DEFAULT,
>>       T_PROMPT,
>>       T_INCLUDE,
>> +     T_FDT,
>>       T_INVALID
>>  };
>>
>> @@ -685,6 +702,7 @@ static const struct token keywords[] = {
>>       {"append", T_APPEND},
>>       {"initrd", T_INITRD},
>>       {"include", T_INCLUDE},
>> +     {"fdt", T_FDT},
>>       {NULL, T_INVALID}
>>  };
>>
>> @@ -1074,6 +1092,11 @@ static int parse_label(char **c, struct pxe_menu *cfg)
>>                               err = parse_sliteral(c, &label->initrd);
>>                       break;
>>
>> +             case T_FDT:
>> +                     if (!label->fdt)
>> +                             err = parse_sliteral(c, &label->fdt);
>> +                     break;
>> +
>>               case T_LOCALBOOT:
>>                       err = parse_integer(c, &label->localboot);
>>                       break;
>> diff --git a/doc/README.pxe b/doc/README.pxe
>> index 2bbf53d..835ca5a 100644
>> --- a/doc/README.pxe
>> +++ b/doc/README.pxe
>> @@ -93,8 +93,9 @@ pxe boot
>>       be passed to the bootm command to boot the kernel. These environment
>>       variables are required to be set.
>>
>> -     fdt_addr - the location of a fdt blob. If this is set, it will be passed
>> -     to bootm when booting a kernel.
>> +     fdt_addr - locations in RAM at which 'pxe boot' will store the fdt blob
>> +     it retrieves from tftp, if "fdt" lable is defined in pxe file. If this is
>> +     set, it will be passed to bootm when booting a kernel.
>
> Thinking about this some more, I don't think you can use fdt_addr as the
> place to store the blob. fdt_addr isn't garaunteed to be writeable RAM -
> it could be a read only non volatile memory like NOR flash.
>
> If you notice, all of the other tftp retrievals go to "_r" suffixed
> variables, which are garaunteed (by convention) to be in writeable RAM.
>
> You may need to take an approach where an addition fdt_addr_r variable
> is used to point at the location to store the fdt blob.
>
Sure, I will take care for this
> Your description also makes it less clear that if fdt_addr is set, it
> points to the blob, whether or not it was retrieved from tftp.
Will make it more clear

>
>>
>>  pxe file format
>>  ===============
>> @@ -156,6 +157,11 @@ initrd <path>        - if this label is chosen, use tftp to retrieve the initrd
>>                     the initrd_addr_r environment variable, and that address
>>                     will be passed to bootm.
>>
>> +fdt <path>       - if this label is chosen, use tftp to retrieve the fdt blob
>> +                   at <path>. it will be stored at the address indicated in
>> +                   the fdt_addr environment variable, and that address will
>> +                   be passed to bootm.
>> +
>
> again, this should be changed to fdt_addr_r.
>
>
>>  localboot <flag>    - Run the command defined by "localcmd" in the environment.
>>                     <flag> is ignored and is only here to match the syntax of
>>                     PXELINUX config files.
>> --
>> 1.7.9.5
>>
Thanks for the comments.


-- 
with warm regards,
Chander Kashyap


More information about the U-Boot mailing list