vga_int.h 6.6 KB

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