|
@@ -62,10 +62,9 @@ static unsigned int get_gem_mmap_offset(struct drm_gem_object *obj)
|
|
|
return (unsigned int)obj->map_list.hash.key << PAGE_SHIFT;
|
|
|
}
|
|
|
|
|
|
-static struct exynos_drm_gem_obj
|
|
|
- *exynos_drm_gem_init(struct drm_device *drm_dev,
|
|
|
- struct drm_file *file_priv, unsigned int *handle,
|
|
|
- unsigned int size)
|
|
|
+static struct exynos_drm_gem_obj *
|
|
|
+exynos_drm_gem_init(struct drm_device *drm_dev, struct drm_file *file_priv,
|
|
|
+ unsigned int *handle, unsigned int size)
|
|
|
{
|
|
|
struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
struct drm_gem_object *obj;
|
|
@@ -83,7 +82,7 @@ static struct exynos_drm_gem_obj
|
|
|
if (ret < 0) {
|
|
|
DRM_ERROR("failed to initialize gem object.\n");
|
|
|
ret = -EINVAL;
|
|
|
- goto err_object_init;
|
|
|
+ goto err;
|
|
|
}
|
|
|
|
|
|
DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp);
|
|
@@ -91,7 +90,7 @@ static struct exynos_drm_gem_obj
|
|
|
ret = drm_gem_create_mmap_offset(obj);
|
|
|
if (ret < 0) {
|
|
|
DRM_ERROR("failed to allocate mmap offset.\n");
|
|
|
- goto err_create_mmap_offset;
|
|
|
+ goto err_release;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -100,7 +99,7 @@ static struct exynos_drm_gem_obj
|
|
|
*/
|
|
|
ret = drm_gem_handle_create(file_priv, obj, handle);
|
|
|
if (ret)
|
|
|
- goto err_handle_create;
|
|
|
+ goto err_free_mmap_offset;
|
|
|
|
|
|
DRM_DEBUG_KMS("gem handle = 0x%x\n", *handle);
|
|
|
|
|
@@ -109,34 +108,32 @@ static struct exynos_drm_gem_obj
|
|
|
|
|
|
return exynos_gem_obj;
|
|
|
|
|
|
-err_handle_create:
|
|
|
+err_free_mmap_offset:
|
|
|
drm_gem_free_mmap_offset(obj);
|
|
|
|
|
|
-err_create_mmap_offset:
|
|
|
+err_release:
|
|
|
drm_gem_object_release(obj);
|
|
|
|
|
|
-err_object_init:
|
|
|
+err:
|
|
|
kfree(exynos_gem_obj);
|
|
|
-
|
|
|
return ERR_PTR(ret);
|
|
|
}
|
|
|
|
|
|
struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev,
|
|
|
- struct drm_file *file_priv,
|
|
|
- unsigned int *handle, unsigned long size)
|
|
|
+ struct drm_file *file_priv,
|
|
|
+ unsigned int *handle,
|
|
|
+ unsigned long size)
|
|
|
{
|
|
|
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj = NULL;
|
|
|
+ struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
struct exynos_drm_gem_buf *buffer;
|
|
|
|
|
|
size = roundup(size, PAGE_SIZE);
|
|
|
-
|
|
|
DRM_DEBUG_KMS("%s: size = 0x%lx\n", __FILE__, size);
|
|
|
|
|
|
buffer = exynos_drm_buf_create(dev, size);
|
|
|
- if (IS_ERR(buffer)) {
|
|
|
- return ERR_CAST(buffer);
|
|
|
- }
|
|
|
+ if (!buffer)
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
exynos_gem_obj = exynos_drm_gem_init(dev, file_priv, handle, size);
|
|
|
if (IS_ERR(exynos_gem_obj)) {
|
|
@@ -150,15 +147,15 @@ struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev,
|
|
|
}
|
|
|
|
|
|
int exynos_drm_gem_create_ioctl(struct drm_device *dev, void *data,
|
|
|
- struct drm_file *file_priv)
|
|
|
+ struct drm_file *file_priv)
|
|
|
{
|
|
|
struct drm_exynos_gem_create *args = data;
|
|
|
- struct exynos_drm_gem_obj *exynos_gem_obj = NULL;
|
|
|
+ struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
|
|
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
|
|
|
|
|
- exynos_gem_obj = exynos_drm_gem_create(dev, file_priv,
|
|
|
- &args->handle, args->size);
|
|
|
+ exynos_gem_obj = exynos_drm_gem_create(dev, file_priv, &args->handle,
|
|
|
+ args->size);
|
|
|
if (IS_ERR(exynos_gem_obj))
|
|
|
return PTR_ERR(exynos_gem_obj);
|
|
|
|
|
@@ -166,7 +163,7 @@ int exynos_drm_gem_create_ioctl(struct drm_device *dev, void *data,
|
|
|
}
|
|
|
|
|
|
int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data,
|
|
|
- struct drm_file *file_priv)
|
|
|
+ struct drm_file *file_priv)
|
|
|
{
|
|
|
struct drm_exynos_gem_map_off *args = data;
|
|
|
|
|
@@ -185,7 +182,7 @@ int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data,
|
|
|
}
|
|
|
|
|
|
static int exynos_drm_gem_mmap_buffer(struct file *filp,
|
|
|
- struct vm_area_struct *vma)
|
|
|
+ struct vm_area_struct *vma)
|
|
|
{
|
|
|
struct drm_gem_object *obj = filp->private_data;
|
|
|
struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);
|
|
@@ -232,7 +229,7 @@ static const struct file_operations exynos_drm_gem_fops = {
|
|
|
};
|
|
|
|
|
|
int exynos_drm_gem_mmap_ioctl(struct drm_device *dev, void *data,
|
|
|
- struct drm_file *file_priv)
|
|
|
+ struct drm_file *file_priv)
|
|
|
{
|
|
|
struct drm_exynos_gem_mmap *args = data;
|
|
|
struct drm_gem_object *obj;
|
|
@@ -278,30 +275,31 @@ int exynos_drm_gem_init_object(struct drm_gem_object *obj)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-void exynos_drm_gem_free_object(struct drm_gem_object *gem_obj)
|
|
|
+void exynos_drm_gem_free_object(struct drm_gem_object *obj)
|
|
|
{
|
|
|
struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
|
|
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
|
|
|
|
|
DRM_DEBUG_KMS("handle count = %d\n",
|
|
|
- atomic_read(&gem_obj->handle_count));
|
|
|
+ atomic_read(&obj->handle_count));
|
|
|
|
|
|
- if (gem_obj->map_list.map)
|
|
|
- drm_gem_free_mmap_offset(gem_obj);
|
|
|
+ if (obj->map_list.map)
|
|
|
+ drm_gem_free_mmap_offset(obj);
|
|
|
|
|
|
/* release file pointer to gem object. */
|
|
|
- drm_gem_object_release(gem_obj);
|
|
|
+ drm_gem_object_release(obj);
|
|
|
|
|
|
- exynos_gem_obj = to_exynos_gem_obj(gem_obj);
|
|
|
+ exynos_gem_obj = to_exynos_gem_obj(obj);
|
|
|
|
|
|
- exynos_drm_buf_destroy(gem_obj->dev, exynos_gem_obj->buffer);
|
|
|
+ exynos_drm_buf_destroy(obj->dev, exynos_gem_obj->buffer);
|
|
|
|
|
|
kfree(exynos_gem_obj);
|
|
|
}
|
|
|
|
|
|
int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
|
|
|
- struct drm_device *dev, struct drm_mode_create_dumb *args)
|
|
|
+ struct drm_device *dev,
|
|
|
+ struct drm_mode_create_dumb *args)
|
|
|
{
|
|
|
struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
|
|
@@ -317,7 +315,7 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
|
|
|
args->size = args->pitch * args->height;
|
|
|
|
|
|
exynos_gem_obj = exynos_drm_gem_create(dev, file_priv, &args->handle,
|
|
|
- args->size);
|
|
|
+ args->size);
|
|
|
if (IS_ERR(exynos_gem_obj))
|
|
|
return PTR_ERR(exynos_gem_obj);
|
|
|
|
|
@@ -325,7 +323,8 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
|
|
|
}
|
|
|
|
|
|
int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv,
|
|
|
- struct drm_device *dev, uint32_t handle, uint64_t *offset)
|
|
|
+ struct drm_device *dev, uint32_t handle,
|
|
|
+ uint64_t *offset)
|
|
|
{
|
|
|
struct exynos_drm_gem_obj *exynos_gem_obj;
|
|
|
struct drm_gem_object *obj;
|
|
@@ -360,6 +359,28 @@ int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int exynos_drm_gem_dumb_destroy(struct drm_file *file_priv,
|
|
|
+ struct drm_device *dev,
|
|
|
+ unsigned int handle)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ DRM_DEBUG_KMS("%s\n", __FILE__);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * obj->refcount and obj->handle_count are decreased and
|
|
|
+ * if both them are 0 then exynos_drm_gem_free_object()
|
|
|
+ * would be called by callback to release resources.
|
|
|
+ */
|
|
|
+ ret = drm_gem_handle_delete(file_priv, handle);
|
|
|
+ if (ret < 0) {
|
|
|
+ DRM_ERROR("failed to delete drm_gem_handle.\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|
|
{
|
|
|
struct drm_gem_object *obj = vma->vm_private_data;
|
|
@@ -403,28 +424,6 @@ int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-int exynos_drm_gem_dumb_destroy(struct drm_file *file_priv,
|
|
|
- struct drm_device *dev, unsigned int handle)
|
|
|
-{
|
|
|
- int ret;
|
|
|
-
|
|
|
- DRM_DEBUG_KMS("%s\n", __FILE__);
|
|
|
-
|
|
|
- /*
|
|
|
- * obj->refcount and obj->handle_count are decreased and
|
|
|
- * if both them are 0 then exynos_drm_gem_free_object()
|
|
|
- * would be called by callback to release resources.
|
|
|
- */
|
|
|
- ret = drm_gem_handle_delete(file_priv, handle);
|
|
|
- if (ret < 0) {
|
|
|
- DRM_ERROR("failed to delete drm_gem_handle.\n");
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
MODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>");
|
|
|
MODULE_DESCRIPTION("Samsung SoC DRM GEM Module");
|
|
|
MODULE_LICENSE("GPL");
|