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,9 +1125,15 @@ static void pci_e1000_init(PCIDevice *pci_dev) | ||
| 1125 | e1000_reset(d); | 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 | static void e1000_register_devices(void) | 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 | device_init(e1000_register_devices) | 1139 | device_init(e1000_register_devices) |
hw/eepro100.c
| @@ -1792,14 +1792,27 @@ static void pci_i82559er_init(PCIDevice *dev) | @@ -1792,14 +1792,27 @@ static void pci_i82559er_init(PCIDevice *dev) | ||
| 1792 | nic_init(dev, i82559ER); | 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 | static void eepro100_register_devices(void) | 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 | device_init(eepro100_register_devices) | 1818 | device_init(eepro100_register_devices) |
hw/lsi53c895a.c
| @@ -2035,9 +2035,15 @@ static void lsi_scsi_init(PCIDevice *dev) | @@ -2035,9 +2035,15 @@ static void lsi_scsi_init(PCIDevice *dev) | ||
| 2035 | scsi_bus_new(&dev->qdev, lsi_scsi_attach); | 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 | static void lsi53c895a_register_devices(void) | 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 | device_init(lsi53c895a_register_devices); | 2049 | device_init(lsi53c895a_register_devices); |
hw/ne2000.c
| @@ -832,9 +832,15 @@ static void pci_ne2000_init(PCIDevice *pci_dev) | @@ -832,9 +832,15 @@ static void pci_ne2000_init(PCIDevice *pci_dev) | ||
| 832 | register_savevm("ne2000", -1, 3, ne2000_save, ne2000_load, s); | 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 | static void ne2000_register_devices(void) | 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 | device_init(ne2000_register_devices) | 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,11 +874,6 @@ PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, | ||
| 874 | return s->bus; | 874 | return s->bus; |
| 875 | } | 875 | } |
| 876 | 876 | ||
| 877 | -typedef struct { | ||
| 878 | - DeviceInfo qdev; | ||
| 879 | - pci_qdev_initfn init; | ||
| 880 | -} PCIDeviceInfo; | ||
| 881 | - | ||
| 882 | static void pci_qdev_init(DeviceState *qdev, DeviceInfo *base) | 877 | static void pci_qdev_init(DeviceState *qdev, DeviceInfo *base) |
| 883 | { | 878 | { |
| 884 | PCIDevice *pci_dev = (PCIDevice *)qdev; | 879 | PCIDevice *pci_dev = (PCIDevice *)qdev; |
| @@ -889,25 +884,26 @@ static void pci_qdev_init(DeviceState *qdev, DeviceInfo *base) | @@ -889,25 +884,26 @@ static void pci_qdev_init(DeviceState *qdev, DeviceInfo *base) | ||
| 889 | bus = FROM_QBUS(PCIBus, qdev_get_parent_bus(qdev)); | 884 | bus = FROM_QBUS(PCIBus, qdev_get_parent_bus(qdev)); |
| 890 | devfn = qdev_get_prop_int(qdev, "devfn", -1); | 885 | devfn = qdev_get_prop_int(qdev, "devfn", -1); |
| 891 | pci_dev = do_pci_register_device(pci_dev, bus, "FIXME", devfn, | 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 | assert(pci_dev); | 888 | assert(pci_dev); |
| 894 | info->init(pci_dev); | 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 | info->qdev.init = pci_qdev_init; | 894 | info->qdev.init = pci_qdev_init; |
| 906 | info->qdev.bus_type = BUS_TYPE_PCI; | 895 | info->qdev.bus_type = BUS_TYPE_PCI; |
| 907 | - | ||
| 908 | qdev_register(&info->qdev); | 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 | PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name) | 907 | PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name) |
| 912 | { | 908 | { |
| 913 | DeviceState *dev; | 909 | DeviceState *dev; |
hw/pci.h
| @@ -314,7 +314,15 @@ pci_config_set_class(uint8_t *pci_config, uint16_t val) | @@ -314,7 +314,15 @@ pci_config_set_class(uint8_t *pci_config, uint16_t val) | ||
| 314 | } | 314 | } |
| 315 | 315 | ||
| 316 | typedef void (*pci_qdev_initfn)(PCIDevice *dev); | 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 | PCIDevice *pci_create(const char *name, const char *devaddr); | 327 | PCIDevice *pci_create(const char *name, const char *devaddr); |
| 320 | PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name); | 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,9 +2143,15 @@ static void lance_init(SysBusDevice *dev) | ||
| 2143 | } | 2143 | } |
| 2144 | #endif /* TARGET_SPARC */ | 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 | static void pcnet_register_devices(void) | 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 | #if defined (TARGET_SPARC) && !defined(TARGET_SPARC64) | 2155 | #if defined (TARGET_SPARC) && !defined(TARGET_SPARC64) |
| 2150 | sysbus_register_dev("lance", sizeof(SysBusPCNetState), lance_init); | 2156 | sysbus_register_dev("lance", sizeof(SysBusPCNetState), lance_init); |
| 2151 | #endif | 2157 | #endif |
hw/rtl8139.c
| @@ -3499,9 +3499,15 @@ static void pci_rtl8139_init(PCIDevice *dev) | @@ -3499,9 +3499,15 @@ static void pci_rtl8139_init(PCIDevice *dev) | ||
| 3499 | #endif /* RTL8139_ONBOARD_TIMER */ | 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 | static void rtl8139_register_devices(void) | 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 | device_init(rtl8139_register_devices) | 3513 | device_init(rtl8139_register_devices) |
hw/versatile_pci.c
| @@ -153,13 +153,18 @@ static void versatile_pci_host_init(PCIDevice *d) | @@ -153,13 +153,18 @@ static void versatile_pci_host_init(PCIDevice *d) | ||
| 153 | d->config[0x0D] = 0x10; // latency_timer | 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 | static void versatile_pci_register_devices(void) | 162 | static void versatile_pci_register_devices(void) |
| 157 | { | 163 | { |
| 158 | sysbus_register_dev("versatile_pci", sizeof(PCIVPBState), pci_vpb_init); | 164 | sysbus_register_dev("versatile_pci", sizeof(PCIVPBState), pci_vpb_init); |
| 159 | sysbus_register_dev("realview_pci", sizeof(PCIVPBState), | 165 | sysbus_register_dev("realview_pci", sizeof(PCIVPBState), |
| 160 | pci_realview_init); | 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 | device_init(versatile_pci_register_devices) | 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,16 +466,31 @@ static void virtio_balloon_init_pci(PCIDevice *pci_dev) | ||
| 466 | 0x00); | 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 | static void virtio_pci_register_devices(void) | 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 | device_init(virtio_pci_register_devices) | 496 | device_init(virtio_pci_register_devices) |