This way grub can properly match up the loaded_image device-path to a
partition device object, so it can locate it's grub.cfg.

Signed-off-by: Rob Clark <robdcl...@gmail.com>
---
 cmd/bootefi.c | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 5030b7bd86..ea0d5dbc79 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -41,6 +41,11 @@ static struct efi_device_path_file_path bootefi_image_path[] 
= {
        }
 };
 
+/* if we have CONFIG_DM we construct a proper device-path from the
+ * boot device, otherwise fallback to using bootefi_device_path.
+ */
+static struct efi_device_path *real_bootefi_device_path;
+
 static struct efi_device_path_file_path bootefi_device_path[] = {
        {
                .dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE,
@@ -58,13 +63,12 @@ static efi_status_t EFIAPI bootefi_open_dp(void *handle, 
efi_guid_t *protocol,
                        void **protocol_interface, void *agent_handle,
                        void *controller_handle, uint32_t attributes)
 {
-       *protocol_interface = bootefi_device_path;
+       *protocol_interface = real_bootefi_device_path;
        return EFI_SUCCESS;
 }
 
 /* The EFI loaded_image interface for the image executed via "bootefi" */
 static struct efi_loaded_image loaded_image_info = {
-       .device_handle = bootefi_device_path,
        .file_path = bootefi_image_path,
 };
 
@@ -93,7 +97,6 @@ static struct efi_object loaded_image_info_obj = {
 
 /* The EFI object struct for the device the "bootefi" image was loaded from */
 static struct efi_object bootefi_device_obj = {
-       .handle = bootefi_device_path,
        .protocols = {
                {
                        /* When asking for the device path interface, return
@@ -239,8 +242,6 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt)
 
        if (!memcmp(bootefi_device_path[0].str, "N\0e\0t", 6))
                loaded_image_info.device_handle = nethandle;
-       else
-               loaded_image_info.device_handle = bootefi_device_path;
 #endif
 #ifdef CONFIG_GENERATE_SMBIOS_TABLE
        efi_smbios_register();
@@ -339,6 +340,18 @@ U_BOOT_CMD(
        bootefi_help_text
 );
 
+#ifdef CONFIG_DM
+static int parse_partnum(const char *devnr)
+{
+       const char *str = strchr(devnr, ':');
+       if (str) {
+               str++;
+               return simple_strtoul(str, NULL, 16);
+       }
+       return 0;
+}
+#endif
+
 void efi_set_bootdev(const char *dev, const char *devnr, const char *path)
 {
        __maybe_unused struct blk_desc *desc;
@@ -376,9 +389,14 @@ void efi_set_bootdev(const char *dev, const char *devnr, 
const char *path)
        if (colon)
                *colon = '\0';
 
+#ifdef CONFIG_DM
+       real_bootefi_device_path = efi_dp_from_part(desc, parse_partnum(devnr));
+#else
        /* Patch bootefi_device_path to the target device */
+       real_bootefi_device_path = bootefi_device_path;
        memset(bootefi_device_path[0].str, 0, 
sizeof(bootefi_device_path[0].str));
        ascii2unicode(bootefi_device_path[0].str, devname);
+#endif
 
        /* Patch bootefi_image_path to the target file path */
        memset(bootefi_image_path[0].str, 0, sizeof(bootefi_image_path[0].str));
@@ -389,4 +407,7 @@ void efi_set_bootdev(const char *dev, const char *devnr, 
const char *path)
                snprintf(devname, sizeof(devname), "%s", path);
        }
        ascii2unicode(bootefi_image_path[0].str, devname);
+
+       loaded_image_info.device_handle = real_bootefi_device_path;
+       bootefi_device_obj.handle = real_bootefi_device_path;
 }
-- 
2.13.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to