Commit a414c306c06c4ee9cb05af645b9fee6f8ea34038
Committed by
Anthony Liguori
1 parent
9316d30f
qdev: convert all vga devices.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
3 changed files
with
130 additions
and
81 deletions
hw/cirrus_vga.c
| ... | ... | @@ -3302,46 +3302,55 @@ static void pci_cirrus_write_config(PCIDevice *d, |
| 3302 | 3302 | cirrus_update_memory_access(s); |
| 3303 | 3303 | } |
| 3304 | 3304 | |
| 3305 | +static void pci_cirrus_vga_initfn(PCIDevice *dev) | |
| 3306 | +{ | |
| 3307 | + PCICirrusVGAState *d = DO_UPCAST(PCICirrusVGAState, dev, dev); | |
| 3308 | + CirrusVGAState *s = &d->cirrus_vga; | |
| 3309 | + uint8_t *pci_conf = d->dev.config; | |
| 3310 | + int device_id = CIRRUS_ID_CLGD5446; | |
| 3311 | + | |
| 3312 | + /* setup VGA */ | |
| 3313 | + vga_common_init(&s->vga, VGA_RAM_SIZE); | |
| 3314 | + cirrus_init_common(s, device_id, 1); | |
| 3315 | + s->vga.pci_dev = (PCIDevice *)d; | |
| 3316 | + s->vga.ds = graphic_console_init(s->vga.update, s->vga.invalidate, | |
| 3317 | + s->vga.screen_dump, s->vga.text_update, | |
| 3318 | + &s->vga); | |
| 3319 | + | |
| 3320 | + /* setup PCI */ | |
| 3321 | + pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_CIRRUS); | |
| 3322 | + pci_config_set_device_id(pci_conf, device_id); | |
| 3323 | + pci_conf[0x04] = PCI_COMMAND_IOACCESS | PCI_COMMAND_MEMACCESS; | |
| 3324 | + pci_config_set_class(pci_conf, PCI_CLASS_DISPLAY_VGA); | |
| 3325 | + pci_conf[PCI_HEADER_TYPE] = PCI_HEADER_TYPE_NORMAL; | |
| 3326 | + | |
| 3327 | + /* setup memory space */ | |
| 3328 | + /* memory #0 LFB */ | |
| 3329 | + /* memory #1 memory-mapped I/O */ | |
| 3330 | + /* XXX: s->vga.vram_size must be a power of two */ | |
| 3331 | + pci_register_bar((PCIDevice *)d, 0, 0x2000000, | |
| 3332 | + PCI_ADDRESS_SPACE_MEM_PREFETCH, cirrus_pci_lfb_map); | |
| 3333 | + if (device_id == CIRRUS_ID_CLGD5446) { | |
| 3334 | + pci_register_bar((PCIDevice *)d, 1, CIRRUS_PNPMMIO_SIZE, | |
| 3335 | + PCI_ADDRESS_SPACE_MEM, cirrus_pci_mmio_map); | |
| 3336 | + } | |
| 3337 | + /* XXX: ROM BIOS */ | |
| 3338 | +} | |
| 3339 | + | |
| 3305 | 3340 | void pci_cirrus_vga_init(PCIBus *bus) |
| 3306 | 3341 | { |
| 3307 | - PCICirrusVGAState *d; | |
| 3308 | - uint8_t *pci_conf; | |
| 3309 | - CirrusVGAState *s; | |
| 3310 | - int device_id; | |
| 3311 | - | |
| 3312 | - device_id = CIRRUS_ID_CLGD5446; | |
| 3313 | - | |
| 3314 | - /* setup PCI configuration registers */ | |
| 3315 | - d = (PCICirrusVGAState *)pci_register_device(bus, "Cirrus VGA", | |
| 3316 | - sizeof(PCICirrusVGAState), | |
| 3317 | - -1, NULL, pci_cirrus_write_config); | |
| 3318 | - pci_conf = d->dev.config; | |
| 3319 | - pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_CIRRUS); | |
| 3320 | - pci_config_set_device_id(pci_conf, device_id); | |
| 3321 | - pci_conf[0x04] = PCI_COMMAND_IOACCESS | PCI_COMMAND_MEMACCESS; | |
| 3322 | - pci_config_set_class(pci_conf, PCI_CLASS_DISPLAY_VGA); | |
| 3323 | - pci_conf[PCI_HEADER_TYPE] = PCI_HEADER_TYPE_NORMAL; | |
| 3324 | - | |
| 3325 | - /* setup VGA */ | |
| 3326 | - s = &d->cirrus_vga; | |
| 3327 | - vga_common_init(&s->vga, VGA_RAM_SIZE); | |
| 3328 | - cirrus_init_common(s, device_id, 1); | |
| 3329 | - | |
| 3330 | - s->vga.ds = graphic_console_init(s->vga.update, s->vga.invalidate, | |
| 3331 | - s->vga.screen_dump, s->vga.text_update, | |
| 3332 | - &s->vga); | |
| 3342 | + pci_create_simple(bus, -1, "Cirrus VGA"); | |
| 3343 | +} | |
| 3333 | 3344 | |
| 3334 | - s->vga.pci_dev = (PCIDevice *)d; | |
| 3345 | +static PCIDeviceInfo cirrus_vga_info = { | |
| 3346 | + .qdev.name = "Cirrus VGA", | |
| 3347 | + .qdev.size = sizeof(PCICirrusVGAState), | |
| 3348 | + .init = pci_cirrus_vga_initfn, | |
| 3349 | + .config_write = pci_cirrus_write_config, | |
| 3350 | +}; | |
| 3335 | 3351 | |
| 3336 | - /* setup memory space */ | |
| 3337 | - /* memory #0 LFB */ | |
| 3338 | - /* memory #1 memory-mapped I/O */ | |
| 3339 | - /* XXX: s->vga.vram_size must be a power of two */ | |
| 3340 | - pci_register_bar((PCIDevice *)d, 0, 0x2000000, | |
| 3341 | - PCI_ADDRESS_SPACE_MEM_PREFETCH, cirrus_pci_lfb_map); | |
| 3342 | - if (device_id == CIRRUS_ID_CLGD5446) { | |
| 3343 | - pci_register_bar((PCIDevice *)d, 1, CIRRUS_PNPMMIO_SIZE, | |
| 3344 | - PCI_ADDRESS_SPACE_MEM, cirrus_pci_mmio_map); | |
| 3345 | - } | |
| 3346 | - /* XXX: ROM BIOS */ | |
| 3352 | +static void cirrus_vga_register(void) | |
| 3353 | +{ | |
| 3354 | + pci_qdev_register(&cirrus_vga_info); | |
| 3347 | 3355 | } |
| 3356 | +device_init(cirrus_vga_register); | ... | ... |
hw/vga.c
| ... | ... | @@ -2480,52 +2480,78 @@ static void pci_vga_write_config(PCIDevice *d, |
| 2480 | 2480 | s->map_addr = 0; |
| 2481 | 2481 | } |
| 2482 | 2482 | |
| 2483 | -int pci_vga_init(PCIBus *bus, | |
| 2484 | - unsigned long vga_bios_offset, int vga_bios_size) | |
| 2485 | -{ | |
| 2486 | - PCIVGAState *d; | |
| 2487 | - VGAState *s; | |
| 2488 | - uint8_t *pci_conf; | |
| 2489 | - | |
| 2490 | - d = (PCIVGAState *)pci_register_device(bus, "VGA", | |
| 2491 | - sizeof(PCIVGAState), | |
| 2492 | - -1, NULL, pci_vga_write_config); | |
| 2493 | - if (!d) | |
| 2494 | - return -1; | |
| 2495 | - s = &d->vga_state; | |
| 2496 | - | |
| 2497 | - vga_common_init(s, VGA_RAM_SIZE); | |
| 2498 | - vga_init(s); | |
| 2499 | - | |
| 2500 | - s->ds = graphic_console_init(s->update, s->invalidate, | |
| 2501 | - s->screen_dump, s->text_update, s); | |
| 2502 | - | |
| 2503 | - s->pci_dev = &d->dev; | |
| 2504 | - | |
| 2505 | - pci_conf = d->dev.config; | |
| 2506 | - // dummy VGA (same as Bochs ID) | |
| 2507 | - pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_QEMU); | |
| 2508 | - pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_QEMU_VGA); | |
| 2509 | - pci_config_set_class(pci_conf, PCI_CLASS_DISPLAY_VGA); | |
| 2510 | - pci_conf[PCI_HEADER_TYPE] = PCI_HEADER_TYPE_NORMAL; // header_type | |
| 2511 | - | |
| 2512 | - /* XXX: VGA_RAM_SIZE must be a power of two */ | |
| 2513 | - pci_register_bar(&d->dev, 0, VGA_RAM_SIZE, | |
| 2514 | - PCI_ADDRESS_SPACE_MEM_PREFETCH, vga_map); | |
| 2515 | - if (vga_bios_size != 0) { | |
| 2483 | +static void pci_vga_initfn(PCIDevice *dev) | |
| 2484 | +{ | |
| 2485 | + PCIVGAState *d = DO_UPCAST(PCIVGAState, dev, dev); | |
| 2486 | + VGAState *s = &d->vga_state; | |
| 2487 | + uint8_t *pci_conf = d->dev.config; | |
| 2488 | + | |
| 2489 | + // vga + console init | |
| 2490 | + vga_common_init(s, VGA_RAM_SIZE); | |
| 2491 | + vga_init(s); | |
| 2492 | + s->pci_dev = &d->dev; | |
| 2493 | + s->ds = graphic_console_init(s->update, s->invalidate, | |
| 2494 | + s->screen_dump, s->text_update, s); | |
| 2495 | + | |
| 2496 | + // dummy VGA (same as Bochs ID) | |
| 2497 | + pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_QEMU); | |
| 2498 | + pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_QEMU_VGA); | |
| 2499 | + pci_config_set_class(pci_conf, PCI_CLASS_DISPLAY_VGA); | |
| 2500 | + pci_conf[PCI_HEADER_TYPE] = PCI_HEADER_TYPE_NORMAL; // header_type | |
| 2501 | + | |
| 2502 | + /* XXX: VGA_RAM_SIZE must be a power of two */ | |
| 2503 | + pci_register_bar(&d->dev, 0, VGA_RAM_SIZE, | |
| 2504 | + PCI_ADDRESS_SPACE_MEM_PREFETCH, vga_map); | |
| 2505 | + | |
| 2506 | + if (s->bios_size) { | |
| 2516 | 2507 | unsigned int bios_total_size; |
| 2517 | - s->bios_offset = vga_bios_offset; | |
| 2518 | - s->bios_size = vga_bios_size; | |
| 2519 | 2508 | /* must be a power of two */ |
| 2520 | 2509 | bios_total_size = 1; |
| 2521 | - while (bios_total_size < vga_bios_size) | |
| 2510 | + while (bios_total_size < s->bios_size) | |
| 2522 | 2511 | bios_total_size <<= 1; |
| 2523 | 2512 | pci_register_bar(&d->dev, PCI_ROM_SLOT, bios_total_size, |
| 2524 | - PCI_ADDRESS_SPACE_MEM_PREFETCH, vga_map); | |
| 2513 | + PCI_ADDRESS_SPACE_MEM_PREFETCH, vga_map); | |
| 2525 | 2514 | } |
| 2515 | +} | |
| 2516 | + | |
| 2517 | +int pci_vga_init(PCIBus *bus, | |
| 2518 | + unsigned long vga_bios_offset, int vga_bios_size) | |
| 2519 | +{ | |
| 2520 | + PCIDevice *dev; | |
| 2521 | + | |
| 2522 | + dev = pci_create("VGA", NULL); | |
| 2523 | + qdev_prop_set_uint32(&dev->qdev, "bios-offset", vga_bios_offset); | |
| 2524 | + qdev_prop_set_uint32(&dev->qdev, "bios-size", vga_bios_offset); | |
| 2525 | + qdev_init(&dev->qdev); | |
| 2526 | + | |
| 2526 | 2527 | return 0; |
| 2527 | 2528 | } |
| 2528 | 2529 | |
| 2530 | +static PCIDeviceInfo vga_info = { | |
| 2531 | + .qdev.name = "VGA", | |
| 2532 | + .qdev.size = sizeof(PCIVGAState), | |
| 2533 | + .init = pci_vga_initfn, | |
| 2534 | + .config_write = pci_vga_write_config, | |
| 2535 | + .qdev.props = (Property[]) { | |
| 2536 | + { | |
| 2537 | + .name = "bios-offset", | |
| 2538 | + .info = &qdev_prop_hex32, | |
| 2539 | + .offset = offsetof(PCIVGAState, vga_state.bios_offset), | |
| 2540 | + },{ | |
| 2541 | + .name = "bios-size", | |
| 2542 | + .info = &qdev_prop_hex32, | |
| 2543 | + .offset = offsetof(PCIVGAState, vga_state.bios_size), | |
| 2544 | + }, | |
| 2545 | + {/* end of list */} | |
| 2546 | + } | |
| 2547 | +}; | |
| 2548 | + | |
| 2549 | +static void vga_register(void) | |
| 2550 | +{ | |
| 2551 | + pci_qdev_register(&vga_info); | |
| 2552 | +} | |
| 2553 | +device_init(vga_register); | |
| 2554 | + | |
| 2529 | 2555 | /********************************************************/ |
| 2530 | 2556 | /* vga screen dump */ |
| 2531 | 2557 | ... | ... |
hw/vmware_vga.c
| ... | ... | @@ -1210,14 +1210,11 @@ static void pci_vmsvga_map_mem(PCIDevice *pci_dev, int region_num, |
| 1210 | 1210 | iomemtype); |
| 1211 | 1211 | } |
| 1212 | 1212 | |
| 1213 | -void pci_vmsvga_init(PCIBus *bus) | |
| 1213 | +static void pci_vmsvga_initfn(PCIDevice *dev) | |
| 1214 | 1214 | { |
| 1215 | - struct pci_vmsvga_state_s *s; | |
| 1215 | + struct pci_vmsvga_state_s *s = | |
| 1216 | + DO_UPCAST(struct pci_vmsvga_state_s, card, dev); | |
| 1216 | 1217 | |
| 1217 | - /* Setup PCI configuration */ | |
| 1218 | - s = (struct pci_vmsvga_state_s *) | |
| 1219 | - pci_register_device(bus, "QEMUware SVGA", | |
| 1220 | - sizeof(struct pci_vmsvga_state_s), -1, NULL, NULL); | |
| 1221 | 1218 | pci_config_set_vendor_id(s->card.config, PCI_VENDOR_ID_VMWARE); |
| 1222 | 1219 | pci_config_set_device_id(s->card.config, SVGA_PCI_DEVICE_ID); |
| 1223 | 1220 | s->card.config[PCI_COMMAND] = 0x07; /* I/O + Memory */ |
| ... | ... | @@ -1240,3 +1237,20 @@ void pci_vmsvga_init(PCIBus *bus) |
| 1240 | 1237 | |
| 1241 | 1238 | register_savevm("vmware_vga", 0, 0, pci_vmsvga_save, pci_vmsvga_load, s); |
| 1242 | 1239 | } |
| 1240 | + | |
| 1241 | +void pci_vmsvga_init(PCIBus *bus) | |
| 1242 | +{ | |
| 1243 | + pci_create_simple(bus, -1, "QEMUware SVGA"); | |
| 1244 | +} | |
| 1245 | + | |
| 1246 | +static PCIDeviceInfo vmsvga_info = { | |
| 1247 | + .qdev.name = "QEMUware SVGA", | |
| 1248 | + .qdev.size = sizeof(struct pci_vmsvga_state_s), | |
| 1249 | + .init = pci_vmsvga_initfn, | |
| 1250 | +}; | |
| 1251 | + | |
| 1252 | +static void vmsvga_register(void) | |
| 1253 | +{ | |
| 1254 | + pci_qdev_register(&vmsvga_info); | |
| 1255 | +} | |
| 1256 | +device_init(vmsvga_register); | ... | ... |