public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
From: Mika Kuoppala <mika.kuoppala@linux.intel.com>
To: Michel Thierry <michel.thierry@intel.com>,
	intel-gfx@lists.freedesktop.org
Cc: deepak.s@intel.com
Subject: Re: [PATCH] drm/i915: Consider HW CSB write pointer before	resetting the sw read pointer
Date: Fri, 25 Sep 2015 18:44:34 +0300	[thread overview]
Message-ID: <87fv22a4gt.fsf@gaia.fi.intel.com> (raw)
In-Reply-To: <1443019430-20792-1-git-send-email-michel.thierry@intel.com>

Michel Thierry <michel.thierry@intel.com> writes:

> A previous commit resets the Context Status Buffer (CSB) read pointer in
> ring init
>     commit c0a03a2e4c4e ("drm/i915: Reset CSB read pointer in ring init")
>
> This is generally correct, but this pointer is not reset after
> suspend/resume in some platforms (cht). In this case, the driver should
> read the register value instead of resetting the sw read counter to 0.
> Otherwise we process old events, leading to unwanted pre-emptions or
> something worse.
>
> But in other platforms (bdw) and also during GPU reset or power up, the
> CSBWP is reset to 0x7 (an invalid number), and in this case the read
> pointer should be set to 0.
>
> Signed-off-by: Lei Shen <lei.shen@intel.com>
> Signed-off-by: Deepak S <deepak.s@intel.com>
> Signed-off-by: Michel Thierry <michel.thierry@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_lrc.c | 24 +++++++++++++++++++++++-
>  1 file changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index ff9a481..dd87812 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -1479,6 +1479,7 @@ static int gen8_init_common_ring(struct intel_engine_cs *ring)
>  {
>  	struct drm_device *dev = ring->dev;
>  	struct drm_i915_private *dev_priv = dev->dev_private;
> +	u8 next_context_status_buffer_hw;
>  
>  	lrc_setup_hardware_status_page(ring,
>  				ring->default_context->engine[ring->id].state);
> @@ -1496,7 +1497,28 @@ static int gen8_init_common_ring(struct intel_engine_cs *ring)
>  		   _MASKED_BIT_DISABLE(GFX_REPLAY_MODE) |
>  		   _MASKED_BIT_ENABLE(GFX_RUN_LIST_ENABLE));
>  	POSTING_READ(RING_MODE_GEN7(ring));
> -	ring->next_context_status_buffer = 0;
> +
> +	/*
> +	 * Instead of resetting the Context Status Buffer (CSB) read pointer to
> +	 * zero, we need to read the write pointer from hardware and use its
> +	 * value because "this register is power context save restored".
> +	 * Effectively, these states have been observed:
> +	 *
> +	 *      | Suspend-to-idle (freeze) | Suspend-to-RAM (mem) |
> +	 * BDW  | CSB regs not reset       | CSB regs reset       |
> +	 * CHT  | CSB regs not reset       | CSB regs not reset   |
> +	 */
> +	next_context_status_buffer_hw = I915_READ(RING_CONTEXT_STATUS_PTR(ring)) & 0x07;
> +
> +	/*
> +	 * When the CSB registers are reset (also after power-up / gpu reset),
> +	 * CSB write pointer is set to all 1's, which is not valid, use 0 in
> +	 * this special case.
> +	 */
> +	if (next_context_status_buffer_hw == 0x7)
> +		next_context_status_buffer_hw = 0;


If hardware has been reset and we have b111 here, I assume
the first write will be at index zero.

If we look at the interrupt code there is while (read_pointer <
write_pointer). Initializing next status buffer to zero
would mean that you miss the first write to csb[0].

If b111 is found, I think the correct value is 5.

-Mika


> +
> +	ring->next_context_status_buffer = next_context_status_buffer_hw;
>  	DRM_DEBUG_DRIVER("Execlists enabled for %s\n", ring->name);
>  
>  	memset(&ring->hangcheck, 0, sizeof(ring->hangcheck));
> -- 
> 2.5.3
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2015-09-25 15:45 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-23 14:43 [PATCH] drm/i915: Consider HW CSB write pointer before resetting the sw read pointer Michel Thierry
2015-09-25 15:44 ` Mika Kuoppala [this message]
2015-09-25 17:33   ` Michel Thierry
2015-09-28 12:25 ` [PATCH v2] " Michel Thierry
2015-09-28 13:17 ` [PATCH v3] " Michel Thierry
2015-09-28 14:00   ` Mika Kuoppala
2015-09-28 14:12     ` Daniel Vetter
2015-09-28 14:30       ` Jani Nikula
2015-09-28 13:49 ` [PATCH v2] " Michel Thierry

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=87fv22a4gt.fsf@gaia.fi.intel.com \
    --to=mika.kuoppala@linux.intel.com \
    --cc=deepak.s@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=michel.thierry@intel.com \
    /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