Lines Matching +full:- +full:s
13 * Currently it's little more than a frame buffer with minimal functions,
22 #include "vga-access.h"
23 #include "hw/qdev-properties.h"
27 #include "qemu/error-report.h"
30 #include "hw/display/i2c-ddc.h"
51 static void ati_vga_switch_mode(ATIVGAState *s) in ati_vga_switch_mode() argument
53 DPRINTF("%d -> %d\n", in ati_vga_switch_mode()
54 s->mode, !!(s->regs.crtc_gen_cntl & CRTC2_EXT_DISP_EN)); in ati_vga_switch_mode()
55 if (s->regs.crtc_gen_cntl & CRTC2_EXT_DISP_EN) { in ati_vga_switch_mode()
57 s->mode = EXT_MODE; in ati_vga_switch_mode()
58 if (s->regs.crtc_gen_cntl & CRTC2_EN) { in ati_vga_switch_mode()
61 uint32_t offs = s->regs.crtc_offset & 0x07ffffff; in ati_vga_switch_mode()
62 int stride = (s->regs.crtc_pitch & 0x7ff) * 8; in ati_vga_switch_mode()
66 if (s->regs.crtc_h_total_disp == 0) { in ati_vga_switch_mode()
67 s->regs.crtc_h_total_disp = ((640 / 8) - 1) << 16; in ati_vga_switch_mode()
69 if (s->regs.crtc_v_total_disp == 0) { in ati_vga_switch_mode()
70 s->regs.crtc_v_total_disp = (480 - 1) << 16; in ati_vga_switch_mode()
72 h = ((s->regs.crtc_h_total_disp >> 16) + 1) * 8; in ati_vga_switch_mode()
73 v = (s->regs.crtc_v_total_disp >> 16) + 1; in ati_vga_switch_mode()
74 switch (s->regs.crtc_gen_cntl & CRTC_PIX_WIDTH_MASK) { in ati_vga_switch_mode()
98 vbe_ioport_write_index(&s->vga, 0, VBE_DISPI_INDEX_ENABLE); in ati_vga_switch_mode()
99 vbe_ioport_write_data(&s->vga, 0, VBE_DISPI_DISABLED); in ati_vga_switch_mode()
100 s->vga.big_endian_fb = (s->regs.config_cntl & APER_0_ENDIAN || in ati_vga_switch_mode()
101 s->regs.config_cntl & APER_1_ENDIAN ? in ati_vga_switch_mode()
104 s->vga.vbe_regs[VBE_DISPI_INDEX_XRES] = h; in ati_vga_switch_mode()
105 s->vga.vbe_regs[VBE_DISPI_INDEX_YRES] = v; in ati_vga_switch_mode()
106 s->vga.vbe_regs[VBE_DISPI_INDEX_BPP] = bpp; in ati_vga_switch_mode()
108 vbe_ioport_write_index(&s->vga, 0, VBE_DISPI_INDEX_ENABLE); in ati_vga_switch_mode()
109 vbe_ioport_write_data(&s->vga, 0, VBE_DISPI_ENABLED | in ati_vga_switch_mode()
111 (s->regs.dac_cntl & DAC_8BIT_EN ? VBE_DISPI_8BIT_DAC : 0)); in ati_vga_switch_mode()
116 vbe_ioport_write_index(&s->vga, 0, VBE_DISPI_INDEX_VIRT_WIDTH); in ati_vga_switch_mode()
117 vbe_ioport_write_data(&s->vga, 0, stride); in ati_vga_switch_mode()
121 vbe_ioport_write_index(&s->vga, 0, in ati_vga_switch_mode()
123 vbe_ioport_write_data(&s->vga, 0, offs % stride / bypp); in ati_vga_switch_mode()
125 vbe_ioport_write_index(&s->vga, 0, VBE_DISPI_INDEX_Y_OFFSET); in ati_vga_switch_mode()
126 vbe_ioport_write_data(&s->vga, 0, offs / stride); in ati_vga_switch_mode()
128 s->vga.vbe_regs[VBE_DISPI_INDEX_X_OFFSET], in ati_vga_switch_mode()
129 s->vga.vbe_regs[VBE_DISPI_INDEX_Y_OFFSET], in ati_vga_switch_mode()
130 s->vga.vbe_start_addr); in ati_vga_switch_mode()
135 s->mode = VGA_MODE; in ati_vga_switch_mode()
136 vbe_ioport_write_index(&s->vga, 0, VBE_DISPI_INDEX_ENABLE); in ati_vga_switch_mode()
137 vbe_ioport_write_data(&s->vga, 0, VBE_DISPI_DISABLED); in ati_vga_switch_mode()
142 static void ati_cursor_define(ATIVGAState *s) in ati_cursor_define() argument
148 if ((s->regs.cur_offset & BIT(31)) || s->cursor_guest_mode) { in ati_cursor_define()
152 srcoff = s->regs.cur_offset - in ati_cursor_define()
153 (s->regs.cur_hv_offs >> 16) - (s->regs.cur_hv_offs & 0xffff) * 16; in ati_cursor_define()
156 data[idx] = vga_read_byte(&s->vga, srcoff + i * 16 + j); in ati_cursor_define()
157 data[512 + idx] = vga_read_byte(&s->vga, srcoff + i * 16 + j + 8); in ati_cursor_define()
160 if (!s->cursor) { in ati_cursor_define()
161 s->cursor = cursor_alloc(64, 64); in ati_cursor_define()
163 cursor_set_mono(s->cursor, s->regs.cur_color1, s->regs.cur_color0, in ati_cursor_define()
165 dpy_cursor_define(s->vga.con, s->cursor); in ati_cursor_define()
171 ATIVGAState *s = container_of(vga, ATIVGAState, vga); in ati_cursor_invalidate() local
172 int size = (s->regs.crtc_gen_cntl & CRTC2_CUR_EN) ? 64 : 0; in ati_cursor_invalidate()
174 if (s->regs.cur_offset & BIT(31)) { in ati_cursor_invalidate()
177 if (s->cursor_size != size || in ati_cursor_invalidate()
178 vga->hw_cursor_x != s->regs.cur_hv_pos >> 16 || in ati_cursor_invalidate()
179 vga->hw_cursor_y != (s->regs.cur_hv_pos & 0xffff) || in ati_cursor_invalidate()
180 s->cursor_offset != s->regs.cur_offset - (s->regs.cur_hv_offs >> 16) - in ati_cursor_invalidate()
181 (s->regs.cur_hv_offs & 0xffff) * 16) { in ati_cursor_invalidate()
183 vga_invalidate_scanlines(vga, vga->hw_cursor_y, vga->hw_cursor_y + 63); in ati_cursor_invalidate()
184 vga->hw_cursor_x = s->regs.cur_hv_pos >> 16; in ati_cursor_invalidate()
185 vga->hw_cursor_y = s->regs.cur_hv_pos & 0xffff; in ati_cursor_invalidate()
186 s->cursor_offset = s->regs.cur_offset - (s->regs.cur_hv_offs >> 16) - in ati_cursor_invalidate()
187 (s->regs.cur_hv_offs & 0xffff) * 16; in ati_cursor_invalidate()
188 s->cursor_size = size; in ati_cursor_invalidate()
191 vga->hw_cursor_y, vga->hw_cursor_y + 63); in ati_cursor_invalidate()
198 ATIVGAState *s = container_of(vga, ATIVGAState, vga); in ati_cursor_draw_line() local
203 if (!(s->regs.crtc_gen_cntl & CRTC2_CUR_EN) || in ati_cursor_draw_line()
204 scr_y < vga->hw_cursor_y || scr_y >= vga->hw_cursor_y + 64 || in ati_cursor_draw_line()
205 scr_y > s->regs.crtc_v_total_disp >> 16) { in ati_cursor_draw_line()
209 srcoff = s->cursor_offset + (scr_y - vga->hw_cursor_y) * 16; in ati_cursor_draw_line()
210 dp = &dp[vga->hw_cursor_x]; in ati_cursor_draw_line()
211 h = ((s->regs.crtc_h_total_disp >> 16) + 1) * 8; in ati_cursor_draw_line()
224 color = (xbits & BIT(7) ? s->regs.cur_color1 : in ati_cursor_draw_line()
225 s->regs.cur_color0) | 0xff000000; in ati_cursor_draw_line()
227 if (vga->hw_cursor_x + i * 8 + j >= h) { in ati_cursor_draw_line()
253 static void ati_vga_update_irq(ATIVGAState *s) in ati_vga_update_irq() argument
255 pci_set_irq(&s->dev, !!(s->regs.gen_int_status & s->regs.gen_int_cntl)); in ati_vga_update_irq()
260 ATIVGAState *s = opaque; in ati_vga_vblank_irq() local
262 timer_mod(&s->vblank_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + in ati_vga_vblank_irq()
264 s->regs.gen_int_status |= CRTC_VBLANK_INT; in ati_vga_vblank_irq()
265 ati_vga_update_irq(s); in ati_vga_vblank_irq()
280 ATIVGAState *s = opaque; in ati_mm_read() local
285 val = s->regs.mm_index; in ati_mm_read()
289 if (s->regs.mm_index & BIT(31)) { in ati_mm_read()
290 uint32_t idx = s->regs.mm_index & ~BIT(31); in ati_mm_read()
291 if (idx <= s->vga.vram_size - size) { in ati_mm_read()
292 val = ldn_le_p(s->vga.vram_ptr + idx, size); in ati_mm_read()
294 } else if (s->regs.mm_index > MM_DATA + 3) { in ati_mm_read()
295 val = ati_mm_read(s, s->regs.mm_index + addr - MM_DATA, size); in ati_mm_read()
298 "ati_mm_read: mm_index too small: %u\n", s->regs.mm_index); in ati_mm_read()
301 case BIOS_0_SCRATCH ... BUS_CNTL - 1: in ati_mm_read()
303 int i = (addr - BIOS_0_SCRATCH) / 4; in ati_mm_read()
304 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF && i > 3) { in ati_mm_read()
307 val = ati_reg_read_offs(s->regs.bios_scratch[i], in ati_mm_read()
308 addr - (BIOS_0_SCRATCH + i * 4), size); in ati_mm_read()
312 val = s->regs.gen_int_cntl; in ati_mm_read()
315 val = s->regs.gen_int_status; in ati_mm_read()
318 val = ati_reg_read_offs(s->regs.crtc_gen_cntl, in ati_mm_read()
319 addr - CRTC_GEN_CNTL, size); in ati_mm_read()
322 val = ati_reg_read_offs(s->regs.crtc_ext_cntl, in ati_mm_read()
323 addr - CRTC_EXT_CNTL, size); in ati_mm_read()
326 val = s->regs.dac_cntl; in ati_mm_read()
329 val = ati_reg_read_offs(s->regs.gpio_vga_ddc, in ati_mm_read()
330 addr - GPIO_VGA_DDC, size); in ati_mm_read()
333 val = ati_reg_read_offs(s->regs.gpio_dvi_ddc, in ati_mm_read()
334 addr - GPIO_DVI_DDC, size); in ati_mm_read()
337 val = ati_reg_read_offs(s->regs.gpio_monid, in ati_mm_read()
338 addr - GPIO_MONID, size); in ati_mm_read()
342 val = vga_ioport_read(&s->vga, VGA_PEL_IR) << 16; in ati_mm_read()
343 val |= vga_ioport_read(&s->vga, VGA_PEL_IW) & 0xff; in ati_mm_read()
346 val = vga_ioport_read(&s->vga, VGA_PEL_D); in ati_mm_read()
349 val = s->regs.palette[vga_ioport_read(&s->vga, VGA_PEL_IR)]; in ati_mm_read()
352 val = s->regs.config_cntl; in ati_mm_read()
355 val = s->vga.vram_size; in ati_mm_read()
359 val = pci_default_read_config(&s->dev, in ati_mm_read()
363 val = s->vga.vram_size / 2; in ati_mm_read()
366 val = pci_default_read_config(&s->dev, in ati_mm_read()
370 val = memory_region_size(&s->mm) / 2; in ati_mm_read()
379 if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_read()
388 val = s->regs.crtc_h_total_disp; in ati_mm_read()
391 val = s->regs.crtc_h_sync_strt_wid; in ati_mm_read()
394 val = s->regs.crtc_v_total_disp; in ati_mm_read()
397 val = s->regs.crtc_v_sync_strt_wid; in ati_mm_read()
400 val = s->regs.crtc_offset; in ati_mm_read()
403 val = s->regs.crtc_offset_cntl; in ati_mm_read()
406 val = s->regs.crtc_pitch; in ati_mm_read()
409 val = pci_default_read_config(&s->dev, addr - 0xf00, size); in ati_mm_read()
412 val = ati_reg_read_offs(s->regs.cur_offset, addr - CUR_OFFSET, size); in ati_mm_read()
415 val = ati_reg_read_offs(s->regs.cur_hv_pos, in ati_mm_read()
416 addr - CUR_HORZ_VERT_POSN, size); in ati_mm_read()
418 val |= (s->regs.cur_offset & BIT(31)) >> (4 - size); in ati_mm_read()
422 val = ati_reg_read_offs(s->regs.cur_hv_offs, in ati_mm_read()
423 addr - CUR_HORZ_VERT_OFF, size); in ati_mm_read()
425 val |= (s->regs.cur_offset & BIT(31)) >> (4 - size); in ati_mm_read()
429 val = ati_reg_read_offs(s->regs.cur_color0, addr - CUR_CLR0, size); in ati_mm_read()
432 val = ati_reg_read_offs(s->regs.cur_color1, addr - CUR_CLR1, size); in ati_mm_read()
435 val = s->regs.dst_offset; in ati_mm_read()
438 val = s->regs.dst_pitch; in ati_mm_read()
439 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_read()
440 val &= s->regs.dst_tile << 16; in ati_mm_read()
444 val = s->regs.dst_width; in ati_mm_read()
447 val = s->regs.dst_height; in ati_mm_read()
450 val = s->regs.src_x; in ati_mm_read()
453 val = s->regs.src_y; in ati_mm_read()
456 val = s->regs.dst_x; in ati_mm_read()
459 val = s->regs.dst_y; in ati_mm_read()
462 val = s->regs.dp_gui_master_cntl; in ati_mm_read()
465 val = s->regs.src_offset; in ati_mm_read()
468 val = s->regs.src_pitch; in ati_mm_read()
469 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_read()
470 val &= s->regs.src_tile << 16; in ati_mm_read()
474 val = s->regs.dp_brush_bkgd_clr; in ati_mm_read()
477 val = s->regs.dp_brush_frgd_clr; in ati_mm_read()
480 val = s->regs.dp_src_frgd_clr; in ati_mm_read()
483 val = s->regs.dp_src_bkgd_clr; in ati_mm_read()
486 val = s->regs.dp_cntl; in ati_mm_read()
489 val = s->regs.dp_datatype; in ati_mm_read()
492 val = s->regs.dp_mix; in ati_mm_read()
495 val = s->regs.dp_write_mask; in ati_mm_read()
498 val = s->regs.default_offset; in ati_mm_read()
499 if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_read()
501 val |= s->regs.default_pitch << 16; in ati_mm_read()
502 val |= s->regs.default_tile << 30; in ati_mm_read()
506 val = s->regs.default_pitch; in ati_mm_read()
507 val |= s->regs.default_tile << 16; in ati_mm_read()
510 val = s->regs.default_sc_bottom_right; in ati_mm_read()
535 ATIVGAState *s = opaque; in ati_mm_write() local
542 s->regs.mm_index = data & ~3; in ati_mm_write()
546 if (s->regs.mm_index & BIT(31)) { in ati_mm_write()
547 uint32_t idx = s->regs.mm_index & ~BIT(31); in ati_mm_write()
548 if (idx <= s->vga.vram_size - size) { in ati_mm_write()
549 stn_le_p(s->vga.vram_ptr + idx, size, data); in ati_mm_write()
551 } else if (s->regs.mm_index > MM_DATA + 3) { in ati_mm_write()
552 ati_mm_write(s, s->regs.mm_index + addr - MM_DATA, data, size); in ati_mm_write()
555 "ati_mm_write: mm_index too small: %u\n", s->regs.mm_index); in ati_mm_write()
558 case BIOS_0_SCRATCH ... BUS_CNTL - 1: in ati_mm_write()
560 int i = (addr - BIOS_0_SCRATCH) / 4; in ati_mm_write()
561 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF && i > 3) { in ati_mm_write()
564 ati_reg_write_offs(&s->regs.bios_scratch[i], in ati_mm_write()
565 addr - (BIOS_0_SCRATCH + i * 4), data, size); in ati_mm_write()
569 s->regs.gen_int_cntl = data; in ati_mm_write()
571 ati_vga_vblank_irq(s); in ati_mm_write()
573 timer_del(&s->vblank_timer); in ati_mm_write()
574 ati_vga_update_irq(s); in ati_mm_write()
578 data &= (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF ? in ati_mm_write()
580 s->regs.gen_int_status &= ~data; in ati_mm_write()
581 ati_vga_update_irq(s); in ati_mm_write()
585 uint32_t val = s->regs.crtc_gen_cntl; in ati_mm_write()
586 ati_reg_write_offs(&s->regs.crtc_gen_cntl, in ati_mm_write()
587 addr - CRTC_GEN_CNTL, data, size); in ati_mm_write()
588 if ((val & CRTC2_CUR_EN) != (s->regs.crtc_gen_cntl & CRTC2_CUR_EN)) { in ati_mm_write()
589 if (s->cursor_guest_mode) { in ati_mm_write()
590 s->vga.force_shadow = !!(s->regs.crtc_gen_cntl & CRTC2_CUR_EN); in ati_mm_write()
592 if (s->regs.crtc_gen_cntl & CRTC2_CUR_EN) { in ati_mm_write()
593 ati_cursor_define(s); in ati_mm_write()
595 dpy_mouse_set(s->vga.con, s->regs.cur_hv_pos >> 16, in ati_mm_write()
596 s->regs.cur_hv_pos & 0xffff, in ati_mm_write()
597 (s->regs.crtc_gen_cntl & CRTC2_CUR_EN) != 0); in ati_mm_write()
601 (s->regs.crtc_gen_cntl & (CRTC2_EXT_DISP_EN | CRTC2_EN))) { in ati_mm_write()
602 ati_vga_switch_mode(s); in ati_mm_write()
608 uint32_t val = s->regs.crtc_ext_cntl; in ati_mm_write()
609 ati_reg_write_offs(&s->regs.crtc_ext_cntl, in ati_mm_write()
610 addr - CRTC_EXT_CNTL, data, size); in ati_mm_write()
611 if (s->regs.crtc_ext_cntl & CRT_CRTC_DISPLAY_DIS) { in ati_mm_write()
613 s->vga.ar_index &= ~BIT(5); in ati_mm_write()
616 s->vga.ar_index |= BIT(5); in ati_mm_write()
617 ati_vga_switch_mode(s); in ati_mm_write()
620 (s->regs.crtc_ext_cntl & CRT_CRTC_DISPLAY_DIS)) { in ati_mm_write()
621 ati_vga_switch_mode(s); in ati_mm_write()
626 s->regs.dac_cntl = data & 0xffffe3ff; in ati_mm_write()
627 s->vga.dac_8bit = !!(data & DAC_8BIT_EN); in ati_mm_write()
636 if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_write()
641 if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_write()
642 ati_reg_write_offs(&s->regs.gpio_dvi_ddc, in ati_mm_write()
643 addr - GPIO_DVI_DDC, data, size); in ati_mm_write()
645 (addr == GPIO_DVI_DDC && (s->regs.gpio_dvi_ddc & 0x30000))) { in ati_mm_write()
646 s->regs.gpio_dvi_ddc = ati_i2c(&s->bbi2c, in ati_mm_write()
647 s->regs.gpio_dvi_ddc, 0); in ati_mm_write()
653 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_write()
654 /* Rage128p accesses DDC via MONID(1-2) with additional mask bit */ in ati_mm_write()
655 ati_reg_write_offs(&s->regs.gpio_monid, in ati_mm_write()
656 addr - GPIO_MONID, data, size); in ati_mm_write()
657 if ((s->regs.gpio_monid & BIT(25)) && in ati_mm_write()
659 (addr == GPIO_MONID && (s->regs.gpio_monid & 0x60000)))) { in ati_mm_write()
660 s->regs.gpio_monid = ati_i2c(&s->bbi2c, s->regs.gpio_monid, 1); in ati_mm_write()
666 vga_ioport_write(&s->vga, VGA_PEL_IR, (data >> 16) & 0xff); in ati_mm_write()
667 vga_ioport_write(&s->vga, VGA_PEL_IW, data & 0xff); in ati_mm_write()
670 vga_ioport_write(&s->vga, VGA_PEL_IW, data & 0xff); in ati_mm_write()
672 vga_ioport_write(&s->vga, VGA_PEL_IR, data & 0xff); in ati_mm_write()
677 data <<= addr - PALETTE_DATA; in ati_mm_write()
679 vga_ioport_write(&s->vga, VGA_PEL_D, data & 0xff); in ati_mm_write()
681 vga_ioport_write(&s->vga, VGA_PEL_D, data & 0xff); in ati_mm_write()
683 vga_ioport_write(&s->vga, VGA_PEL_D, data & 0xff); in ati_mm_write()
686 s->regs.palette[vga_ioport_read(&s->vga, VGA_PEL_IW)] = data; in ati_mm_write()
687 vga_ioport_write(&s->vga, VGA_PEL_D, (data >> 22) & 0xff); in ati_mm_write()
688 vga_ioport_write(&s->vga, VGA_PEL_D, (data >> 12) & 0xff); in ati_mm_write()
689 vga_ioport_write(&s->vga, VGA_PEL_D, (data >> 2) & 0xff); in ati_mm_write()
692 s->regs.config_cntl = data; in ati_mm_write()
695 s->regs.crtc_h_total_disp = data & 0x07ff07ff; in ati_mm_write()
698 s->regs.crtc_h_sync_strt_wid = data & 0x17bf1fff; in ati_mm_write()
701 s->regs.crtc_v_total_disp = data & 0x0fff0fff; in ati_mm_write()
704 s->regs.crtc_v_sync_strt_wid = data & 0x9f0fff; in ati_mm_write()
707 s->regs.crtc_offset = data & 0xc7ffffff; in ati_mm_write()
710 s->regs.crtc_offset_cntl = data; /* FIXME */ in ati_mm_write()
713 s->regs.crtc_pitch = data & 0x07ff07ff; in ati_mm_write()
716 /* read-only copy of PCI config space so ignore writes */ in ati_mm_write()
720 uint32_t t = s->regs.cur_offset; in ati_mm_write()
722 ati_reg_write_offs(&t, addr - CUR_OFFSET, data, size); in ati_mm_write()
724 if (s->regs.cur_offset != t) { in ati_mm_write()
725 s->regs.cur_offset = t; in ati_mm_write()
726 ati_cursor_define(s); in ati_mm_write()
732 uint32_t t = s->regs.cur_hv_pos | (s->regs.cur_offset & BIT(31)); in ati_mm_write()
734 ati_reg_write_offs(&t, addr - CUR_HORZ_VERT_POSN, data, size); in ati_mm_write()
735 s->regs.cur_hv_pos = t & 0x3fff0fff; in ati_mm_write()
737 s->regs.cur_offset |= t & BIT(31); in ati_mm_write()
738 } else if (s->regs.cur_offset & BIT(31)) { in ati_mm_write()
739 s->regs.cur_offset &= ~BIT(31); in ati_mm_write()
740 ati_cursor_define(s); in ati_mm_write()
742 if (!s->cursor_guest_mode && in ati_mm_write()
743 (s->regs.crtc_gen_cntl & CRTC2_CUR_EN) && !(t & BIT(31))) { in ati_mm_write()
744 dpy_mouse_set(s->vga.con, s->regs.cur_hv_pos >> 16, in ati_mm_write()
745 s->regs.cur_hv_pos & 0xffff, true); in ati_mm_write()
751 uint32_t t = s->regs.cur_hv_offs | (s->regs.cur_offset & BIT(31)); in ati_mm_write()
753 ati_reg_write_offs(&t, addr - CUR_HORZ_VERT_OFF, data, size); in ati_mm_write()
754 s->regs.cur_hv_offs = t & 0x3f003f; in ati_mm_write()
756 s->regs.cur_offset |= t & BIT(31); in ati_mm_write()
757 } else if (s->regs.cur_offset & BIT(31)) { in ati_mm_write()
758 s->regs.cur_offset &= ~BIT(31); in ati_mm_write()
759 ati_cursor_define(s); in ati_mm_write()
765 uint32_t t = s->regs.cur_color0; in ati_mm_write()
767 ati_reg_write_offs(&t, addr - CUR_CLR0, data, size); in ati_mm_write()
769 if (s->regs.cur_color0 != t) { in ati_mm_write()
770 s->regs.cur_color0 = t; in ati_mm_write()
771 ati_cursor_define(s); in ati_mm_write()
781 ati_reg_write_offs(&s->regs.cur_color1, addr - CUR_CLR1, data, size); in ati_mm_write()
782 s->regs.cur_color1 &= 0xffffff; in ati_mm_write()
783 ati_cursor_define(s); in ati_mm_write()
786 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_write()
787 s->regs.dst_offset = data & 0xfffffff0; in ati_mm_write()
789 s->regs.dst_offset = data & 0xfffffc00; in ati_mm_write()
793 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_write()
794 s->regs.dst_pitch = data & 0x3fff; in ati_mm_write()
795 s->regs.dst_tile = (data >> 16) & 1; in ati_mm_write()
797 s->regs.dst_pitch = data & 0x3ff0; in ati_mm_write()
801 if (s->dev_id == PCI_DEVICE_ID_ATI_RADEON_QY) { in ati_mm_write()
802 s->regs.dst_tile = data & 3; in ati_mm_write()
806 s->regs.dst_width = data & 0x3fff; in ati_mm_write()
807 ati_2d_blt(s); in ati_mm_write()
810 s->regs.dst_height = data & 0x3fff; in ati_mm_write()
813 s->regs.src_x = data & 0x3fff; in ati_mm_write()
816 s->regs.src_y = data & 0x3fff; in ati_mm_write()
819 s->regs.dst_x = data & 0x3fff; in ati_mm_write()
822 s->regs.dst_y = data & 0x3fff; in ati_mm_write()
825 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_write()
826 s->regs.src_offset = (data & 0x1fffff) << 5; in ati_mm_write()
827 s->regs.src_pitch = (data & 0x7fe00000) >> 21; in ati_mm_write()
828 s->regs.src_tile = data >> 31; in ati_mm_write()
830 s->regs.src_offset = (data & 0x3fffff) << 10; in ati_mm_write()
831 s->regs.src_pitch = (data & 0x3fc00000) >> 16; in ati_mm_write()
832 s->regs.src_tile = (data >> 30) & 1; in ati_mm_write()
836 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_write()
837 s->regs.dst_offset = (data & 0x1fffff) << 5; in ati_mm_write()
838 s->regs.dst_pitch = (data & 0x7fe00000) >> 21; in ati_mm_write()
839 s->regs.dst_tile = data >> 31; in ati_mm_write()
841 s->regs.dst_offset = (data & 0x3fffff) << 10; in ati_mm_write()
842 s->regs.dst_pitch = (data & 0x3fc00000) >> 16; in ati_mm_write()
843 s->regs.dst_tile = data >> 30; in ati_mm_write()
847 s->regs.src_x = data & 0x3fff; in ati_mm_write()
848 s->regs.src_y = (data >> 16) & 0x3fff; in ati_mm_write()
851 s->regs.dst_x = data & 0x3fff; in ati_mm_write()
852 s->regs.dst_y = (data >> 16) & 0x3fff; in ati_mm_write()
855 s->regs.dst_width = data & 0x3fff; in ati_mm_write()
856 s->regs.dst_height = (data >> 16) & 0x3fff; in ati_mm_write()
857 ati_2d_blt(s); in ati_mm_write()
860 s->regs.dp_gui_master_cntl = data & 0xf800000f; in ati_mm_write()
861 s->regs.dp_datatype = (data & 0x0f00) >> 8 | (data & 0x30f0) << 4 | in ati_mm_write()
863 s->regs.dp_mix = (data & GMC_ROP3_MASK) | (data & 0x7000000) >> 16; in ati_mm_write()
866 s->regs.dst_x = data & 0x3fff; in ati_mm_write()
867 s->regs.dst_width = (data >> 16) & 0x3fff; in ati_mm_write()
868 ati_2d_blt(s); in ati_mm_write()
871 s->regs.src_y = data & 0x3fff; in ati_mm_write()
872 s->regs.src_x = (data >> 16) & 0x3fff; in ati_mm_write()
875 s->regs.dst_y = data & 0x3fff; in ati_mm_write()
876 s->regs.dst_x = (data >> 16) & 0x3fff; in ati_mm_write()
879 s->regs.dst_height = data & 0x3fff; in ati_mm_write()
880 s->regs.dst_width = (data >> 16) & 0x3fff; in ati_mm_write()
881 ati_2d_blt(s); in ati_mm_write()
884 s->regs.dst_y = data & 0x3fff; in ati_mm_write()
885 s->regs.dst_height = (data >> 16) & 0x3fff; in ati_mm_write()
888 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_write()
889 s->regs.src_offset = data & 0xfffffff0; in ati_mm_write()
891 s->regs.src_offset = data & 0xfffffc00; in ati_mm_write()
895 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_write()
896 s->regs.src_pitch = data & 0x3fff; in ati_mm_write()
897 s->regs.src_tile = (data >> 16) & 1; in ati_mm_write()
899 s->regs.src_pitch = data & 0x3ff0; in ati_mm_write()
903 s->regs.dp_brush_bkgd_clr = data; in ati_mm_write()
906 s->regs.dp_brush_frgd_clr = data; in ati_mm_write()
909 s->regs.dp_cntl = data; in ati_mm_write()
912 s->regs.dp_datatype = data & 0xe0070f0f; in ati_mm_write()
915 s->regs.dp_mix = data & 0x00ff0700; in ati_mm_write()
918 s->regs.dp_write_mask = data; in ati_mm_write()
921 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_write()
922 s->regs.default_offset = data & 0xfffffff0; in ati_mm_write()
925 s->regs.default_offset = (data & 0x3fffff) << 10; in ati_mm_write()
926 s->regs.default_pitch = (data & 0x3fc00000) >> 16; in ati_mm_write()
927 s->regs.default_tile = data >> 30; in ati_mm_write()
931 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { in ati_mm_write()
932 s->regs.default_pitch = data & 0x3fff; in ati_mm_write()
933 s->regs.default_tile = (data >> 16) & 1; in ati_mm_write()
937 s->regs.default_sc_bottom_right = data & 0x3fff3fff; in ati_mm_write()
952 ATIVGAState *s = ATI_VGA(dev); in ati_vga_realize() local
953 VGACommonState *vga = &s->vga; in ati_vga_realize()
956 if (s->use_pixman != 0) { in ati_vga_realize()
957 warn_report("x-pixman != 0, not effective without PIXMAN"); in ati_vga_realize()
961 if (s->model) { in ati_vga_realize()
964 if (!strcmp(s->model, ati_model_aliases[i].name)) { in ati_vga_realize()
965 s->dev_id = ati_model_aliases[i].dev_id; in ati_vga_realize()
974 if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF && in ati_vga_realize()
975 s->dev_id != PCI_DEVICE_ID_ATI_RADEON_QY) { in ati_vga_realize()
980 pci_set_word(dev->config + PCI_DEVICE_ID, s->dev_id); in ati_vga_realize()
982 if (s->dev_id == PCI_DEVICE_ID_ATI_RADEON_QY && in ati_vga_realize()
983 s->vga.vram_size_mb < 16) { in ati_vga_realize()
985 s->vga.vram_size_mb = 16; in ati_vga_realize()
989 if (!vga_common_init(vga, OBJECT(s), errp)) { in ati_vga_realize()
992 vga_init(vga, OBJECT(s), pci_address_space(dev), in ati_vga_realize()
994 vga->con = graphic_console_init(DEVICE(s), 0, s->vga.hw_ops, vga); in ati_vga_realize()
995 if (s->cursor_guest_mode) { in ati_vga_realize()
996 vga->cursor_invalidate = ati_cursor_invalidate; in ati_vga_realize()
997 vga->cursor_draw_line = ati_cursor_draw_line; in ati_vga_realize()
1001 I2CBus *i2cbus = i2c_init_bus(DEVICE(s), "ati-vga.ddc"); in ati_vga_realize()
1002 bitbang_i2c_init(&s->bbi2c, i2cbus); in ati_vga_realize()
1008 memory_region_init_io(&s->mm, OBJECT(s), &ati_mm_ops, s, in ati_vga_realize()
1011 memory_region_init_alias(&s->io, OBJECT(s), "ati.io", &s->mm, 0, 0x100); in ati_vga_realize()
1013 pci_register_bar(dev, 0, PCI_BASE_ADDRESS_MEM_PREFETCH, &vga->vram); in ati_vga_realize()
1014 pci_register_bar(dev, 1, PCI_BASE_ADDRESS_SPACE_IO, &s->io); in ati_vga_realize()
1015 pci_register_bar(dev, 2, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mm); in ati_vga_realize()
1018 dev->config[PCI_INTERRUPT_PIN] = 1; in ati_vga_realize()
1019 timer_init_ns(&s->vblank_timer, QEMU_CLOCK_VIRTUAL, ati_vga_vblank_irq, s); in ati_vga_realize()
1024 ATIVGAState *s = ATI_VGA(dev); in ati_vga_reset() local
1026 timer_del(&s->vblank_timer); in ati_vga_reset()
1027 ati_vga_update_irq(s); in ati_vga_reset()
1030 vga_common_reset(&s->vga); in ati_vga_reset()
1031 s->mode = VGA_MODE; in ati_vga_reset()
1036 ATIVGAState *s = ATI_VGA(dev); in ati_vga_exit() local
1038 timer_del(&s->vblank_timer); in ati_vga_exit()
1039 graphic_console_close(s->vga.con); in ati_vga_exit()
1045 DEFINE_PROP_UINT16("x-device-id", ATIVGAState, dev_id,
1049 DEFINE_PROP_UINT8("x-pixman", ATIVGAState, use_pixman, DEFAULT_X_PIXMAN),
1060 dc->hotpluggable = false; in ati_vga_class_init()
1061 set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); in ati_vga_class_init()
1063 k->class_id = PCI_CLASS_DISPLAY_VGA; in ati_vga_class_init()
1064 k->vendor_id = PCI_VENDOR_ID_ATI; in ati_vga_class_init()
1065 k->device_id = PCI_DEVICE_ID_ATI_RAGE128_PF; in ati_vga_class_init()
1066 k->romfile = "vgabios-ati.bin"; in ati_vga_class_init()
1067 k->realize = ati_vga_realize; in ati_vga_class_init()
1068 k->exit = ati_vga_exit; in ati_vga_class_init()
1073 object_property_set_description(o, "x-pixman", "Use pixman for: " in ati_vga_init()