ahci: fix sysbus support
Non-PCI AHCI support is broken due to assertion failures when trying to convert AHCIState to a PCIDevice pointer as AHCIState can have different container structs. Fix this by using the non-asserting object cast and checking the returned pointer is not NULL. The AddressSpace pointer is also being initialized to NULL and causing dma_memory_map call to fail. Fix this by initializing to address_space_memory for sysbus instances. Also correct AHCI_VMSTATE to use the correct container SysbusAHCIState for sysbus instances. Signed-off-by: Rob Herring <rob.herring@linaro.org> Message-id: 1392073373-3295-1-git-send-email-robherring2@gmail.com [PMM: added linebreaks to fix overlong lines] Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
059b3527f0
commit
bd16430777
|
@ -118,11 +118,12 @@ static uint32_t ahci_port_read(AHCIState *s, int port, int offset)
|
||||||
static void ahci_irq_raise(AHCIState *s, AHCIDevice *dev)
|
static void ahci_irq_raise(AHCIState *s, AHCIDevice *dev)
|
||||||
{
|
{
|
||||||
AHCIPCIState *d = container_of(s, AHCIPCIState, ahci);
|
AHCIPCIState *d = container_of(s, AHCIPCIState, ahci);
|
||||||
PCIDevice *pci_dev = PCI_DEVICE(d);
|
PCIDevice *pci_dev =
|
||||||
|
(PCIDevice *)object_dynamic_cast(OBJECT(d), TYPE_PCI_DEVICE);
|
||||||
|
|
||||||
DPRINTF(0, "raise irq\n");
|
DPRINTF(0, "raise irq\n");
|
||||||
|
|
||||||
if (msi_enabled(pci_dev)) {
|
if (pci_dev && msi_enabled(pci_dev)) {
|
||||||
msi_notify(pci_dev, 0);
|
msi_notify(pci_dev, 0);
|
||||||
} else {
|
} else {
|
||||||
qemu_irq_raise(s->irq);
|
qemu_irq_raise(s->irq);
|
||||||
|
@ -132,10 +133,12 @@ static void ahci_irq_raise(AHCIState *s, AHCIDevice *dev)
|
||||||
static void ahci_irq_lower(AHCIState *s, AHCIDevice *dev)
|
static void ahci_irq_lower(AHCIState *s, AHCIDevice *dev)
|
||||||
{
|
{
|
||||||
AHCIPCIState *d = container_of(s, AHCIPCIState, ahci);
|
AHCIPCIState *d = container_of(s, AHCIPCIState, ahci);
|
||||||
|
PCIDevice *pci_dev =
|
||||||
|
(PCIDevice *)object_dynamic_cast(OBJECT(d), TYPE_PCI_DEVICE);
|
||||||
|
|
||||||
DPRINTF(0, "lower irq\n");
|
DPRINTF(0, "lower irq\n");
|
||||||
|
|
||||||
if (!msi_enabled(PCI_DEVICE(d))) {
|
if (!pci_dev || !msi_enabled(pci_dev)) {
|
||||||
qemu_irq_lower(s->irq);
|
qemu_irq_lower(s->irq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1311,7 +1314,7 @@ static const VMStateDescription vmstate_sysbus_ahci = {
|
||||||
.name = "sysbus-ahci",
|
.name = "sysbus-ahci",
|
||||||
.unmigratable = 1, /* Still buggy under I/O load */
|
.unmigratable = 1, /* Still buggy under I/O load */
|
||||||
.fields = (VMStateField []) {
|
.fields = (VMStateField []) {
|
||||||
VMSTATE_AHCI(ahci, AHCIPCIState),
|
VMSTATE_AHCI(ahci, SysbusAHCIState),
|
||||||
VMSTATE_END_OF_LIST()
|
VMSTATE_END_OF_LIST()
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -1328,7 +1331,7 @@ static void sysbus_ahci_realize(DeviceState *dev, Error **errp)
|
||||||
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
||||||
SysbusAHCIState *s = SYSBUS_AHCI(dev);
|
SysbusAHCIState *s = SYSBUS_AHCI(dev);
|
||||||
|
|
||||||
ahci_init(&s->ahci, dev, NULL, s->num_ports);
|
ahci_init(&s->ahci, dev, &address_space_memory, s->num_ports);
|
||||||
|
|
||||||
sysbus_init_mmio(sbd, &s->ahci.mem);
|
sysbus_init_mmio(sbd, &s->ahci.mem);
|
||||||
sysbus_init_irq(sbd, &s->ahci.irq);
|
sysbus_init_irq(sbd, &s->ahci.irq);
|
||||||
|
|
Loading…
Reference in a new issue