diff options
| author | Armin Reese <armin.c.reese@intel.com> | 2012-03-30 19:20:16 -0400 |
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-04-17 11:54:51 -0400 |
| commit | 446f254566ea8911c9e19c7bc8a162fc0e53cf31 (patch) | |
| tree | 22c60cf8cf85a7e87676780faeca086dafbb2596 | |
| parent | 83de97c885b633ab6d12346a406911fadeb85f8c (diff) | |
drm/i915: Mask reserved bits in display/sprite address registers
The purpose of this patch is to avoid zeroing the lower 12 reserved bits
of surface base address registers (framebuffer & sprite). There are bits
in that range that may occasionally be set by BIOS or by other components.
Signed-off-by: Armin Reese <armin.c.reese@intel.com>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sprite.c | 8 |
4 files changed, 15 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 967b92eaf797..ab023ca73b45 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -1368,7 +1368,8 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe) | |||
| 1368 | obj = work->pending_flip_obj; | 1368 | obj = work->pending_flip_obj; |
| 1369 | if (INTEL_INFO(dev)->gen >= 4) { | 1369 | if (INTEL_INFO(dev)->gen >= 4) { |
| 1370 | int dspsurf = DSPSURF(intel_crtc->plane); | 1370 | int dspsurf = DSPSURF(intel_crtc->plane); |
| 1371 | stall_detected = I915_READ(dspsurf) == obj->gtt_offset; | 1371 | stall_detected = I915_HI_DISPBASE(I915_READ(dspsurf)) == |
| 1372 | obj->gtt_offset; | ||
| 1372 | } else { | 1373 | } else { |
| 1373 | int dspaddr = DSPADDR(intel_crtc->plane); | 1374 | int dspaddr = DSPADDR(intel_crtc->plane); |
| 1374 | stall_detected = I915_READ(dspaddr) == (obj->gtt_offset + | 1375 | stall_detected = I915_READ(dspaddr) == (obj->gtt_offset + |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 0668815d05d7..d093dba8224b 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -2869,6 +2869,13 @@ | |||
| 2869 | #define DSPSURF(plane) _PIPE(plane, _DSPASURF, _DSPBSURF) | 2869 | #define DSPSURF(plane) _PIPE(plane, _DSPASURF, _DSPBSURF) |
| 2870 | #define DSPTILEOFF(plane) _PIPE(plane, _DSPATILEOFF, _DSPBTILEOFF) | 2870 | #define DSPTILEOFF(plane) _PIPE(plane, _DSPATILEOFF, _DSPBTILEOFF) |
| 2871 | 2871 | ||
| 2872 | /* Display/Sprite base address macros */ | ||
| 2873 | #define DISP_BASEADDR_MASK (0xfffff000) | ||
| 2874 | #define I915_LO_DISPBASE(val) (val & ~DISP_BASEADDR_MASK) | ||
| 2875 | #define I915_HI_DISPBASE(val) (val & DISP_BASEADDR_MASK) | ||
| 2876 | #define I915_MODIFY_DISPBASE(reg, gfx_addr) \ | ||
| 2877 | (I915_WRITE(reg, gfx_addr | I915_LO_DISPBASE(I915_READ(reg)))) | ||
| 2878 | |||
| 2872 | /* VBIOS flags */ | 2879 | /* VBIOS flags */ |
| 2873 | #define SWF00 0x71410 | 2880 | #define SWF00 0x71410 |
| 2874 | #define SWF01 0x71414 | 2881 | #define SWF01 0x71414 |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 02e9932c3774..eb7ebf49f97e 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -2236,7 +2236,7 @@ static int i9xx_update_plane(struct drm_crtc *crtc, struct drm_framebuffer *fb, | |||
| 2236 | Start, Offset, x, y, fb->pitches[0]); | 2236 | Start, Offset, x, y, fb->pitches[0]); |
| 2237 | I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]); | 2237 | I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]); |
| 2238 | if (INTEL_INFO(dev)->gen >= 4) { | 2238 | if (INTEL_INFO(dev)->gen >= 4) { |
| 2239 | I915_WRITE(DSPSURF(plane), Start); | 2239 | I915_MODIFY_DISPBASE(DSPSURF(plane), Start); |
| 2240 | I915_WRITE(DSPTILEOFF(plane), (y << 16) | x); | 2240 | I915_WRITE(DSPTILEOFF(plane), (y << 16) | x); |
| 2241 | I915_WRITE(DSPADDR(plane), Offset); | 2241 | I915_WRITE(DSPADDR(plane), Offset); |
| 2242 | } else | 2242 | } else |
| @@ -2316,7 +2316,7 @@ static int ironlake_update_plane(struct drm_crtc *crtc, | |||
| 2316 | DRM_DEBUG_KMS("Writing base %08lX %08lX %d %d %d\n", | 2316 | DRM_DEBUG_KMS("Writing base %08lX %08lX %d %d %d\n", |
| 2317 | Start, Offset, x, y, fb->pitches[0]); | 2317 | Start, Offset, x, y, fb->pitches[0]); |
| 2318 | I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]); | 2318 | I915_WRITE(DSPSTRIDE(plane), fb->pitches[0]); |
| 2319 | I915_WRITE(DSPSURF(plane), Start); | 2319 | I915_MODIFY_DISPBASE(DSPSURF(plane), Start); |
| 2320 | I915_WRITE(DSPTILEOFF(plane), (y << 16) | x); | 2320 | I915_WRITE(DSPTILEOFF(plane), (y << 16) | x); |
| 2321 | I915_WRITE(DSPADDR(plane), Offset); | 2321 | I915_WRITE(DSPADDR(plane), Offset); |
| 2322 | POSTING_READ(reg); | 2322 | POSTING_READ(reg); |
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index 987800a0234f..fbf03b996587 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c | |||
| @@ -133,7 +133,7 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, | |||
| 133 | I915_WRITE(SPRSIZE(pipe), (crtc_h << 16) | crtc_w); | 133 | I915_WRITE(SPRSIZE(pipe), (crtc_h << 16) | crtc_w); |
| 134 | I915_WRITE(SPRSCALE(pipe), sprscale); | 134 | I915_WRITE(SPRSCALE(pipe), sprscale); |
| 135 | I915_WRITE(SPRCTL(pipe), sprctl); | 135 | I915_WRITE(SPRCTL(pipe), sprctl); |
| 136 | I915_WRITE(SPRSURF(pipe), obj->gtt_offset); | 136 | I915_MODIFY_DISPBASE(SPRSURF(pipe), obj->gtt_offset); |
| 137 | POSTING_READ(SPRSURF(pipe)); | 137 | POSTING_READ(SPRSURF(pipe)); |
| 138 | } | 138 | } |
| 139 | 139 | ||
| @@ -149,7 +149,7 @@ ivb_disable_plane(struct drm_plane *plane) | |||
| 149 | /* Can't leave the scaler enabled... */ | 149 | /* Can't leave the scaler enabled... */ |
| 150 | I915_WRITE(SPRSCALE(pipe), 0); | 150 | I915_WRITE(SPRSCALE(pipe), 0); |
| 151 | /* Activate double buffered register update */ | 151 | /* Activate double buffered register update */ |
| 152 | I915_WRITE(SPRSURF(pipe), 0); | 152 | I915_MODIFY_DISPBASE(SPRSURF(pipe), 0); |
| 153 | POSTING_READ(SPRSURF(pipe)); | 153 | POSTING_READ(SPRSURF(pipe)); |
| 154 | } | 154 | } |
| 155 | 155 | ||
| @@ -291,7 +291,7 @@ ilk_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, | |||
| 291 | I915_WRITE(DVSSIZE(pipe), (crtc_h << 16) | crtc_w); | 291 | I915_WRITE(DVSSIZE(pipe), (crtc_h << 16) | crtc_w); |
| 292 | I915_WRITE(DVSSCALE(pipe), dvsscale); | 292 | I915_WRITE(DVSSCALE(pipe), dvsscale); |
| 293 | I915_WRITE(DVSCNTR(pipe), dvscntr); | 293 | I915_WRITE(DVSCNTR(pipe), dvscntr); |
| 294 | I915_WRITE(DVSSURF(pipe), obj->gtt_offset); | 294 | I915_MODIFY_DISPBASE(DVSSURF(pipe), obj->gtt_offset); |
| 295 | POSTING_READ(DVSSURF(pipe)); | 295 | POSTING_READ(DVSSURF(pipe)); |
| 296 | } | 296 | } |
| 297 | 297 | ||
| @@ -307,7 +307,7 @@ ilk_disable_plane(struct drm_plane *plane) | |||
| 307 | /* Disable the scaler */ | 307 | /* Disable the scaler */ |
| 308 | I915_WRITE(DVSSCALE(pipe), 0); | 308 | I915_WRITE(DVSSCALE(pipe), 0); |
| 309 | /* Flush double buffered register updates */ | 309 | /* Flush double buffered register updates */ |
| 310 | I915_WRITE(DVSSURF(pipe), 0); | 310 | I915_MODIFY_DISPBASE(DVSSURF(pipe), 0); |
| 311 | POSTING_READ(DVSSURF(pipe)); | 311 | POSTING_READ(DVSSURF(pipe)); |
| 312 | } | 312 | } |
| 313 | 313 | ||
