}
/**
- * drm_get_buffer_object - find the buffer object for a given handle
- * @dev: DRM device
- * @bo: pointer to caller's buffer_object pointer
- * @handle: handle to lookup
- *
- * LOCKING:
- * Must take @dev's struct_mutex to protect buffer object lookup.
- *
- * Given @handle, lookup the buffer object in @dev and put it in the caller's
- * @bo pointer.
- *
- * RETURNS:
- * Zero on success, -EINVAL if the handle couldn't be found.
- */
-static int drm_get_buffer_object(struct drm_device *dev, struct drm_buffer_object **bo, unsigned long handle)
-{
- struct drm_user_object *uo;
- struct drm_hash_item *hash;
- int ret;
-
- *bo = NULL;
-
- mutex_lock(&dev->struct_mutex);
- ret = drm_ht_find_item(&dev->object_hash, handle, &hash);
- if (ret) {
- DRM_ERROR("Couldn't find handle.\n");
- ret = -EINVAL;
- goto out_err;
- }
-
- uo = drm_hash_entry(hash, struct drm_user_object, hash);
- if (uo->type != drm_buffer_type) {
- ret = -EINVAL;
- goto out_err;
- }
-
- *bo = drm_user_object_entry(uo, struct drm_buffer_object, base);
- ret = 0;
-out_err:
- mutex_unlock(&dev->struct_mutex);
- return ret;
-}
-
-
-
-
-/**
* drm_mode_config_cleanup - free up DRM mode_config info
* @dev: DRM device
*
if (req->flags & DRM_MODE_CURSOR_BO) {
/* Turn of the cursor if handle is 0 */
- if (req->handle)
- ret = drm_get_buffer_object(dev, &bo, req->handle);
-
- if (ret) {
- DRM_ERROR("invalid buffer id\n");
- ret = -EINVAL;
- goto out;
- }
-
if (crtc->funcs->cursor_set) {
- ret = crtc->funcs->cursor_set(crtc, bo, req->width, req->height);
+ ret = crtc->funcs->cursor_set(crtc, req->handle, req->width, req->height);
} else {
DRM_ERROR("crtc does not support cursor\n");
ret = -EFAULT;
void (*restore)(struct drm_crtc *crtc); /* resume? */
/* cursor controls */
- int (*cursor_set)(struct drm_crtc *crtc, struct drm_buffer_object *bo,
+ int (*cursor_set)(struct drm_crtc *crtc, uint32_t buffer_handle,
uint32_t width, uint32_t height);
int (*cursor_move)(struct drm_crtc *crtc, int x, int y);
-
-/*
- * Copyright (c) 2006-2007 Intel Corporation
+/* (c) 2006-2007 Intel Corporation
* Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
*
* DRM core CRTC related functions
return 0;
}
EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct);
+
+/**
+ * drm_get_buffer_object - find the buffer object for a given handle
+ * @dev: DRM device
+ * @bo: pointer to caller's buffer_object pointer
+ * @handle: handle to lookup
+ *
+ * LOCKING:
+ * Must take @dev's struct_mutex to protect buffer object lookup.
+ *
+ * Given @handle, lookup the buffer object in @dev and put it in the caller's
+ * @bo pointer.
+ *
+ * RETURNS:
+ * Zero on success, -EINVAL if the handle couldn't be found.
+ */
+int drm_get_buffer_object(struct drm_device *dev, struct drm_buffer_object **bo, unsigned long handle)
+{
+ struct drm_user_object *uo;
+ struct drm_hash_item *hash;
+ int ret;
+
+ *bo = NULL;
+
+ mutex_lock(&dev->struct_mutex);
+ ret = drm_ht_find_item(&dev->object_hash, handle, &hash);
+ if (ret) {
+ DRM_ERROR("Couldn't find handle.\n");
+ ret = -EINVAL;
+ goto out_err;
+ }
+
+ uo = drm_hash_entry(hash, struct drm_user_object, hash);
+ if (uo->type != drm_buffer_type) {
+ ret = -EINVAL;
+ goto out_err;
+ }
+
+ *bo = drm_user_object_entry(uo, struct drm_buffer_object, base);
+ ret = 0;
+out_err:
+ mutex_unlock(&dev->struct_mutex);
+ return ret;
+}
+EXPORT_SYMBOL(drm_get_buffer_object);
connector->helper_private = (void *)funcs;
}
-
+extern int drm_get_buffer_object(struct drm_device *dev, struct drm_buffer_object **bo, unsigned long handle);
#endif
}
static int intel_crtc_cursor_set(struct drm_crtc *crtc,
- struct drm_buffer_object *bo,
+ uint32_t handle,
uint32_t width, uint32_t height)
{
struct drm_device *dev = crtc->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+ struct drm_buffer_object *bo;
int pipe = intel_crtc->pipe;
uint32_t control = (pipe == 0) ? CURACNTR : CURBCNTR;
uint32_t base = (pipe == 0) ? CURABASE : CURBBASE;
uint32_t temp;
+ int ret;
size_t addr;
DRM_DEBUG("\n");
/* if we want to turn of the cursor ignore width and height */
- if (!bo) {
+ if (!handle) {
DRM_DEBUG("cursor off\n");
/* turn of the cursor */
temp = 0;
return -EINVAL;
}
+ ret = drm_get_buffer_object(dev, &bo, handle);
+ if (ret) {
+ return -EINVAL;
+ }
+
if ((bo->mem.flags & DRM_BO_MASK_MEM) != DRM_BO_FLAG_MEM_VRAM) {
DRM_ERROR("buffer needs to be in VRAM\n");
return -ENOMEM;