Commit 760c3e44 authored by Alexander Graf's avatar Alexander Graf Committed by Kevin Wolf
Browse files

ahci: Implement HBA reset



The ahci code was missing its soft reset functionality. This wasn't really an
issue for Linux guests, but Windows gets confused when the controller doesn't
reset when it tells it so.

Using this patch I can now successfully boot Windows 7 from AHCI using AHCI
enabled SeaBIOS.

Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 87e62065
...@@ -335,7 +335,7 @@ static void ahci_mem_writel(void *ptr, target_phys_addr_t addr, uint32_t val) ...@@ -335,7 +335,7 @@ static void ahci_mem_writel(void *ptr, target_phys_addr_t addr, uint32_t val)
case HOST_CTL: /* R/W */ case HOST_CTL: /* R/W */
if (val & HOST_CTL_RESET) { if (val & HOST_CTL_RESET) {
DPRINTF(-1, "HBA Reset\n"); DPRINTF(-1, "HBA Reset\n");
/* FIXME reset? */ ahci_reset(container_of(s, AHCIPCIState, ahci));
} else { } else {
s->control_regs.ghc = (val & 0x3) | HOST_CTL_AHCI_EN; s->control_regs.ghc = (val & 0x3) | HOST_CTL_AHCI_EN;
ahci_check_irq(s); ahci_check_irq(s);
...@@ -1134,6 +1134,9 @@ void ahci_reset(void *opaque) ...@@ -1134,6 +1134,9 @@ void ahci_reset(void *opaque)
struct AHCIPCIState *d = opaque; struct AHCIPCIState *d = opaque;
int i; int i;
d->ahci.control_regs.irqstatus = 0;
d->ahci.control_regs.ghc = 0;
for (i = 0; i < SATA_PORTS; i++) { for (i = 0; i < SATA_PORTS; i++) {
ahci_reset_port(&d->ahci, i); ahci_reset_port(&d->ahci, i);
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment