[Intel-gfx] [PATCH 2/2] drm/i915: Add the support of memory self-refresh on Ironlake
Jesse Barnes
jbarnes at virtuousgeek.org
Mon Apr 12 19:50:56 CEST 2010
On Mon, 12 Apr 2010 10:43:04 -0400
Adam Jackson <ajax at redhat.com> wrote:
> 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.
We should probably add a comment about that. The chicken bits
generally control whether new features are enabled in hw, so-called
because the designers were too chicken to just enable them
unconditionally. :)
--
Jesse Barnes, Intel Open Source Technology Center
More information about the Intel-gfx
mailing list