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 --- |