From d718b7475b188dd47c10b24f8d2c46326b37094a Mon Sep 17 00:00:00 2001 From: BALATON Zoltan Date: Thu, 20 Jun 2019 12:55:23 +0200 Subject: [PATCH 1/6] i2c: Move bitbang_i2c.h to include/hw/i2c/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The bitbang i2c implementation is also useful for other device models such as DDC in display controllers. Move the header to include/hw/i2c/ to allow it to be used from other device models and adjust users of this include. This also reverts commit 2b4c1125ac which is no longer needed. Signed-off-by: BALATON Zoltan Reviewed-by: Philippe Mathieu-Daudé Tested-by: Philippe Mathieu-Daudé Acked-by: Corey Minyard Message-id: 5d1fe4db846ab9be4b77ddb0d43cc74cd200a003.1561028123.git.balaton@eik.bme.hu Signed-off-by: Gerd Hoffmann --- hw/i2c/bitbang_i2c.c | 2 +- hw/i2c/ppc4xx_i2c.c | 1 - hw/i2c/versatile_i2c.c | 2 +- {hw => include/hw}/i2c/bitbang_i2c.h | 2 ++ include/hw/i2c/i2c.h | 2 -- include/hw/i2c/ppc4xx_i2c.h | 2 +- 6 files changed, 5 insertions(+), 6 deletions(-) rename {hw => include/hw}/i2c/bitbang_i2c.h (80%) diff --git a/hw/i2c/bitbang_i2c.c b/hw/i2c/bitbang_i2c.c index 5dfc72d9d7..3cb0509b02 100644 --- a/hw/i2c/bitbang_i2c.c +++ b/hw/i2c/bitbang_i2c.c @@ -12,7 +12,7 @@ #include "qemu/osdep.h" #include "hw/hw.h" -#include "bitbang_i2c.h" +#include "hw/i2c/bitbang_i2c.h" #include "hw/sysbus.h" #include "qemu/module.h" diff --git a/hw/i2c/ppc4xx_i2c.c b/hw/i2c/ppc4xx_i2c.c index d606d3dbeb..5fb4f86c38 100644 --- a/hw/i2c/ppc4xx_i2c.c +++ b/hw/i2c/ppc4xx_i2c.c @@ -30,7 +30,6 @@ #include "cpu.h" #include "hw/hw.h" #include "hw/i2c/ppc4xx_i2c.h" -#include "bitbang_i2c.h" #define PPC4xx_I2C_MEM_SIZE 18 diff --git a/hw/i2c/versatile_i2c.c b/hw/i2c/versatile_i2c.c index e07be9890c..24b6e36b6d 100644 --- a/hw/i2c/versatile_i2c.c +++ b/hw/i2c/versatile_i2c.c @@ -23,7 +23,7 @@ #include "qemu/osdep.h" #include "hw/sysbus.h" -#include "bitbang_i2c.h" +#include "hw/i2c/bitbang_i2c.h" #include "qemu/log.h" #include "qemu/module.h" diff --git a/hw/i2c/bitbang_i2c.h b/include/hw/i2c/bitbang_i2c.h similarity index 80% rename from hw/i2c/bitbang_i2c.h rename to include/hw/i2c/bitbang_i2c.h index 9443021710..3a7126d5de 100644 --- a/hw/i2c/bitbang_i2c.h +++ b/include/hw/i2c/bitbang_i2c.h @@ -3,6 +3,8 @@ #include "hw/i2c/i2c.h" +typedef struct bitbang_i2c_interface bitbang_i2c_interface; + #define BITBANG_I2C_SDA 0 #define BITBANG_I2C_SCL 1 diff --git a/include/hw/i2c/i2c.h b/include/hw/i2c/i2c.h index 8e236f7bb4..75c5bd638b 100644 --- a/include/hw/i2c/i2c.h +++ b/include/hw/i2c/i2c.h @@ -81,8 +81,6 @@ uint8_t i2c_recv(I2CBus *bus); DeviceState *i2c_create_slave(I2CBus *bus, const char *name, uint8_t addr); -typedef struct bitbang_i2c_interface bitbang_i2c_interface; - /* lm832x.c */ void lm832x_key_event(DeviceState *dev, int key, int state); diff --git a/include/hw/i2c/ppc4xx_i2c.h b/include/hw/i2c/ppc4xx_i2c.h index aa2a2bf9de..8437bf070b 100644 --- a/include/hw/i2c/ppc4xx_i2c.h +++ b/include/hw/i2c/ppc4xx_i2c.h @@ -28,7 +28,7 @@ #define PPC4XX_I2C_H #include "hw/sysbus.h" -#include "hw/i2c/i2c.h" +#include "hw/i2c/bitbang_i2c.h" #define TYPE_PPC4xx_I2C "ppc4xx-i2c" #define PPC4xx_I2C(obj) OBJECT_CHECK(PPC4xxI2CState, (obj), TYPE_PPC4xx_I2C) From c82c7336de58876862e6b4dccbda29e9240fd388 Mon Sep 17 00:00:00 2001 From: BALATON Zoltan Date: Thu, 20 Jun 2019 12:55:23 +0200 Subject: [PATCH 2/6] ati-vga: Implement DDC and EDID info from monitor This adds DDC support to ati-vga and connects i2c-ddc to it. This allows at least MacOS with an ATI ndrv, Linux radeonfb and MorphOS to get monitor EDID info (although MorphOS splash screen is not displayed and radeonfb needs additional tables from vgabios-rv100). Xorg needs additional support from VESA vgabios, it's missing INT10 0x4F15 function (see https://gitlab.freedesktop.org/xorg/xserver/blob/master/hw/xfree86/vbe/vbe.c) without which no DDC is available that also prevents loading the accelerated X driver. Signed-off-by: BALATON Zoltan Message-id: 046ddebb7ec8db48c4e877ee444ec1c41e385a74.1561028123.git.balaton@eik.bme.hu ati-vga: Clarify comment Signed-off-by: BALATON Zoltan Message-id: 20190620195213.C54127461AE@zero.eik.bme.hu ati-vga: Add DDC reg names for debug Signed-off-by: BALATON Zoltan Message-id: 20190621181459.2F8207462AA@zero.eik.bme.hu Signed-off-by: Gerd Hoffmann --- hw/display/Kconfig | 2 ++ hw/display/ati.c | 65 +++++++++++++++++++++++++++++++++++++++++-- hw/display/ati_dbg.c | 2 ++ hw/display/ati_int.h | 5 ++++ hw/display/ati_regs.h | 2 ++ 5 files changed, 74 insertions(+), 2 deletions(-) diff --git a/hw/display/Kconfig b/hw/display/Kconfig index 910dccb2f7..cbdf7b1a67 100644 --- a/hw/display/Kconfig +++ b/hw/display/Kconfig @@ -130,3 +130,5 @@ config ATI_VGA default y if PCI_DEVICES depends on PCI select VGA + select BITBANG_I2C + select DDC diff --git a/hw/display/ati.c b/hw/display/ati.c index 76595d9511..25d5077ba0 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -26,6 +26,7 @@ #include "qapi/error.h" #include "hw/hw.h" #include "ui/console.h" +#include "hw/display/i2c-ddc.h" #include "trace.h" #define ATI_DEBUG_HW_CURSOR 0 @@ -215,6 +216,24 @@ static void ati_cursor_draw_line(VGACommonState *vga, uint8_t *d, int scr_y) } } +static uint64_t ati_i2c(bitbang_i2c_interface *i2c, uint64_t data, int base) +{ + bool c = (data & BIT(base + 17) ? !!(data & BIT(base + 1)) : 1); + bool d = (data & BIT(base + 16) ? !!(data & BIT(base)) : 1); + + bitbang_i2c_set(i2c, BITBANG_I2C_SCL, c); + d = bitbang_i2c_set(i2c, BITBANG_I2C_SDA, d); + + data &= ~0xf00ULL; + if (c) { + data |= BIT(base + 9); + } + if (d) { + data |= BIT(base + 8); + } + return data; +} + static inline uint64_t ati_reg_read_offs(uint32_t reg, int offs, unsigned int size) { @@ -266,7 +285,16 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr, unsigned int size) case DAC_CNTL: val = s->regs.dac_cntl; break; -/* case GPIO_MONID: FIXME hook up DDC I2C here */ + case GPIO_VGA_DDC: + val = s->regs.gpio_vga_ddc; + break; + case GPIO_DVI_DDC: + val = s->regs.gpio_dvi_ddc; + break; + case GPIO_MONID ... GPIO_MONID + 3: + val = ati_reg_read_offs(s->regs.gpio_monid, + addr - GPIO_MONID, size); + break; case PALETTE_INDEX: /* FIXME unaligned access */ val = vga_ioport_read(&s->vga, VGA_PEL_IR) << 16; @@ -497,7 +525,33 @@ static void ati_mm_write(void *opaque, hwaddr addr, s->regs.dac_cntl = data & 0xffffe3ff; s->vga.dac_8bit = !!(data & DAC_8BIT_EN); break; -/* case GPIO_MONID: FIXME hook up DDC I2C here */ + case GPIO_VGA_DDC: + if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) { + /* FIXME: Maybe add a property to select VGA or DVI port? */ + } + break; + case GPIO_DVI_DDC: + if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) { + s->regs.gpio_dvi_ddc = ati_i2c(s->bbi2c, data, 0); + } + break; + case GPIO_MONID ... GPIO_MONID + 3: + /* FIXME What does Radeon have here? */ + if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { + ati_reg_write_offs(&s->regs.gpio_monid, + addr - GPIO_MONID, data, size); + /* + * Rage128p accesses DDC used to get EDID via these bits. + * Only touch i2c when write overlaps 3rd byte because some + * drivers access this reg via multiple partial writes and + * without this spurious bits would be sent. + */ + if ((s->regs.gpio_monid & BIT(25)) && + addr <= GPIO_MONID + 2 && addr + size > GPIO_MONID + 2) { + s->regs.gpio_monid = ati_i2c(s->bbi2c, s->regs.gpio_monid, 1); + } + } + break; case PALETTE_INDEX ... PALETTE_INDEX + 3: if (size == 4) { vga_ioport_write(&s->vga, VGA_PEL_IR, (data >> 16) & 0xff); @@ -788,6 +842,12 @@ static void ati_vga_realize(PCIDevice *dev, Error **errp) vga->cursor_draw_line = ati_cursor_draw_line; } + /* ddc, edid */ + I2CBus *i2cbus = i2c_init_bus(DEVICE(s), "ati-vga.ddc"); + s->bbi2c = bitbang_i2c_init(i2cbus); + I2CSlave *i2cddc = I2C_SLAVE(qdev_create(BUS(i2cbus), TYPE_I2CDDC)); + i2c_set_slave_address(i2cddc, 0x50); + /* mmio register space */ memory_region_init_io(&s->mm, OBJECT(s), &ati_mm_ops, s, "ati.mmregs", 0x4000); @@ -813,6 +873,7 @@ static void ati_vga_exit(PCIDevice *dev) ATIVGAState *s = ATI_VGA(dev); graphic_console_close(s->vga.con); + g_free(s->bbi2c); } static Property ati_vga_properties[] = { diff --git a/hw/display/ati_dbg.c b/hw/display/ati_dbg.c index b045f81d06..88b3a11315 100644 --- a/hw/display/ati_dbg.c +++ b/hw/display/ati_dbg.c @@ -19,6 +19,8 @@ static struct ati_regdesc ati_reg_names[] = { {"CRTC_GEN_CNTL", 0x0050}, {"CRTC_EXT_CNTL", 0x0054}, {"DAC_CNTL", 0x0058}, + {"GPIO_VGA_DDC", 0x0060}, + {"GPIO_DVI_DDC", 0x0064}, {"GPIO_MONID", 0x0068}, {"I2C_CNTL_1", 0x0094}, {"PALETTE_INDEX", 0x00b0}, diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h index 2f426064cf..51465f5630 100644 --- a/hw/display/ati_int.h +++ b/hw/display/ati_int.h @@ -10,6 +10,7 @@ #define ATI_INT_H #include "hw/pci/pci.h" +#include "hw/i2c/bitbang_i2c.h" #include "vga_int.h" /*#define DEBUG_ATI*/ @@ -35,6 +36,9 @@ typedef struct ATIVGARegs { uint32_t crtc_gen_cntl; uint32_t crtc_ext_cntl; uint32_t dac_cntl; + uint32_t gpio_vga_ddc; + uint32_t gpio_dvi_ddc; + uint32_t gpio_monid; uint32_t crtc_h_total_disp; uint32_t crtc_h_sync_strt_wid; uint32_t crtc_v_total_disp; @@ -83,6 +87,7 @@ typedef struct ATIVGAState { uint16_t cursor_size; uint32_t cursor_offset; QEMUCursor *cursor; + bitbang_i2c_interface *bbi2c; MemoryRegion io; MemoryRegion mm; ATIVGARegs regs; diff --git a/hw/display/ati_regs.h b/hw/display/ati_regs.h index 923bfd33ce..1ec3498b73 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -37,6 +37,8 @@ #define CRTC_GEN_CNTL 0x0050 #define CRTC_EXT_CNTL 0x0054 #define DAC_CNTL 0x0058 +#define GPIO_VGA_DDC 0x0060 +#define GPIO_DVI_DDC 0x0064 #define GPIO_MONID 0x0068 #define I2C_CNTL_1 0x0094 #define PALETTE_INDEX 0x00b0 From 866ad5f5ff620078f88183aa254f7b02727e6aa3 Mon Sep 17 00:00:00 2001 From: BALATON Zoltan Date: Mon, 24 Jun 2019 11:50:12 +0200 Subject: [PATCH 3/6] ati-vga: Fixes to offset and pitch registers Fix bit masks of registers for offset and pitch and also handle default values for both R128P and RV100. This improves picture a bit but does not resolve all problems yet so there might be some more bugs somewhere. Signed-off-by: BALATON Zoltan Message-id: 20190624100005.7A1CA746395@zero.eik.bme.hu Signed-off-by: Gerd Hoffmann --- hw/display/ati.c | 32 ++++++++++++++++++++++---------- hw/display/ati_2d.c | 26 ++++++++++++++++++-------- hw/display/ati_int.h | 1 + hw/display/ati_regs.h | 4 ++-- 4 files changed, 43 insertions(+), 20 deletions(-) diff --git a/hw/display/ati.c b/hw/display/ati.c index 25d5077ba0..e1bde5e0b1 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -419,9 +419,15 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr, unsigned int size) break; case DEFAULT_OFFSET: val = s->regs.default_offset; + if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) { + val >>= 10; + val |= s->regs.default_pitch << 16; + val |= s->regs.default_tile << 30; + } break; case DEFAULT_PITCH: val = s->regs.default_pitch; + val |= s->regs.default_tile << 16; break; case DEFAULT_SC_BOTTOM_RIGHT: val = s->regs.default_sc_bottom_right; @@ -682,22 +688,22 @@ static void ati_mm_write(void *opaque, hwaddr addr, break; case SRC_PITCH_OFFSET: if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { - s->regs.src_offset = (data & 0x1fffff) << 5; - s->regs.src_pitch = (data >> 21) & 0x3ff; + s->regs.src_offset = (data & 0x1fffff) << 4; + s->regs.src_pitch = (data & 0x7fe00000) >> 21; s->regs.src_tile = data >> 31; } else { - s->regs.src_offset = (data & 0x3fffff) << 11; + s->regs.src_offset = (data & 0x3fffff) << 10; s->regs.src_pitch = (data & 0x3fc00000) >> 16; s->regs.src_tile = (data >> 30) & 1; } break; case DST_PITCH_OFFSET: if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { - s->regs.dst_offset = (data & 0x1fffff) << 5; - s->regs.dst_pitch = (data >> 21) & 0x3ff; + s->regs.dst_offset = (data & 0x1fffff) << 4; + s->regs.dst_pitch = (data & 0x7fe00000) >> 21; s->regs.dst_tile = data >> 31; } else { - s->regs.dst_offset = (data & 0x3fffff) << 11; + s->regs.dst_offset = (data & 0x3fffff) << 10; s->regs.dst_pitch = (data & 0x3fc00000) >> 16; s->regs.dst_tile = data >> 30; } @@ -777,13 +783,19 @@ static void ati_mm_write(void *opaque, hwaddr addr, s->regs.dp_write_mask = data; break; case DEFAULT_OFFSET: - data &= (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF ? - 0x03fffc00 : 0xfffffc00); - s->regs.default_offset = data; + if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { + s->regs.default_offset = data & 0xfffffff0; + } else { + /* Radeon has DEFAULT_PITCH_OFFSET here like DST_PITCH_OFFSET */ + s->regs.default_offset = (data & 0x3fffff) << 10; + s->regs.default_pitch = (data & 0x3fc00000) >> 16; + s->regs.default_tile = data >> 30; + } break; case DEFAULT_PITCH: if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { - s->regs.default_pitch = data & 0x103ff; + s->regs.default_pitch = data & 0x3fff; + s->regs.default_tile = (data >> 16) & 1; } break; case DEFAULT_SC_BOTTOM_RIGHT: diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c index d83c29c6d9..2dbf53f039 100644 --- a/hw/display/ati_2d.c +++ b/hw/display/ati_2d.c @@ -51,8 +51,9 @@ void ati_2d_blt(ATIVGAState *s) s->vga.vbe_start_addr, surface_data(ds), surface_stride(ds), surface_bits_per_pixel(ds), (s->regs.dp_mix & GMC_ROP3_MASK) >> 16); - DPRINTF("%d %d, %d %d, (%d,%d) -> (%d,%d) %dx%d\n", s->regs.src_offset, - s->regs.dst_offset, s->regs.src_pitch, s->regs.dst_pitch, + DPRINTF("%d %d %d, %d %d %d, (%d,%d) -> (%d,%d) %dx%d\n", + s->regs.src_offset, s->regs.dst_offset, s->regs.default_offset, + s->regs.src_pitch, s->regs.dst_pitch, s->regs.default_pitch, s->regs.src_x, s->regs.src_y, s->regs.dst_x, s->regs.dst_y, s->regs.dst_width, s->regs.dst_height); switch (s->regs.dp_mix & GMC_ROP3_MASK) { @@ -60,10 +61,16 @@ void ati_2d_blt(ATIVGAState *s) { uint8_t *src_bits, *dst_bits, *end; int src_stride, dst_stride, bpp = ati_bpp_from_datatype(s); - src_bits = s->vga.vram_ptr + s->regs.src_offset; - dst_bits = s->vga.vram_ptr + s->regs.dst_offset; - src_stride = s->regs.src_pitch; - dst_stride = s->regs.dst_pitch; + src_bits = s->vga.vram_ptr + + (s->regs.dp_gui_master_cntl & GMC_SRC_PITCH_OFFSET_CNTL ? + s->regs.src_offset : s->regs.default_offset); + dst_bits = s->vga.vram_ptr + + (s->regs.dp_gui_master_cntl & GMC_DST_PITCH_OFFSET_CNTL ? + s->regs.dst_offset : s->regs.default_offset); + src_stride = (s->regs.dp_gui_master_cntl & GMC_SRC_PITCH_OFFSET_CNTL ? + s->regs.src_pitch : s->regs.default_pitch); + dst_stride = (s->regs.dp_gui_master_cntl & GMC_DST_PITCH_OFFSET_CNTL ? + s->regs.dst_pitch : s->regs.default_pitch); if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { src_bits += s->regs.crtc_offset & 0x07ffffff; @@ -111,8 +118,11 @@ void ati_2d_blt(ATIVGAState *s) uint8_t *dst_bits, *end; int dst_stride, bpp = ati_bpp_from_datatype(s); uint32_t filler = 0; - dst_bits = s->vga.vram_ptr + s->regs.dst_offset; - dst_stride = s->regs.dst_pitch; + dst_bits = s->vga.vram_ptr + + (s->regs.dp_gui_master_cntl & GMC_DST_PITCH_OFFSET_CNTL ? + s->regs.dst_offset : s->regs.default_offset); + dst_stride = (s->regs.dp_gui_master_cntl & GMC_DST_PITCH_OFFSET_CNTL ? + s->regs.dst_pitch : s->regs.default_pitch); if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { dst_bits += s->regs.crtc_offset & 0x07ffffff; diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h index 51465f5630..9b67d0022a 100644 --- a/hw/display/ati_int.h +++ b/hw/display/ati_int.h @@ -74,6 +74,7 @@ typedef struct ATIVGARegs { uint32_t dp_write_mask; uint32_t default_offset; uint32_t default_pitch; + uint32_t default_tile; uint32_t default_sc_bottom_right; } ATIVGARegs; diff --git a/hw/display/ati_regs.h b/hw/display/ati_regs.h index 1ec3498b73..d7155c93d5 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -370,8 +370,8 @@ #define BRUSH_SOLIDCOLOR 0x00000d00 /* DP_GUI_MASTER_CNTL bit constants */ -#define GMC_SRC_PITCH_OFFSET_DEFAULT 0x00000000 -#define GMC_DST_PITCH_OFFSET_DEFAULT 0x00000000 +#define GMC_SRC_PITCH_OFFSET_CNTL 0x00000001 +#define GMC_DST_PITCH_OFFSET_CNTL 0x00000002 #define GMC_SRC_CLIP_DEFAULT 0x00000000 #define GMC_DST_CLIP_DEFAULT 0x00000000 #define GMC_BRUSH_SOLIDCOLOR 0x000000d0 From 350ef09674da4005c3ed9688ba3c52aef4590359 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 20 Jun 2019 17:11:02 +0200 Subject: [PATCH 4/6] seabios: add config for ati vgabios Signed-off-by: Gerd Hoffmann Tested-by: BALATON Zoltan Message-id: 20190620151104.2678-2-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- roms/config.vga-ati | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 roms/config.vga-ati diff --git a/roms/config.vga-ati b/roms/config.vga-ati new file mode 100644 index 0000000000..12506b6644 --- /dev/null +++ b/roms/config.vga-ati @@ -0,0 +1,4 @@ +CONFIG_QEMU=y +CONFIG_BUILD_VGABIOS=y +CONFIG_VGA_ATI=y +CONFIG_VGA_PCI=y From 0cca7e7bfd6c81cc3c29ec2b3a0a98954c4ba71a Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 20 Jun 2019 17:11:03 +0200 Subject: [PATCH 5/6] seabios: add ati vgabios binary Built from master (commit 6e56ed129c9782ba050a5fbfbf4ac12335b230f7), which has ati vgabios support merged (checkout master branch in roms/seabios submodule, then run "make -C roms seavgabios-ati"). Temporary exception until the next seabios major version is released (probably 1.13, fall 2019). Signed-off-by: Gerd Hoffmann Tested-by: BALATON Zoltan Message-id: 20190620151104.2678-3-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- pc-bios/vgabios-ati.bin | Bin 0 -> 38912 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pc-bios/vgabios-ati.bin diff --git a/pc-bios/vgabios-ati.bin b/pc-bios/vgabios-ati.bin new file mode 100644 index 0000000000000000000000000000000000000000..79644708ff88014f127aad29b707bfc8e26aee06 GIT binary patch literal 38912 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 Date: Thu, 20 Jun 2019 17:11:04 +0200 Subject: [PATCH 6/6] ati-vga: switch to vgabios-ati.bin Signed-off-by: Gerd Hoffmann Tested-by: BALATON Zoltan Message-id: 20190620151104.2678-4-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- hw/display/ati.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/display/ati.c b/hw/display/ati.c index e1bde5e0b1..0cb1173848 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -910,7 +910,7 @@ static void ati_vga_class_init(ObjectClass *klass, void *data) k->class_id = PCI_CLASS_DISPLAY_VGA; k->vendor_id = PCI_VENDOR_ID_ATI; k->device_id = PCI_DEVICE_ID_ATI_RAGE128_PF; - k->romfile = "vgabios-stdvga.bin"; + k->romfile = "vgabios-ati.bin"; k->realize = ati_vga_realize; k->exit = ati_vga_exit; }