• Ben Widawsky's avatar
    drm/i915: make PM interrupt writes non-destructive · 4848405c
    Ben Widawsky authored
    PM interrupts have an expanded role on HSW. It helps route the EBOX
    interrupts. This patch is necessary to make the existing code which
    touches the mask, and enable registers more friendly to other code paths
    that also will need these registers.
    
    To be more explicit:
    At preinstall all interrupts are masked and disabled. This implies that
    preinstall should always happen before any enabling/disabling of RPS or
    other interrupts.
    
    The PMIMR is touched by the workqueue, so enable/disable touch IER and
    IIR. Similarly, the code currently expects IMR has no use outside of the
    RPS related interrupts so they unconditionally set 0, or ~0. We could
    use IER in the workqueue, and IMR elsewhere, but since the workqueue
    use-case is more transient the existing usage makes sense.
    
    Disable RPS events:
    IER := IER & ~GEN6_PM_RPS_EVENTS // Disable RPS related interrupts
    IIR := GEN6_PM_RPS_EVENTS // Disable any outstanding interrupts
    
    Enable RPS events:
    IER := IER | GEN6_PM_RPS_EVENTS // Enable the RPS related interrupts
    IIR := GEN6_PM_RPS_EVENTS // Make sure there were no leftover events
    (really shouldn't happen)
    
    v2: Shouldn't destroy PMIIR or PMIMR VEBOX interrupt state in
    enable/disable rps functions (Haihao)
    
    v3: Bug found by Chris where we were clearing the wrong bits at rps
    disable.
        expanded commit message
    
    v4: v3 was based off the wrong branch
    
    v5: Added the setting of PMIMR because of previous patch update
    
    CC: Chris Wilson <chris@chris-wilson.co.uk>
    Signed-off-by: default avatarBen Widawsky <ben@bwidawsk.net>
    Reviewed-by: default avatarDamien Lespiau <damien.lespiau@intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    4848405c
intel_pm.c 153 KB