From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
To: Daniel Vetter <daniel@ffwll.ch>
Cc: Ander Conselvan de Oliveira
<ander.conselvan.de.oliveira@intel.com>,
intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 32/42] drm/i915: Calculate haswell plane workaround.
Date: Tue, 12 May 2015 16:05:24 +0200 [thread overview]
Message-ID: <555208A4.1060808@linux.intel.com> (raw)
In-Reply-To: <20150512094348.GN15256@phenom.ffwll.local>
Op 12-05-15 om 11:43 schreef Daniel Vetter:
> On Mon, May 11, 2015 at 04:25:08PM +0200, Maarten Lankhorst wrote:
>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>> ---
>> drivers/gpu/drm/i915/intel_display.c | 109 +++++++++++++++++++++++++----------
>> drivers/gpu/drm/i915/intel_drv.h | 2 +
>> 2 files changed, 81 insertions(+), 30 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
>> index 7bc78b49f9f4..7a79659dca00 100644
>> --- a/drivers/gpu/drm/i915/intel_display.c
>> +++ b/drivers/gpu/drm/i915/intel_display.c
>> @@ -4848,35 +4848,6 @@ static bool hsw_crtc_supports_ips(struct intel_crtc *crtc)
>> return HAS_IPS(crtc->base.dev) && crtc->pipe == PIPE_A;
>> }
>>
>> -/*
>> - * This implements the workaround described in the "notes" section of the mode
>> - * set sequence documentation. When going from no pipes or single pipe to
>> - * multiple pipes, and planes are enabled after the pipe, we need to wait at
>> - * least 2 vblanks on the first pipe before enabling planes on the second pipe.
>> - */
>> -static void haswell_mode_set_planes_workaround(struct intel_crtc *crtc)
>> -{
>> - struct drm_device *dev = crtc->base.dev;
>> - struct intel_crtc *crtc_it, *other_active_crtc = NULL;
>> -
>> - /* We want to get the other_active_crtc only if there's only 1 other
>> - * active crtc. */
>> - for_each_intel_crtc(dev, crtc_it) {
>> - if (!crtc_it->active || crtc_it == crtc)
>> - continue;
>> -
>> - if (other_active_crtc)
>> - return;
>> -
>> - other_active_crtc = crtc_it;
>> - }
>> - if (!other_active_crtc)
>> - return;
>> -
>> - intel_wait_for_vblank(dev, other_active_crtc->pipe);
>> - intel_wait_for_vblank(dev, other_active_crtc->pipe);
>> -}
>> -
>> static void haswell_crtc_enable(struct drm_crtc *crtc)
>> {
>> struct drm_device *dev = crtc->dev;
>> @@ -4967,7 +4938,10 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
>>
>> /* If we change the relative order between pipe/planes enabling, we need
>> * to change the workaround. */
>> - haswell_mode_set_planes_workaround(intel_crtc);
>> + if (pipe_config->hsw_workaround_pipe != INVALID_PIPE) {
>> + intel_wait_for_vblank(dev, pipe_config->hsw_workaround_pipe);
>> + intel_wait_for_vblank(dev, pipe_config->hsw_workaround_pipe);
>> + }
>> }
>>
>> static void ironlake_pfit_disable(struct intel_crtc *crtc)
>> @@ -12147,6 +12121,74 @@ done:
>> return ret;
>> }
>>
>> +/*
>> + * This implements the workaround described in the "notes" section of the mode
>> + * set sequence documentation. When going from no pipes or single pipe to
>> + * multiple pipes, and planes are enabled after the pipe, we need to wait at
>> + * least 2 vblanks on the first pipe before enabling planes on the second pipe.
>> + */
>> +static int haswell_mode_set_planes_workaround(struct drm_atomic_state *state)
>> +{
>> + struct drm_crtc *crtc;
>> + struct drm_crtc_state *crtc_state;
>> + struct intel_crtc_state *first_crtc_state = NULL, *other_crtc_state = NULL;
>> + struct intel_crtc *intel_crtc, *first_crtc = NULL, *enabled_crtc;
>> + int enabled_crtcs = 0, ret, i;
>> +
>> + for_each_crtc_in_state(state, crtc, crtc_state, i) {
>> + struct intel_crtc_state *pipe_config =
>> + to_intel_crtc_state(crtc_state);
>> +
>> + pipe_config->hsw_workaround_pipe = INVALID_PIPE;
> This kind of state resetting should be done in duplicate_state.
The v2 of this patch uses intel_crtc->atomic.hsw_workaround pipe, which would work better. :)
>> +
>> + if (!crtc_state->active)
>> + continue;
>> +
>> + if (!needs_modeset(crtc_state)) {
>> + enabled_crtcs++;
>> + enabled_crtc = to_intel_crtc(crtc);
>> + continue;
>> + }
>> +
>> + if (first_crtc) {
>> + other_crtc_state = pipe_config;
>> + break;
>> + }
>> + first_crtc = to_intel_crtc(crtc);
>> + first_crtc_state = pipe_config;
>> + }
>> +
>> + /* No workaround needed? */
>> + if (!first_crtc || enabled_crtcs > 1)
>> + return 0;
>> +
>> + for_each_intel_crtc(state->dev, intel_crtc) {
>> + if (state->crtcs[drm_crtc_index(&intel_crtc->base)])
>> + continue;
>> +
>> + ret = drm_modeset_lock(&intel_crtc->base.mutex,
>> + state->acquire_ctx);
>> + if (ret)
>> + return ret;
>> +
>> + if (!intel_crtc->base.state->active)
>> + continue;
> Imo just unconditionally acquire the crtc state, there' shouldn't be any
> harm in that (as long as we leave mode/active/planes_changed untouched).
Probably.
>> +
>> + /* 2 enabled crtcs means no need for w/a */
>> + if (++enabled_crtcs >= 2)
>> + return 0;
>> +
>> + enabled_crtc = intel_crtc;
>> + }
>> +
>> + if (enabled_crtcs == 1)
>> + first_crtc_state->hsw_workaround_pipe = enabled_crtc->pipe;
> first_crtc_state could be miscomputed if 1 crtc is already on and you add
> another one. Then first_crtc will point at the other crtc since that's the
> only one at first in the atomic set. Imo a simpler algo would be:
No, in that case enabled_crtcs != 0 and enabled_crtc is set to the correct crtc.
> 1. Check whether your activating any crtc at all.
> 2. If so add all crtc states.
> 3. Same loop as the old one, just using for_each_crtc_in_state.
>
> There's other cases with shared resources where we need to grab all crtc
> locks already anyway (shared dpll), trying to be clever doesn't seem
> beneficial. And if this indeed becomes a problem then we need a global
> state ww mutex and use that (instead of crtc locks) for this book-keeping:
> First enable crtc would set global_state->hsw_wa_pipe, 2nd and later would
> clear it. We might need this eventually (I've heard rumours about people
> not liking stalls when unplugging external screens that much), but let's
> not overcomplicate things while we do this conversion.
You would still need it when disabling crtc's then. To do it right you would need to keep crtc->active,
or use a crtc_mask, but that would be abused so I'd rather not. The crtc lock is also needed so the
other crtc's cannot be disabled or enabled while modesetting, but I guess always taking the
connector_mutex for that could work too.
~Maarten
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2015-05-12 14:07 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-11 14:24 [PATCH 00/42] drm/i915: Convert to atomic, part 2 Maarten Lankhorst
2015-05-11 14:24 ` [PATCH 01/42] drm/atomic: Allow drivers to subclass drm_atomic_state Maarten Lankhorst
2015-05-13 5:52 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 02/42] drm/i915: get rid of intel_crtc_disable and related code, v2 Maarten Lankhorst
2015-05-11 17:08 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 03/42] drm/i915: Only update required power domains Maarten Lankhorst
2015-05-11 17:00 ` Daniel Vetter
2015-05-12 12:05 ` Maarten Lankhorst
2015-05-12 13:13 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 04/42] drm/i915: use intel_crtc_control everywhere Maarten Lankhorst
2015-05-11 17:11 ` Daniel Vetter
2015-05-12 12:06 ` Maarten Lankhorst
2015-05-12 13:16 ` Daniel Vetter
2015-05-12 14:38 ` Daniel Stone
2015-05-11 14:24 ` [PATCH 05/42] drm/i915: Get rid of new_encoder Maarten Lankhorst
2015-05-11 17:17 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 06/42] drm/i915: get rid of new_crtc Maarten Lankhorst
2015-05-11 17:28 ` Daniel Vetter
2015-05-12 12:07 ` Maarten Lankhorst
2015-05-11 14:24 ` [PATCH 07/42] drm/i915: Get rid of crtc->new_enabled, v2 Maarten Lankhorst
2015-05-11 17:33 ` Daniel Vetter
2015-05-11 17:44 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 08/42] drm/i915: Implement intel_crtc_toggle using atomic state Maarten Lankhorst
2015-05-11 18:12 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 09/42] drm/i915: Make intel_modeset_fixup_state similar to the atomic helper Maarten Lankhorst
2015-05-12 6:59 ` Daniel Vetter
2015-05-12 12:41 ` Maarten Lankhorst
2015-05-12 13:18 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 10/42] drm/i915: make plane helpers fully atomic Maarten Lankhorst
2015-05-12 8:18 ` Daniel Vetter
2015-05-12 13:33 ` Maarten Lankhorst
2015-05-12 13:43 ` Ville Syrjälä
2015-05-12 13:46 ` Ville Syrjälä
2015-05-12 15:31 ` Daniel Vetter
2015-05-12 16:00 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 11/42] drm/i915: Update less state during modeset Maarten Lankhorst
2015-05-12 8:22 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 12/42] drm/i915: move swap_state to the right place Maarten Lankhorst
2015-05-12 8:25 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 13/42] drm/i915: Set mode_changed for audio in intel_modeset_pipe_config() Maarten Lankhorst
2015-05-11 14:24 ` [PATCH 14/42] drm/i915: Make __intel_set_mode() take only atomic state as argument Maarten Lankhorst
2015-05-11 14:24 ` [PATCH 15/42] drm/i915: Use hwmode for vblanks Maarten Lankhorst
2015-05-11 14:24 ` [PATCH 16/42] drm/i915: Remove usage of crtc->config from i915_debugfs.c Maarten Lankhorst
2015-05-12 8:51 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 17/42] drm/i915: Remove use of crtc->config from intel_pm.c Maarten Lankhorst
2015-05-12 8:54 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 18/42] drm/i915: Remove use of crtc->config from intel_audio.c Maarten Lankhorst
2015-05-11 14:24 ` [PATCH 19/42] drm/i915: remove use of crtc->config from intel_fbc.c Maarten Lankhorst
2015-05-11 14:24 ` [PATCH 20/42] drm/i915: remove use of crtc->config from intel_atomic.c and intel_sprite.c Maarten Lankhorst
2015-05-12 9:03 ` Daniel Vetter
2015-05-12 13:36 ` Maarten Lankhorst
2015-05-11 14:24 ` [PATCH 21/42] drm/i915: Remove use of crtc->config from intel_overlay.c Maarten Lankhorst
2015-05-12 9:06 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 22/42] drm/i915: Pass old state to crtc_disable and use it Maarten Lankhorst
2015-05-12 9:13 ` Daniel Vetter
2015-05-11 14:24 ` [PATCH 23/42] drm/i915: Pass old state to encoder->(post_)disable Maarten Lankhorst
2015-05-12 9:16 ` Daniel Vetter
2015-05-11 14:25 ` [PATCH 24/42] drm/i915: Remove use of crtc->config from intel_fbdev.c Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 25/42] drm/i915: Remove use of crtc->config from intel_psr.c Maarten Lankhorst
2015-05-12 9:20 ` Daniel Vetter
2015-05-12 13:41 ` Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 26/42] drm/i915: Remove use of crtc->config from intel_ddi.c Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 27/42] drm/i915: Remove use of crtc->config from intel_dp.c Maarten Lankhorst
2015-05-12 9:22 ` Daniel Vetter
2015-05-12 13:43 ` Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 28/42] drm/i915: Remove use of crtc->config from intel_dp_mst.c Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 29/42] drm/i915: Remove use of crtc->config from intel_dsi.c Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 30/42] drm/i915: Remove use of crtc->config in intel_hdmi.c Maarten Lankhorst
2015-05-12 9:26 ` Daniel Vetter
2015-05-11 14:25 ` [PATCH 31/42] drm/i915: Remove use of crtc->config in intel_sdvo.c Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 32/42] drm/i915: Calculate haswell plane workaround Maarten Lankhorst
2015-05-12 9:43 ` Daniel Vetter
2015-05-12 14:05 ` Maarten Lankhorst [this message]
2015-05-12 16:54 ` Daniel Vetter
2015-05-11 14:25 ` [PATCH 33/42] drm/i915: remove crtc->active tracking completely Maarten Lankhorst
2015-05-12 9:55 ` Daniel Vetter
2015-05-12 10:03 ` Daniel Vetter
2015-05-12 14:07 ` Maarten Lankhorst
2015-05-12 16:57 ` Daniel Vetter
2015-05-12 17:01 ` Daniel Stone
2015-05-12 17:08 ` Daniel Vetter
2015-05-11 14:25 ` [PATCH 34/42] drm/i915: get rid of crtc->config in intel_display.c, part 1 Maarten Lankhorst
2015-05-12 10:11 ` Daniel Vetter
2015-05-12 14:13 ` Maarten Lankhorst
2015-05-12 17:01 ` Daniel Vetter
2015-05-11 14:25 ` [PATCH 35/42] drm/i915: get rid of crtc->config in intel_display.c, part 2 Maarten Lankhorst
2015-05-12 10:17 ` Daniel Vetter
2015-05-11 14:25 ` [PATCH 36/42] drm/i915: get rid of crtc->config Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 37/42] drm/i915: swap state correctly in intel_atomic_commit Maarten Lankhorst
2015-05-12 13:03 ` Daniel Vetter
2015-05-12 14:16 ` Maarten Lankhorst
2015-05-12 17:03 ` Daniel Vetter
2015-05-11 14:25 ` [PATCH 38/42] drm/i915: Use global atomic state for staged pll config Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 39/42] drm/i915: Support modeset across multiple pipes Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 40/42] drm/i915: Move cdclk and pll setup to intel_modeset_compute_config() Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 41/42] drm/i915: Read hw state into an atomic state struct Maarten Lankhorst
2015-05-11 14:25 ` [PATCH 42/42] drm/i915: return early in __intel_set_mode_setup_plls without modeset Maarten Lankhorst
2015-05-13 7:04 ` [PATCH 00/42] drm/i915: Convert to atomic, part 2 Daniel Vetter
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=555208A4.1060808@linux.intel.com \
--to=maarten.lankhorst@linux.intel.com \
--cc=ander.conselvan.de.oliveira@intel.com \
--cc=daniel@ffwll.ch \
--cc=intel-gfx@lists.freedesktop.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox