Skip to contentSkip to conversation

Enable NVMe start controller for Windows guest.

PATCH Applied Daniel Stekloff 3 participants 3 messages Apr 24, 2015 – Apr 30, 2015

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Enable NVMe start controller for Windows guest.

Windows seems to send two separate calls to NVMe controller configuration. The first sends configuration info and the second the enable bit. I couldn't enable the Windows 8.1 in-box NVMe driver with base Qemu. I made the following change to store the configuration data and then handle enable and NVMe driver works on Windows 8.1.

I am not a Windows expert and I'm not entirely sure this is the correct approach. I'm offering it for anyone who wishes to use NVMe on Windows 8.1 using Qemu.

I have tested this change with Linux and Windows guests with NVMe devices.

---
 hw/block/nvme.c | 7 +++++++
 1 file changed, 7 insertions(+)
hw/block/nvme.c +7 -0
index 1e07166..ad988d7 100644
@@ -615,6 +615,13 @@ static void nvme_write_bar(NvmeCtrl *n, hwaddr offset, uint64_t data,
         n->bar.intmc = n->bar.intms;
         break;
     case 0x14:
+        /* Windows first sends data, then sends enable bit */
+        if (!NVME_CC_EN(data) && !NVME_CC_EN(n->bar.cc) &&
+            !NVME_CC_SHN(data) && !NVME_CC_SHN(n->bar.cc))
+        {
+            n->bar.cc = data;
+        }
+
         if (NVME_CC_EN(data) && !NVME_CC_EN(n->bar.cc)) {
             n->bar.cc = data;
             if (nvme_start_ctrl(n)) {
Signature · 1 line
1.9.1
Acked-by on v1 1/1
#1 lore raw
Quoted 5 lines · Daniel Stekloff

Windows seems to send two separate calls to NVMe controller configuration. The first sends configuration info and the second the enable bit. I couldn't enable the Windows 8.1 in-box NVMe driver with base Qemu. I made the following change to store the configuration data and then handle enable and NVMe driver works on Windows 8.1.

Hm, Microsoft's driver must be issuing MMIO reads to mask in the enable bit rather than keep the state known. Sounds odd, but thanks for the fix.

Applied
#2 lore raw

[Cc: qemu-block]

Am 24.04.2015 um 21:19 hat Keith Busch geschrieben:

Quoted 11 lines · Daniel Stekloff
Quoted 5 lines

Windows seems to send two separate calls to NVMe controller configuration. The first sends configuration info and the second the enable bit. I couldn't enable the Windows 8.1 in-box NVMe driver with base Qemu. I made the following change to store the configuration data and then handle enable and NVMe driver works on Windows 8.1.

Hm, Microsoft's driver must be issuing MMIO reads to mask in the enable bit rather than keep the state known. Sounds odd, but thanks for the fix.

Thanks, applied to the block branch.

Kevin