Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp3409005imd; Mon, 29 Oct 2018 06:46:02 -0700 (PDT) X-Google-Smtp-Source: AJdET5eVXL3qvtWs8iMtTUoOv2het7J683w4jVZOTmPzZL1O4/tO2IUYhqm0fmSPhCMDWgp7SgEr X-Received: by 2002:a17:902:9896:: with SMTP id s22-v6mr14186111plp.113.1540820762029; Mon, 29 Oct 2018 06:46:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540820762; cv=none; d=google.com; s=arc-20160816; b=oCYw/Y1GceqTuGBqR7vTd6KEYhxMUXTbDUYVCiZvC1xUyomb5O999kiY7S4D2ZZiU5 JECvZ2wwUJx24G8I+n4/rH9n6JavHMNvWnAzPS5hU1q5i9LKNgGcwbq3XwXxKf5t1NyX X2YbZHEjZsoHwg/sBoeRkOygPC/Z6QLCYAfpmopRDmZ4nbu4outRUi84pHn5ATApddTa Kwwjs/uQF3JGBQbOyq4Vb+N4xZGei5U0SRoFnzpzEBu6GRfQIQzfhwP9qX/EfYsegqzx gAKqwFMReXV+jCaGW6fnIZF3bVrQMjLZIKE5bb0FjJZju2F+v+QdEBjcTA5YFqqE8qAa V8/g== 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=MxOsjj0T/q83NfNhwQFoU+s0IEDotLZFslh4vEUIf64=; b=jFU66A1z22COnuK13gTwyLzprHPxNDGnoDUim+pVATeQkRy4BeZjFlA9u+QMd7ibsj O+s47U/lIcvGJROBxDLsRDZtrRVdOUq3EEViejtVf+1BoOEZj27xFLXMhByVsjJSEQx/ WifDisTt/A902yu/NIaZPuEy9HWsqRomyQRNJnrhagvEQzv8KOlcEorYjyWFv1Rupq4B jp6A/2KuPXl9Mcq3T8ix6OsCDWVU6PrmiM3di2Tgtt4fMdjCo1B1Oqqs7280s7OJBMC+ JZTbR8lmhM7qP7jdQZEUmT3jXqXXr1xTEeBKY4KlLDbyI3pL5AUoeQkR1xhUi9tROnc5 ilAA== 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 w11-v6si20402959pgs.377.2018.10.29.06.45.46; Mon, 29 Oct 2018 06:46:01 -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 S1726126AbeJ2WeI (ORCPT + 99 others); Mon, 29 Oct 2018 18:34:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:15838 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725977AbeJ2WeI (ORCPT ); Mon, 29 Oct 2018 18:34:08 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0E714307EAB8; Mon, 29 Oct 2018 13:45:24 +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 746805EDEA; Mon, 29 Oct 2018 13:45:16 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id A22BDB3DC7; Mon, 29 Oct 2018 14:45:15 +0100 (CET) From: Gerd Hoffmann To: dri-devel@lists.freedesktop.org Cc: David Airlie , 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 v3] drm/bochs: add edid support. Date: Mon, 29 Oct 2018 14:45:07 +0100 Message-Id: <20181029134507.7775-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Mon, 29 Oct 2018 13:45:24 +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 | 1 + drivers/gpu/drm/bochs/bochs_hw.c | 39 +++++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/bochs/bochs_kms.c | 18 +++++++++++++++--- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h index e7a69077e4..06b8166efa 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; diff --git a/drivers/gpu/drm/bochs/bochs_hw.c b/drivers/gpu/drm/bochs/bochs_hw.c index cacff73a64..db4afe94c5 100644 --- a/drivers/gpu/drm/bochs/bochs_hw.c +++ b/drivers/gpu/drm/bochs/bochs_hw.c @@ -69,6 +69,41 @@ 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_load_edid(struct bochs_device *bochs) +{ + uint8_t *blob; + size_t i, len; + uint8_t num_exts; + + if (!bochs->mmio) + return -1; + + if ((readb(bochs->mmio+0) != 0x00 || + readb(bochs->mmio+1) != 0xff)) + return -1; + + num_exts = readb(bochs->mmio + 126); + len = EDID_LENGTH * (1 + num_exts); + if (len > 0x400 /* vga register offset */) + return -1; + + kfree(bochs->edid); + bochs->edid = kmalloc(len, GFP_KERNEL); + blob = (void *)bochs->edid; + for (i = 0; i < len; i++) { + blob[i] = readb(bochs->mmio+i); + } + + if (!drm_edid_is_valid(bochs->edid)) { + DRM_ERROR("EDID is not valid, ignoring.\n"); + kfree(bochs->edid); + bochs->edid = NULL; + return -1; + } + + return 0; +} + int bochs_hw_init(struct drm_device *dev) { struct bochs_device *bochs = dev->dev_private; @@ -150,6 +185,9 @@ int bochs_hw_init(struct drm_device *dev) } noext: + if (bochs_load_edid(bochs) == 0) + DRM_INFO("Found EDID data blob.\n"); + return 0; } @@ -164,6 +202,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..b9931443a7 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,11 @@ static void bochs_connector_init(struct drm_device *dev) drm_connector_helper_add(connector, &bochs_connector_connector_helper_funcs); drm_connector_register(connector); + + if (bochs->edid) { + drm_connector_attach_edid_property(connector); + drm_connector_update_edid_property(connector, bochs->edid); + } } -- 2.9.3