mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-19 19:34:35 +00:00
efi_loader: disk: use udevice instead of blk_desc
In most of all cases, we can avoid using blk_desc which is expected to be private to udevice(UCLASS_BLK), that is, the data should not be manipulated outside the device driver unless really needed. Now efi_disk's internally use dev_read/write() interfaces if CONFIG_PARTITIONS is enabled. Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
59da9d4782
commit
d97e98c887
1 changed files with 16 additions and 6 deletions
|
@ -36,7 +36,7 @@ const efi_guid_t efi_system_partition_guid = PARTITION_SYSTEM_GUID;
|
||||||
* @part: partition
|
* @part: partition
|
||||||
* @volume: simple file system protocol of the partition
|
* @volume: simple file system protocol of the partition
|
||||||
* @offset: offset into disk for simple partition
|
* @offset: offset into disk for simple partition
|
||||||
* @desc: internal block device descriptor
|
* @dev: associated DM device
|
||||||
*/
|
*/
|
||||||
struct efi_disk_obj {
|
struct efi_disk_obj {
|
||||||
struct efi_object header;
|
struct efi_object header;
|
||||||
|
@ -48,7 +48,7 @@ struct efi_disk_obj {
|
||||||
unsigned int part;
|
unsigned int part;
|
||||||
struct efi_simple_file_system_protocol *volume;
|
struct efi_simple_file_system_protocol *volume;
|
||||||
lbaint_t offset;
|
lbaint_t offset;
|
||||||
struct blk_desc *desc;
|
struct udevice *dev; /* TODO: move it to efi_object */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -83,14 +83,12 @@ static efi_status_t efi_disk_rw_blocks(struct efi_block_io *this,
|
||||||
void *buffer, enum efi_disk_direction direction)
|
void *buffer, enum efi_disk_direction direction)
|
||||||
{
|
{
|
||||||
struct efi_disk_obj *diskobj;
|
struct efi_disk_obj *diskobj;
|
||||||
struct blk_desc *desc;
|
|
||||||
int blksz;
|
int blksz;
|
||||||
int blocks;
|
int blocks;
|
||||||
unsigned long n;
|
unsigned long n;
|
||||||
|
|
||||||
diskobj = container_of(this, struct efi_disk_obj, ops);
|
diskobj = container_of(this, struct efi_disk_obj, ops);
|
||||||
desc = (struct blk_desc *) diskobj->desc;
|
blksz = diskobj->media.block_size;
|
||||||
blksz = desc->blksz;
|
|
||||||
blocks = buffer_size / blksz;
|
blocks = buffer_size / blksz;
|
||||||
lba += diskobj->offset;
|
lba += diskobj->offset;
|
||||||
|
|
||||||
|
@ -101,10 +99,21 @@ static efi_status_t efi_disk_rw_blocks(struct efi_block_io *this,
|
||||||
if (buffer_size & (blksz - 1))
|
if (buffer_size & (blksz - 1))
|
||||||
return EFI_BAD_BUFFER_SIZE;
|
return EFI_BAD_BUFFER_SIZE;
|
||||||
|
|
||||||
|
#if CONFIG_IS_ENABLED(PARTITIONS)
|
||||||
|
if (direction == EFI_DISK_READ)
|
||||||
|
n = dev_read(diskobj->dev, lba, blocks, buffer);
|
||||||
|
else
|
||||||
|
n = dev_write(diskobj->dev, lba, blocks, buffer);
|
||||||
|
#else
|
||||||
|
/* dev is always a block device (UCLASS_BLK) */
|
||||||
|
struct blk_desc *desc;
|
||||||
|
|
||||||
|
desc = dev_get_uclass_plat(diskobj->dev);
|
||||||
if (direction == EFI_DISK_READ)
|
if (direction == EFI_DISK_READ)
|
||||||
n = blk_dread(desc, lba, blocks, buffer);
|
n = blk_dread(desc, lba, blocks, buffer);
|
||||||
else
|
else
|
||||||
n = blk_dwrite(desc, lba, blocks, buffer);
|
n = blk_dwrite(desc, lba, blocks, buffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* We don't do interrupts, so check for timers cooperatively */
|
/* We don't do interrupts, so check for timers cooperatively */
|
||||||
efi_timer_check();
|
efi_timer_check();
|
||||||
|
@ -446,7 +455,6 @@ static efi_status_t efi_disk_add_dev(
|
||||||
diskobj->ops = block_io_disk_template;
|
diskobj->ops = block_io_disk_template;
|
||||||
diskobj->ifname = if_typename;
|
diskobj->ifname = if_typename;
|
||||||
diskobj->dev_index = dev_index;
|
diskobj->dev_index = dev_index;
|
||||||
diskobj->desc = desc;
|
|
||||||
|
|
||||||
/* Fill in EFI IO Media info (for read/write callbacks) */
|
/* Fill in EFI IO Media info (for read/write callbacks) */
|
||||||
diskobj->media.removable_media = desc->removable;
|
diskobj->media.removable_media = desc->removable;
|
||||||
|
@ -522,6 +530,7 @@ static int efi_disk_create_raw(struct udevice *dev)
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
disk->dev = dev;
|
||||||
if (dev_tag_set_ptr(dev, DM_TAG_EFI, &disk->header)) {
|
if (dev_tag_set_ptr(dev, DM_TAG_EFI, &disk->header)) {
|
||||||
efi_free_pool(disk->dp);
|
efi_free_pool(disk->dp);
|
||||||
efi_delete_handle(&disk->header);
|
efi_delete_handle(&disk->header);
|
||||||
|
@ -578,6 +587,7 @@ static int efi_disk_create_part(struct udevice *dev)
|
||||||
log_err("Adding partition for %s failed\n", dev->name);
|
log_err("Adding partition for %s failed\n", dev->name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
disk->dev = dev;
|
||||||
if (dev_tag_set_ptr(dev, DM_TAG_EFI, &disk->header)) {
|
if (dev_tag_set_ptr(dev, DM_TAG_EFI, &disk->header)) {
|
||||||
efi_free_pool(disk->dp);
|
efi_free_pool(disk->dp);
|
||||||
efi_delete_handle(&disk->header);
|
efi_delete_handle(&disk->header);
|
||||||
|
|
Loading…
Add table
Reference in a new issue