Revision 02e2da45 hw/pci.c

b/hw/pci.c
30 30
//#define DEBUG_PCI
31 31

  
32 32
struct PCIBus {
33
    BusState qbus;
33 34
    int bus_num;
34 35
    int devfn_min;
35 36
    pci_set_irq_fn set_irq;
......
87 88
    return 0;
88 89
}
89 90

  
90
PCIBus *pci_register_bus(pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
91
PCIBus *pci_register_bus(DeviceState *parent, const char *name,
92
                         pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
91 93
                         qemu_irq *pic, int devfn_min, int nirq)
92 94
{
93 95
    PCIBus *bus;
94 96
    static int nbus = 0;
95 97

  
96
    bus = qemu_mallocz(sizeof(PCIBus) + (nirq * sizeof(int)));
98
    bus = FROM_QBUS(PCIBus, qbus_create(BUS_TYPE_PCI,
99
                                        sizeof(PCIBus) + (nirq * sizeof(int)),
100
                                        parent, name));
97 101
    bus->set_irq = set_irq;
98 102
    bus->map_irq = map_irq;
99 103
    bus->irq_opaque = pic;
......
320 324
    qemu_free_irqs(pci_dev->irq);
321 325
    pci_irq_index--;
322 326
    pci_dev->bus->devices[pci_dev->devfn] = NULL;
323
    qemu_free(pci_dev);
327
    qdev_free(&pci_dev->qdev);
324 328
    return 0;
325 329
}
326 330

  
......
821 825

  
822 826
    for (i = 0; pci_nic_models[i]; i++) {
823 827
        if (strcmp(nd->model, pci_nic_models[i]) == 0) {
824
            dev = qdev_create(bus, pci_nic_names[i]);
828
            dev = qdev_create(&bus->qbus, pci_nic_names[i]);
825 829
            qdev_set_prop_int(dev, "devfn", devfn);
826 830
            qdev_set_netdev(dev, nd);
827 831
            qdev_init(dev);
......
901 905
    return s->bus;
902 906
}
903 907

  
904
static void pci_qdev_init(DeviceState *qdev, void *opaque)
908
typedef struct {
909
    DeviceInfo qdev;
910
    pci_qdev_initfn init;
911
} PCIDeviceInfo;
912

  
913
static void pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
905 914
{
906 915
    PCIDevice *pci_dev = (PCIDevice *)qdev;
907
    pci_qdev_initfn init;
916
    PCIDeviceInfo *info = container_of(base, PCIDeviceInfo, qdev);
908 917
    PCIBus *bus;
909 918
    int devfn;
910 919

  
911
    init = opaque;
912
    bus = qdev_get_bus(qdev);
920
    bus = FROM_QBUS(PCIBus, qdev_get_parent_bus(qdev));
913 921
    devfn = qdev_get_prop_int(qdev, "devfn", -1);
914 922
    pci_dev = do_pci_register_device(pci_dev, bus, "FIXME", devfn,
915 923
                                     NULL, NULL);//FIXME:config_read, config_write);
916 924
    assert(pci_dev);
917
    init(pci_dev);
925
    info->init(pci_dev);
918 926
}
919 927

  
920 928
void pci_qdev_register(const char *name, int size, pci_qdev_initfn init)
921 929
{
922
    qdev_register(name, size, pci_qdev_init, init);
930
    PCIDeviceInfo *info;
931

  
932
    info = qemu_mallocz(sizeof(*info));
933
    info->init = init;
934
    info->qdev.init = pci_qdev_init;
935
    info->qdev.bus_type = BUS_TYPE_PCI;
936

  
937
    qdev_register(name, size, &info->qdev);
923 938
}
924 939

  
925 940
PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name)
926 941
{
927 942
    DeviceState *dev;
928 943

  
929
    dev = qdev_create(bus, name);
944
    dev = qdev_create(&bus->qbus, name);
930 945
    qdev_set_prop_int(dev, "devfn", devfn);
931 946
    qdev_init(dev);
932 947

  

Also available in: Unified diff