Commit 0aab0d3a4a62505ab7e79ee0a67fe3f04f6dae23
Committed by
Paul Brook
1 parent
e2b19c85
qdev: update pci device registration.
Makes pci_qdev_register take a PCIDeviceInfo struct instead of a bunch of parameters. Also adds config_read and config_write callbacks to PCIDeviceInfo, so drivers needing these can be converted to the qdev device API too. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Showing
10 changed files
with
103 additions
and
36 deletions
hw/e1000.c
... | ... | @@ -1125,9 +1125,15 @@ static void pci_e1000_init(PCIDevice *pci_dev) |
1125 | 1125 | e1000_reset(d); |
1126 | 1126 | } |
1127 | 1127 | |
1128 | +static PCIDeviceInfo e1000_info = { | |
1129 | + .qdev.name = "e1000", | |
1130 | + .qdev.size = sizeof(E1000State), | |
1131 | + .init = pci_e1000_init, | |
1132 | +}; | |
1133 | + | |
1128 | 1134 | static void e1000_register_devices(void) |
1129 | 1135 | { |
1130 | - pci_qdev_register("e1000", sizeof(E1000State), pci_e1000_init); | |
1136 | + pci_qdev_register(&e1000_info); | |
1131 | 1137 | } |
1132 | 1138 | |
1133 | 1139 | device_init(e1000_register_devices) | ... | ... |
hw/eepro100.c
... | ... | @@ -1792,14 +1792,27 @@ static void pci_i82559er_init(PCIDevice *dev) |
1792 | 1792 | nic_init(dev, i82559ER); |
1793 | 1793 | } |
1794 | 1794 | |
1795 | +static PCIDeviceInfo eepro100_info[] = { | |
1796 | + { | |
1797 | + .qdev.name = "i82551", | |
1798 | + .qdev.size = sizeof(PCIEEPRO100State), | |
1799 | + .init = pci_i82551_init, | |
1800 | + },{ | |
1801 | + .qdev.name = "i82557b", | |
1802 | + .qdev.size = sizeof(PCIEEPRO100State), | |
1803 | + .init = pci_i82557b_init, | |
1804 | + },{ | |
1805 | + .qdev.name = "i82559er", | |
1806 | + .qdev.size = sizeof(PCIEEPRO100State), | |
1807 | + .init = pci_i82559er_init, | |
1808 | + },{ | |
1809 | + /* end of list */ | |
1810 | + } | |
1811 | +}; | |
1812 | + | |
1795 | 1813 | static void eepro100_register_devices(void) |
1796 | 1814 | { |
1797 | - pci_qdev_register("i82551", sizeof(PCIEEPRO100State), | |
1798 | - pci_i82551_init); | |
1799 | - pci_qdev_register("i82557b", sizeof(PCIEEPRO100State), | |
1800 | - pci_i82557b_init); | |
1801 | - pci_qdev_register("i82559er", sizeof(PCIEEPRO100State), | |
1802 | - pci_i82559er_init); | |
1815 | + pci_qdev_register_many(eepro100_info); | |
1803 | 1816 | } |
1804 | 1817 | |
1805 | 1818 | device_init(eepro100_register_devices) | ... | ... |
hw/lsi53c895a.c
... | ... | @@ -2035,9 +2035,15 @@ static void lsi_scsi_init(PCIDevice *dev) |
2035 | 2035 | scsi_bus_new(&dev->qdev, lsi_scsi_attach); |
2036 | 2036 | } |
2037 | 2037 | |
2038 | +static PCIDeviceInfo lsi_info = { | |
2039 | + .qdev.name = "lsi53c895a", | |
2040 | + .qdev.size = sizeof(LSIState), | |
2041 | + .init = lsi_scsi_init, | |
2042 | +}; | |
2043 | + | |
2038 | 2044 | static void lsi53c895a_register_devices(void) |
2039 | 2045 | { |
2040 | - pci_qdev_register("lsi53c895a", sizeof(LSIState), lsi_scsi_init); | |
2046 | + pci_qdev_register(&lsi_info); | |
2041 | 2047 | } |
2042 | 2048 | |
2043 | 2049 | device_init(lsi53c895a_register_devices); | ... | ... |
hw/ne2000.c
... | ... | @@ -832,9 +832,15 @@ static void pci_ne2000_init(PCIDevice *pci_dev) |
832 | 832 | register_savevm("ne2000", -1, 3, ne2000_save, ne2000_load, s); |
833 | 833 | } |
834 | 834 | |
835 | +static PCIDeviceInfo ne2000_info = { | |
836 | + .qdev.name = "ne2k_pci", | |
837 | + .qdev.size = sizeof(PCINE2000State), | |
838 | + .init = pci_ne2000_init, | |
839 | +}; | |
840 | + | |
835 | 841 | static void ne2000_register_devices(void) |
836 | 842 | { |
837 | - pci_qdev_register("ne2k_pci", sizeof(PCINE2000State), pci_ne2000_init); | |
843 | + pci_qdev_register(&ne2000_info); | |
838 | 844 | } |
839 | 845 | |
840 | 846 | device_init(ne2000_register_devices) | ... | ... |
hw/pci.c
... | ... | @@ -874,11 +874,6 @@ PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, |
874 | 874 | return s->bus; |
875 | 875 | } |
876 | 876 | |
877 | -typedef struct { | |
878 | - DeviceInfo qdev; | |
879 | - pci_qdev_initfn init; | |
880 | -} PCIDeviceInfo; | |
881 | - | |
882 | 877 | static void pci_qdev_init(DeviceState *qdev, DeviceInfo *base) |
883 | 878 | { |
884 | 879 | PCIDevice *pci_dev = (PCIDevice *)qdev; |
... | ... | @@ -889,25 +884,26 @@ static void pci_qdev_init(DeviceState *qdev, DeviceInfo *base) |
889 | 884 | bus = FROM_QBUS(PCIBus, qdev_get_parent_bus(qdev)); |
890 | 885 | devfn = qdev_get_prop_int(qdev, "devfn", -1); |
891 | 886 | pci_dev = do_pci_register_device(pci_dev, bus, "FIXME", devfn, |
892 | - NULL, NULL);//FIXME:config_read, config_write); | |
887 | + info->config_read, info->config_write); | |
893 | 888 | assert(pci_dev); |
894 | 889 | info->init(pci_dev); |
895 | 890 | } |
896 | 891 | |
897 | -void pci_qdev_register(const char *name, int size, pci_qdev_initfn init) | |
892 | +void pci_qdev_register(PCIDeviceInfo *info) | |
898 | 893 | { |
899 | - PCIDeviceInfo *info; | |
900 | - | |
901 | - info = qemu_mallocz(sizeof(*info)); | |
902 | - info->qdev.name = qemu_strdup(name); | |
903 | - info->qdev.size = size; | |
904 | - info->init = init; | |
905 | 894 | info->qdev.init = pci_qdev_init; |
906 | 895 | info->qdev.bus_type = BUS_TYPE_PCI; |
907 | - | |
908 | 896 | qdev_register(&info->qdev); |
909 | 897 | } |
910 | 898 | |
899 | +void pci_qdev_register_many(PCIDeviceInfo *info) | |
900 | +{ | |
901 | + while (info->qdev.name) { | |
902 | + pci_qdev_register(info); | |
903 | + info++; | |
904 | + } | |
905 | +} | |
906 | + | |
911 | 907 | PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name) |
912 | 908 | { |
913 | 909 | DeviceState *dev; | ... | ... |
hw/pci.h
... | ... | @@ -314,7 +314,15 @@ pci_config_set_class(uint8_t *pci_config, uint16_t val) |
314 | 314 | } |
315 | 315 | |
316 | 316 | typedef void (*pci_qdev_initfn)(PCIDevice *dev); |
317 | -void pci_qdev_register(const char *name, int size, pci_qdev_initfn init); | |
317 | +typedef struct { | |
318 | + DeviceInfo qdev; | |
319 | + pci_qdev_initfn init; | |
320 | + PCIConfigReadFunc *config_read; | |
321 | + PCIConfigWriteFunc *config_write; | |
322 | +} PCIDeviceInfo; | |
323 | + | |
324 | +void pci_qdev_register(PCIDeviceInfo *info); | |
325 | +void pci_qdev_register_many(PCIDeviceInfo *info); | |
318 | 326 | |
319 | 327 | PCIDevice *pci_create(const char *name, const char *devaddr); |
320 | 328 | PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name); | ... | ... |
hw/pcnet.c
... | ... | @@ -2143,9 +2143,15 @@ static void lance_init(SysBusDevice *dev) |
2143 | 2143 | } |
2144 | 2144 | #endif /* TARGET_SPARC */ |
2145 | 2145 | |
2146 | +static PCIDeviceInfo pcnet_info = { | |
2147 | + .qdev.name = "pcnet", | |
2148 | + .qdev.size = sizeof(PCIPCNetState), | |
2149 | + .init = pci_pcnet_init, | |
2150 | +}; | |
2151 | + | |
2146 | 2152 | static void pcnet_register_devices(void) |
2147 | 2153 | { |
2148 | - pci_qdev_register("pcnet", sizeof(PCIPCNetState), pci_pcnet_init); | |
2154 | + pci_qdev_register(&pcnet_info); | |
2149 | 2155 | #if defined (TARGET_SPARC) && !defined(TARGET_SPARC64) |
2150 | 2156 | sysbus_register_dev("lance", sizeof(SysBusPCNetState), lance_init); |
2151 | 2157 | #endif | ... | ... |
hw/rtl8139.c
... | ... | @@ -3499,9 +3499,15 @@ static void pci_rtl8139_init(PCIDevice *dev) |
3499 | 3499 | #endif /* RTL8139_ONBOARD_TIMER */ |
3500 | 3500 | } |
3501 | 3501 | |
3502 | +static PCIDeviceInfo rtl8139_info = { | |
3503 | + .qdev.name = "rtl8139", | |
3504 | + .qdev.size = sizeof(PCIRTL8139State), | |
3505 | + .init = pci_rtl8139_init, | |
3506 | +}; | |
3507 | + | |
3502 | 3508 | static void rtl8139_register_devices(void) |
3503 | 3509 | { |
3504 | - pci_qdev_register("rtl8139", sizeof(PCIRTL8139State), pci_rtl8139_init); | |
3510 | + pci_qdev_register(&rtl8139_info); | |
3505 | 3511 | } |
3506 | 3512 | |
3507 | 3513 | device_init(rtl8139_register_devices) | ... | ... |
hw/versatile_pci.c
... | ... | @@ -153,13 +153,18 @@ static void versatile_pci_host_init(PCIDevice *d) |
153 | 153 | d->config[0x0D] = 0x10; // latency_timer |
154 | 154 | } |
155 | 155 | |
156 | +static PCIDeviceInfo versatile_pci_host_info = { | |
157 | + .qdev.name = "versatile_pci_host", | |
158 | + .qdev.size = sizeof(PCIDevice), | |
159 | + .init = versatile_pci_host_init, | |
160 | +}; | |
161 | + | |
156 | 162 | static void versatile_pci_register_devices(void) |
157 | 163 | { |
158 | 164 | sysbus_register_dev("versatile_pci", sizeof(PCIVPBState), pci_vpb_init); |
159 | 165 | sysbus_register_dev("realview_pci", sizeof(PCIVPBState), |
160 | 166 | pci_realview_init); |
161 | - pci_qdev_register("versatile_pci_host", sizeof(PCIDevice), | |
162 | - versatile_pci_host_init); | |
167 | + pci_qdev_register(&versatile_pci_host_info); | |
163 | 168 | } |
164 | 169 | |
165 | 170 | device_init(versatile_pci_register_devices) | ... | ... |
hw/virtio-pci.c
... | ... | @@ -466,16 +466,31 @@ static void virtio_balloon_init_pci(PCIDevice *pci_dev) |
466 | 466 | 0x00); |
467 | 467 | } |
468 | 468 | |
469 | +static PCIDeviceInfo virtio_info[] = { | |
470 | + { | |
471 | + .qdev.name = "virtio-blk-pci", | |
472 | + .qdev.size = sizeof(VirtIOPCIProxy), | |
473 | + .init = virtio_blk_init_pci, | |
474 | + },{ | |
475 | + .qdev.name = "virtio-net-pci", | |
476 | + .qdev.size = sizeof(VirtIOPCIProxy), | |
477 | + .init = virtio_net_init_pci, | |
478 | + },{ | |
479 | + .qdev.name = "virtio-console-pci", | |
480 | + .qdev.size = sizeof(VirtIOPCIProxy), | |
481 | + .init = virtio_console_init_pci, | |
482 | + },{ | |
483 | + .qdev.name = "virtio-balloon-pci", | |
484 | + .qdev.size = sizeof(VirtIOPCIProxy), | |
485 | + .init = virtio_balloon_init_pci, | |
486 | + },{ | |
487 | + /* end of list */ | |
488 | + } | |
489 | +}; | |
490 | + | |
469 | 491 | static void virtio_pci_register_devices(void) |
470 | 492 | { |
471 | - pci_qdev_register("virtio-blk-pci", sizeof(VirtIOPCIProxy), | |
472 | - virtio_blk_init_pci); | |
473 | - pci_qdev_register("virtio-net-pci", sizeof(VirtIOPCIProxy), | |
474 | - virtio_net_init_pci); | |
475 | - pci_qdev_register("virtio-console-pci", sizeof(VirtIOPCIProxy), | |
476 | - virtio_console_init_pci); | |
477 | - pci_qdev_register("virtio-balloon-pci", sizeof(VirtIOPCIProxy), | |
478 | - virtio_balloon_init_pci); | |
493 | + pci_qdev_register_many(virtio_info); | |
479 | 494 | } |
480 | 495 | |
481 | 496 | device_init(virtio_pci_register_devices) | ... | ... |