[Intel-gfx] [PATCH 02/14] drm/i915: DSL_LINEMASK is 12 bits only on gen2

Daniel Vetter daniel at ffwll.ch
Tue May 8 13:49:36 CEST 2012


On Fri, May 04, 2012 at 05:18:14PM -0300, Paulo Zanoni wrote:
> From: Paulo Zanoni <paulo.r.zanoni at intel.com>
> 
> Gen3+ is 13 bits (12:0), and on gen2 only 12 (11:0). For both the high
> bits are marked reserved, read-only so continue to mask them. Bit 31
> is not reserved and has a meaning.
> 
> Signed-off-by: Paulo Zanoni <paulo.r.zanoni at intel.com>
> Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
Queued for -next, thanks for the patch. While reading through the code
I've noticed that there are other places where we get this wrong. In the
crt load detect code we don't even bother with properly masking, and in
the precise vblank timestamp code we always use the gen3+ mask. That code
in addition doesn't properly handle the lack of the PIPEDSL register on
ilk+. Can I volunteer you to look into that?

Thanks, Daniel
> ---
>  drivers/gpu/drm/i915/i915_reg.h      |    3 ++-
>  drivers/gpu/drm/i915/intel_display.c |   11 ++++++++---
>  2 files changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 7bc407a..8da0b40 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -2475,7 +2475,8 @@
>  
>  /* Pipe A */
>  #define _PIPEADSL		0x70000
> -#define   DSL_LINEMASK		0x00000fff
> +#define   DSL_LINEMASK_GEN2	0x00000fff
> +#define   DSL_LINEMASK_GEN3	0x00001fff
>  #define _PIPEACONF		0x70008
>  #define   PIPECONF_ENABLE	(1<<31)
>  #define   PIPECONF_DISABLE	0
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index e1716be..613f871 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -871,15 +871,20 @@ void intel_wait_for_pipe_off(struct drm_device *dev, int pipe)
>  			     100))
>  			DRM_DEBUG_KMS("pipe_off wait timed out\n");
>  	} else {
> -		u32 last_line;
> +		u32 last_line, line_mask;
>  		int reg = PIPEDSL(pipe);
>  		unsigned long timeout = jiffies + msecs_to_jiffies(100);
>  
> +		if (IS_GEN2(dev))
> +			line_mask = DSL_LINEMASK_GEN2;
> +		else
> +			line_mask = DSL_LINEMASK_GEN3;
> +
>  		/* Wait for the display line to settle */
>  		do {
> -			last_line = I915_READ(reg) & DSL_LINEMASK;
> +			last_line = I915_READ(reg) & line_mask;
>  			mdelay(5);
> -		} while (((I915_READ(reg) & DSL_LINEMASK) != last_line) &&
> +		} while (((I915_READ(reg) & line_mask) != last_line) &&
>  			 time_after(timeout, jiffies));
>  		if (time_after(jiffies, timeout))
>  			DRM_DEBUG_KMS("pipe_off wait timed out\n");
> -- 
> 1.7.10
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Mail: daniel at ffwll.ch
Mobile: +41 (0)79 365 57 48



More information about the Intel-gfx mailing list