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)