From patchwork Fri Mar 15 14:25:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: BALATON Zoltan X-Patchwork-Id: 1057102 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=eik.bme.hu Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 44LTPN1QDXz9s00 for ; Sat, 16 Mar 2019 02:04:06 +1100 (AEDT) Received: from localhost ([127.0.0.1]:56920 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h4oNP-0003n2-2T for incoming@patchwork.ozlabs.org; Fri, 15 Mar 2019 11:04:03 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50790) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h4o1E-00007h-DC for qemu-devel@nongnu.org; Fri, 15 Mar 2019 10:41:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h4nvs-0005S7-1w for qemu-devel@nongnu.org; Fri, 15 Mar 2019 10:35:36 -0400 Received: from zero.eik.bme.hu ([2001:738:2001:2001::2001]:24837) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h4nvr-0005Qb-Hx for qemu-devel@nongnu.org; Fri, 15 Mar 2019 10:35:35 -0400 Received: from zero.eik.bme.hu (blah.eik.bme.hu [152.66.115.182]) by localhost (Postfix) with SMTP id 7D51774660A; Fri, 15 Mar 2019 15:35:19 +0100 (CET) Received: by zero.eik.bme.hu (Postfix, from userid 432) id E7FC97465DB; Fri, 15 Mar 2019 15:35:18 +0100 (CET) Message-Id: <0b6c5527f75cd3a6668a15750516bfe24daff4e6.1552659955.git.balaton@eik.bme.hu> In-Reply-To: References: From: BALATON Zoltan Date: Fri, 15 Mar 2019 15:25:55 +0100 MIME-Version: 1.0 To: qemu-devel@nongnu.org X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2001:738:2001:2001::2001 Subject: [Qemu-devel] [PATCH v2 1/2] i2c: Move contents of bitbang_i2c.h to include/hw/i2c/i2c.h X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Corey Minyard , Gerd Hoffmann Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" The bitbang i2c implementation is also useful for other device models such as DDC in display controllers. Because of this, part of the file had to be moved to the main i2c.h to avoid a warning in commit 2b4c1125ac. Move the rest of the hw/i2c/bitbang_i2c.h to the main i2c.h now to allow it to be used from other device models. Signed-off-by: BALATON Zoltan --- hw/i2c/bitbang_i2c.c | 2 +- hw/i2c/bitbang_i2c.h | 12 ------------ hw/i2c/ppc4xx_i2c.c | 1 - hw/i2c/versatile_i2c.c | 2 +- include/hw/i2c/i2c.h | 7 +++++++ 5 files changed, 9 insertions(+), 15 deletions(-) delete mode 100644 hw/i2c/bitbang_i2c.h diff --git a/hw/i2c/bitbang_i2c.c b/hw/i2c/bitbang_i2c.c index 8be88ee265..a1fe3ac35c 100644 --- a/hw/i2c/bitbang_i2c.c +++ b/hw/i2c/bitbang_i2c.c @@ -11,7 +11,7 @@ */ #include "qemu/osdep.h" #include "hw/hw.h" -#include "bitbang_i2c.h" +#include "hw/i2c/i2c.h" #include "hw/sysbus.h" //#define DEBUG_BITBANG_I2C diff --git a/hw/i2c/bitbang_i2c.h b/hw/i2c/bitbang_i2c.h deleted file mode 100644 index 9443021710..0000000000 --- a/hw/i2c/bitbang_i2c.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef BITBANG_I2C_H -#define BITBANG_I2C_H - -#include "hw/i2c/i2c.h" - -#define BITBANG_I2C_SDA 0 -#define BITBANG_I2C_SCL 1 - -bitbang_i2c_interface *bitbang_i2c_init(I2CBus *bus); -int bitbang_i2c_set(bitbang_i2c_interface *i2c, int line, int level); - -#endif diff --git a/hw/i2c/ppc4xx_i2c.c b/hw/i2c/ppc4xx_i2c.c index d6dfafab31..a907d0194e 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 da9f298ee5..88f0b89f8d 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/i2c.h" #include "qemu/log.h" #define TYPE_VERSATILE_I2C "versatile_i2c" diff --git a/include/hw/i2c/i2c.h b/include/hw/i2c/i2c.h index 8e236f7bb4..fa102dde80 100644 --- a/include/hw/i2c/i2c.h +++ b/include/hw/i2c/i2c.h @@ -81,8 +81,15 @@ uint8_t i2c_recv(I2CBus *bus); DeviceState *i2c_create_slave(I2CBus *bus, const char *name, uint8_t addr); +/* generic bitbang i2c interface */ +#define BITBANG_I2C_SDA 0 +#define BITBANG_I2C_SCL 1 + typedef struct bitbang_i2c_interface bitbang_i2c_interface; +bitbang_i2c_interface *bitbang_i2c_init(I2CBus *bus); +int bitbang_i2c_set(bitbang_i2c_interface *i2c, int line, int level); + /* lm832x.c */ void lm832x_key_event(DeviceState *dev, int key, int state); From patchwork Fri Mar 15 14:25:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: BALATON Zoltan X-Patchwork-Id: 1057087 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=eik.bme.hu Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 44LSwX1F41z9s00 for ; Sat, 16 Mar 2019 01:42:26 +1100 (AEDT) Received: from localhost ([127.0.0.1]:56459 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h4o2R-0000ce-S6 for incoming@patchwork.ozlabs.org; Fri, 15 Mar 2019 10:42:23 -0400 Received: from eggs.gnu.org ([209.51.188.92]:50554) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h4o1E-0008Na-1A for qemu-devel@nongnu.org; Fri, 15 Mar 2019 10:41:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h4nvu-0005U0-2E for qemu-devel@nongnu.org; Fri, 15 Mar 2019 10:35:39 -0400 Received: from zero.eik.bme.hu ([152.66.115.2]:24839) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h4nvt-0005So-Gt for qemu-devel@nongnu.org; Fri, 15 Mar 2019 10:35:37 -0400 Received: from zero.eik.bme.hu (blah.eik.bme.hu [152.66.115.182]) by localhost (Postfix) with SMTP id 80174746612; Fri, 15 Mar 2019 15:35:26 +0100 (CET) Received: by zero.eik.bme.hu (Postfix, from userid 432) id EC8DA7465F7; Fri, 15 Mar 2019 15:35:18 +0100 (CET) Message-Id: <020ecaad3ea29327dc032b8919fc4dc50d3c489a.1552659955.git.balaton@eik.bme.hu> In-Reply-To: References: From: BALATON Zoltan Date: Fri, 15 Mar 2019 15:25:55 +0100 MIME-Version: 1.0 To: qemu-devel@nongnu.org X-detected-operating-system: by eggs.gnu.org: FreeBSD 9.x [fuzzy] X-Received-From: 152.66.115.2 Subject: [Qemu-devel] [PATCH v2 2/2] ati-vga: Implement DDC and EDID info from monitor X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Corey Minyard , Gerd Hoffmann Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" This adds DDC support to ati-vga and connects i2c-ddc to provide EDID info that is read by guests to find available screen modes. Not sure if this is 100% correct yet but at least MorphOS is happy with it and starts in a high resolution mode instead of 640x480 (although its splash screen is still not correct). Linux needs support from VESA vgabios, it seems to be 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 --- hw/display/Kconfig | 2 ++ hw/display/ati.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- hw/display/ati_int.h | 4 ++++ hw/display/ati_regs.h | 1 + 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/hw/display/Kconfig b/hw/display/Kconfig index 86c1d544c5..f8d65802a9 100644 --- a/hw/display/Kconfig +++ b/hw/display/Kconfig @@ -112,3 +112,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 8322f52aff..85cb11e9e1 100644 --- a/hw/display/ati.c +++ b/hw/display/ati.c @@ -24,6 +24,8 @@ #include "qapi/error.h" #include "hw/hw.h" #include "ui/console.h" +#include "hw/i2c/i2c.h" +#include "hw/i2c/i2c-ddc.h" #include "trace.h" #define ATI_DEBUG_HW_CURSOR 0 @@ -267,7 +269,12 @@ 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_DVI_DDC: + val = s->regs.gpio_dvi_ddc; + break; + case GPIO_MONID: + val = s->regs.gpio_monid; + break; case PALETTE_INDEX: /* FIXME unaligned access */ val = vga_ioport_read(&s->vga, VGA_PEL_IR) << 16; @@ -501,7 +508,34 @@ 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_DVI_DDC: + if (s->dev_id == PCI_DEVICE_ID_ATI_RAGE128_PF) { + break; + } + s->regs.gpio_dvi_ddc = data & 0xf000f; + if (data & BIT(17)) { + s->regs.gpio_dvi_ddc |= !!(data & BIT(1)) << 9; + bitbang_i2c_set(s->bbi2c, BITBANG_I2C_SCL, (data & BIT(1)) != 0); + } + if (data & BIT(16)) { + s->regs.gpio_dvi_ddc |= bitbang_i2c_set(s->bbi2c, BITBANG_I2C_SDA, + data & BIT(0)) << 8; + } + break; + case GPIO_MONID: + if (s->dev_id != PCI_DEVICE_ID_ATI_RAGE128_PF) { + break; /* FIXME What does Radeon have here? */ + } + s->regs.gpio_monid = data & 0x0f0f000f; + if (data & BIT(2) << 24) { + s->regs.gpio_monid |= !!(data & BIT(2)) << 10; + bitbang_i2c_set(s->bbi2c, BITBANG_I2C_SCL, (data & BIT(2)) != 0); + } + if (data & BIT(1) << 24) { + s->regs.gpio_monid |= bitbang_i2c_set(s->bbi2c, BITBANG_I2C_SDA, + (data & BIT(1)) != 0) << 9; + } + break; case PALETTE_INDEX ... PALETTE_INDEX + 3: if (size == 4) { vga_ioport_write(&s->vga, VGA_PEL_IR, (data >> 16) & 0xff); @@ -792,6 +826,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); diff --git a/hw/display/ati_int.h b/hw/display/ati_int.h index a6f3e20e63..43f7f79fb4 100644 --- a/hw/display/ati_int.h +++ b/hw/display/ati_int.h @@ -11,6 +11,7 @@ #include "qemu/osdep.h" #include "hw/pci/pci.h" +#include "hw/i2c/i2c.h" #include "vga_int.h" /*#define DEBUG_ATI*/ @@ -36,6 +37,8 @@ typedef struct ATIVGARegs { uint32_t crtc_gen_cntl; uint32_t crtc_ext_cntl; uint32_t dac_cntl; + 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; @@ -84,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..b9cd373862 100644 --- a/hw/display/ati_regs.h +++ b/hw/display/ati_regs.h @@ -37,6 +37,7 @@ #define CRTC_GEN_CNTL 0x0050 #define CRTC_EXT_CNTL 0x0054 #define DAC_CNTL 0x0058 +#define GPIO_DVI_DDC 0x0064 #define GPIO_MONID 0x0068 #define I2C_CNTL_1 0x0094 #define PALETTE_INDEX 0x00b0