diff options
author | Inki Dae <inki.dae@samsung.com> | 2012-03-16 05:47:06 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-03-20 05:40:22 -0400 |
commit | f0b1bda725c1c49620d2e7ae7405a247098cdb8e (patch) | |
tree | c9ac3da863eb33b87cce83572a78103e98191cff /drivers | |
parent | 2b35892e9da672df40ce890bffc4f9f6119c57e0 (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.c | 58 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gem.h | 18 |
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 | ||
389 | void *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 | |||
415 | void 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 | |||
389 | int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data, | 447 | int 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, | |||
88 | int exynos_drm_gem_create_ioctl(struct drm_device *dev, void *data, | 88 | int 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 | */ | ||
96 | void *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 | */ | ||
105 | void 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. */ |
92 | int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data, | 110 | int exynos_drm_gem_map_offset_ioctl(struct drm_device *dev, void *data, |
93 | struct drm_file *file_priv); | 111 | struct drm_file *file_priv); |