]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
efi_loader: Split drive add into function
authorAlexander Graf <agraf@suse.de>
Mon, 11 Apr 2016 14:16:17 +0000 (16:16 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 18 Apr 2016 21:11:35 +0000 (17:11 -0400)
The snippet of code to add a drive to our drive list needs to
get called from 2 places in the future. Split it into a separate
function.

Signed-off-by: Alexander Graf <agraf@suse.de>
lib/efi_loader/efi_disk.c

index aaff947596f04c13cdc67cd70e6378c41f42c8bf..e30e72817efb3860aab824f09cb3282c8e027397 100644 (file)
@@ -138,6 +138,52 @@ static const struct efi_block_io block_io_disk_template = {
        .flush_blocks = &efi_disk_flush_blocks,
 };
 
+static void efi_disk_add_dev(char *name,
+                            const struct block_drvr *cur_drvr,
+                            const struct blk_desc *desc,
+                            int dev_index,
+                            lbaint_t offset)
+{
+       struct efi_disk_obj *diskobj;
+       struct efi_device_path_file_path *dp;
+       int objlen = sizeof(*diskobj) + (sizeof(*dp) * 2);
+
+       diskobj = calloc(1, objlen);
+
+       /* Fill in object data */
+       diskobj->parent.protocols[0].guid = &efi_block_io_guid;
+       diskobj->parent.protocols[0].open = efi_disk_open_block;
+       diskobj->parent.protocols[1].guid = &efi_guid_device_path;
+       diskobj->parent.protocols[1].open = efi_disk_open_dp;
+       diskobj->parent.handle = diskobj;
+       diskobj->ops = block_io_disk_template;
+       diskobj->ifname = cur_drvr->name;
+       diskobj->dev_index = dev_index;
+
+       /* Fill in EFI IO Media info (for read/write callbacks) */
+       diskobj->media.removable_media = desc->removable;
+       diskobj->media.media_present = 1;
+       diskobj->media.block_size = desc->blksz;
+       diskobj->media.io_align = desc->blksz;
+       diskobj->media.last_block = desc->lba;
+       diskobj->ops.media = &diskobj->media;
+
+       /* Fill in device path */
+       dp = (void*)&diskobj[1];
+       diskobj->dp = dp;
+       dp[0].dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
+       dp[0].dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH;
+       dp[0].dp.length = sizeof(*dp);
+       ascii2unicode(dp[0].str, name);
+
+       dp[1].dp.type = DEVICE_PATH_TYPE_END;
+       dp[1].dp.sub_type = DEVICE_PATH_SUB_TYPE_END;
+       dp[1].dp.length = sizeof(*dp);
+
+       /* Hook up to the device list */
+       list_add_tail(&diskobj->parent.link, &efi_obj_list);
+}
+
 /*
  * U-Boot doesn't have a list of all online disk devices. So when running our
  * EFI payload, we scan through all of the potentially available ones and
@@ -156,9 +202,6 @@ int efi_disk_register(void)
                printf("Scanning disks on %s...\n", cur_drvr->name);
                for (i = 0; i < 4; i++) {
                        struct blk_desc *desc;
-                       struct efi_disk_obj *diskobj;
-                       struct efi_device_path_file_path *dp;
-                       int objlen = sizeof(*diskobj) + (sizeof(*dp) * 2);
                        char devname[16] = { 0 }; /* dp->str is u16[16] long */
 
                        desc = blk_get_dev(cur_drvr->name, i);
@@ -167,42 +210,9 @@ int efi_disk_register(void)
                        if (desc->type == DEV_TYPE_UNKNOWN)
                                continue;
 
-                       diskobj = calloc(1, objlen);
-
-                       /* Fill in object data */
-                       diskobj->parent.protocols[0].guid = &efi_block_io_guid;
-                       diskobj->parent.protocols[0].open = efi_disk_open_block;
-                       diskobj->parent.protocols[1].guid = &efi_guid_device_path;
-                       diskobj->parent.protocols[1].open = efi_disk_open_dp;
-                       diskobj->parent.handle = diskobj;
-                       diskobj->ops = block_io_disk_template;
-                       diskobj->ifname = cur_drvr->name;
-                       diskobj->dev_index = i;
-
-                       /* Fill in EFI IO Media info (for read/write callbacks) */
-                       diskobj->media.removable_media = desc->removable;
-                       diskobj->media.media_present = 1;
-                       diskobj->media.block_size = desc->blksz;
-                       diskobj->media.io_align = desc->blksz;
-                       diskobj->media.last_block = desc->lba;
-                       diskobj->ops.media = &diskobj->media;
-
-                       /* Fill in device path */
-                       dp = (void*)&diskobj[1];
-                       diskobj->dp = dp;
-                       dp[0].dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
-                       dp[0].dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH;
-                       dp[0].dp.length = sizeof(*dp);
                        snprintf(devname, sizeof(devname), "%s%d",
                                 cur_drvr->name, i);
-                       ascii2unicode(dp[0].str, devname);
-
-                       dp[1].dp.type = DEVICE_PATH_TYPE_END;
-                       dp[1].dp.sub_type = DEVICE_PATH_SUB_TYPE_END;
-                       dp[1].dp.length = sizeof(*dp);
-
-                       /* Hook up to the device list */
-                       list_add_tail(&diskobj->parent.link, &efi_obj_list);
+                       efi_disk_add_dev(devname, cur_drvr, desc, i, 0);
                        disks++;
                }
        }