From patchwork Tue Apr 17 23:44:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 10347071 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 7105560365 for ; Tue, 17 Apr 2018 23:44:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6046428306 for ; Tue, 17 Apr 2018 23:44:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 54DCD2837E; Tue, 17 Apr 2018 23:44:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 65C0C28306 for ; Tue, 17 Apr 2018 23:44:41 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1481C6E04E; Tue, 17 Apr 2018 23:44:40 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from fireflyinternet.com (mail.fireflyinternet.com [109.228.58.192]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8B7146E04E for ; Tue, 17 Apr 2018 23:44:38 +0000 (UTC) X-Default-Received-SPF: pass (skip=forwardok (res=PASS)) x-ip-name=78.156.65.138; Received: from localhost (unverified [78.156.65.138]) by fireflyinternet.com (Firefly Internet (M1)) with ESMTP (TLS) id 11404815-1500050 for multiple; Wed, 18 Apr 2018 00:44:33 +0100 MIME-Version: 1.0 To: =?utf-8?q?Jos=C3=A9_Roberto_de_Souza?= , intel-gfx@lists.freedesktop.org From: Chris Wilson In-Reply-To: <20180417223418.15046-1-jose.souza@intel.com> References: <20180417223418.15046-1-jose.souza@intel.com> Message-ID: <152400867086.27610.1519950270871479703@mail.alporthouse.com> User-Agent: alot/0.3.6 Date: Wed, 18 Apr 2018 00:44:30 +0100 Subject: Re: [Intel-gfx] [PATCH] drm/i915/fbdev: Enable late fbdev initial configuration X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Rodrigo@freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP Quoting José Roberto de Souza (2018-04-17 23:34:18) > If the initial fbdev configuration(intel_fbdev_initial_config()) runs and > there still no sink connected it will cause > drm_fb_helper_initial_config() to return 0 as no error happened(but > internally the return is -EAGAIN). > Because no framebuffer was allocated, when a sink is connected > intel_fbdev_output_poll_changed() will not execute > drm_fb_helper_hotplug_event() that would trigger another try to do the > initial fbdev configuration. > > So here creating a dummy framebuffer of 800x600, so > drm_fb_helper_hotplug_event() will be executed and fbdev can be properly > setup when a sink is connected, if needed the dummy framebuffer will be > freed and a new with the proper size will be allocated. > > This issue also happens when a MST DP sink is connected since boot, as > the MST topology is discovered in parallel if intel_fbdev_initial_config() > is executed before the first sink MST is discovered it will cause this > same issue. > > This is a follow up patch of > https://patchwork.freedesktop.org/patch/196089/ > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104158 > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104425 > Cc: Chris Wilson > Cc: Rodrigo Vivi > Signed-off-by: José Roberto de Souza > --- > drivers/gpu/drm/i915/intel_fbdev.c | 24 +++++++++++++++++++++++- > 1 file changed, 23 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c > index 7d41d139341b..773577d39782 100644 > --- a/drivers/gpu/drm/i915/intel_fbdev.c > +++ b/drivers/gpu/drm/i915/intel_fbdev.c > @@ -696,14 +696,36 @@ int intel_fbdev_init(struct drm_device *dev) > return 0; > } > > +static void intel_fbdev_dummy_fb_create(struct intel_fbdev *ifbdev) > +{ > + struct drm_fb_helper_surface_size sizes; > + > + sizes.fb_width = 800; > + sizes.fb_height = 600; > + sizes.surface_width = sizes.fb_width; > + sizes.surface_height = sizes.fb_height; > + sizes.surface_bpp = 32; > + sizes.surface_depth = 24; > + > + if (intelfb_create(&ifbdev->helper, &sizes)) > + DRM_ERROR("Unable to create dummy framebufer"); > +} > + > static void intel_fbdev_initial_config(void *data, async_cookie_t cookie) > { > struct intel_fbdev *ifbdev = data; > > /* Due to peculiar init order wrt to hpd handling this is separate. */ > if (drm_fb_helper_initial_config(&ifbdev->helper, > - ifbdev->preferred_bpp)) > + ifbdev->preferred_bpp)) { > intel_fbdev_unregister(to_i915(ifbdev->helper.dev)); > + return; > + } > + > + mutex_lock(&ifbdev->helper.lock); > + if (!ifbdev->vma) > + intel_fbdev_dummy_fb_create(ifbdev); > + mutex_unlock(&ifbdev->helper.lock); > } Did you try possible as of commit ca91a2758fcef6635626993557dd51cfbb6dd134 Author: Daniel Vetter Date: Thu Jul 6 15:00:21 2017 +0200 drm/fb-helper: Support deferred setup FB helper code falls back to a 1024x768 mode if no outputs are connected or don't report back any modes upon initialization. This can be annoying because outputs that are added to FB helper later on can't be used with FB helper if they don't support a matching mode. ... -Chris diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c index 65a3313723c9..4120c635742d 100644 --- a/drivers/gpu/drm/i915/intel_fbdev.c +++ b/drivers/gpu/drm/i915/intel_fbdev.c @@ -493,6 +493,7 @@ static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper, bail: DRM_DEBUG_KMS("Not using firmware configuration\n"); memcpy(enabled, save_enabled, count); + fb_helper->deferred_setup = true; ret = false; }