efi_loader: Split drive add into function
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>
This commit is contained in:
parent
a2adb173ec
commit
4a12a97c14
|
|
@ -138,6 +138,52 @@ static const struct efi_block_io block_io_disk_template = {
|
||||||
.flush_blocks = &efi_disk_flush_blocks,
|
.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
|
* 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
|
* 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);
|
printf("Scanning disks on %s...\n", cur_drvr->name);
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
struct blk_desc *desc;
|
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 */
|
char devname[16] = { 0 }; /* dp->str is u16[16] long */
|
||||||
|
|
||||||
desc = blk_get_dev(cur_drvr->name, i);
|
desc = blk_get_dev(cur_drvr->name, i);
|
||||||
|
|
@ -167,42 +210,9 @@ int efi_disk_register(void)
|
||||||
if (desc->type == DEV_TYPE_UNKNOWN)
|
if (desc->type == DEV_TYPE_UNKNOWN)
|
||||||
continue;
|
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",
|
snprintf(devname, sizeof(devname), "%s%d",
|
||||||
cur_drvr->name, i);
|
cur_drvr->name, i);
|
||||||
ascii2unicode(dp[0].str, devname);
|
efi_disk_add_dev(devname, cur_drvr, desc, i, 0);
|
||||||
|
|
||||||
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);
|
|
||||||
disks++;
|
disks++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue