Module Name: src
Committed By: jakllsch
Date: Thu Feb 27 16:21:30 UTC 2025
Modified Files:
src/sys/dev/pci: ld_virtio.c
Log Message:
Implement VIRTIO_BLK_F_TOPOLOGY support for physical sector size information
To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sys/dev/pci/ld_virtio.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/ld_virtio.c
diff -u src/sys/dev/pci/ld_virtio.c:1.41 src/sys/dev/pci/ld_virtio.c:1.42
--- src/sys/dev/pci/ld_virtio.c:1.41 Sun Feb 23 22:04:06 2025
+++ src/sys/dev/pci/ld_virtio.c Thu Feb 27 16:21:30 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: ld_virtio.c,v 1.41 2025/02/23 22:04:06 mlelstv Exp $ */
+/* $NetBSD: ld_virtio.c,v 1.42 2025/02/27 16:21:30 jakllsch Exp $ */
/*
* Copyright (c) 2010 Minoura Makoto.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,v 1.41 2025/02/23 22:04:06 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,v 1.42 2025/02/27 16:21:30 jakllsch Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -57,6 +57,10 @@ __KERNEL_RCSID(0, "$NetBSD: ld_virtio.c,
#define VIRTIO_BLK_CONFIG_GEOMETRY_H 18 /* 8bit */
#define VIRTIO_BLK_CONFIG_GEOMETRY_S 19 /* 8bit */
#define VIRTIO_BLK_CONFIG_BLK_SIZE 20 /* 32bit */
+#define VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP 24 /* 8bit */
+#define VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET 25 /* 8bit */
+#define VIRTIO_BLK_CONFIG_MIN_IO_SIZE 26 /* 16bit */
+#define VIRTIO_BLK_CONFIG_OPT_IO_SIZE 28 /* 32bit */
#define VIRTIO_BLK_CONFIG_WRITEBACK 32 /* 8bit */
#define VIRTIO_BLK_CONFIG_NUM_QUEUES 34 /* 16bit */
#define VIRTIO_BLK_CONFIG_MAX_DISCARD_SECTORS 36 /* 32bit */
@@ -324,8 +328,8 @@ ld_virtio_attach(device_t parent, device
virtio_child_attach_start(vsc, self, IPL_BIO,
(VIRTIO_BLK_F_SIZE_MAX | VIRTIO_BLK_F_SEG_MAX |
VIRTIO_BLK_F_GEOMETRY | VIRTIO_BLK_F_RO | VIRTIO_BLK_F_BLK_SIZE |
- VIRTIO_BLK_F_FLUSH | VIRTIO_BLK_F_CONFIG_WCE |
- VIRTIO_BLK_F_DISCARD),
+ VIRTIO_BLK_F_FLUSH | VIRTIO_BLK_F_TOPOLOGY |
+ VIRTIO_BLK_F_CONFIG_WCE | VIRTIO_BLK_F_DISCARD),
VIRTIO_BLK_FLAG_BITS);
features = virtio_features(vsc);
@@ -416,6 +420,13 @@ ld_virtio_attach(device_t parent, device
ld->sc_nsectors = virtio_read_device_config_1(vsc,
VIRTIO_BLK_CONFIG_GEOMETRY_S);
}
+ if (features & VIRTIO_BLK_F_TOPOLOGY) {
+ ld->sc_alignedsec = virtio_read_device_config_1(vsc,
+ VIRTIO_BLK_CONFIG_ALIGNMENT_OFFSET);
+ ld->sc_physsecsize = ld->sc_secsize <<
+ virtio_read_device_config_1(vsc,
+ VIRTIO_BLK_CONFIG_PHYSICAL_BLOCK_EXP);
+ }
ld->sc_maxqueuecnt = qsize - 1; /* reserve slot for dumps, flushes */
if (ld_virtio_alloc_reqs(sc, qsize) < 0)