Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- hw/display/cirrus_vga.c | 19 ++++++++++++++----- hw/display/qxl.c | 5 +++-- hw/display/vga-isa-mm.c | 2 +- hw/display/vga-isa.c | 4 ++-- hw/display/vga-pci.c | 5 +++-- hw/display/vga.c | 19 ++++++++++++++----- hw/display/vga_int.h | 9 +++++---- hw/display/vmware_vga.c | 4 ++-- 8 files changed, 44 insertions(+), 23 deletions(-)
diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c index 64bfe2b..ffc4dd4 100644 --- a/hw/display/cirrus_vga.c +++ b/hw/display/cirrus_vga.c @@ -2806,12 +2806,14 @@ static const MemoryRegionOps cirrus_vga_io_ops = { }, }; -static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci, +static void cirrus_init_common(CirrusVGAState * s, int device_id, + DeviceState *owner, MemoryRegion *system_memory, MemoryRegion *system_io) { int i; static int inited; + int is_pci = !!object_dynamic_cast(OBJECT(owner), TYPE_PCI_DEVICE); if (!inited) { inited = 1; @@ -2843,19 +2845,23 @@ static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci, /* Register ioport 0x3b0 - 0x3df */ memory_region_init_io(&s->cirrus_vga_io, &cirrus_vga_io_ops, s, "cirrus-io", 0x30); + memory_region_set_owner(&s->cirrus_vga_io, OBJECT(owner)); memory_region_add_subregion(system_io, 0x3b0, &s->cirrus_vga_io); memory_region_init(&s->low_mem_container, "cirrus-lowmem-container", 0x20000); + memory_region_set_owner(&s->low_mem_container, OBJECT(owner)); memory_region_init_io(&s->low_mem, &cirrus_vga_mem_ops, s, "cirrus-low-memory", 0x20000); + memory_region_set_owner(&s->low_mem, OBJECT(owner)); memory_region_add_subregion(&s->low_mem_container, 0, &s->low_mem); for (i = 0; i < 2; ++i) { static const char *names[] = { "vga.bank0", "vga.bank1" }; MemoryRegion *bank = &s->cirrus_bank[i]; memory_region_init_alias(bank, names[i], &s->vga.vram, 0, 0x8000); + memory_region_set_owner(bank, OBJECT(owner)); memory_region_set_enabled(bank, false); memory_region_add_subregion_overlap(&s->low_mem_container, i * 0x8000, bank, 1); @@ -2870,6 +2876,7 @@ static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci, memory_region_init_io(&s->cirrus_linear_io, &cirrus_linear_io_ops, s, "cirrus-linear-io", s->vga.vram_size_mb * 1024 * 1024); + memory_region_set_owner(&s->cirrus_linear_io, OBJECT(owner)); memory_region_set_flush_coalesced(&s->cirrus_linear_io); /* I/O handler for LFB */ @@ -2878,11 +2885,13 @@ static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci, s, "cirrus-bitblt-mmio", 0x400000); + memory_region_set_owner(&s->cirrus_linear_bitblt_io, OBJECT(owner)); memory_region_set_flush_coalesced(&s->cirrus_linear_bitblt_io); /* I/O handler for memory-mapped I/O */ memory_region_init_io(&s->cirrus_mmio_io, &cirrus_mmio_io_ops, s, "cirrus-mmio", CIRRUS_PNPMMIO_SIZE); + memory_region_set_owner(&s->cirrus_mmio_io, OBJECT(owner)); memory_region_set_flush_coalesced(&s->cirrus_mmio_io); s->real_vram_size = @@ -2912,8 +2921,8 @@ static int vga_initfn(ISADevice *dev) ISACirrusVGAState *d = ISA_CIRRUS_VGA(dev); VGACommonState *s = &d->cirrus_vga.vga; - vga_common_init(s); - cirrus_init_common(&d->cirrus_vga, CIRRUS_ID_CLGD5430, 0, + vga_common_init(s, DEVICE(dev)); + cirrus_init_common(&d->cirrus_vga, CIRRUS_ID_CLGD5430, DEVICE(d), isa_address_space(dev), isa_address_space_io(dev)); s->con = graphic_console_init(DEVICE(dev), s->hw_ops, s); rom_add_vga(VGABIOS_CIRRUS_FILENAME); @@ -2959,8 +2968,8 @@ static int pci_cirrus_vga_initfn(PCIDevice *dev) int16_t device_id = pc->device_id; /* setup VGA */ - vga_common_init(&s->vga); - cirrus_init_common(s, device_id, 1, pci_address_space(dev), + vga_common_init(&s->vga, DEVICE(dev)); + cirrus_init_common(s, device_id, DEVICE(dev), pci_address_space(dev), pci_address_space_io(dev)); s->vga.con = graphic_console_init(DEVICE(dev), s->vga.hw_ops, &s->vga); diff --git a/hw/display/qxl.c b/hw/display/qxl.c index 2d49e9a..fc7bfa9 100644 --- a/hw/display/qxl.c +++ b/hw/display/qxl.c @@ -2063,9 +2063,10 @@ static int qxl_init_primary(PCIDevice *dev) qxl->id = 0; qxl_init_ramsize(qxl); vga->vram_size_mb = qxl->vga.vram_size >> 20; - vga_common_init(vga); - vga_init(vga, pci_address_space(dev), pci_address_space_io(dev), false); + vga_common_init(vga, dev); + vga_init(vga, dev, pci_address_space(dev), pci_address_space_io(dev), false); portio_list_init(qxl_vga_port_list, qxl_vga_portio_list, vga, "vga"); + portio_list_set_owner(vbe_port_list, OBJECT(dev)); portio_list_add(qxl_vga_port_list, pci_address_space_io(dev), 0x3b0); vga->con = graphic_console_init(DEVICE(dev), &qxl_ops, qxl); diff --git a/hw/display/vga-isa-mm.c b/hw/display/vga-isa-mm.c index ceeb92f..64c6fc3 100644 --- a/hw/display/vga-isa-mm.c +++ b/hw/display/vga-isa-mm.c @@ -132,7 +132,7 @@ int isa_vga_mm_init(hwaddr vram_base, s = g_malloc0(sizeof(*s)); s->vga.vram_size_mb = VGA_RAM_SIZE >> 20; - vga_common_init(&s->vga); + vga_common_init(&s->vga, NULL); vga_mm_init(s, vram_base, ctrl_base, it_shift, address_space); s->vga.con = graphic_console_init(NULL, s->vga.hw_ops, s); diff --git a/hw/display/vga-isa.c b/hw/display/vga-isa.c index 9e63b69..f52c104 100644 --- a/hw/display/vga-isa.c +++ b/hw/display/vga-isa.c @@ -55,9 +55,9 @@ static int vga_initfn(ISADevice *dev) MemoryRegion *vga_io_memory; const MemoryRegionPortio *vga_ports, *vbe_ports; - vga_common_init(s); + vga_common_init(s, DEVICE(dev)); s->legacy_address_space = isa_address_space(dev); - vga_io_memory = vga_init_io(s, &vga_ports, &vbe_ports); + vga_io_memory = vga_init_io(s, DEVICE(dev), &vga_ports, &vbe_ports); isa_register_portio_list(dev, 0x3b0, vga_ports, s, "vga"); if (vbe_ports) { isa_register_portio_list(dev, 0x1ce, vbe_ports, s, "vbe"); diff --git a/hw/display/vga-pci.c b/hw/display/vga-pci.c index cea8db7..3f860e9 100644 --- a/hw/display/vga-pci.c +++ b/hw/display/vga-pci.c @@ -147,8 +147,9 @@ static int pci_std_vga_initfn(PCIDevice *dev) VGACommonState *s = &d->vga; /* vga + console init */ - vga_common_init(s); - vga_init(s, pci_address_space(dev), pci_address_space_io(dev), true); + vga_common_init(s, DEVICE(dev)); + vga_init(s, DEVICE(dev), pci_address_space(dev), pci_address_space_io(dev), + true); s->con = graphic_console_init(DEVICE(dev), s->hw_ops, s); diff --git a/hw/display/vga.c b/hw/display/vga.c index 21a108d..2d7e37a 100644 --- a/hw/display/vga.c +++ b/hw/display/vga.c @@ -199,6 +199,8 @@ static void vga_update_memory_access(VGACommonState *s) base += isa_mem_base; region = g_malloc(sizeof(*region)); memory_region_init_alias(region, "vga.chain4", &s->vram, offset, size); + memory_region_set_owner(region, memory_region_owner(&s->vram)); + memory_region_add_subregion_overlap(s->legacy_address_space, base, region, 2); s->chain4_alias = region; @@ -2256,7 +2258,7 @@ static const GraphicHwOps vga_ops = { .text_update = vga_update_text, }; -void vga_common_init(VGACommonState *s) +void vga_common_init(VGACommonState *s, DeviceState *owner) { int i, j, v, b; @@ -2293,6 +2295,7 @@ void vga_common_init(VGACommonState *s) s->is_vbe_vmstate = 1; memory_region_init_ram(&s->vram, "vga.vram", s->vram_size); + memory_region_set_owner(&s->vram, OBJECT(owner)); vmstate_register_ram_global(&s->vram); xen_register_framebuffer(&s->vram); s->vram_ptr = memory_region_get_ram_ptr(&s->vram); @@ -2333,7 +2336,7 @@ static const MemoryRegionPortio vbe_portio_list[] = { }; /* Used by both ISA and PCI */ -MemoryRegion *vga_init_io(VGACommonState *s, +MemoryRegion *vga_init_io(VGACommonState *s, DeviceState *owner, const MemoryRegionPortio **vga_ports, const MemoryRegionPortio **vbe_ports) { @@ -2345,13 +2348,15 @@ MemoryRegion *vga_init_io(VGACommonState *s, vga_mem = g_malloc(sizeof(*vga_mem)); memory_region_init_io(vga_mem, &vga_mem_ops, s, "vga-lowmem", 0x20000); + memory_region_set_owner(vga_mem, OBJECT(owner)); memory_region_set_flush_coalesced(vga_mem); return vga_mem; } -void vga_init(VGACommonState *s, MemoryRegion *address_space, - MemoryRegion *address_space_io, bool init_vga_ports) +void vga_init(VGACommonState *s, DeviceState *owner, + MemoryRegion *address_space, MemoryRegion *address_space_io, + bool init_vga_ports) { MemoryRegion *vga_io_memory; const MemoryRegionPortio *vga_ports, *vbe_ports; @@ -2364,7 +2369,7 @@ void vga_init(VGACommonState *s, MemoryRegion *address_space, s->legacy_address_space = address_space; - vga_io_memory = vga_init_io(s, &vga_ports, &vbe_ports); + vga_io_memory = vga_init_io(s, owner, &vga_ports, &vbe_ports); memory_region_add_subregion_overlap(address_space, isa_mem_base + 0x000a0000, vga_io_memory, @@ -2372,10 +2377,12 @@ void vga_init(VGACommonState *s, MemoryRegion *address_space, memory_region_set_coalescing(vga_io_memory); if (init_vga_ports) { portio_list_init(vga_port_list, vga_ports, s, "vga"); + portio_list_set_owner(vga_port_list, OBJECT(owner)); portio_list_add(vga_port_list, address_space_io, 0x3b0); } if (vbe_ports) { portio_list_init(vbe_port_list, vbe_ports, s, "vbe"); + portio_list_set_owner(vbe_port_list, OBJECT(owner)); portio_list_add(vbe_port_list, address_space_io, 0x1ce); } } @@ -2387,6 +2394,8 @@ void vga_init_vbe(VGACommonState *s, MemoryRegion *system_memory) */ memory_region_init_alias(&s->vram_vbe, "vram.vbe", &s->vram, 0, memory_region_size(&s->vram)); + memory_region_set_owner(&s->vram_vbe, memory_region_owner(&s->vram)); + /* XXX: use optimized standard vga accesses */ memory_region_add_subregion(system_memory, VBE_DISPI_LFB_PHYSICAL_ADDRESS, diff --git a/hw/display/vga_int.h b/hw/display/vga_int.h index 66f9f3c..7fe4967 100644 --- a/hw/display/vga_int.h +++ b/hw/display/vga_int.h @@ -177,10 +177,11 @@ static inline int c6_to_8(int v) return (v << 2) | (b << 1) | b; } -void vga_common_init(VGACommonState *s); -void vga_init(VGACommonState *s, MemoryRegion *address_space, - MemoryRegion *address_space_io, bool init_vga_ports); -MemoryRegion *vga_init_io(VGACommonState *s, +void vga_common_init(VGACommonState *s, DeviceState *owner); +void vga_init(VGACommonState *s, DeviceState *owner, + MemoryRegion *address_space, MemoryRegion *address_space_io, + bool init_vga_ports); +MemoryRegion *vga_init_io(VGACommonState *s, DeviceState *owner, const MemoryRegionPortio **vga_ports, const MemoryRegionPortio **vbe_ports); void vga_common_reset(VGACommonState *s); diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c index fd3569d..1f94b8e 100644 --- a/hw/display/vmware_vga.c +++ b/hw/display/vmware_vga.c @@ -1198,8 +1198,8 @@ static void vmsvga_init(DeviceState *dev, struct vmsvga_state_s *s, vmstate_register_ram_global(&s->fifo_ram); s->fifo_ptr = memory_region_get_ram_ptr(&s->fifo_ram); - vga_common_init(&s->vga); - vga_init(&s->vga, address_space, io, true); + vga_common_init(&s->vga, dev); + vga_init(&s->vga, dev, address_space, io, true); vmstate_register(NULL, 0, &vmstate_vga_common, &s->vga); s->new_depth = 32; } -- 1.7.1