ati.c (0094908375d280c1a4e8b932d8b133a41fb3bdf8) ati.c (41742927ee37527462a13160380860653d4f1c84)
1/*
2 * QEMU ATI SVGA emulation
3 *
4 * Copyright (c) 2019 BALATON Zoltan
5 *
6 * This work is licensed under the GNU GPL license version 2 or later.
7 */
8

--- 524 unchanged lines hidden (view full) ---

533 break;
534 case GPIO_VGA_DDC:
535 if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) {
536 /* FIXME: Maybe add a property to select VGA or DVI port? */
537 }
538 break;
539 case GPIO_DVI_DDC:
540 if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) {
1/*
2 * QEMU ATI SVGA emulation
3 *
4 * Copyright (c) 2019 BALATON Zoltan
5 *
6 * This work is licensed under the GNU GPL license version 2 or later.
7 */
8

--- 524 unchanged lines hidden (view full) ---

533 break;
534 case GPIO_VGA_DDC:
535 if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) {
536 /* FIXME: Maybe add a property to select VGA or DVI port? */
537 }
538 break;
539 case GPIO_DVI_DDC:
540 if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) {
541 s->regs.gpio_dvi_ddc = ati_i2c(s->bbi2c, data, 0);
541 s->regs.gpio_dvi_ddc = ati_i2c(&s->bbi2c, data, 0);
542 }
543 break;
544 case GPIO_MONID ... GPIO_MONID + 3:
545 /* FIXME What does Radeon have here? */
546 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) {
547 ati_reg_write_offs(&s->regs.gpio_monid,
548 addr - GPIO_MONID, data, size);
549 /*
550 * Rage128p accesses DDC used to get EDID via these bits.
551 * Only touch i2c when write overlaps 3rd byte because some
552 * drivers access this reg via multiple partial writes and
553 * without this spurious bits would be sent.
554 */
555 if ((s->regs.gpio_monid & BIT(25)) &&
556 addr <= GPIO_MONID + 2 && addr + size > GPIO_MONID + 2) {
542 }
543 break;
544 case GPIO_MONID ... GPIO_MONID + 3:
545 /* FIXME What does Radeon have here? */
546 if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) {
547 ati_reg_write_offs(&s->regs.gpio_monid,
548 addr - GPIO_MONID, data, size);
549 /*
550 * Rage128p accesses DDC used to get EDID via these bits.
551 * Only touch i2c when write overlaps 3rd byte because some
552 * drivers access this reg via multiple partial writes and
553 * without this spurious bits would be sent.
554 */
555 if ((s->regs.gpio_monid & BIT(25)) &&
556 addr <= GPIO_MONID + 2 && addr + size > GPIO_MONID + 2) {
557 s->regs.gpio_monid = ati_i2c(s->bbi2c, s->regs.gpio_monid, 1);
557 s->regs.gpio_monid = ati_i2c(&s->bbi2c, s->regs.gpio_monid, 1);
558 }
559 }
560 break;
561 case PALETTE_INDEX ... PALETTE_INDEX + 3:
562 if (size == 4) {
563 vga_ioport_write(&s->vga, VGA_PEL_IR, (data >> 16) & 0xff);
564 vga_ioport_write(&s->vga, VGA_PEL_IW, data & 0xff);
565 } else {

--- 285 unchanged lines hidden (view full) ---

851 vga->con = graphic_console_init(DEVICE(s), 0, s->vga.hw_ops, &s->vga);
852 if (s->cursor_guest_mode) {
853 vga->cursor_invalidate = ati_cursor_invalidate;
854 vga->cursor_draw_line = ati_cursor_draw_line;
855 }
856
857 /* ddc, edid */
858 I2CBus *i2cbus = i2c_init_bus(DEVICE(s), "ati-vga.ddc");
558 }
559 }
560 break;
561 case PALETTE_INDEX ... PALETTE_INDEX + 3:
562 if (size == 4) {
563 vga_ioport_write(&s->vga, VGA_PEL_IR, (data >> 16) & 0xff);
564 vga_ioport_write(&s->vga, VGA_PEL_IW, data & 0xff);
565 } else {

--- 285 unchanged lines hidden (view full) ---

851 vga->con = graphic_console_init(DEVICE(s), 0, s->vga.hw_ops, &s->vga);
852 if (s->cursor_guest_mode) {
853 vga->cursor_invalidate = ati_cursor_invalidate;
854 vga->cursor_draw_line = ati_cursor_draw_line;
855 }
856
857 /* ddc, edid */
858 I2CBus *i2cbus = i2c_init_bus(DEVICE(s), "ati-vga.ddc");
859 s->bbi2c = bitbang_i2c_init(i2cbus);
859 bitbang_i2c_init(&s->bbi2c, i2cbus);
860 I2CSlave *i2cddc = I2C_SLAVE(qdev_create(BUS(i2cbus), TYPE_I2CDDC));
861 i2c_set_slave_address(i2cddc, 0x50);
862
863 /* mmio register space */
864 memory_region_init_io(&s->mm, OBJECT(s), &ati_mm_ops, s,
865 "ati.mmregs", 0x4000);
866 /* io space is alias to beginning of mmregs */
867 memory_region_init_alias(&s->io, OBJECT(s), "ati.io", &s->mm, 0, 0x100);

--- 12 unchanged lines hidden (view full) ---

880 s->mode = VGA_MODE;
881}
882
883static void ati_vga_exit(PCIDevice *dev)
884{
885 ATIVGAState *s = ATI_VGA(dev);
886
887 graphic_console_close(s->vga.con);
860 I2CSlave *i2cddc = I2C_SLAVE(qdev_create(BUS(i2cbus), TYPE_I2CDDC));
861 i2c_set_slave_address(i2cddc, 0x50);
862
863 /* mmio register space */
864 memory_region_init_io(&s->mm, OBJECT(s), &ati_mm_ops, s,
865 "ati.mmregs", 0x4000);
866 /* io space is alias to beginning of mmregs */
867 memory_region_init_alias(&s->io, OBJECT(s), "ati.io", &s->mm, 0, 0x100);

--- 12 unchanged lines hidden (view full) ---

880 s->mode = VGA_MODE;
881}
882
883static void ati_vga_exit(PCIDevice *dev)
884{
885 ATIVGAState *s = ATI_VGA(dev);
886
887 graphic_console_close(s->vga.con);
888 g_free(s->bbi2c);
889}
890
891static Property ati_vga_properties[] = {
892 DEFINE_PROP_UINT32("vgamem_mb", ATIVGAState, vga.vram_size_mb, 16),
893 DEFINE_PROP_STRING("model", ATIVGAState, model),
894 DEFINE_PROP_UINT16("x-device-id", ATIVGAState, dev_id,
895 PCI_DEVICE_ID_ATI_RAGE128_PF),
896 DEFINE_PROP_BOOL("guest_hwcursor", ATIVGAState, cursor_guest_mode, false),

--- 38 unchanged lines hidden ---
888}
889
890static Property ati_vga_properties[] = {
891 DEFINE_PROP_UINT32("vgamem_mb", ATIVGAState, vga.vram_size_mb, 16),
892 DEFINE_PROP_STRING("model", ATIVGAState, model),
893 DEFINE_PROP_UINT16("x-device-id", ATIVGAState, dev_id,
894 PCI_DEVICE_ID_ATI_RAGE128_PF),
895 DEFINE_PROP_BOOL("guest_hwcursor", ATIVGAState, cursor_guest_mode, false),

--- 38 unchanged lines hidden ---