1 |
commit: c3f02b3326bbdf3f016c3baa1617863d4d85c478 |
2 |
Author: Jason Baron <jbaron <AT> redhat <DOT> com> |
3 |
AuthorDate: Tue Sep 4 20:08:08 2012 +0000 |
4 |
Commit: Doug Goldstein <cardoe <AT> gentoo <DOT> org> |
5 |
CommitDate: Wed Oct 24 07:06:43 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/qemu-kvm.git;a=commit;h=c3f02b33 |
7 |
|
8 |
ahci: properly reset PxCMD on HBA reset |
9 |
|
10 |
While testing q35, I found that windows 7 (specifically, windows 7 ultimate |
11 |
with sp1 x64), wouldn't install because it can't find the cdrom or disk drive. |
12 |
The failure message is: 'A required cd/dvd device driver is missing. If you |
13 |
have a driver floppy disk, CD, DVD, or USB flash drive, please insert it now.' |
14 |
This can also be reproduced on piix by adding an ahci controller, and |
15 |
observing that windows 7 does not see any devices behind it. |
16 |
|
17 |
The problem is that when windows issues a HBA reset, qemu does not reset the |
18 |
individual ports' PxCMD register. Windows 7 then reads back the PxCMD register |
19 |
and presumably assumes that the ahci controller has already been initialized. |
20 |
Windows then never sets up the PxIE register to enable interrupts, and thus it |
21 |
never gets irqs back when it sends ata device inquiry commands. |
22 |
|
23 |
This change brings qemu into ahci 1.3 specification compliance. |
24 |
|
25 |
Section 10.4.3 HBA Reset: |
26 |
|
27 |
" |
28 |
When GHC.HR is set to '1', GHC.AE, GHC.IE, the IS register, and all port |
29 |
register fields (except PxFB/PxFBU/PxCLB/PxCLBU) that are not HwInit in the |
30 |
HBA's register memory space are reset. |
31 |
" |
32 |
|
33 |
I've also re-tested Fedora 16 and 17 to verify that they continue to work with |
34 |
this change. |
35 |
|
36 |
Signed-off-by: Jason Baron <jbaron <AT> redhat.com> |
37 |
Acked-by: Alexander Graf <agraf <AT> suse.de> |
38 |
Signed-off-by: Kevin Wolf <kwolf <AT> redhat.com> |
39 |
(cherry picked from commit 2a4f4f34e6fe55f4c82507c3e7ec9b58c2e24ad4) |
40 |
|
41 |
Conflicts: |
42 |
|
43 |
hw/ide/ahci.c |
44 |
|
45 |
--- |
46 |
hw/ide/ahci.c | 2 +- |
47 |
1 files changed, 1 insertions(+), 1 deletions(-) |
48 |
|
49 |
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c |
50 |
index 267198e..1b5b5bf 100644 |
51 |
--- a/hw/ide/ahci.c |
52 |
+++ b/hw/ide/ahci.c |
53 |
@@ -1168,7 +1168,6 @@ void ahci_init(AHCIState *s, DeviceState *qdev, int ports) |
54 |
ad->port_no = i; |
55 |
ad->port.dma = &ad->dma; |
56 |
ad->port.dma->ops = &ahci_dma_ops; |
57 |
- ad->port_regs.cmd = PORT_CMD_SPIN_UP | PORT_CMD_POWER_ON; |
58 |
} |
59 |
} |
60 |
|
61 |
@@ -1193,6 +1192,7 @@ void ahci_reset(void *opaque) |
62 |
pr->irq_stat = 0; |
63 |
pr->irq_mask = 0; |
64 |
pr->scr_ctl = 0; |
65 |
+ pr->cmd = PORT_CMD_SPIN_UP | PORT_CMD_POWER_ON; |
66 |
ahci_reset_port(&d->ahci, i); |
67 |
} |
68 |
} |