[PATCH v2 2/8] cmd: eficonfig: add support for setting fdt

Ilias Apalodimas ilias.apalodimas at linaro.org
Tue May 28 17:16:32 CEST 2024


Hi Heinrich,

[...]

>
> -       const struct efi_initrd_dp id_dp = {
> +       const struct efi_initrd_dp initrd_prefix = {
>                 .vendor = {
>                         {
>                         DEVICE_PATH_TYPE_MEDIA_DEVICE,
>                         DEVICE_PATH_SUB_TYPE_VENDOR_PATH,
> -                       sizeof(id_dp.vendor),
> +                       sizeof(initrd_prefix.vendor),
>                         },
>                         EFI_INITRD_MEDIA_GUID,
>                 },
>                 .end = {
>                         DEVICE_PATH_TYPE_END,
>                         DEVICE_PATH_SUB_TYPE_END,
> -                       sizeof(id_dp.end),
> +                       sizeof(initrd_prefix.end),
> +               }
> +       };
> +
> +       const struct efi_initrd_dp fdt_prefix = {

We need to rename efi_initrd_dp to something more generic in the future

> +               .vendor = {
> +                       {
> +                       DEVICE_PATH_TYPE_MEDIA_DEVICE,
> +                       DEVICE_PATH_SUB_TYPE_VENDOR_PATH,
> +                       sizeof(fdt_prefix.vendor),
> +                       },
> +                       EFI_FDT_GUID,
> +               },
> +               .end = {
> +                       DEVICE_PATH_TYPE_END,
> +                       DEVICE_PATH_SUB_TYPE_END,
> +                       sizeof(initrd_prefix.end),
>                 }
>         };
>

[...]

> +/**
> + * efi_load_option_dp_join() - join device-paths for load option
> + *
> + * @dp:                in: binary device-path, out: joined device-path
> + * @dp_size:   size of joined device-path
> + * @initrd_dp: initrd device-path or NULL
> + * @fdt_dp:    device-tree device-path or NULL
> + * Return:     status_code
> + */
> +efi_status_t efi_load_option_dp_join(struct efi_device_path **dp,
> +                                    size_t *dp_size,
> +                                    struct efi_device_path *initrd_dp,
> +                                    struct efi_device_path *fdt_dp)
> +{
> +       if (!dp)

Should we add && !*dp here?

> +               return EFI_INVALID_PARAMETER;
> +
> +       *dp_size = efi_dp_size(*dp);
> +
> +       if (initrd_dp) {
> +               struct efi_device_path *tmp_dp = *dp;
> +
> +               *dp = efi_dp_concat(tmp_dp, initrd_dp, *dp_size);
> +               efi_free_pool(tmp_dp);
> +               if (!*dp)
> +                       return EFI_OUT_OF_RESOURCES;
> +               *dp_size += efi_dp_size(initrd_dp) + sizeof(END);
> +       }
> +
> +       if (fdt_dp) {
> +               struct efi_device_path *tmp_dp = *dp;
> +
> +               *dp = efi_dp_concat(tmp_dp, fdt_dp, *dp_size);
> +               efi_free_pool(tmp_dp);
> +               if (!dp)
> +                       return EFI_OUT_OF_RESOURCES;
> +               *dp_size += efi_dp_size(fdt_dp) + sizeof(END);
> +       }
> +
> +       *dp_size += sizeof(END);

Why do we have to account for the end node twice if either fdt_dp or
initrd_dp are found?

Thanks
/Ilias
> +
> +       return EFI_SUCCESS;
> +}
> +
>  const struct guid_to_hash_map {
>         efi_guid_t guid;
>         const char algo[32];
> --
> 2.43.0
>


More information about the U-Boot mailing list