Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp3876859imd; Mon, 29 Oct 2018 13:51:35 -0700 (PDT) X-Google-Smtp-Source: AJdET5fq7+Q6L0fdK6YlTVaxfaR70tw0ibPmTO6Qvx1iDkeV66tqAAhmgTGULg0jqKlVfke+Jf2L X-Received: by 2002:a65:620f:: with SMTP id d15-v6mr6351865pgv.120.1540846295784; Mon, 29 Oct 2018 13:51:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540846295; cv=none; d=google.com; s=arc-20160816; b=KLnsEkksVnhCOjChEdqa1r2NF98lD4G5BUjyedECi3teFiDakUfUaNC7tDUoczn8dE sH/wQMzpkFYj61jxtL1KU2h/L5zgS1LmE18XJhsb3wsDIJjLMzLfDQK3nTa2DtBAMdVx hcGXNNv/XAZ5yqfafHXNk2uu+GdcBLGE3T57SPWNNMumk+gkMn8JaOHDpGnBivXyvSco +zqaBSpFcsFb/cYwAm3fdUnv+SeJANpp79mN8ipoIwETAk5L6qPU/fVuGxdIclt/Watv aeOT9Jf/6+3lMPtc29WEtqcnj1IJnMpMw8Jn43mUfGNQ4SN0LZAV1netl2RBGazOzgdJ ixtQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=1X57x9/uYsMIQZammNXmtcNOh7/ZxS+EYeXjcJ4ygPc=; b=HzvrpjzOSyOehiAbSotqijc4rOyVqjZ+aIrb9o8plcX5LmDiiNXRGXfXgbKnhIInYr 25PETNKlg99gXzdDHfWHRpHKF4uossoilNF40YLdcTNk/DV/CYiETFC0rOd/xxLTpSQ4 ggiz6kGWHpDC1m6+WJTCQF6cUeQepLqtcjIi/sxKuxEzO/4l1cOynohphb/7vgNEsOwp TPWDoJTLfr0s3X0M0r4O/0vBhLRasAOy8NN7lD8I2a2/1Cdkm+WcEBq3JUKWLh/wS4GF 3VEWgbOhA5lUroiXDfKXpz41jpKFP99lwlocZNX8IYXL6GZ/oBAc/iV7f+JwpUMhKFBs 063Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f14-v6si21197821pgr.259.2018.10.29.13.51.19; Mon, 29 Oct 2018 13:51:35 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729417AbeJ3FlT (ORCPT + 99 others); Tue, 30 Oct 2018 01:41:19 -0400 Received: from mx1.redhat.com ([209.132.183.28]:45374 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726016AbeJ3FlT (ORCPT ); Tue, 30 Oct 2018 01:41:19 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 96AA830832DA; Mon, 29 Oct 2018 20:50:57 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-158.ams2.redhat.com [10.36.116.158]) by smtp.corp.redhat.com (Postfix) with ESMTP id 83D8819489; Mon, 29 Oct 2018 20:50:54 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 8D880B3DC7; Mon, 29 Oct 2018 21:50:53 +0100 (CET) From: Gerd Hoffmann To: dri-devel@lists.freedesktop.org Cc: David Airlie , jani.nikula@linux.intel.com, Gerd Hoffmann , David Airlie , virtualization@lists.linux-foundation.org (open list:DRM DRIVER FOR BOCHS VIRTUAL GPU), linux-kernel@vger.kernel.org (open list) Subject: [PATCH v4] drm/bochs: add edid support. Date: Mon, 29 Oct 2018 21:50:48 +0100 Message-Id: <20181029205048.13200-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Mon, 29 Oct 2018 20:50:57 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Recent qemu (latest master branch, upcoming 3.1 release) got support for EDID data. This patch adds guest driver support. EDID support in qemu is not (yet) enabled by default, so please use 'qemu -device VGA,edid=on' for testing. Signed-off-by: Gerd Hoffmann --- drivers/gpu/drm/bochs/bochs.h | 2 ++ drivers/gpu/drm/bochs/bochs_hw.c | 30 ++++++++++++++++++++++++++++++ drivers/gpu/drm/bochs/bochs_kms.c | 20 +++++++++++++++++--- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h index e7a69077e4..577a8b917c 100644 --- a/drivers/gpu/drm/bochs/bochs.h +++ b/drivers/gpu/drm/bochs/bochs.h @@ -66,6 +66,7 @@ struct bochs_device { u16 yres_virtual; u32 stride; u32 bpp; + struct edid *edid; /* drm */ struct drm_device *dev; @@ -126,6 +127,7 @@ void bochs_hw_setmode(struct bochs_device *bochs, const struct drm_format_info *format); void bochs_hw_setbase(struct bochs_device *bochs, int x, int y, u64 addr); +int bochs_hw_load_edid(struct bochs_device *bochs); /* bochs_mm.c */ int bochs_mm_init(struct bochs_device *bochs); diff --git a/drivers/gpu/drm/bochs/bochs_hw.c b/drivers/gpu/drm/bochs/bochs_hw.c index cacff73a64..c90a0d492f 100644 --- a/drivers/gpu/drm/bochs/bochs_hw.c +++ b/drivers/gpu/drm/bochs/bochs_hw.c @@ -69,6 +69,35 @@ static void bochs_hw_set_little_endian(struct bochs_device *bochs) #define bochs_hw_set_native_endian(_b) bochs_hw_set_little_endian(_b) #endif +static int bochs_get_edid_block(void *data, u8 *buf, + unsigned int block, size_t len) +{ + struct bochs_device *bochs = data; + size_t i, start = block * EDID_LENGTH; + + if (start + len > 0x400 /* vga register offset */) + return -1; + + for (i = 0; i < len; i++) { + buf[i] = readb(bochs->mmio + start + i); + } + return 0; +} + +int bochs_hw_load_edid(struct bochs_device *bochs) +{ + if (!bochs->mmio) + return -1; + + kfree(bochs->edid); + bochs->edid = drm_do_get_edid(&bochs->connector, + bochs_get_edid_block, bochs); + if (bochs->edid == NULL) + return -1; + + return 0; +} + int bochs_hw_init(struct drm_device *dev) { struct bochs_device *bochs = dev->dev_private; @@ -164,6 +193,7 @@ void bochs_hw_fini(struct drm_device *dev) if (bochs->fb_map) iounmap(bochs->fb_map); pci_release_regions(dev->pdev); + kfree(bochs->edid); } void bochs_hw_setmode(struct bochs_device *bochs, diff --git a/drivers/gpu/drm/bochs/bochs_kms.c b/drivers/gpu/drm/bochs/bochs_kms.c index 9bc5b438ae..f87c284dd9 100644 --- a/drivers/gpu/drm/bochs/bochs_kms.c +++ b/drivers/gpu/drm/bochs/bochs_kms.c @@ -213,10 +213,17 @@ static void bochs_encoder_init(struct drm_device *dev) static int bochs_connector_get_modes(struct drm_connector *connector) { - int count; + struct bochs_device *bochs = + container_of(connector, struct bochs_device, connector); + int count = 0; - count = drm_add_modes_noedid(connector, 8192, 8192); - drm_set_preferred_mode(connector, defx, defy); + if (bochs->edid) + count = drm_add_edid_modes(connector, bochs->edid); + + if (!count) { + count = drm_add_modes_noedid(connector, 8192, 8192); + drm_set_preferred_mode(connector, defx, defy); + } return count; } @@ -271,6 +278,13 @@ static void bochs_connector_init(struct drm_device *dev) drm_connector_helper_add(connector, &bochs_connector_connector_helper_funcs); drm_connector_register(connector); + + bochs_hw_load_edid(bochs); + if (bochs->edid) { + DRM_INFO("Found EDID data blob.\n"); + drm_connector_attach_edid_property(connector); + drm_connector_update_edid_property(connector, bochs->edid); + } } -- 2.9.3