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