mirror of https://github.com/xqemu/xqemu.git
convert pci bridge to qdev
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
21eea4b38f
commit
0358718275
62
hw/pci.c
62
hw/pci.c
|
@ -142,18 +142,16 @@ PCIBus *pci_register_bus(DeviceState *parent, const char *name,
|
||||||
return bus;
|
return bus;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PCIBus *pci_register_secondary_bus(PCIDevice *dev,
|
static void pci_register_secondary_bus(PCIBus *bus,
|
||||||
|
PCIDevice *dev,
|
||||||
pci_map_irq_fn map_irq,
|
pci_map_irq_fn map_irq,
|
||||||
const char *name)
|
const char *name)
|
||||||
{
|
{
|
||||||
PCIBus *bus;
|
qbus_create_inplace(&bus->qbus, &pci_bus_info, &dev->qdev, name);
|
||||||
|
|
||||||
bus = FROM_QBUS(PCIBus, qbus_create(&pci_bus_info, &dev->qdev, name));
|
|
||||||
bus->map_irq = map_irq;
|
bus->map_irq = map_irq;
|
||||||
bus->parent_dev = dev;
|
bus->parent_dev = dev;
|
||||||
bus->next = dev->bus->next;
|
bus->next = dev->bus->next;
|
||||||
dev->bus->next = bus;
|
dev->bus->next = bus;
|
||||||
return bus;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int pci_bus_num(PCIBus *s)
|
int pci_bus_num(PCIBus *s)
|
||||||
|
@ -869,7 +867,9 @@ PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PCIDevice dev;
|
PCIDevice dev;
|
||||||
PCIBus *bus;
|
PCIBus bus;
|
||||||
|
uint32_t vid;
|
||||||
|
uint32_t did;
|
||||||
} PCIBridge;
|
} PCIBridge;
|
||||||
|
|
||||||
static void pci_bridge_write_config(PCIDevice *d,
|
static void pci_bridge_write_config(PCIDevice *d,
|
||||||
|
@ -878,7 +878,7 @@ static void pci_bridge_write_config(PCIDevice *d,
|
||||||
PCIBridge *s = (PCIBridge *)d;
|
PCIBridge *s = (PCIBridge *)d;
|
||||||
|
|
||||||
pci_default_write_config(d, address, val, len);
|
pci_default_write_config(d, address, val, len);
|
||||||
s->bus->bus_num = d->config[PCI_SECONDARY_BUS];
|
s->bus.bus_num = d->config[PCI_SECONDARY_BUS];
|
||||||
}
|
}
|
||||||
|
|
||||||
PCIBus *pci_find_bus(int bus_num)
|
PCIBus *pci_find_bus(int bus_num)
|
||||||
|
@ -901,15 +901,12 @@ PCIDevice *pci_find_device(int bus_num, int slot, int function)
|
||||||
return bus->devices[PCI_DEVFN(slot, function)];
|
return bus->devices[PCI_DEVFN(slot, function)];
|
||||||
}
|
}
|
||||||
|
|
||||||
PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did,
|
static int pci_bridge_initfn(PCIDevice *dev)
|
||||||
pci_map_irq_fn map_irq, const char *name)
|
|
||||||
{
|
{
|
||||||
PCIBridge *s;
|
PCIBridge *s = DO_UPCAST(PCIBridge, dev, dev);
|
||||||
s = (PCIBridge *)pci_register_device(bus, name, sizeof(PCIBridge),
|
|
||||||
devfn, NULL, pci_bridge_write_config);
|
|
||||||
|
|
||||||
pci_config_set_vendor_id(s->dev.config, vid);
|
pci_config_set_vendor_id(s->dev.config, s->vid);
|
||||||
pci_config_set_device_id(s->dev.config, did);
|
pci_config_set_device_id(s->dev.config, s->did);
|
||||||
|
|
||||||
s->dev.config[0x04] = 0x06; // command = bus master, pci mem
|
s->dev.config[0x04] = 0x06; // command = bus master, pci mem
|
||||||
s->dev.config[0x05] = 0x00;
|
s->dev.config[0x05] = 0x00;
|
||||||
|
@ -922,9 +919,23 @@ PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did,
|
||||||
s->dev.config[PCI_HEADER_TYPE] =
|
s->dev.config[PCI_HEADER_TYPE] =
|
||||||
PCI_HEADER_TYPE_MULTI_FUNCTION | PCI_HEADER_TYPE_BRIDGE; // header_type
|
PCI_HEADER_TYPE_MULTI_FUNCTION | PCI_HEADER_TYPE_BRIDGE; // header_type
|
||||||
s->dev.config[0x1E] = 0xa0; // secondary status
|
s->dev.config[0x1E] = 0xa0; // secondary status
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
s->bus = pci_register_secondary_bus(&s->dev, map_irq, name);
|
PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did,
|
||||||
return s->bus;
|
pci_map_irq_fn map_irq, const char *name)
|
||||||
|
{
|
||||||
|
PCIDevice *dev;
|
||||||
|
PCIBridge *s;
|
||||||
|
|
||||||
|
dev = pci_create_noinit(bus, devfn, "pci-bridge");
|
||||||
|
qdev_prop_set_uint32(&dev->qdev, "vendorid", vid);
|
||||||
|
qdev_prop_set_uint32(&dev->qdev, "deviceid", did);
|
||||||
|
qdev_init(&dev->qdev);
|
||||||
|
|
||||||
|
s = DO_UPCAST(PCIBridge, dev, dev);
|
||||||
|
pci_register_secondary_bus(&s->bus, &s->dev, map_irq, name);
|
||||||
|
return &s->bus;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
|
static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
|
||||||
|
@ -1085,3 +1096,22 @@ static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent)
|
||||||
r->addr, r->addr + r->size - 1);
|
r->addr, r->addr + r->size - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PCIDeviceInfo bridge_info = {
|
||||||
|
.qdev.name = "pci-bridge",
|
||||||
|
.qdev.size = sizeof(PCIBridge),
|
||||||
|
.init = pci_bridge_initfn,
|
||||||
|
.config_write = pci_bridge_write_config,
|
||||||
|
.qdev.props = (Property[]) {
|
||||||
|
DEFINE_PROP_HEX32("vendorid", PCIBridge, vid, 0),
|
||||||
|
DEFINE_PROP_HEX32("deviceid", PCIBridge, did, 0),
|
||||||
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static void pci_register_devices(void)
|
||||||
|
{
|
||||||
|
pci_qdev_register(&bridge_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
device_init(pci_register_devices)
|
||||||
|
|
Loading…
Reference in New Issue