Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp3688398imd; Mon, 29 Oct 2018 10:46:50 -0700 (PDT) X-Google-Smtp-Source: AJdET5eAtuwGWPtIVegSxtLNqn/GMhvXSMRs+DUNKA9h9OM7M6OhSYc/h5iDwNV464vDx2ocBELd X-Received: by 2002:a62:c60a:: with SMTP id m10-v6mr16292916pfg.15.1540835210058; Mon, 29 Oct 2018 10:46:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540835210; cv=none; d=google.com; s=arc-20160816; b=c5QsGrcMIPeD59J8hCoFeaWHL+p8pCQZ33SlSSo2FQ8pblq8UdzzwB88zfod34m6iY omxg9dNXB0n2fTZCcsl1iyLD2AbQmOMahS5w8MVQ96ve6SIZJ5Kr6e5Uqi0IL6avvBz4 D3LetkxGm2Y1xa6uMF6yggFCJHudRVVg+IK+ZIPrloR51nZ7URFiTQcFIWKnENjy3Phe 19GMR5bLRx8vpwIXecjln0IJx5m1YVnzFPOwdnP1+bIDV1oD+zEoFJCW+HV9cKVnN0sa CCGBvvoHbUkCc73spfx8Dc6/yr2CDgLUEBio91NzdqZrGOESChgVACA5WdgdjquMXolc 0WwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:references :organization:in-reply-to:subject:cc:to:from; bh=G5Dyxg1XtOp4+/LD4+BdN8Oc41ecgfol5YAUZ8auDjw=; b=OFihfA7YP2Y9Qs6b4eIn9NFIYyLtQ8HIAFw/9T0+ODld7JqBEAtIVOmuUbcx7knWHT BHcOwQiGi53+XJhne7t8W/8gVIEYKEQhBqc8vxEAqhueuEfvv25RqS7MLSf5JvPHR332 tLyGFkG0pFzrzodKjUT/epdtW7B/sYOgSDqKpSpHLz6Wh6FM3lZqqYpjYCE4QL8L4ooH u7Eni8KjPg9uPMs8m87zqT/LwllIJYgWJfBdUZ60MDktcTtk2g3hMnuFfmQWyM56IVFJ aqkWZzQHjnOsgpxsOe6fgQcG6GZiYmhiHtyTRd4v/mGH7LakKYURimOYjiMMZzZ2b3DS 8rXw== 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=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e193-v6si21082386pfc.131.2018.10.29.10.46.34; Mon, 29 Oct 2018 10:46:50 -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=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727773AbeJ3CeJ (ORCPT + 99 others); Mon, 29 Oct 2018 22:34:09 -0400 Received: from mga12.intel.com ([192.55.52.136]:19857 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726330AbeJ3CeJ (ORCPT ); Mon, 29 Oct 2018 22:34:09 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Oct 2018 10:44:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,441,1534834800"; d="scan'208";a="103514549" Received: from vmabille-mobl.ger.corp.intel.com (HELO localhost) ([10.252.39.241]) by fmsmga001.fm.intel.com with ESMTP; 29 Oct 2018 10:44:28 -0700 From: Jani Nikula To: Gerd Hoffmann , dri-devel@lists.freedesktop.org Cc: David Airlie , David Airlie , Gerd Hoffmann , open list , "open list\:DRM DRIVER FOR BOCHS VIRTUAL GPU" Subject: Re: [PATCH v3] drm/bochs: add edid support. In-Reply-To: <20181029134507.7775-1-kraxel@redhat.com> Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo References: <20181029134507.7775-1-kraxel@redhat.com> Date: Mon, 29 Oct 2018 19:44:28 +0200 Message-ID: <87in1kejgj.fsf@intel.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 29 Oct 2018, Gerd Hoffmann wrote: > 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. Any chance of making this use drm_get_edid() (requires an i2c_adapter) or at least drm_do_get_edid()? BR, Jani. > > 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); > + } > } -- Jani Nikula, Intel Open Source Graphics Center