Skip to content

Commit

Permalink
drm/i915: Pin cursor bo and unpin old bo when setting cursor.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Kristian Høgsberg authored and Dave Airlie committed Jan 7, 2009
1 parent 9bb2d6f commit 3f8bc37
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 8 deletions.
29 changes: 21 additions & 8 deletions drivers/gpu/drm/i915/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -986,19 +986,17 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc,
uint32_t base = (pipe == 0) ? CURABASE : CURBBASE;
uint32_t temp;
size_t addr;
int ret;

DRM_DEBUG("\n");

/* if we want to turn off the cursor ignore width and height */
if (!handle) {
DRM_DEBUG("cursor off\n");
/* turn of the cursor */
temp = 0;
temp |= CURSOR_MODE_DISABLE;

I915_WRITE(control, temp);
I915_WRITE(base, 0);
return 0;
temp = CURSOR_MODE_DISABLE;
addr = 0;
bo = NULL;
goto finish;
}

/* Currently we only support 64x64 cursors */
Expand All @@ -1025,15 +1023,30 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc,
addr = obj_priv->gtt_offset;
}

intel_crtc->cursor_addr = addr;
ret = i915_gem_object_pin(bo, PAGE_SIZE);
if (ret) {
DRM_ERROR("failed to pin cursor bo\n");
drm_gem_object_unreference(bo);
return ret;
}

temp = 0;
/* set the pipe for the cursor */
temp |= (pipe << 28);
temp |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;

finish:
I915_WRITE(control, temp);
I915_WRITE(base, addr);

if (intel_crtc->cursor_bo) {
i915_gem_object_unpin(intel_crtc->cursor_bo);
drm_gem_object_unreference(intel_crtc->cursor_bo);
}

intel_crtc->cursor_addr = addr;
intel_crtc->cursor_bo = bo;

return 0;
}

Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/i915/intel_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ struct intel_crtc {
struct drm_crtc base;
int pipe;
int plane;
struct drm_gem_object *cursor_bo;
uint32_t cursor_addr;
u8 lut_r[256], lut_g[256], lut_b[256];
int dpms_mode;
Expand Down

0 comments on commit 3f8bc37

Please sign in to comment.