blob: 55c418eab551c2c728b6e7570b2e59c4eefb6078 [file] [log] [blame]
bellard798b0c22004-06-05 10:30:49 +00001/*
2 * QEMU internal VGA defines.
ths5fafdf22007-09-16 21:08:06 +00003 *
bellard798b0c22004-06-05 10:30:49 +00004 * Copyright (c) 2003-2004 Fabrice Bellard
ths5fafdf22007-09-16 21:08:06 +00005 *
bellard798b0c22004-06-05 10:30:49 +00006 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
Markus Armbruster175de522016-06-29 15:29:06 +020024
Paolo Bonzinicb9c3772012-12-06 12:15:58 +010025#ifndef HW_VGA_INT_H
Markus Armbruster175de522016-06-29 15:29:06 +020026#define HW_VGA_INT_H
Juan Quintela11b6b342009-10-14 15:25:25 +020027
Philippe Mathieu-Daudée07b1582017-10-17 13:44:20 -030028#include "exec/ioport.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010029#include "exec/memory.h"
Philippe Mathieu-Daudée07b1582017-10-17 13:44:20 -030030#include "ui/console.h"
Juan Quintela11b6b342009-10-14 15:25:25 +020031
Gerd Hoffmanna3ee49f2018-05-22 18:50:53 +020032#include "hw/display/bochs-vbe.h"
33
bellard798b0c22004-06-05 10:30:49 +000034#define ST01_V_RETRACE 0x08
35#define ST01_DISP_ENABLE 0x01
36
bellard798b0c22004-06-05 10:30:49 +000037#define CH_ATTR_SIZE (160 * 100)
bellard8454df82006-06-13 16:37:40 +000038#define VGA_MAX_HEIGHT 2048
bellard4e3e9d02004-06-05 13:18:45 +000039
malccb5a7aa2008-09-28 00:42:12 +000040struct vga_precise_retrace {
41 int64_t ticks_per_char;
42 int64_t total_chars;
43 int htotal;
44 int hstart;
45 int hend;
46 int vstart;
47 int vend;
48 int freq;
49};
50
51union vga_retrace {
52 struct vga_precise_retrace precise;
53};
54
Avi Kivity4e12cd92009-05-03 22:25:16 +030055struct VGACommonState;
56typedef uint8_t (* vga_retrace_fn)(struct VGACommonState *s);
57typedef void (* vga_update_retrace_info_fn)(struct VGACommonState *s);
malccb5a7aa2008-09-28 00:42:12 +000058
Avi Kivity4e12cd92009-05-03 22:25:16 +030059typedef struct VGACommonState {
Jan Kiszka80763882011-08-22 19:12:12 +020060 MemoryRegion *legacy_address_space;
Avi Kivity4e12cd92009-05-03 22:25:16 +030061 uint8_t *vram_ptr;
Avi Kivityb1950432011-08-08 16:08:57 +030062 MemoryRegion vram;
Avi Kivity8294a642012-05-09 18:23:06 +030063 MemoryRegion vram_vbe;
Gerd Hoffmanna19cbfb2010-04-27 11:50:11 +020064 uint32_t vram_size;
Gerd Hoffmann4a1e2442012-05-24 09:59:44 +020065 uint32_t vram_size_mb; /* property */
Gerd Hoffmann54a85d42014-08-26 14:16:30 +020066 uint32_t vbe_size;
Gerd Hoffmann3d90c622017-08-28 14:29:06 +020067 uint32_t vbe_size_mask;
Avi Kivity4e12cd92009-05-03 22:25:16 +030068 uint32_t latch;
Paolo Bonziniad371682014-06-11 12:19:25 +020069 bool has_chain4_alias;
70 MemoryRegion chain4_alias;
Avi Kivity4e12cd92009-05-03 22:25:16 +030071 uint8_t sr_index;
72 uint8_t sr[256];
Gerd Hoffmann94ef4f32016-05-17 10:54:54 +020073 uint8_t sr_vbe[256];
Avi Kivity4e12cd92009-05-03 22:25:16 +030074 uint8_t gr_index;
75 uint8_t gr[256];
76 uint8_t ar_index;
77 uint8_t ar[21];
78 int ar_flip_flop;
79 uint8_t cr_index;
80 uint8_t cr[256]; /* CRT registers */
81 uint8_t msr; /* Misc Output Register */
82 uint8_t fcr; /* Feature Control Register */
83 uint8_t st00; /* status 0 */
84 uint8_t st01; /* status 1 */
85 uint8_t dac_state;
86 uint8_t dac_sub_index;
87 uint8_t dac_read_index;
88 uint8_t dac_write_index;
89 uint8_t dac_cache[3]; /* used when writing */
90 int dac_8bit;
91 uint8_t palette[768];
92 int32_t bank_offset;
Avi Kivity4e12cd92009-05-03 22:25:16 +030093 int (*get_bpp)(struct VGACommonState *s);
94 void (*get_offsets)(struct VGACommonState *s,
95 uint32_t *pline_offset,
96 uint32_t *pstart_addr,
97 uint32_t *pline_compare);
98 void (*get_resolution)(struct VGACommonState *s,
99 int *pwidth,
100 int *pheight);
Kirill Batuzov848696b2014-04-29 17:38:39 +0400101 PortioList vga_port_list;
102 PortioList vbe_port_list;
Gerd Hoffmanna96d8be2012-10-15 08:02:57 +0200103 /* bochs vbe state */
104 uint16_t vbe_index;
105 uint16_t vbe_regs[VBE_DISPI_INDEX_NB];
106 uint32_t vbe_start_addr;
107 uint32_t vbe_line_offset;
108 uint32_t vbe_bank_mask;
109 int vbe_mapped;
Avi Kivity4e12cd92009-05-03 22:25:16 +0300110 /* display refresh support */
Gerd Hoffmannc78f7132013-03-05 15:24:14 +0100111 QemuConsole *con;
Avi Kivity4e12cd92009-05-03 22:25:16 +0300112 uint32_t font_offsets[2];
113 int graphic_mode;
114 uint8_t shift_control;
115 uint8_t double_scan;
116 uint32_t line_offset;
117 uint32_t line_compare;
118 uint32_t start_addr;
119 uint32_t plane_updated;
120 uint32_t last_line_offset;
121 uint8_t last_cw, last_ch;
122 uint32_t last_width, last_height; /* in chars or pixels */
123 uint32_t last_scr_width, last_scr_height; /* in pixels */
124 uint32_t last_depth; /* in bits */
Benjamin Herrenschmidtc3b10602014-06-23 13:57:41 +1000125 bool last_byteswap;
Benjamin Herrenschmidt55080992014-07-07 10:17:44 +1000126 bool force_shadow;
Avi Kivity4e12cd92009-05-03 22:25:16 +0300127 uint8_t cursor_start, cursor_end;
Jan Kiszka9aa0ff02012-07-04 19:49:54 +0200128 bool cursor_visible_phase;
129 int64_t cursor_blink_time;
Avi Kivity4e12cd92009-05-03 22:25:16 +0300130 uint32_t cursor_offset;
Gerd Hoffmann380cd052013-03-13 14:04:18 +0100131 const GraphicHwOps *hw_ops;
Gerd Hoffmann9678aed2012-10-09 17:10:13 +0200132 bool full_update_text;
133 bool full_update_gfx;
Benjamin Herrenschmidt2c7d8732014-07-07 09:50:12 +1000134 bool big_endian_fb;
Benjamin Herrenschmidtc3b10602014-06-23 13:57:41 +1000135 bool default_endian_fb;
Gerd Hoffmann1fcfdc42018-07-02 18:33:44 +0200136 bool global_vmstate;
Avi Kivity4e12cd92009-05-03 22:25:16 +0300137 /* hardware mouse cursor support */
138 uint32_t invalidated_y_table[VGA_MAX_HEIGHT / 32];
Gerd Hoffmann22382bb2014-10-16 10:22:23 +0200139 uint32_t hw_cursor_x;
140 uint32_t hw_cursor_y;
Avi Kivity4e12cd92009-05-03 22:25:16 +0300141 void (*cursor_invalidate)(struct VGACommonState *s);
142 void (*cursor_draw_line)(struct VGACommonState *s, uint8_t *d, int y);
143 /* tell for each page if it has been updated since the last time */
144 uint32_t last_palette[256];
145 uint32_t last_ch_attr[CH_ATTR_SIZE]; /* XXX: make it dynamic */
146 /* retrace */
147 vga_retrace_fn retrace;
148 vga_update_retrace_info_fn update_retrace_info;
malccb5a7aa2008-09-28 00:42:12 +0000149 union vga_retrace retrace_info;
Juan Quintela2a3138a2009-10-14 14:10:11 +0200150 uint8_t is_vbe_vmstate;
Avi Kivity4e12cd92009-05-03 22:25:16 +0300151} VGACommonState;
bellard4e3e9d02004-06-05 13:18:45 +0000152
bellarda8aa6692004-06-06 15:17:19 +0000153static inline int c6_to_8(int v)
154{
155 int b;
156 v &= 0x3f;
157 b = v & 1;
158 return (v << 2) | (b << 1) | b;
159}
160
Gerd Hoffmann1fcfdc42018-07-02 18:33:44 +0200161void vga_common_init(VGACommonState *s, Object *obj);
Paolo Bonzini712f0cc2013-06-06 21:21:13 -0400162void vga_init(VGACommonState *s, Object *obj, MemoryRegion *address_space,
Richard Henderson0a039dc2011-08-16 08:27:39 -0700163 MemoryRegion *address_space_io, bool init_vga_ports);
Paolo Bonzinic84b28e2013-06-06 21:21:13 -0400164MemoryRegion *vga_init_io(VGACommonState *s, Object *obj,
Richard Henderson0a039dc2011-08-16 08:27:39 -0700165 const MemoryRegionPortio **vga_ports,
166 const MemoryRegionPortio **vbe_ports);
Juan Quintela03a3e7b2009-08-24 18:42:45 +0200167void vga_common_reset(VGACommonState *s);
aliguori2bec46d2008-11-24 20:21:41 +0000168
Juan Quintelaa4a2f592009-08-24 18:42:47 +0200169void vga_dirty_log_start(VGACommonState *s);
Anthony Liguorib5cc6e32009-12-18 08:08:10 +1000170void vga_dirty_log_stop(VGACommonState *s);
aliguori2bec46d2008-11-24 20:21:41 +0000171
Juan Quintela11b6b342009-10-14 15:25:25 +0200172extern const VMStateDescription vmstate_vga_common;
Juan Quintela43bf7822009-08-31 16:07:13 +0200173uint32_t vga_ioport_read(void *opaque, uint32_t addr);
174void vga_ioport_write(void *opaque, uint32_t addr, uint32_t val);
Avi Kivitya8170e52012-10-23 12:30:10 +0200175uint32_t vga_mem_readb(VGACommonState *s, hwaddr addr);
176void vga_mem_writeb(VGACommonState *s, hwaddr addr, uint32_t val);
Juan Quintelaa4a2f592009-08-24 18:42:47 +0200177void vga_invalidate_scanlines(VGACommonState *s, int y1, int y2);
bellarda8aa6692004-06-06 15:17:19 +0000178
Juan Quintela25a18cb2009-08-31 16:07:19 +0200179int vga_ioport_invalid(VGACommonState *s, uint32_t addr);
Gerd Hoffmann803ff052012-10-15 08:02:55 +0200180
Paolo Bonzini83118322013-06-06 21:21:13 -0400181void vga_init_vbe(VGACommonState *s, Object *obj, MemoryRegion *address_space);
Gerd Hoffmann803ff052012-10-15 08:02:55 +0200182uint32_t vbe_ioport_read_data(void *opaque, uint32_t addr);
183void vbe_ioport_write_index(void *opaque, uint32_t addr, uint32_t val);
184void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val);
Juan Quintela25a18cb2009-08-31 16:07:19 +0200185
bellard798b0c22004-06-05 10:30:49 +0000186extern const uint8_t sr_mask[8];
187extern const uint8_t gr_mask[16];
Paul Brookfbe1b592009-05-13 17:56:25 +0100188
Gerd Hoffmann5245d572009-10-26 12:18:26 +0100189#define VGABIOS_FILENAME "vgabios.bin"
190#define VGABIOS_CIRRUS_FILENAME "vgabios-cirrus.bin"
Paul Brookfbe1b592009-05-13 17:56:25 +0100191
Avi Kivityb1950432011-08-08 16:08:57 +0300192extern const MemoryRegionOps vga_mem_ops;
Paolo Bonzinicb9c3772012-12-06 12:15:58 +0100193
Gerd Hoffmannc5d4dac2014-09-10 14:25:45 +0200194/* vga-pci.c */
195void pci_std_vga_mmio_region_init(VGACommonState *s,
Gerd Hoffmann93abfc82018-06-26 08:09:41 +0200196 Object *owner,
Gerd Hoffmannc5d4dac2014-09-10 14:25:45 +0200197 MemoryRegion *parent,
198 MemoryRegion *subs,
Gerd Hoffmannd46b40f2018-09-25 09:56:46 +0200199 bool qext, bool edid);
Gerd Hoffmannc5d4dac2014-09-10 14:25:45 +0200200
Paolo Bonzinicb9c3772012-12-06 12:15:58 +0100201#endif