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; |