Enable NVMe start controller for Windows guest.
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
@@ -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
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.
Kevin Wolf
Applied[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.
Acked-by Keith Busch <[email protected]>
Thanks, applied to the block branch.
Kevin