[PATCH 2/8] disk: Simplify disk_blk_read() using blk_read()

Marek Vasut marek.vasut+renesas at mailbox.org
Mon Aug 14 01:46:42 CEST 2023

The disk_blk_read() can be simplified using blk_read(), the only
things which needs to be handled are the read offset based on the
partition properties, and the block device ops which are coming
from the parent udevice, not the partition udevice.

The later is currently not implemented correctly as far as I can
tell, since the current code extracts block device descriptor from
the parent udevice which is OK, but extracts block device operations
from the partition udevice, which does not seem OK.

Switching to the blk_read() fixes that too.

The dev_get_blk() usage is simplified using UCLASS_PARTITION check.

Add non-confusing documentation what this really does.

Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
Cc: AKASHI Takahiro <takahiro.akashi at linaro.org>
Cc: Abdellatif El Khlifi <abdellatif.elkhlifi at arm.com>
Cc: Bin Meng <bmeng.cn at gmail.com>
Cc: Heinrich Schuchardt <xypron.glplk at gmx.de>
Cc: Joshua Watt <jpewhacker at gmail.com>
Cc: Michal Suchanek <msuchanek at suse.de>
Cc: Simon Glass <sjg at chromium.org>
Cc: Tobias Waldekranz <tobias at waldekranz.com>
 disk/disk-uclass.c | 38 ++++++++++++++------------------------
 1 file changed, 14 insertions(+), 24 deletions(-)

diff --git a/disk/disk-uclass.c b/disk/disk-uclass.c
index 5974dd8c2ec..6daece1288f 100644
--- a/disk/disk-uclass.c
+++ b/disk/disk-uclass.c
@@ -168,36 +168,26 @@ static struct blk_desc *dev_get_blk(struct udevice *dev)
 	return desc;
+ * disk_blk_read() - Read from a block device partition
+ *
+ * @dev: Device to read from (partition udevice)
+ * @start: Start block for the read (from start of partition)
+ * @blkcnt: Number of blocks to read (within the partition)
+ * @buffer: Place to put the data
+ * @return number of blocks read (which may be less than @blkcnt),
+ * or -ve on error. This never returns 0 unless @blkcnt is 0
+ */
 unsigned long disk_blk_read(struct udevice *dev, lbaint_t start,
 			    lbaint_t blkcnt, void *buffer)
-	struct blk_desc *desc;
-	const struct blk_ops *ops;
-	struct disk_part *part;
-	lbaint_t start_in_disk;
-	ulong blks_read;
-	desc = dev_get_blk(dev);
-	if (!desc)
-		return -ENOSYS;
+	struct disk_part *part = dev_get_uclass_plat(dev);
-	ops = blk_get_ops(dev);
-	if (!ops->read)
+	if (device_get_uclass_id(dev) != UCLASS_PARTITION)
 		return -ENOSYS;
-	start_in_disk = start;
-	part = dev_get_uclass_plat(dev);
-	start_in_disk += part->gpt_part_info.start;
-	if (blkcache_read(desc->uclass_id, desc->devnum, start_in_disk, blkcnt,
-			  desc->blksz, buffer))
-		return blkcnt;
-	blks_read = ops->read(dev, start, blkcnt, buffer);
-	if (blks_read == blkcnt)
-		blkcache_fill(desc->uclass_id, desc->devnum, start_in_disk,
-			      blkcnt, desc->blksz, buffer);
-	return blks_read;
+	return blk_read(dev_get_parent(dev), start + part->gpt_part_info.start,
+			blkcnt, buffer);
 unsigned long disk_blk_write(struct udevice *dev, lbaint_t start,

More information about the U-Boot mailing list