diff mbox series

[RFC,11/22] efi_loader: disk: use udevice instead of blk_desc

Message ID 20211001050228.55183-23-takahiro.akashi@linaro.org
State Superseded
Headers show
Series None | expand

Commit Message

AKASHI Takahiro Oct. 1, 2021, 5:02 a.m. UTC
In most of all usages, we can avoid accessing blk_desc which is eventually
an internal data structure to be hided outside block device drivers.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>

---
 lib/efi_loader/efi_disk.c | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

-- 
2.33.0

Comments

Simon Glass Oct. 10, 2021, 2:14 p.m. UTC | #1
On Thu, 30 Sept 2021 at 23:04, AKASHI Takahiro
<takahiro.akashi@linaro.org> wrote:
>

> In most of all usages, we can avoid accessing blk_desc which is eventually

> an internal data structure to be hided outside block device drivers.

>

> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>

> ---

>  lib/efi_loader/efi_disk.c | 25 ++++++++++++-------------

>  1 file changed, 12 insertions(+), 13 deletions(-)

>


Reviewed-by: Simon Glass <sjg@chromium.org>


But needs updating to use media_read() or similar


> diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c

> index 988907ecb910..dfa6f898d586 100644

> --- a/lib/efi_loader/efi_disk.c

> +++ b/lib/efi_loader/efi_disk.c

> @@ -45,7 +45,7 @@ struct efi_disk_obj {

>         unsigned int part;

>         struct efi_simple_file_system_protocol *volume;

>         lbaint_t offset;

> -       struct blk_desc *desc;

> +       struct udevice *dev; /* TODO: move it to efi_object */

>  };

>

>  /**

> @@ -80,14 +80,12 @@ static efi_status_t efi_disk_rw_blocks(struct efi_block_io *this,

>                         void *buffer, enum efi_disk_direction direction)

>  {

>         struct efi_disk_obj *diskobj;

> -       struct blk_desc *desc;

>         int blksz;

>         int blocks;

>         unsigned long n;

>

>         diskobj = container_of(this, struct efi_disk_obj, ops);

> -       desc = (struct blk_desc *) diskobj->desc;

> -       blksz = desc->blksz;

> +       blksz = diskobj->media.block_size;

>         blocks = buffer_size / blksz;

>         lba += diskobj->offset;

>

> @@ -99,9 +97,9 @@ static efi_status_t efi_disk_rw_blocks(struct efi_block_io *this,

>                 return EFI_BAD_BUFFER_SIZE;

>

>         if (direction == EFI_DISK_READ)

> -               n = blk_dread(desc, lba, blocks, buffer);

> +               n = blk_read(diskobj->dev, lba, blocks, buffer);

>         else

> -               n = blk_dwrite(desc, lba, blocks, buffer);

> +               n = blk_write(diskobj->dev, lba, blocks, buffer);

>

>         /* We don't do interrupts, so check for timers cooperatively */

>         efi_timer_check();

> @@ -443,7 +441,6 @@ static efi_status_t efi_disk_add_dev(

>         diskobj->ops = block_io_disk_template;

>         diskobj->ifname = if_typename;

>         diskobj->dev_index = dev_index;

> -       diskobj->desc = desc;

>

>         /* Fill in EFI IO Media info (for read/write callbacks) */

>         diskobj->media.removable_media = desc->removable;

> @@ -647,20 +644,22 @@ bool efi_disk_is_system_part(efi_handle_t handle)

>  {

>         struct efi_handler *handler;

>         struct efi_disk_obj *diskobj;

> -       struct disk_partition info;

> +       struct udevice *dev;

> +       struct disk_part *part;

>         efi_status_t ret;

> -       int r;

>

>         /* check if this is a block device */

>         ret = efi_search_protocol(handle, &efi_block_io_guid, &handler);

>         if (ret != EFI_SUCCESS)

>                 return false;

>

> +       /* find a partition udevice */

>         diskobj = container_of(handle, struct efi_disk_obj, header);

> -

> -       r = part_get_info(diskobj->desc, diskobj->part, &info);

> -       if (r)

> +       dev = diskobj->dev;

> +       if (!dev || dev->driver->id != UCLASS_PARTITION)

>                 return false;

>

> -       return !!(info.bootable & PART_EFI_SYSTEM_PARTITION);

> +       part = dev_get_uclass_plat(dev);

> +

> +       return !!(part->gpt_part_info.bootable & PART_EFI_SYSTEM_PARTITION);

>  }

> --

> 2.33.0

>
diff mbox series

Patch

diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index 988907ecb910..dfa6f898d586 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -45,7 +45,7 @@  struct efi_disk_obj {
 	unsigned int part;
 	struct efi_simple_file_system_protocol *volume;
 	lbaint_t offset;
-	struct blk_desc *desc;
+	struct udevice *dev; /* TODO: move it to efi_object */
 };
 
 /**
@@ -80,14 +80,12 @@  static efi_status_t efi_disk_rw_blocks(struct efi_block_io *this,
 			void *buffer, enum efi_disk_direction direction)
 {
 	struct efi_disk_obj *diskobj;
-	struct blk_desc *desc;
 	int blksz;
 	int blocks;
 	unsigned long n;
 
 	diskobj = container_of(this, struct efi_disk_obj, ops);
-	desc = (struct blk_desc *) diskobj->desc;
-	blksz = desc->blksz;
+	blksz = diskobj->media.block_size;
 	blocks = buffer_size / blksz;
 	lba += diskobj->offset;
 
@@ -99,9 +97,9 @@  static efi_status_t efi_disk_rw_blocks(struct efi_block_io *this,
 		return EFI_BAD_BUFFER_SIZE;
 
 	if (direction == EFI_DISK_READ)
-		n = blk_dread(desc, lba, blocks, buffer);
+		n = blk_read(diskobj->dev, lba, blocks, buffer);
 	else
-		n = blk_dwrite(desc, lba, blocks, buffer);
+		n = blk_write(diskobj->dev, lba, blocks, buffer);
 
 	/* We don't do interrupts, so check for timers cooperatively */
 	efi_timer_check();
@@ -443,7 +441,6 @@  static efi_status_t efi_disk_add_dev(
 	diskobj->ops = block_io_disk_template;
 	diskobj->ifname = if_typename;
 	diskobj->dev_index = dev_index;
-	diskobj->desc = desc;
 
 	/* Fill in EFI IO Media info (for read/write callbacks) */
 	diskobj->media.removable_media = desc->removable;
@@ -647,20 +644,22 @@  bool efi_disk_is_system_part(efi_handle_t handle)
 {
 	struct efi_handler *handler;
 	struct efi_disk_obj *diskobj;
-	struct disk_partition info;
+	struct udevice *dev;
+	struct disk_part *part;
 	efi_status_t ret;
-	int r;
 
 	/* check if this is a block device */
 	ret = efi_search_protocol(handle, &efi_block_io_guid, &handler);
 	if (ret != EFI_SUCCESS)
 		return false;
 
+	/* find a partition udevice */
 	diskobj = container_of(handle, struct efi_disk_obj, header);
-
-	r = part_get_info(diskobj->desc, diskobj->part, &info);
-	if (r)
+	dev = diskobj->dev;
+	if (!dev || dev->driver->id != UCLASS_PARTITION)
 		return false;
 
-	return !!(info.bootable & PART_EFI_SYSTEM_PARTITION);
+	part = dev_get_uclass_plat(dev);
+
+	return !!(part->gpt_part_info.bootable & PART_EFI_SYSTEM_PARTITION);
 }