gets radeonfb going for me, on top of your i2c patches. --- hw/display/ati_int.h | 1 + hw/display/ati_regs.h | 1 + hw/display/ati.c | 35 +++++++++++++++++++++++++++-------- 3 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h index 3f4a06f1e1ed..7289db206cd2 100644 --- a/hw/display/ati_int.h +++ b/hw/display/ati_int.h @@ -38,6 +38,7 @@ typedef struct ATIVGARegs { 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; diff --git a/hw/display/ati_regs.h b/hw/display/ati_regs.h index 90384c886ecb..1ec3498b731c 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -38,6 +38,7 @@ #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 diff --git a/hw/display/ati.c b/hw/display/ati.c index e2efc6f2225e..ffced39aad9c 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -272,6 +272,9 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr, unsigned int size) 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: val = s->regs.gpio_monid; break; @@ -426,6 +429,22 @@ static inline void ati_reg_write_offs(uint32_t *reg, int offs, } } +static uint64_t ati_i2c(bitbang_i2c_interface *i2c, + uint64_t data) +{ + bool clk = !(data & BIT(17)); + bool out = !(data & BIT(16)); + bool in; + + bitbang_i2c_set(i2c, BITBANG_I2C_SCL, clk); + in = bitbang_i2c_set(i2c, BITBANG_I2C_SDA, out); + + data &= 0xf000f; + data |= clk ? BIT(9) : 0; + data |= in ? BIT(8) : 0; + return data; +} + static void ati_mm_write(void *opaque, hwaddr addr, uint64_t data, unsigned int size) { @@ -512,15 +531,15 @@ static void ati_mm_write(void *opaque, hwaddr addr, if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { break; } - s->regs.gpio_vga_ddc = data & 0xf000f; - if (data & BIT(17)) { - s->regs.gpio_monid |= !!(data & BIT(1)) << 9; - bitbang_i2c_set(s->bbi2c, BITBANG_I2C_SCL, (data & BIT(1)) != 0); - } - if (data & BIT(16)) { - s->regs.gpio_monid |= bitbang_i2c_set(s->bbi2c, BITBANG_I2C_SDA, - data & BIT(0)) << 8; +#if 0 + s->regs.gpio_vga_ddc = ati_i2c(s->bbi2c, data); +#endif + break; + case GPIO_DVI_DDC: + if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { + break; } + s->regs.gpio_dvi_ddc = ati_i2c(s->bbi2c, data); break; case GPIO_MONID: if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) { -- 2.18.1