aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorInki Dae <inki.dae@samsung.com>2012-03-16 05:47:06 -0400
committerDave Airlie <airlied@redhat.com>2012-03-20 05:40:22 -0400
commitf0b1bda725c1c49620d2e7ae7405a247098cdb8e (patch)
treec9ac3da863eb33b87cce83572a78103e98191cff /drivers
parent2b35892e9da672df40ce890bffc4f9f6119c57e0 (diff)
drm/exynos: added new funtion to get/put dma address.
this function would be used for drm based 2d acceleration driver to get/put dma address through gem handle. when exynos_drm_get_dma_address is called reference count of gem object would be increased not to be released by gem close and when exynos_drm_put_dma_address is called the reference count of this gem object would be decreased to be released. Signed-off-by: Inki Dae <inki.dae@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_gem.c58
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_gem.h18
2 files changed, 76 insertions, 0 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c
index 730093fed512..b5c6f3cfc698 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gem.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c
@@ -386,6 +386,64 @@ int exynos_drm_gem_create_ioctl(struct drm_device *dev, void *data,
386 return 0; 386 return 0;
387} 387}
388 388
389void *exynos_drm_gem_get_dma_addr(struct drm_device *dev,
390 unsigned int gem_handle,
391 struct drm_file *file_priv)
392{
393 struct exynos_drm_gem_obj *exynos_gem_obj;
394 struct drm_gem_object *obj;
395
396 obj = drm_gem_object_lookup(dev, file_priv, gem_handle);
397 if (!obj) {
398 DRM_ERROR("failed to lookup gem object.\n");
399 return ERR_PTR(-EINVAL);
400 }
401
402 exynos_gem_obj = to_exynos_gem_obj(obj);
403
404 if (exynos_gem_obj->flags & EXYNOS_BO_NONCONTIG) {
405 DRM_DEBUG_KMS("not support NONCONTIG type.\n");
406 drm_gem_object_unreference_unlocked(obj);
407
408 /* TODO */
409 return ERR_PTR(-EINVAL);
410 }
411
412 return &exynos_gem_obj->buffer->dma_addr;
413}
414
415void exynos_drm_gem_put_dma_addr(struct drm_device *dev,
416 unsigned int gem_handle,
417 struct drm_file *file_priv)
418{
419 struct exynos_drm_gem_obj *exynos_gem_obj;
420 struct drm_gem_object *obj;
421
422 obj = drm_gem_object_lookup(dev, file_priv, gem_handle);
423 if (!obj) {
424 DRM_ERROR("failed to lookup gem object.\n");
425 return;
426 }
427
428 exynos_gem_obj = to_exynos_gem_obj(obj);
429
430 if (exynos_gem_obj->flags & EXYNOS_BO_NONCONTIG) {
431 DRM_DEBUG_KMS("not support NONCONTIG type.\n");
432 drm_gem_object_unreference_unlocked(obj);
433
434 /* TODO */
435 return;
436 }
437
438 drm_gem_object_unreference_unlocked(obj);
439
440 /*
441 * decrease obj->refcount one more time because we has already
442 * increased it at exynos_drm_gem_get_dma_addr().
443 */
444 drm_gem_object_unreference_unlocked(obj);
445}
446
389int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data, 447int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data,
390 struct drm_file *file_priv) 448 struct drm_file *file_priv)
391{ 449{
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h
index 096267d5a715..e40fbad8b705 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gem.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h
@@ -88,6 +88,24 @@ struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev,
88int exynos_drm_gem_create_ioctl(struct drm_device *dev, void *data, 88int exynos_drm_gem_create_ioctl(struct drm_device *dev, void *data,
89 struct drm_file *file_priv); 89 struct drm_file *file_priv);
90 90
91/*
92 * get dma address from gem handle and this function could be used for
93 * other drivers such as 2d/3d acceleration drivers.
94 * with this function call, gem object reference count would be increased.
95 */
96void *exynos_drm_gem_get_dma_addr(struct drm_device *dev,
97 unsigned int gem_handle,
98 struct drm_file *file_priv);
99
100/*
101 * put dma address from gem handle and this function could be used for
102 * other drivers such as 2d/3d acceleration drivers.
103 * with this function call, gem object reference count would be decreased.
104 */
105void exynos_drm_gem_put_dma_addr(struct drm_device *dev,
106 unsigned int gem_handle,
107 struct drm_file *file_priv);
108
91/* get buffer offset to map to user space. */ 109/* get buffer offset to map to user space. */
92int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data, 110int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data,
93 struct drm_file *file_priv); 111 struct drm_file *file_priv);