mirror of https://github.com/xqemu/xqemu.git
pci: use qdev reset framework for pci bus reset
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
5af0a04bea
commit
9bb3358627
24
hw/pci.c
24
hw/pci.c
|
@ -43,12 +43,14 @@
|
||||||
|
|
||||||
static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
|
static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
|
||||||
static char *pcibus_get_dev_path(DeviceState *dev);
|
static char *pcibus_get_dev_path(DeviceState *dev);
|
||||||
|
static int pcibus_reset(BusState *qbus);
|
||||||
|
|
||||||
struct BusInfo pci_bus_info = {
|
struct BusInfo pci_bus_info = {
|
||||||
.name = "PCI",
|
.name = "PCI",
|
||||||
.size = sizeof(PCIBus),
|
.size = sizeof(PCIBus),
|
||||||
.print_dev = pcibus_dev_print,
|
.print_dev = pcibus_dev_print,
|
||||||
.get_dev_path = pcibus_get_dev_path,
|
.get_dev_path = pcibus_get_dev_path,
|
||||||
|
.reset = pcibus_reset,
|
||||||
.props = (Property[]) {
|
.props = (Property[]) {
|
||||||
DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
|
DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
|
||||||
DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
|
DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
|
||||||
|
@ -136,6 +138,11 @@ static void pci_update_irq_status(PCIDevice *dev)
|
||||||
static void pci_device_reset(PCIDevice *dev)
|
static void pci_device_reset(PCIDevice *dev)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
/* TODO: call the below unconditionally once all pci devices
|
||||||
|
* are qdevified */
|
||||||
|
if (dev->qdev.info) {
|
||||||
|
qdev_reset_all(&dev->qdev);
|
||||||
|
}
|
||||||
|
|
||||||
dev->irq_state = 0;
|
dev->irq_state = 0;
|
||||||
pci_update_irq_status(dev);
|
pci_update_irq_status(dev);
|
||||||
|
@ -164,9 +171,12 @@ static void pci_device_reset(PCIDevice *dev)
|
||||||
pci_update_mappings(dev);
|
pci_update_mappings(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pci_bus_reset(void *opaque)
|
/*
|
||||||
|
* Trigger pci bus reset under a given bus.
|
||||||
|
* To be called on RST# assert.
|
||||||
|
*/
|
||||||
|
void pci_bus_reset(PCIBus *bus)
|
||||||
{
|
{
|
||||||
PCIBus *bus = opaque;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < bus->nirq; i++) {
|
for (i = 0; i < bus->nirq; i++) {
|
||||||
|
@ -179,6 +189,15 @@ static void pci_bus_reset(void *opaque)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pcibus_reset(BusState *qbus)
|
||||||
|
{
|
||||||
|
pci_bus_reset(DO_UPCAST(PCIBus, qbus, qbus));
|
||||||
|
|
||||||
|
/* topology traverse is done by pci_bus_reset().
|
||||||
|
Tell qbus/qdev walker not to traverse the tree */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static void pci_host_bus_register(int domain, PCIBus *bus)
|
static void pci_host_bus_register(int domain, PCIBus *bus)
|
||||||
{
|
{
|
||||||
struct PCIHostBus *host;
|
struct PCIHostBus *host;
|
||||||
|
@ -233,7 +252,6 @@ void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent,
|
||||||
pci_host_bus_register(0, bus); /* for now only pci domain 0 is supported */
|
pci_host_bus_register(0, bus); /* for now only pci domain 0 is supported */
|
||||||
|
|
||||||
vmstate_register(NULL, -1, &vmstate_pcibus, bus);
|
vmstate_register(NULL, -1, &vmstate_pcibus, bus);
|
||||||
qemu_register_reset(pci_bus_reset, bus);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PCIBus *pci_bus_new(DeviceState *parent, const char *name, int devfn_min)
|
PCIBus *pci_bus_new(DeviceState *parent, const char *name, int devfn_min)
|
||||||
|
|
1
hw/pci.h
1
hw/pci.h
|
@ -232,6 +232,7 @@ void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug, DeviceState *dev);
|
||||||
PCIBus *pci_register_bus(DeviceState *parent, const char *name,
|
PCIBus *pci_register_bus(DeviceState *parent, const char *name,
|
||||||
pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
|
pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
|
||||||
void *irq_opaque, int devfn_min, int nirq);
|
void *irq_opaque, int devfn_min, int nirq);
|
||||||
|
void pci_bus_reset(PCIBus *bus);
|
||||||
|
|
||||||
void pci_bus_set_mem_base(PCIBus *bus, target_phys_addr_t base);
|
void pci_bus_set_mem_base(PCIBus *bus, target_phys_addr_t base);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue