2
0

vga_int.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /*
  2. * QEMU internal VGA defines.
  3. *
  4. * Copyright (c) 2003-2004 Fabrice Bellard
  5. *
  6. * 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. */
  24. #ifndef HW_VGA_INT_H
  25. #define HW_VGA_INT_H
  26. #include "exec/ioport.h"
  27. #include "exec/memory.h"
  28. #include "ui/console.h"
  29. #include "hw/display/bochs-vbe.h"
  30. #define ST01_V_RETRACE 0x08
  31. #define ST01_DISP_ENABLE 0x01
  32. #define CH_ATTR_SIZE (160 * 100)
  33. #define VGA_MAX_HEIGHT 2048
  34. struct vga_precise_retrace {
  35. int64_t ticks_per_char;
  36. int64_t total_chars;
  37. int htotal;
  38. int hstart;
  39. int hend;
  40. int vstart;
  41. int vend;
  42. int freq;
  43. };
  44. union vga_retrace {
  45. struct vga_precise_retrace precise;
  46. };
  47. struct VGACommonState;
  48. typedef uint8_t (* vga_retrace_fn)(struct VGACommonState *s);
  49. typedef void (* vga_update_retrace_info_fn)(struct VGACommonState *s);
  50. typedef struct VGACommonState {
  51. MemoryRegion *legacy_address_space;
  52. uint8_t *vram_ptr;
  53. MemoryRegion vram;
  54. MemoryRegion vram_vbe;
  55. uint32_t vram_size;
  56. uint32_t vram_size_mb; /* property */
  57. uint32_t vbe_size;
  58. uint32_t vbe_size_mask;
  59. uint32_t latch;
  60. bool has_chain4_alias;
  61. MemoryRegion chain4_alias;
  62. uint8_t sr_index;
  63. uint8_t sr[256];
  64. uint8_t sr_vbe[256];
  65. uint8_t gr_index;
  66. uint8_t gr[256];
  67. uint8_t ar_index;
  68. uint8_t ar[21];
  69. int ar_flip_flop;
  70. uint8_t cr_index;
  71. uint8_t cr[256]; /* CRT registers */
  72. uint8_t msr; /* Misc Output Register */
  73. uint8_t fcr; /* Feature Control Register */
  74. uint8_t st00; /* status 0 */
  75. uint8_t st01; /* status 1 */
  76. uint8_t dac_state;
  77. uint8_t dac_sub_index;
  78. uint8_t dac_read_index;
  79. uint8_t dac_write_index;
  80. uint8_t dac_cache[3]; /* used when writing */
  81. int dac_8bit;
  82. uint8_t palette[768];
  83. int32_t bank_offset;
  84. int (*get_bpp)(struct VGACommonState *s);
  85. void (*get_offsets)(struct VGACommonState *s,
  86. uint32_t *pline_offset,
  87. uint32_t *pstart_addr,
  88. uint32_t *pline_compare);
  89. void (*get_resolution)(struct VGACommonState *s,
  90. int *pwidth,
  91. int *pheight);
  92. PortioList vga_port_list;
  93. PortioList vbe_port_list;
  94. /* bochs vbe state */
  95. uint16_t vbe_index;
  96. uint16_t vbe_regs[VBE_DISPI_INDEX_NB];
  97. uint32_t vbe_start_addr;
  98. uint32_t vbe_line_offset;
  99. uint32_t vbe_bank_mask;
  100. int vbe_mapped;
  101. /* display refresh support */
  102. QemuConsole *con;
  103. uint32_t font_offsets[2];
  104. int graphic_mode;
  105. uint8_t shift_control;
  106. uint8_t double_scan;
  107. uint32_t line_offset;
  108. uint32_t line_compare;
  109. uint32_t start_addr;
  110. uint32_t plane_updated;
  111. uint32_t last_line_offset;
  112. uint8_t last_cw, last_ch;
  113. uint32_t last_width, last_height; /* in chars or pixels */
  114. uint32_t last_scr_width, last_scr_height; /* in pixels */
  115. uint32_t last_depth; /* in bits */
  116. bool last_byteswap;
  117. bool force_shadow;
  118. uint8_t cursor_start, cursor_end;
  119. bool cursor_visible_phase;
  120. int64_t cursor_blink_time;
  121. uint32_t cursor_offset;
  122. const GraphicHwOps *hw_ops;
  123. bool full_update_text;
  124. bool full_update_gfx;
  125. bool big_endian_fb;
  126. bool default_endian_fb;
  127. bool global_vmstate;
  128. /* hardware mouse cursor support */
  129. uint32_t invalidated_y_table[VGA_MAX_HEIGHT / 32];
  130. uint32_t hw_cursor_x;
  131. uint32_t hw_cursor_y;
  132. void (*cursor_invalidate)(struct VGACommonState *s);
  133. void (*cursor_draw_line)(struct VGACommonState *s, uint8_t *d, int y);
  134. /* tell for each page if it has been updated since the last time */
  135. uint32_t last_palette[256];
  136. uint32_t last_ch_attr[CH_ATTR_SIZE]; /* XXX: make it dynamic */
  137. /* retrace */
  138. vga_retrace_fn retrace;
  139. vga_update_retrace_info_fn update_retrace_info;
  140. union vga_retrace retrace_info;
  141. uint8_t is_vbe_vmstate;
  142. } VGACommonState;
  143. static inline int c6_to_8(int v)
  144. {
  145. int b;
  146. v &= 0x3f;
  147. b = v & 1;
  148. return (v << 2) | (b << 1) | b;
  149. }
  150. void vga_common_init(VGACommonState *s, Object *obj);
  151. void vga_init(VGACommonState *s, Object *obj, MemoryRegion *address_space,
  152. MemoryRegion *address_space_io, bool init_vga_ports);
  153. MemoryRegion *vga_init_io(VGACommonState *s, Object *obj,
  154. const MemoryRegionPortio **vga_ports,
  155. const MemoryRegionPortio **vbe_ports);
  156. void vga_common_reset(VGACommonState *s);
  157. void vga_dirty_log_start(VGACommonState *s);
  158. void vga_dirty_log_stop(VGACommonState *s);
  159. extern const VMStateDescription vmstate_vga_common;
  160. uint32_t vga_ioport_read(void *opaque, uint32_t addr);
  161. void vga_ioport_write(void *opaque, uint32_t addr, uint32_t val);
  162. uint32_t vga_mem_readb(VGACommonState *s, hwaddr addr);
  163. void vga_mem_writeb(VGACommonState *s, hwaddr addr, uint32_t val);
  164. void vga_invalidate_scanlines(VGACommonState *s, int y1, int y2);
  165. int vga_ioport_invalid(VGACommonState *s, uint32_t addr);
  166. void vga_init_vbe(VGACommonState *s, Object *obj, MemoryRegion *address_space);
  167. uint32_t vbe_ioport_read_data(void *opaque, uint32_t addr);
  168. void vbe_ioport_write_index(void *opaque, uint32_t addr, uint32_t val);
  169. void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val);
  170. extern const uint8_t sr_mask[8];
  171. extern const uint8_t gr_mask[16];
  172. #define VGABIOS_FILENAME "vgabios.bin"
  173. #define VGABIOS_CIRRUS_FILENAME "vgabios-cirrus.bin"
  174. extern const MemoryRegionOps vga_mem_ops;
  175. /* vga-pci.c */
  176. void pci_std_vga_mmio_region_init(VGACommonState *s,
  177. Object *owner,
  178. MemoryRegion *parent,
  179. MemoryRegion *subs,
  180. bool qext, bool edid);
  181. #endif