1 | /* |
2 | * QEMU ISA VGA Emulator. |
3 | * |
4 | * see docs/specs/standard-vga.txt for virtual hardware specs. |
5 | * |
6 | * Copyright (c) 2003 Fabrice Bellard |
7 | * |
8 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
9 | * of this software and associated documentation files (the "Software"), to deal |
10 | * in the Software without restriction, including without limitation the rights |
11 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
12 | * copies of the Software, and to permit persons to whom the Software is |
13 | * furnished to do so, subject to the following conditions: |
14 | * |
15 | * The above copyright notice and this permission notice shall be included in |
16 | * all copies or substantial portions of the Software. |
17 | * |
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
21 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
24 | * THE SOFTWARE. |
25 | */ |
26 | |
27 | #include "qemu/osdep.h" |
28 | #include "hw/isa/isa.h" |
29 | #include "vga_int.h" |
30 | #include "ui/pixel_ops.h" |
31 | #include "qemu/module.h" |
32 | #include "qemu/timer.h" |
33 | #include "hw/loader.h" |
34 | #include "hw/qdev-properties.h" |
35 | |
36 | #define TYPE_ISA_VGA "isa-vga" |
37 | #define ISA_VGA(obj) OBJECT_CHECK(ISAVGAState, (obj), TYPE_ISA_VGA) |
38 | |
39 | typedef struct ISAVGAState { |
40 | ISADevice parent_obj; |
41 | |
42 | struct VGACommonState state; |
43 | PortioList portio_vga; |
44 | PortioList portio_vbe; |
45 | } ISAVGAState; |
46 | |
47 | static void vga_isa_reset(DeviceState *dev) |
48 | { |
49 | ISAVGAState *d = ISA_VGA(dev); |
50 | VGACommonState *s = &d->state; |
51 | |
52 | vga_common_reset(s); |
53 | } |
54 | |
55 | static void vga_isa_realizefn(DeviceState *dev, Error **errp) |
56 | { |
57 | ISADevice *isadev = ISA_DEVICE(dev); |
58 | ISAVGAState *d = ISA_VGA(dev); |
59 | VGACommonState *s = &d->state; |
60 | MemoryRegion *vga_io_memory; |
61 | const MemoryRegionPortio *vga_ports, *vbe_ports; |
62 | |
63 | s->global_vmstate = true; |
64 | vga_common_init(s, OBJECT(dev)); |
65 | s->legacy_address_space = isa_address_space(isadev); |
66 | vga_io_memory = vga_init_io(s, OBJECT(dev), &vga_ports, &vbe_ports); |
67 | isa_register_portio_list(isadev, &d->portio_vga, |
68 | 0x3b0, vga_ports, s, "vga" ); |
69 | if (vbe_ports) { |
70 | isa_register_portio_list(isadev, &d->portio_vbe, |
71 | 0x1ce, vbe_ports, s, "vbe" ); |
72 | } |
73 | memory_region_add_subregion_overlap(isa_address_space(isadev), |
74 | 0x000a0000, |
75 | vga_io_memory, 1); |
76 | memory_region_set_coalescing(vga_io_memory); |
77 | s->con = graphic_console_init(DEVICE(dev), 0, s->hw_ops, s); |
78 | |
79 | vga_init_vbe(s, OBJECT(dev), isa_address_space(isadev)); |
80 | /* ROM BIOS */ |
81 | rom_add_vga(VGABIOS_FILENAME); |
82 | } |
83 | |
84 | static Property vga_isa_properties[] = { |
85 | DEFINE_PROP_UINT32("vgamem_mb" , ISAVGAState, state.vram_size_mb, 8), |
86 | DEFINE_PROP_END_OF_LIST(), |
87 | }; |
88 | |
89 | static void vga_isa_class_initfn(ObjectClass *klass, void *data) |
90 | { |
91 | DeviceClass *dc = DEVICE_CLASS(klass); |
92 | |
93 | dc->realize = vga_isa_realizefn; |
94 | dc->reset = vga_isa_reset; |
95 | dc->vmsd = &vmstate_vga_common; |
96 | dc->props = vga_isa_properties; |
97 | set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); |
98 | } |
99 | |
100 | static const TypeInfo vga_isa_info = { |
101 | .name = TYPE_ISA_VGA, |
102 | .parent = TYPE_ISA_DEVICE, |
103 | .instance_size = sizeof(ISAVGAState), |
104 | .class_init = vga_isa_class_initfn, |
105 | }; |
106 | |
107 | static void vga_isa_register_types(void) |
108 | { |
109 | type_register_static(&vga_isa_info); |
110 | } |
111 | |
112 | type_init(vga_isa_register_types) |
113 | |