[edk2] [PATCH 4/5] OvmfPkg: VirtioBlkInit(): expose virtio-blk topology in BlockIo

Subject: [edk2] [PATCH 4/5] OvmfPkg: VirtioBlkInit(): expose virtio-blk topology in BlockIo

From: Laszlo Ersek <lersek@redhat.com>

To: edk2-devel@lists.sourceforge.net, Kevin Wolf <kwolf@redhat.com>

Date: 2013-12-16 03:36:17

UEFI spec                                virtio spec
=======================================  =================================
LowestAlignedLba EFI_LBA (UINT64)        alignment_offset u8
+--------------------------------------  +--------------------------------
| first LBA that is aligned to a         | offset of first aligned
| physical block boundary (SCSI          | logical block
| definition)

LogicalBlocksPerPhysicalBlock UINT32     physical_block_exp u8
+--------------------------------------  +--------------------------------
| number of logical blocks per           | # of logical blocks per
| physical block [...] does not contain  | physical block (log2)
| an exponential value

OptimalTransferLengthGranularity UINT32  opt_io_size le32
+--------------------------------------  +--------------------------------
| optimal transfer length granularity    | optimal (suggested maximum) I/O
| as a number of logical blocks [...] A  | size in blocks
| value of 0 means there is no reported
| optimal transfer length granularity

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek 
---
 OvmfPkg/VirtioBlkDxe/VirtioBlk.c | 38 +++++++++++++++++++++++++++++++++++---
 1 file changed, 35 insertions(+), 3 deletions(-)

diff --git a/OvmfPkg/VirtioBlkDxe/VirtioBlk.c b/OvmfPkg/VirtioBlkDxe/VirtioBlk.c
index 5815cdf..181e5d1 100644
--- a/OvmfPkg/VirtioBlkDxe/VirtioBlk.c
+++ b/OvmfPkg/VirtioBlkDxe/VirtioBlk.c
@@ -595,6 +595,9 @@ VirtioBlkInit (
   UINT32     Features;
   UINT64     NumSectors;
   UINT32     BlockSize;
+  UINT8      PhysicalBlockExp;
+  UINT8      AlignmentOffset;
+  UINT32     OptIoSize;
   UINT16     QueueSize;
 
   //
@@ -662,6 +665,28 @@ VirtioBlkInit (
     BlockSize = 512;
   }
 
+  if (Features & VIRTIO_BLK_F_TOPOLOGY) {
+    Status = VIRTIO_CFG_READ (Dev, Topology.PhysicalBlockExp,
+               &PhysicalBlockExp);
+    if (EFI_ERROR (Status)) {
+      goto Failed;
+    }
+    if (PhysicalBlockExp >= 32) {
+      Status = EFI_UNSUPPORTED;
+      goto Failed;
+    }
+
+    Status = VIRTIO_CFG_READ (Dev, Topology.AlignmentOffset, &AlignmentOffset);
+    if (EFI_ERROR (Status)) {
+      goto Failed;
+    }
+
+    Status = VIRTIO_CFG_READ (Dev, Topology.OptIoSize, &OptIoSize);
+    if (EFI_ERROR (Status)) {
+      goto Failed;
+    }
+  }
+
   //
   // step 4b -- allocate virtqueue
   //
@@ -728,9 +753,8 @@ VirtioBlkInit (
   }
 
   //
-  // Populate the exported interface's attributes; see UEFI spec v2.3.1 +
-  // Errata C, 12.8 EFI Block I/O Protocol. We stick to the lowest possible
-  // EFI_BLOCK_IO_PROTOCOL revision for now.
+  // Populate the exported interface's attributes; see UEFI spec v2.4, 12.9 EFI
+  // Block I/O Protocol.
   //
   Dev->BlockIo.Revision              = 0;
   Dev->BlockIo.Media                 = &Dev->BlockIoMedia;
@@ -748,6 +772,14 @@ VirtioBlkInit (
   Dev->BlockIoMedia.IoAlign          = 0;
   Dev->BlockIoMedia.LastBlock        = DivU64x32 (NumSectors,
                                          BlockSize / 512) - 1;
+
+  if (Features & VIRTIO_BLK_F_TOPOLOGY) {
+    Dev->BlockIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION3;
+
+    Dev->BlockIoMedia.LowestAlignedLba = AlignmentOffset;
+    Dev->BlockIoMedia.LogicalBlocksPerPhysicalBlock = 1u << PhysicalBlockExp;
+    Dev->BlockIoMedia.OptimalTransferLengthGranularity = OptIoSize;
+  }
   return EFI_SUCCESS;
 
 ReleaseQueue:
-- 
1.8.3.1



------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel