diff options
| author | Kristian Høgsberg <krh@redhat.com> | 2008-12-17 22:14:59 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@linux.ie> | 2009-01-06 20:49:43 -0500 |
| commit | 3f8bc370ac679a5fe5c098f30d3cf8e80f62a9f8 (patch) | |
| tree | e8031b491acc957da7c3e4d99688cf755d7ecfba /drivers/gpu | |
| parent | 9bb2d6f94aeb9a185d69aedbd19421b6da4e3309 (diff) | |
drm/i915: Pin cursor bo and unpin old bo when setting cursor.
We also didn't track the cursor bo before and would leak a reference
when the cursor image was change.
Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@linux.ie>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 29 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 1 |
2 files changed, 22 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e5c1c80d1f90..1204d26b50db 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -986,19 +986,17 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 986 | uint32_t base = (pipe == 0) ? CURABASE : CURBBASE; | 986 | uint32_t base = (pipe == 0) ? CURABASE : CURBBASE; |
| 987 | uint32_t temp; | 987 | uint32_t temp; |
| 988 | size_t addr; | 988 | size_t addr; |
| 989 | int ret; | ||
| 989 | 990 | ||
| 990 | DRM_DEBUG("\n"); | 991 | DRM_DEBUG("\n"); |
| 991 | 992 | ||
| 992 | /* if we want to turn off the cursor ignore width and height */ | 993 | /* if we want to turn off the cursor ignore width and height */ |
| 993 | if (!handle) { | 994 | if (!handle) { |
| 994 | DRM_DEBUG("cursor off\n"); | 995 | DRM_DEBUG("cursor off\n"); |
| 995 | /* turn of the cursor */ | 996 | temp = CURSOR_MODE_DISABLE; |
| 996 | temp = 0; | 997 | addr = 0; |
| 997 | temp |= CURSOR_MODE_DISABLE; | 998 | bo = NULL; |
| 998 | 999 | goto finish; | |
| 999 | I915_WRITE(control, temp); | ||
| 1000 | I915_WRITE(base, 0); | ||
| 1001 | return 0; | ||
| 1002 | } | 1000 | } |
| 1003 | 1001 | ||
| 1004 | /* Currently we only support 64x64 cursors */ | 1002 | /* Currently we only support 64x64 cursors */ |
| @@ -1025,15 +1023,30 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 1025 | addr = obj_priv->gtt_offset; | 1023 | addr = obj_priv->gtt_offset; |
| 1026 | } | 1024 | } |
| 1027 | 1025 | ||
| 1028 | intel_crtc->cursor_addr = addr; | 1026 | ret = i915_gem_object_pin(bo, PAGE_SIZE); |
| 1027 | if (ret) { | ||
| 1028 | DRM_ERROR("failed to pin cursor bo\n"); | ||
| 1029 | drm_gem_object_unreference(bo); | ||
| 1030 | return ret; | ||
| 1031 | } | ||
| 1032 | |||
| 1029 | temp = 0; | 1033 | temp = 0; |
| 1030 | /* set the pipe for the cursor */ | 1034 | /* set the pipe for the cursor */ |
| 1031 | temp |= (pipe << 28); | 1035 | temp |= (pipe << 28); |
| 1032 | temp |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE; | 1036 | temp |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE; |
| 1033 | 1037 | ||
| 1038 | finish: | ||
| 1034 | I915_WRITE(control, temp); | 1039 | I915_WRITE(control, temp); |
| 1035 | I915_WRITE(base, addr); | 1040 | I915_WRITE(base, addr); |
| 1036 | 1041 | ||
| 1042 | if (intel_crtc->cursor_bo) { | ||
| 1043 | i915_gem_object_unpin(intel_crtc->cursor_bo); | ||
| 1044 | drm_gem_object_unreference(intel_crtc->cursor_bo); | ||
| 1045 | } | ||
| 1046 | |||
| 1047 | intel_crtc->cursor_addr = addr; | ||
| 1048 | intel_crtc->cursor_bo = bo; | ||
| 1049 | |||
| 1037 | return 0; | 1050 | return 0; |
| 1038 | } | 1051 | } |
| 1039 | 1052 | ||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 407edd5bf582..94981ee7b8bd 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -88,6 +88,7 @@ struct intel_crtc { | |||
| 88 | struct drm_crtc base; | 88 | struct drm_crtc base; |
| 89 | int pipe; | 89 | int pipe; |
| 90 | int plane; | 90 | int plane; |
| 91 | struct drm_gem_object *cursor_bo; | ||
| 91 | uint32_t cursor_addr; | 92 | uint32_t cursor_addr; |
| 92 | u8 lut_r[256], lut_g[256], lut_b[256]; | 93 | u8 lut_r[256], lut_g[256], lut_b[256]; |
| 93 | int dpms_mode; | 94 | int dpms_mode; |
