lkml.org 
[lkml]   [2011]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[16/78] drm/i915: Replace vblank PM QoS with "Interrupt-Based AGPBUSY#"
    2.6.38-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Chris Wilson <chris@chris-wilson.co.uk>

    commit 8692d00e996ed2a6560702623e5cb646da0f9767 upstream.

    I stumbled over this magic bit in the gen3 INSTPM:

    Bit11 Interrupt-Based AGPBUSY# Enable:

    ‘0’ = Pending GMCH interrupts will not cause AGPBUSY# assertion.
    ‘1’ = Pending GMCH interrupts will cause AGPBUSY# assertion and hence
    can cause the CPU to exit C3. There is no suppression of cacheable
    writes.

    Note that in either case in C3 the interrupts are not lost. They will be
    forwarded to the ICH when the GMCH is out of C3.

    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
    Tested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/gpu/drm/i915/i915_irq.c | 9 +++++++++
    drivers/gpu/drm/i915/i915_reg.h | 5 ++++-
    2 files changed, 13 insertions(+), 1 deletion(-)

    --- a/drivers/gpu/drm/i915/i915_irq.c
    +++ b/drivers/gpu/drm/i915/i915_irq.c
    @@ -1377,7 +1377,12 @@ int i915_enable_vblank(struct drm_device
    else
    i915_enable_pipestat(dev_priv, pipe,
    PIPE_VBLANK_INTERRUPT_ENABLE);
    +
    + /* maintain vblank delivery even in deep C-states */
    + if (dev_priv->info->gen == 3)
    + I915_WRITE(INSTPM, INSTPM_AGPBUSY_DIS << 16);
    spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
    +
    return 0;
    }

    @@ -1390,6 +1395,10 @@ void i915_disable_vblank(struct drm_devi
    unsigned long irqflags;

    spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
    + if (dev_priv->info->gen == 3)
    + I915_WRITE(INSTPM,
    + INSTPM_AGPBUSY_DIS << 16 | INSTPM_AGPBUSY_DIS);
    +
    if (HAS_PCH_SPLIT(dev))
    ironlake_disable_display_irq(dev_priv, (pipe == 0) ?
    DE_PIPEA_VBLANK: DE_PIPEB_VBLANK);
    --- a/drivers/gpu/drm/i915/i915_reg.h
    +++ b/drivers/gpu/drm/i915/i915_reg.h
    @@ -405,9 +405,12 @@
    #define I915_ERROR_INSTRUCTION (1<<0)
    #define INSTPM 0x020c0
    #define INSTPM_SELF_EN (1<<12) /* 915GM only */
    +#define INSTPM_AGPBUSY_DIS (1<<11) /* gen3: when disabled, pending interrupts
    + will not assert AGPBUSY# and will only
    + be delivered when out of C3. */
    #define ACTHD 0x020c8
    #define FW_BLC 0x020d8
    -#define FW_BLC2 0x020dc
    +#define FW_BLC2 0x020dc
    #define FW_BLC_SELF 0x020e0 /* 915+ only */
    #define FW_BLC_SELF_EN_MASK (1<<31)
    #define FW_BLC_SELF_FIFO_MASK (1<<16) /* 945 only */

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2011-03-22 00:45    [W:4.117 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site