[Intel-gfx] [PATCH 2/2] drm/i915: Add the support of memory self-refresh on Ironlake

Adam Jackson ajax at redhat.com
Mon Apr 12 16:43:04 CEST 2010


On Mon, 2010-04-12 at 17:09 +0800, Zhenyu Wang wrote:
> Update the self-refresh watermark for display plane/cursor and enable
> the memory self-refresh on Ironlake. The watermark is also updated for
> the active display plane.
> 
> More than 1W idle power is saved on one Ironlake laptop after enabling
> memory self-refresh.

Looks good at a quick read, though I haven't tested it yet.

> +	/* Calculate and update the watermark for plane A */
> +	if (planea_clock) {
> +		entries_required = ((planea_clock / 1000) * pixel_size *
> +				     ILK_LP0_PLANE_LATENCY) / 1000;
> +		entries_required = DIV_ROUND_UP(entries_required,
> +				   ironlake_display_wm_info.cacheline_size);
> +		planea_wm = entries_required +
> +			    ironlake_display_wm_info.guard_size;
> +
> +		if (planea_wm > (int)ironlake_display_wm_info.max_wm)
> +			planea_wm = ironlake_display_wm_info.max_wm;
> +
> +		cursora_wm = 16;
> +		reg_value = I915_READ(WM0_PIPEA_ILK);
> +		reg_value &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK);
> +		reg_value |= (planea_wm << WM0_PIPE_PLANE_SHIFT) |
> +			     (cursora_wm & WM0_PIPE_CURSOR_MASK);
> +		I915_WRITE(WM0_PIPEA_ILK, reg_value);
> +		DRM_DEBUG_KMS("FIFO watermarks For pipe A - plane %d, "
> +				"cursor: %d\n", planea_wm, cursora_wm);
> +	}

This doesn't adjust the video sprite plane watermark.  I suppose it
doesn't really matter, since we're not enabling it yet, but for clarity
I'd also mask off WM0_PIPE_SPRITE_MASK.

Also, the cursor watermark is a magic number.  I assume it's derived
from the hardware cursor size.  In which case, it'd be nice to show the
derivation; Ironlake can do hardware cursors up to 256x256, it'd be nice
to have that work automatically when and if we enable that in the
driver.

> +		/* configure watermark and enable self-refresh */
> +		reg_value = I915_READ(WM1_LP_ILK);
> +		reg_value &= ~(WM1_LP_LATENCY_MASK | WM1_LP_SR_MASK |
> +			       WM1_LP_CURSOR_MASK);
> +		reg_value |= WM1_LP_SR_EN |
> +			     (ilk_sr_latency << WM1_LP_LATENCY_SHIFT) |
> +			     (sr_wm << WM1_LP_SR_SHIFT) | cursor_wm;
> +
> +		I915_WRITE(WM1_LP_ILK, reg_value);
> +		DRM_DEBUG_KMS("self-refresh watermark: display plane %d "
> +				"cursor %d\n", sr_wm, cursor_wm);

What are the conditions for entering LP2 or LP3 state, and is it worth
trying to set them up too?

> +		/*
> +		 * According to the spec the following bits should be set in
> +		 * order to enable memory self-refresh
> +		 * The bit 22/21 of 0x42004
> +		 * The bit 5 of 0x42020
> +		 * The bit 15 of 0x45000
> +		 */
> +		if (IS_IRONLAKE(dev)) {
> +			I915_WRITE(ILK_DISPLAY_CHICKEN2,
> +					(I915_READ(ILK_DISPLAY_CHICKEN2) |
> +					ILK_DPARB_GATE | ILK_VSDPFD_FULL));

I can only hope this is named "chicken" in allusion to:

http://en.wikipedia.org/wiki/Chicken_(game)

I certainly can't find any reference to it in the documentation.

- ajax
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20100412/8ddf6b62/attachment.sig>


More information about the Intel-gfx mailing list