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: Alexander Graf <agraf@suse.de> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
87e62065bb
commit
760c3e44d3
|
@ -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)
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue