drm/i915: Fix primary plane offset on HSW
authorDamien Lespiau <damien.lespiau@intel.com>
Mon, 29 Oct 2012 12:14:21 +0000 (12:14 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Sun, 11 Nov 2012 22:51:01 +0000 (23:51 +0100)
Haswell consolidates DSP_TILEOFF and DSP_LINOFF into DSP_OFFSET (aka
PRI_OFFSET).

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_display.c

index 2dd880f2b4ae7ae9aac3e3e3d0e30a53f3679489..393f22bf43f28822518feb2777b9559b0cab0147 100644 (file)
 #define _DSPASIZE              0x70190
 #define _DSPASURF              0x7019C /* 965+ only */
 #define _DSPATILEOFF           0x701A4 /* 965+ only */
+#define _DSPAOFFSET            0x701A4 /* HSW */
 
 #define DSPCNTR(plane) _PIPE(plane, _DSPACNTR, _DSPBCNTR)
 #define DSPADDR(plane) _PIPE(plane, _DSPAADDR, _DSPBADDR)
 #define DSPSURF(plane) _PIPE(plane, _DSPASURF, _DSPBSURF)
 #define DSPTILEOFF(plane) _PIPE(plane, _DSPATILEOFF, _DSPBTILEOFF)
 #define DSPLINOFF(plane) DSPADDR(plane)
+#define DSPOFFSET(plane) _PIPE(plane, _DSPAOFFSET, _DSPBOFFSET)
 
 /* Display/Sprite base address macros */
 #define DISP_BASEADDR_MASK     (0xfffff000)
 #define _DSPBSIZE              0x71190
 #define _DSPBSURF              0x7119C
 #define _DSPBTILEOFF           0x711A4
+#define _DSPBOFFSET            0x711A4
 
 /* Sprite A control */
 #define _DVSACNTR              0x72180
index 4e7affd268eb60f12f7502504761d173e578ff54..5d9b6509c2722e3553244b504a20c69742a21e5c 100644 (file)
@@ -2128,8 +2128,12 @@ static int ironlake_update_plane(struct drm_crtc *crtc,
        I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]);
        I915_MODIFY_DISPBASE(DSPSURF(plane),
                             obj->gtt_offset + intel_crtc->dspaddr_offset);
-       I915_WRITE(DSPTILEOFF(plane), (y << 16) | x);
-       I915_WRITE(DSPLINOFF(plane), linear_offset);
+       if (IS_HASWELL(dev)) {
+               I915_WRITE(DSPOFFSET(plane), (y << 16) | x);
+       } else {
+               I915_WRITE(DSPTILEOFF(plane), (y << 16) | x);
+               I915_WRITE(DSPLINOFF(plane), linear_offset);
+       }
        POSTING_READ(reg);
 
        return 0;