• Imre Deak's avatar
    drm/i915: gmch: fix stuck primary plane due to memory self-refresh mode · 564ed191
    Imre Deak authored
    Blanking/unblanking the console in a loop on an Asus T100 sometimes
    leaves the console blank. After some digging I found that applying
    
    commit 61bc95c1
    Author: Egbert Eich <eich@suse.com>
    Date:   Mon Mar 4 09:24:38 2013 -0500
    
        DRM/i915: On G45 enable cursor plane briefly after enabling the display plane.
    
    fixed VLV too.
    
    In my case the problem seemed to happen already during the previous crtc
    disabling and went away if I disabled self-refresh mode before disabling
    the primary plane.
    
    The root cause for this is that updates from the shadow to live plane
    control register are blocked at vblank time if the memory self-refresh
    mode (aka max-fifo mode on VLV) is active at that moment. The controller
    checks at frame start time if the CPU is in C0 and the self-refresh mode
    enable bit is set and if so activates self-reresh mode, otherwise
    deactivates it. So to make sure that the plane truly gets disabled before
    pipe-off we have to:
    
    1. disable memory self-refresh mode
    2. disable plane
    3. wait for vblank
    4. disable pipe
    5. wait for pipe-off
    
    v2:
    - add explanation for the root cause from HW team (Cesar Mancini et al)
    - remove note about the CPU C7S state, in my latest tests disabling it
      alone didn't make a difference
    - add vblank between disabling plane and pipe (Ville)
    - apply the same workaround for all gmch platforms (Ville)
    Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
    Reviewed-by: default avatarVijay Purushothaman <vijay.a.purushothaman@intel.com>
    Reviewed-by: Deepak S<deepak.s@linux.intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    564ed191
intel_display.c 366 KB