From: Jani Nikula <jani.nikula@linux.intel.com>
To: Jesse Barnes <jbarnes@virtuousgeek.org>,
Lukas Wunner <lukas@wunner.de>,
dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org
Cc: Andreas Heider <andreas@meetr.de>,
Paul Hordiienko <pvt.gord@gmail.com>,
William Brown <william@blackhats.net.au>,
Bruno Bierbaumer <bruno@bierbaumer.net>,
Matthew Garrett <mjg59@coreos.com>,
Dave Airlie <airlied@redhat.com>
Subject: Re: [PATCH v2 12/22] drm/i915: Preserve SSC earlier
Date: Tue, 01 Sep 2015 09:46:37 +0300 [thread overview]
Message-ID: <87h9ne63hu.fsf@intel.com> (raw)
In-Reply-To: <55E4B7A4.4080100@virtuousgeek.org>
On Mon, 31 Aug 2015, Jesse Barnes <jbarnes@virtuousgeek.org> wrote:
> On 07/15/2015 04:57 AM, Lukas Wunner wrote:
>> Commit 92122789b2d6 ("drm/i915: preserve SSC if previously set v3")
>> added code to intel_modeset_gem_init to override the SSC status read
>> from VBT with the SSC status set by BIOS.
>>
>> However, intel_modeset_gem_init is invoked *after* intel_modeset_init,
>> which calls intel_setup_outputs, which *modifies* SSC status by way of
>> intel_init_pch_refclk. So unlike advertised, intel_modeset_gem_init
>> doesn't preserve the SSC status set by BIOS but whatever
>> intel_init_pch_refclk decided on.
>>
>> This is a problem on dual gpu laptops such as the MacBook Pro which
>> require either a handler to switch DDC lines, or the discrete gpu
>> to proxy DDC/AUX communication: Both the handler and the discrete
>> gpu may initialize after the i915 driver, and consequently, an LVDS
>> connector may initially seem disconnected and the SSC therefore
>> is disabled by intel_init_pch_refclk, but on reprobe the connector
>> may turn out to be connected and the SSC must then be enabled.
>>
>> Due to 92122789b2d6 however, the SSC is not enabled on reprobe since
>> it is assumed BIOS disabled it while in fact it was disabled by
>> intel_init_pch_refclk.
>>
>> Also, because the SSC status is preserved so late, the preserved value
>> only ever gets used on resume but not on panel initialization:
>> intel_modeset_init calls intel_init_display which indirectly calls
>> intel_panel_use_ssc via multiple subroutines, *before* the BIOS value
>> overrides the VBT value in intel_modeset_gem_init (intel_panel_use_ssc
>> is the sole user of dev_priv->vbt.lvds_use_ssc).
>>
>> Fix this by moving the code introduced by 92122789b2d6 from
>> intel_modeset_gem_init to intel_modeset_init before the invocation
>> of intel_setup_outputs and intel_init_display.
>>
>> Add a DRM_DEBUG_KMS as suggested way back by Jani:
>> http://lists.freedesktop.org/archives/intel-gfx/2014-June/046666.html
>>
>> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=88861
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=61115
>> Tested-by: Paul Hordiienko <pvt.gord@gmail.com>
>> [MBP 6,2 2010 intel ILK + nvidia GT216 pre-retina]
>> Tested-by: William Brown <william@blackhats.net.au>
>> [MBP 8,2 2011 intel SNB + amd turks pre-retina]
>> Tested-by: Lukas Wunner <lukas@wunner.de>
>> [MBP 9,1 2012 intel IVB + nvidia GK107 pre-retina]
>> Tested-by: Bruno Bierbaumer <bruno@bierbaumer.net>
>> [MBP 11,3 2013 intel HSW + nvidia GK107 retina -- work in progress]
>>
>> Fixes: 92122789b2d6 ("drm/i915: preserve SSC if previously set v3")
>> Signed-off-by: Lukas Wunner <lukas@wunner.de>
>> ---
>> drivers/gpu/drm/i915/intel_display.c | 29 ++++++++++++++++++-----------
>> 1 file changed, 18 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
>> index af0bcfe..6335883 100644
>> --- a/drivers/gpu/drm/i915/intel_display.c
>> +++ b/drivers/gpu/drm/i915/intel_display.c
>> @@ -14893,6 +14893,24 @@ void intel_modeset_init(struct drm_device *dev)
>> if (INTEL_INFO(dev)->num_pipes == 0)
>> return;
>>
>> + /*
>> + * There may be no VBT; and if the BIOS enabled SSC we can
>> + * just keep using it to avoid unnecessary flicker. Whereas if the
>> + * BIOS isn't using it, don't assume it will work even if the VBT
>> + * indicates as much.
>> + */
>> + if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)) {
>> + bool bios_lvds_use_ssc = !!(I915_READ(PCH_DREF_CONTROL) &
>> + DREF_SSC1_ENABLE);
>> +
>> + if (dev_priv->vbt.lvds_use_ssc != bios_lvds_use_ssc) {
>> + DRM_DEBUG_KMS("SSC %sabled by BIOS, overriding VBT which says %sabled\n",
>> + bios_lvds_use_ssc ? "en" : "dis",
>> + dev_priv->vbt.lvds_use_ssc ? "en" : "dis");
>> + dev_priv->vbt.lvds_use_ssc = bios_lvds_use_ssc;
>> + }
>> + }
>> +
>> intel_init_display(dev);
>> intel_init_audio(dev);
>>
>> @@ -15446,7 +15464,6 @@ err:
>>
>> void intel_modeset_gem_init(struct drm_device *dev)
>> {
>> - struct drm_i915_private *dev_priv = dev->dev_private;
>> struct drm_crtc *c;
>> struct drm_i915_gem_object *obj;
>> int ret;
>> @@ -15455,16 +15472,6 @@ void intel_modeset_gem_init(struct drm_device *dev)
>> intel_init_gt_powersave(dev);
>> mutex_unlock(&dev->struct_mutex);
>>
>> - /*
>> - * There may be no VBT; and if the BIOS enabled SSC we can
>> - * just keep using it to avoid unnecessary flicker. Whereas if the
>> - * BIOS isn't using it, don't assume it will work even if the VBT
>> - * indicates as much.
>> - */
>> - if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
>> - dev_priv->vbt.lvds_use_ssc = !!(I915_READ(PCH_DREF_CONTROL) &
>> - DREF_SSC1_ENABLE);
>> -
>> intel_modeset_init_hw(dev);
>>
>> intel_setup_overlay(dev);
>>
>
> Yeah looks good (and I'm having deja vu here; I thought I ran into the same ordering issue at one point in a report from krh, but I guess I never fixed it; didn't have test hw at the time).
>
> Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Pushed this one patch to drm-intel-next-fixes, thanks for the patch and
review.
BR,
Jani.
>
> Thanks,
> Jesse
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2015-09-01 6:46 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-11 10:29 [PATCH v2 00/22] Enable gpu switching on the MacBook Pro Lukas Wunner
2012-09-07 15:22 ` [PATCH v2 01/22] vga_switcheroo: Add support for switching only the DDC Lukas Wunner
2012-09-07 15:22 ` [PATCH v2 02/22] vga_switcheroo: Add helper function to get the active client Lukas Wunner
2012-09-07 15:22 ` [PATCH v2 03/22] apple-gmux: Add switch_ddc support Lukas Wunner
2012-09-07 15:22 ` [PATCH v2 04/22] drm/edid: Switch DDC when reading the EDID Lukas Wunner
2012-12-22 2:52 ` [PATCH v2 05/22] vga_switcheroo: Lock/unlock DDC lines Lukas Wunner
2015-03-27 11:29 ` [PATCH v2 06/22] vga_switcheroo: Lock/unlock DDC lines harder Lukas Wunner
2015-04-21 8:39 ` [PATCH v2 07/22] Revert "vga_switcheroo: Add helper function to get the active client" Lukas Wunner
2015-08-02 9:06 ` [PATCH v2 08/22] Revert "vga_switcheroo: add reprobe hook for fbcon to recheck connected outputs." Lukas Wunner
2015-05-09 15:20 ` [PATCH v2 09/22] drm/nouveau: Lock/unlock DDC lines on probe Lukas Wunner
2014-03-05 22:34 ` [PATCH v2 10/22] apple-gmux: Assign apple_gmux_data before registering Lukas Wunner
2015-04-20 10:08 ` [PATCH v2 11/22] vga_switcheroo: Generate hotplug event on handler and proxy registration Lukas Wunner
2015-07-15 11:57 ` [PATCH v2 12/22] drm/i915: Preserve SSC earlier Lukas Wunner
2015-04-19 15:01 ` [PATCH v2 13/22] drm/i915: Reprobe eDP and LVDS connectors on hotplug event Lukas Wunner
2015-06-30 9:06 ` [PATCH v2 14/22 RESEND] drm/i915: Fix failure paths around initial fbdev allocation Lukas Wunner
2015-07-04 9:50 ` [PATCH v2 15/22 RESEND] drm/i915: On fb alloc failure, unref gem object where it gets refed Lukas Wunner
2015-05-25 13:15 ` [PATCH v2 16/22] drm: Create new fb and replace default 1024x768 fb on hotplug event Lukas Wunner
[not found] ` <afe73d5a7382f85c9bdbfc46197a52c4278c99c7.1439288957.git.lukas-JFq808J9C/izQB+pC5nmwQ@public.gmane.org>
2015-07-23 10:59 ` [PATCH v2 17/22] drm/nouveau/timer: Fall back to kernel timer if GPU timer read failed Lukas Wunner
2015-07-29 19:23 ` [PATCH v2 18/22 EXPERIMENTAL] vga_switcheroo: Allow using active client as proxy when reading DDC/AUX Lukas Wunner
2015-05-13 19:50 ` [PATCH v2 19/22 EXPERIMENTAL] drm: Amend struct drm_dp_aux with connector attribute Lukas Wunner
2015-05-06 12:06 ` [PATCH v2 20/22 EXPERIMENTAL] drm: Use vga_switcheroo active client as proxy when reading DDC/AUX Lukas Wunner
2015-07-30 11:31 ` [PATCH v2 21/22 EXPERIMENTAL] drm/nouveau/i2c: " Lukas Wunner
2015-06-07 9:20 ` [PATCH v2 22/22 EXPERIMENTAL] drm/nouveau: Use vga_switcheroo active client as proxy when probing DDC on LVDS Lukas Wunner
2015-08-31 20:23 ` [PATCH v2 12/22] drm/i915: Preserve SSC earlier Jesse Barnes
2015-09-01 6:46 ` Jani Nikula [this message]
2015-08-12 14:25 ` [PATCH v2 07/22] Revert "vga_switcheroo: Add helper function to get the active client" Daniel Vetter
2015-08-12 17:34 ` Lukas Wunner
2015-08-12 21:10 ` Daniel Vetter
2015-08-12 14:23 ` [PATCH v2 06/22] vga_switcheroo: Lock/unlock DDC lines harder Daniel Vetter
[not found] ` <cover.1439288957.git.lukas-JFq808J9C/izQB+pC5nmwQ@public.gmane.org>
2015-08-12 14:16 ` [Intel-gfx] [PATCH v2 00/22] Enable gpu switching on the MacBook Pro Daniel Vetter
2015-08-12 23:37 ` Lukas Wunner
[not found] ` <20150812233711.GA6002-JFq808J9C/izQB+pC5nmwQ@public.gmane.org>
2015-08-13 6:50 ` [Intel-gfx] " Daniel Vetter
2015-08-16 19:10 ` Lukas Wunner
2015-08-25 7:36 ` Lukas Wunner
2015-08-25 8:21 ` Daniel Vetter
2015-08-26 14:01 ` Lukas Wunner
2015-08-29 14:15 ` Lukas Wunner
2015-08-31 19:15 ` Jani Nikula
2015-09-01 6:48 ` Jani Nikula
2015-09-04 14:00 ` Lukas Wunner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87h9ne63hu.fsf@intel.com \
--to=jani.nikula@linux.intel.com \
--cc=airlied@redhat.com \
--cc=andreas@meetr.de \
--cc=bruno@bierbaumer.net \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=jbarnes@virtuousgeek.org \
--cc=lukas@wunner.de \
--cc=mjg59@coreos.com \
--cc=pvt.gord@gmail.com \
--cc=william@blackhats.net.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.