diff options
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_gem.c')
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gem.c | 89 | 
1 files changed, 52 insertions, 37 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index a8e7a88906e..aba0fe47f7e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c @@ -62,40 +62,28 @@ static unsigned int get_gem_mmap_offset(struct drm_gem_object *obj)  	return (unsigned int)obj->map_list.hash.key << PAGE_SHIFT;  } -struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_file *file_priv, -		struct drm_device *dev, unsigned int size, -		unsigned int *handle) +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 exynos_drm_buf_entry *entry;  	struct drm_gem_object *obj;  	int ret; -	DRM_DEBUG_KMS("%s\n", __FILE__); - -	size = roundup(size, PAGE_SIZE); -  	exynos_gem_obj = kzalloc(sizeof(*exynos_gem_obj), GFP_KERNEL);  	if (!exynos_gem_obj) {  		DRM_ERROR("failed to allocate exynos gem object.\n");  		return ERR_PTR(-ENOMEM);  	} -	/* allocate the new buffer object and memory region. */ -	entry = exynos_drm_buf_create(dev, size); -	if (!entry) { -		kfree(exynos_gem_obj); -		return ERR_PTR(-ENOMEM); -	} - -	exynos_gem_obj->entry = entry; -  	obj = &exynos_gem_obj->base; -	ret = drm_gem_object_init(dev, obj, size); +	ret = drm_gem_object_init(drm_dev, obj, size);  	if (ret < 0) { -		DRM_ERROR("failed to initailize gem object.\n"); -		goto err_obj_init; +		DRM_ERROR("failed to initialize gem object.\n"); +		ret = -EINVAL; +		goto err_object_init;  	}  	DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp); @@ -127,24 +115,50 @@ err_handle_create:  err_create_mmap_offset:  	drm_gem_object_release(obj); -err_obj_init: -	exynos_drm_buf_destroy(dev, exynos_gem_obj->entry); - +err_object_init:  	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 exynos_drm_gem_obj *exynos_gem_obj = NULL; +	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); +	} + +	exynos_gem_obj = exynos_drm_gem_init(dev, file_priv, handle, size); +	if (IS_ERR(exynos_gem_obj)) { +		exynos_drm_buf_destroy(dev, buffer); +		return exynos_gem_obj; +	} + +	exynos_gem_obj->buffer = buffer; + +	return exynos_gem_obj; +} +  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; +	struct exynos_drm_gem_obj *exynos_gem_obj = NULL; -	DRM_DEBUG_KMS("%s : size = 0x%x\n", __FILE__, args->size); +	DRM_DEBUG_KMS("%s\n", __FILE__); -	exynos_gem_obj = exynos_drm_gem_create(file_priv, dev, args->size, -			&args->handle); +	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); @@ -175,7 +189,7 @@ static int exynos_drm_gem_mmap_buffer(struct file *filp,  {  	struct drm_gem_object *obj = filp->private_data;  	struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj); -	struct exynos_drm_buf_entry *entry; +	struct exynos_drm_gem_buf *buffer;  	unsigned long pfn, vm_size;  	DRM_DEBUG_KMS("%s\n", __FILE__); @@ -187,20 +201,20 @@ static int exynos_drm_gem_mmap_buffer(struct file *filp,  	vm_size = vma->vm_end - vma->vm_start;  	/* -	 * a entry contains information to physically continuous memory +	 * a buffer contains information to physically continuous memory  	 * allocated by user request or at framebuffer creation.  	 */ -	entry = exynos_gem_obj->entry; +	buffer = exynos_gem_obj->buffer;  	/* check if user-requested size is valid. */ -	if (vm_size > entry->size) +	if (vm_size > buffer->size)  		return -EINVAL;  	/*  	 * get page frame number to physical memory to be mapped  	 * to user space.  	 */ -	pfn = exynos_gem_obj->entry->paddr >> PAGE_SHIFT; +	pfn = ((unsigned long)exynos_gem_obj->buffer->dma_addr) >> PAGE_SHIFT;  	DRM_DEBUG_KMS("pfn = 0x%lx\n", pfn); @@ -281,7 +295,7 @@ void exynos_drm_gem_free_object(struct drm_gem_object *gem_obj)  	exynos_gem_obj = to_exynos_gem_obj(gem_obj); -	exynos_drm_buf_destroy(gem_obj->dev, exynos_gem_obj->entry); +	exynos_drm_buf_destroy(gem_obj->dev, exynos_gem_obj->buffer);  	kfree(exynos_gem_obj);  } @@ -302,8 +316,8 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv,  	args->pitch = args->width * args->bpp >> 3;  	args->size = args->pitch * args->height; -	exynos_gem_obj = exynos_drm_gem_create(file_priv, dev, args->size, -							&args->handle); +	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); @@ -360,7 +374,8 @@ int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)  	mutex_lock(&dev->struct_mutex); -	pfn = (exynos_gem_obj->entry->paddr >> PAGE_SHIFT) + page_offset; +	pfn = (((unsigned long)exynos_gem_obj->buffer->dma_addr) >> +			PAGE_SHIFT) + page_offset;  	ret = vm_insert_mixed(vma, (unsigned long)vmf->virtual_address, pfn);  |