Commit 9be5dafe488088bcff8f8365bc7dd35d3dac5186
1 parent
86394e96
LSI SCSI qdev conversion
Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing
6 changed files
with
26 additions
and
52 deletions
hw/lsi53c895a.c
| @@ -1939,9 +1939,9 @@ static void lsi_mmio_mapfunc(PCIDevice *pci_dev, int region_num, | @@ -1939,9 +1939,9 @@ static void lsi_mmio_mapfunc(PCIDevice *pci_dev, int region_num, | ||
| 1939 | cpu_register_physical_memory(addr + 0, 0x400, s->mmio_io_addr); | 1939 | cpu_register_physical_memory(addr + 0, 0x400, s->mmio_io_addr); |
| 1940 | } | 1940 | } |
| 1941 | 1941 | ||
| 1942 | -void lsi_scsi_attach(void *opaque, BlockDriverState *bd, int id) | 1942 | +void lsi_scsi_attach(DeviceState *host, BlockDriverState *bd, int id) |
| 1943 | { | 1943 | { |
| 1944 | - LSIState *s = (LSIState *)opaque; | 1944 | + LSIState *s = (LSIState *)host; |
| 1945 | 1945 | ||
| 1946 | if (id < 0) { | 1946 | if (id < 0) { |
| 1947 | for (id = 0; id < LSI_MAX_DEVS; id++) { | 1947 | for (id = 0; id < LSI_MAX_DEVS; id++) { |
| @@ -1976,18 +1976,11 @@ static int lsi_scsi_uninit(PCIDevice *d) | @@ -1976,18 +1976,11 @@ static int lsi_scsi_uninit(PCIDevice *d) | ||
| 1976 | return 0; | 1976 | return 0; |
| 1977 | } | 1977 | } |
| 1978 | 1978 | ||
| 1979 | -void *lsi_scsi_init(PCIBus *bus, int devfn) | 1979 | +static void lsi_scsi_init(PCIDevice *dev) |
| 1980 | { | 1980 | { |
| 1981 | - LSIState *s; | 1981 | + LSIState *s = (LSIState *)dev; |
| 1982 | uint8_t *pci_conf; | 1982 | uint8_t *pci_conf; |
| 1983 | 1983 | ||
| 1984 | - s = (LSIState *)pci_register_device(bus, "LSI53C895A SCSI HBA", | ||
| 1985 | - sizeof(*s), devfn, NULL, NULL); | ||
| 1986 | - if (s == NULL) { | ||
| 1987 | - fprintf(stderr, "lsi-scsi: Failed to register PCI device\n"); | ||
| 1988 | - return NULL; | ||
| 1989 | - } | ||
| 1990 | - | ||
| 1991 | pci_conf = s->pci_dev.config; | 1984 | pci_conf = s->pci_dev.config; |
| 1992 | 1985 | ||
| 1993 | /* PCI Vendor ID (word) */ | 1986 | /* PCI Vendor ID (word) */ |
| @@ -2022,5 +2015,12 @@ void *lsi_scsi_init(PCIBus *bus, int devfn) | @@ -2022,5 +2015,12 @@ void *lsi_scsi_init(PCIBus *bus, int devfn) | ||
| 2022 | 2015 | ||
| 2023 | lsi_soft_reset(s); | 2016 | lsi_soft_reset(s); |
| 2024 | 2017 | ||
| 2025 | - return s; | 2018 | + scsi_bus_new(&dev->qdev, lsi_scsi_attach); |
| 2026 | } | 2019 | } |
| 2020 | + | ||
| 2021 | +static void lsi53c895a_register_devices(void) | ||
| 2022 | +{ | ||
| 2023 | + pci_qdev_register("lsi53c895a", sizeof(LSIState), lsi_scsi_init); | ||
| 2024 | +} | ||
| 2025 | + | ||
| 2026 | +device_init(lsi53c895a_register_devices); |
hw/pc.c
| @@ -1122,19 +1122,11 @@ static void pc_init1(ram_addr_t ram_size, | @@ -1122,19 +1122,11 @@ static void pc_init1(ram_addr_t ram_size, | ||
| 1122 | 1122 | ||
| 1123 | if (pci_enabled) { | 1123 | if (pci_enabled) { |
| 1124 | int max_bus; | 1124 | int max_bus; |
| 1125 | - int bus, unit; | ||
| 1126 | - void *scsi; | 1125 | + int bus; |
| 1127 | 1126 | ||
| 1128 | max_bus = drive_get_max_bus(IF_SCSI); | 1127 | max_bus = drive_get_max_bus(IF_SCSI); |
| 1129 | - | ||
| 1130 | for (bus = 0; bus <= max_bus; bus++) { | 1128 | for (bus = 0; bus <= max_bus; bus++) { |
| 1131 | - scsi = lsi_scsi_init(pci_bus, -1); | ||
| 1132 | - for (unit = 0; unit < LSI_MAX_DEVS; unit++) { | ||
| 1133 | - index = drive_get_index(IF_SCSI, bus, unit); | ||
| 1134 | - if (index == -1) | ||
| 1135 | - continue; | ||
| 1136 | - lsi_scsi_attach(scsi, drives_table[index].bdrv, unit); | ||
| 1137 | - } | 1129 | + pci_create_simple(pci_bus, -1, "lsi53c895a"); |
| 1138 | } | 1130 | } |
| 1139 | } | 1131 | } |
| 1140 | 1132 |
hw/pci-hotplug.c
| @@ -71,8 +71,8 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts) | @@ -71,8 +71,8 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts) | ||
| 71 | switch (type) { | 71 | switch (type) { |
| 72 | case IF_SCSI: | 72 | case IF_SCSI: |
| 73 | success = 1; | 73 | success = 1; |
| 74 | - lsi_scsi_attach (dev, drives_table[drive_idx].bdrv, | ||
| 75 | - drives_table[drive_idx].unit); | 74 | + lsi_scsi_attach(&dev->qdev, drives_table[drive_idx].bdrv, |
| 75 | + drives_table[drive_idx].unit); | ||
| 76 | break; | 76 | break; |
| 77 | default: | 77 | default: |
| 78 | monitor_printf(mon, "Can't hot-add drive to type %d\n", type); | 78 | monitor_printf(mon, "Can't hot-add drive to type %d\n", type); |
| @@ -117,10 +117,7 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, PCIBus *pci_bus, | @@ -117,10 +117,7 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, PCIBus *pci_bus, | ||
| 117 | 117 | ||
| 118 | switch (type) { | 118 | switch (type) { |
| 119 | case IF_SCSI: | 119 | case IF_SCSI: |
| 120 | - opaque = lsi_scsi_init (pci_bus, -1); | ||
| 121 | - if (opaque && drive_idx >= 0) | ||
| 122 | - lsi_scsi_attach (opaque, drives_table[drive_idx].bdrv, | ||
| 123 | - drives_table[drive_idx].unit); | 120 | + opaque = pci_create_simple(pci_bus, -1, "lsi53c895a"); |
| 124 | break; | 121 | break; |
| 125 | case IF_VIRTIO: | 122 | case IF_VIRTIO: |
| 126 | opaque = virtio_blk_init (pci_bus, drives_table[drive_idx].bdrv); | 123 | opaque = virtio_blk_init (pci_bus, drives_table[drive_idx].bdrv); |
hw/pci.h
| @@ -227,8 +227,7 @@ PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name); | @@ -227,8 +227,7 @@ PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name); | ||
| 227 | 227 | ||
| 228 | /* lsi53c895a.c */ | 228 | /* lsi53c895a.c */ |
| 229 | #define LSI_MAX_DEVS 7 | 229 | #define LSI_MAX_DEVS 7 |
| 230 | -void lsi_scsi_attach(void *opaque, BlockDriverState *bd, int id); | ||
| 231 | -void *lsi_scsi_init(PCIBus *bus, int devfn); | 230 | +void lsi_scsi_attach(DeviceState *host, BlockDriverState *bd, int id); |
| 232 | 231 | ||
| 233 | /* vmware_vga.c */ | 232 | /* vmware_vga.c */ |
| 234 | void pci_vmsvga_init(PCIBus *bus); | 233 | void pci_vmsvga_init(PCIBus *bus); |
hw/realview.c
| @@ -32,7 +32,6 @@ static void realview_init(ram_addr_t ram_size, | @@ -32,7 +32,6 @@ static void realview_init(ram_addr_t ram_size, | ||
| 32 | CPUState *env; | 32 | CPUState *env; |
| 33 | ram_addr_t ram_offset; | 33 | ram_addr_t ram_offset; |
| 34 | qemu_irq *pic; | 34 | qemu_irq *pic; |
| 35 | - void *scsi_hba; | ||
| 36 | PCIBus *pci_bus; | 35 | PCIBus *pci_bus; |
| 37 | NICInfo *nd; | 36 | NICInfo *nd; |
| 38 | int n; | 37 | int n; |
| @@ -111,16 +110,10 @@ static void realview_init(ram_addr_t ram_size, | @@ -111,16 +110,10 @@ static void realview_init(ram_addr_t ram_size, | ||
| 111 | if (usb_enabled) { | 110 | if (usb_enabled) { |
| 112 | usb_ohci_init_pci(pci_bus, 3, -1); | 111 | usb_ohci_init_pci(pci_bus, 3, -1); |
| 113 | } | 112 | } |
| 114 | - if (drive_get_max_bus(IF_SCSI) > 0) { | ||
| 115 | - fprintf(stderr, "qemu: too many SCSI bus\n"); | ||
| 116 | - exit(1); | ||
| 117 | - } | ||
| 118 | - scsi_hba = lsi_scsi_init(pci_bus, -1); | ||
| 119 | - for (n = 0; n < LSI_MAX_DEVS; n++) { | ||
| 120 | - index = drive_get_index(IF_SCSI, 0, n); | ||
| 121 | - if (index == -1) | ||
| 122 | - continue; | ||
| 123 | - lsi_scsi_attach(scsi_hba, drives_table[index].bdrv, n); | 113 | + n = drive_get_max_bus(IF_SCSI); |
| 114 | + while (n >= 0) { | ||
| 115 | + pci_create_simple(pci_bus, -1, "lsi53c895a"); | ||
| 116 | + n--; | ||
| 124 | } | 117 | } |
| 125 | for(n = 0; n < nb_nics; n++) { | 118 | for(n = 0; n < nb_nics; n++) { |
| 126 | nd = &nd_table[n]; | 119 | nd = &nd_table[n]; |
hw/versatilepb.c
| @@ -163,7 +163,6 @@ static void versatile_init(ram_addr_t ram_size, | @@ -163,7 +163,6 @@ static void versatile_init(ram_addr_t ram_size, | ||
| 163 | ram_addr_t ram_offset; | 163 | ram_addr_t ram_offset; |
| 164 | qemu_irq *pic; | 164 | qemu_irq *pic; |
| 165 | qemu_irq *sic; | 165 | qemu_irq *sic; |
| 166 | - void *scsi_hba; | ||
| 167 | PCIBus *pci_bus; | 166 | PCIBus *pci_bus; |
| 168 | NICInfo *nd; | 167 | NICInfo *nd; |
| 169 | int n; | 168 | int n; |
| @@ -206,16 +205,10 @@ static void versatile_init(ram_addr_t ram_size, | @@ -206,16 +205,10 @@ static void versatile_init(ram_addr_t ram_size, | ||
| 206 | if (usb_enabled) { | 205 | if (usb_enabled) { |
| 207 | usb_ohci_init_pci(pci_bus, 3, -1); | 206 | usb_ohci_init_pci(pci_bus, 3, -1); |
| 208 | } | 207 | } |
| 209 | - if (drive_get_max_bus(IF_SCSI) > 0) { | ||
| 210 | - fprintf(stderr, "qemu: too many SCSI bus\n"); | ||
| 211 | - exit(1); | ||
| 212 | - } | ||
| 213 | - scsi_hba = lsi_scsi_init(pci_bus, -1); | ||
| 214 | - for (n = 0; n < LSI_MAX_DEVS; n++) { | ||
| 215 | - index = drive_get_index(IF_SCSI, 0, n); | ||
| 216 | - if (index == -1) | ||
| 217 | - continue; | ||
| 218 | - lsi_scsi_attach(scsi_hba, drives_table[index].bdrv, n); | 208 | + n = drive_get_max_bus(IF_SCSI); |
| 209 | + while (n >= 0) { | ||
| 210 | + pci_create_simple(pci_bus, -1, "lsi53c895a"); | ||
| 211 | + n--; | ||
| 219 | } | 212 | } |
| 220 | 213 | ||
| 221 | sysbus_create_simple("pl011", 0x101f1000, pic[12]); | 214 | sysbus_create_simple("pl011", 0x101f1000, pic[12]); |