//\r
#pragma pack(1)\r
typedef struct {\r
- UINT64 Capacity;\r
- UINT32 SizeMax;\r
- UINT32 SegMax;\r
- UINT16 Cylinders;\r
- UINT8 Heads;\r
- UINT8 Sectors;\r
- UINT32 BlkSize;\r
+ UINT8 PhysicalBlockExp; // # of logical blocks per physical block (log2)\r
+ UINT8 AlignmentOffset; // offset of first aligned logical block\r
+ UINT16 MinIoSize; // suggested minimum I/O size in blocks\r
+ UINT32 OptIoSize; // optimal (suggested maximum) I/O size in blocks\r
+} VIRTIO_BLK_TOPOLOGY;\r
+\r
+typedef struct {\r
+ UINT64 Capacity;\r
+ UINT32 SizeMax;\r
+ UINT32 SegMax;\r
+ UINT16 Cylinders;\r
+ UINT8 Heads;\r
+ UINT8 Sectors;\r
+ UINT32 BlkSize;\r
+ VIRTIO_BLK_TOPOLOGY Topology;\r
} VIRTIO_BLK_CONFIG;\r
#pragma pack()\r
\r
#define VIRTIO_BLK_F_SEG_MAX BIT2\r
#define VIRTIO_BLK_F_GEOMETRY BIT4\r
#define VIRTIO_BLK_F_RO BIT5\r
-#define VIRTIO_BLK_F_BLK_SIZE BIT6 // treated as "logical block size" in\r
- // practice; actual host side implementation\r
- // negotiates "optimal" block size\r
- // separately\r
+#define VIRTIO_BLK_F_BLK_SIZE BIT6 // treated as "logical block size" in\r
+ // practice; actual host side\r
+ // implementation negotiates "optimal"\r
+ // block size separately, via\r
+ // VIRTIO_BLK_F_TOPOLOGY\r
#define VIRTIO_BLK_F_SCSI BIT7\r
-#define VIRTIO_BLK_F_FLUSH BIT9 // identical to "write cache enabled"\r
+#define VIRTIO_BLK_F_FLUSH BIT9 // identical to "write cache enabled"\r
+#define VIRTIO_BLK_F_TOPOLOGY BIT10 // information on optimal I/O alignment\r
\r
//\r
// We keep the status byte separate from the rest of the virtio-blk request\r