u-boot.lists.denx.de archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/1] virtio: blk: support block sizes exceeding 512 bytes
@ 2025-08-30 20:39 Heinrich Schuchardt
  2025-09-02  9:19 ` Emil Renner Berthing
  0 siblings, 1 reply; 2+ messages in thread
From: Heinrich Schuchardt @ 2025-08-30 20:39 UTC (permalink / raw)
  To: Bin Meng
  Cc: Emil Renner Berthing, Tom Rini, Cody Schuffelen, Dmitrii Merkurev,
	Simon Glass, u-boot, Heinrich Schuchardt

QEMU allows to specify the logical block size via parameter
logical_block_size of a virtio-blk-device.

The communication channel via virtqueues remains based on 512 byte blocks
even if the logical_block_size is larger.

Consider the logical block size in the block device driver.

Reported-by: Emil Renner Berthing <emil.renner.berthing@canonical.com>
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
---
v2:
	remove superfluous include linux/err.h
---
 drivers/virtio/virtio_blk.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/drivers/virtio/virtio_blk.c b/drivers/virtio/virtio_blk.c
index 2f999fc8bbe..4224e3c17f4 100644
--- a/drivers/virtio/virtio_blk.c
+++ b/drivers/virtio/virtio_blk.c
@@ -12,10 +12,17 @@
 #include <virtio_types.h>
 #include <virtio.h>
 #include <virtio_ring.h>
+#include <linux/log2.h>
 #include "virtio_blk.h"
 
+/**
+ * struct virtio_blk_priv - private date for virtio block device
+ */
 struct virtio_blk_priv {
+	/** @virtqueue - virtqueue to process */
 	struct virtqueue *vq;
+	/** @blksz_shift - log2 of block size divided by 512 */
+	u32 blksz_shift;
 };
 
 static const u32 feature[] = {
@@ -71,6 +78,8 @@ static ulong virtio_blk_do_req(struct udevice *dev, u64 sector,
 	u8 status;
 	int ret;
 
+	sector <<= priv->blksz_shift;
+	blkcnt <<= priv->blksz_shift;
 	virtio_blk_init_header_sg(dev, sector, type, &out_hdr, &hdr_sg);
 	sgs[num_out++] = &hdr_sg;
 
@@ -109,7 +118,7 @@ static ulong virtio_blk_do_req(struct udevice *dev, u64 sector,
 		;
 	log_debug("done\n");
 
-	return status == VIRTIO_BLK_S_OK ? blkcnt : -EIO;
+	return status == VIRTIO_BLK_S_OK ? blkcnt >> priv->blksz_shift : -EIO;
 }
 
 static ulong virtio_blk_read(struct udevice *dev, lbaint_t start,
@@ -177,15 +186,25 @@ static int virtio_blk_probe(struct udevice *dev)
 	struct blk_desc *desc = dev_get_uclass_plat(dev);
 	u64 cap;
 	int ret;
+	u32 blk_size;
 
 	ret = virtio_find_vqs(dev, 1, &priv->vq);
 	if (ret)
 		return ret;
 
-	desc->blksz = 512;
-	desc->log2blksz = 9;
 	virtio_cread(dev, struct virtio_blk_config, capacity, &cap);
 	desc->lba = cap;
+	if (!virtio_has_feature(dev, VIRTIO_BLK_F_BLK_SIZE)) {
+		virtio_cread(dev, struct virtio_blk_config, blk_size, &blk_size);
+		desc->blksz = blk_size;
+		if (!is_power_of_2(blk_size) || desc->blksz < 512)
+			return -EIO;
+	} else {
+		desc->blksz = 512;
+	}
+	desc->log2blksz = LOG2(desc->blksz);
+	priv->blksz_shift = desc->log2blksz - 9;
+	desc->lba >>= priv->blksz_shift;
 
 	return 0;
 }
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v2 1/1] virtio: blk: support block sizes exceeding 512 bytes
  2025-08-30 20:39 [PATCH v2 1/1] virtio: blk: support block sizes exceeding 512 bytes Heinrich Schuchardt
@ 2025-09-02  9:19 ` Emil Renner Berthing
  0 siblings, 0 replies; 2+ messages in thread
From: Emil Renner Berthing @ 2025-09-02  9:19 UTC (permalink / raw)
  To: Heinrich Schuchardt, Bin Meng
  Cc: Emil Renner Berthing, Tom Rini, Cody Schuffelen, Dmitrii Merkurev,
	Simon Glass, u-boot

Heinrich Schuchardt wrote:
> QEMU allows to specify the logical block size via parameter
> logical_block_size of a virtio-blk-device.
>
> The communication channel via virtqueues remains based on 512 byte blocks
> even if the logical_block_size is larger.
>
> Consider the logical block size in the block device driver.
>
> Reported-by: Emil Renner Berthing <emil.renner.berthing@canonical.com>
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>

Thanks!

Tested-by: Emil Renner Berthing <emil.renner.berthing@canonical.com>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2025-09-02 12:59 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-30 20:39 [PATCH v2 1/1] virtio: blk: support block sizes exceeding 512 bytes Heinrich Schuchardt
2025-09-02  9:19 ` Emil Renner Berthing

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).