2 * QEMU Cirrus CLGD 54xx VGA Emulator, ISA bus support
4 * Copyright (c) 2004 Fabrice Bellard
5 * Copyright (c) 2004 Makoto Suzuki (suzu)
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 #include "qemu/osdep.h"
27 #include "qapi/error.h"
28 #include "qemu/module.h"
29 #include "hw/loader.h"
30 #include "hw/qdev-properties.h"
31 #include "hw/isa/isa.h"
32 #include "cirrus_vga_internal.h"
33 #include "qom/object.h"
35 #define TYPE_ISA_CIRRUS_VGA "isa-cirrus-vga"
36 OBJECT_DECLARE_SIMPLE_TYPE(ISACirrusVGAState
, ISA_CIRRUS_VGA
)
38 struct ISACirrusVGAState
{
41 CirrusVGAState cirrus_vga
;
44 static void isa_cirrus_vga_realizefn(DeviceState
*dev
, Error
**errp
)
46 ISADevice
*isadev
= ISA_DEVICE(dev
);
47 ISACirrusVGAState
*d
= ISA_CIRRUS_VGA(dev
);
48 VGACommonState
*s
= &d
->cirrus_vga
.vga
;
50 /* follow real hardware, cirrus card emulated has 4 MB video memory.
51 Also accept 8 MB/16 MB for backward compatibility. */
52 if (s
->vram_size_mb
!= 4 && s
->vram_size_mb
!= 8 &&
53 s
->vram_size_mb
!= 16) {
54 error_setg(errp
, "Invalid cirrus_vga ram size '%u'",
58 s
->global_vmstate
= true;
59 if (!vga_common_init(s
, OBJECT(dev
), errp
)) {
62 cirrus_init_common(&d
->cirrus_vga
, OBJECT(dev
), CIRRUS_ID_CLGD5430
, 0,
63 isa_address_space(isadev
),
64 isa_address_space_io(isadev
));
65 s
->con
= graphic_console_init(dev
, 0, s
->hw_ops
, s
);
66 rom_add_vga(VGABIOS_CIRRUS_FILENAME
);
67 /* XXX ISA-LFB support */
68 /* FIXME not qdev yet */
71 static Property isa_cirrus_vga_properties
[] = {
72 DEFINE_PROP_UINT32("vgamem_mb", struct ISACirrusVGAState
,
73 cirrus_vga
.vga
.vram_size_mb
, 4),
74 DEFINE_PROP_BOOL("blitter", struct ISACirrusVGAState
,
75 cirrus_vga
.enable_blitter
, true),
76 DEFINE_PROP_END_OF_LIST(),
79 static void isa_cirrus_vga_class_init(ObjectClass
*klass
, void *data
)
81 DeviceClass
*dc
= DEVICE_CLASS(klass
);
83 dc
->vmsd
= &vmstate_cirrus_vga
;
84 dc
->realize
= isa_cirrus_vga_realizefn
;
85 device_class_set_props(dc
, isa_cirrus_vga_properties
);
86 set_bit(DEVICE_CATEGORY_DISPLAY
, dc
->categories
);
89 static const TypeInfo isa_cirrus_vga_info
= {
90 .name
= TYPE_ISA_CIRRUS_VGA
,
91 .parent
= TYPE_ISA_DEVICE
,
92 .instance_size
= sizeof(ISACirrusVGAState
),
93 .class_init
= isa_cirrus_vga_class_init
,
96 static void cirrus_vga_isa_register_types(void)
98 type_register_static(&isa_cirrus_vga_info
);
101 type_init(cirrus_vga_isa_register_types
)