diff options
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_buf.c')
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_buf.c | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_buf.c b/drivers/gpu/drm/exynos/exynos_drm_buf.c index 6f8afea94fc9..2bb07bca511a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_buf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_buf.c | |||
| @@ -27,82 +27,84 @@ | |||
| 27 | #include "drm.h" | 27 | #include "drm.h" |
| 28 | 28 | ||
| 29 | #include "exynos_drm_drv.h" | 29 | #include "exynos_drm_drv.h" |
| 30 | #include "exynos_drm_gem.h" | ||
| 30 | #include "exynos_drm_buf.h" | 31 | #include "exynos_drm_buf.h" |
| 31 | 32 | ||
| 32 | static DEFINE_MUTEX(exynos_drm_buf_lock); | ||
| 33 | |||
| 34 | static int lowlevel_buffer_allocate(struct drm_device *dev, | 33 | static int lowlevel_buffer_allocate(struct drm_device *dev, |
| 35 | struct exynos_drm_buf_entry *entry) | 34 | struct exynos_drm_gem_buf *buffer) |
| 36 | { | 35 | { |
| 37 | DRM_DEBUG_KMS("%s\n", __FILE__); | 36 | DRM_DEBUG_KMS("%s\n", __FILE__); |
| 38 | 37 | ||
| 39 | entry->vaddr = dma_alloc_writecombine(dev->dev, entry->size, | 38 | buffer->kvaddr = dma_alloc_writecombine(dev->dev, buffer->size, |
| 40 | (dma_addr_t *)&entry->paddr, GFP_KERNEL); | 39 | &buffer->dma_addr, GFP_KERNEL); |
| 41 | if (!entry->paddr) { | 40 | if (!buffer->kvaddr) { |
| 42 | DRM_ERROR("failed to allocate buffer.\n"); | 41 | DRM_ERROR("failed to allocate buffer.\n"); |
| 43 | return -ENOMEM; | 42 | return -ENOMEM; |
| 44 | } | 43 | } |
| 45 | 44 | ||
| 46 | DRM_DEBUG_KMS("allocated : vaddr(0x%x), paddr(0x%x), size(0x%x)\n", | 45 | DRM_DEBUG_KMS("vaddr(0x%lx), dma_addr(0x%lx), size(0x%lx)\n", |
| 47 | (unsigned int)entry->vaddr, entry->paddr, entry->size); | 46 | (unsigned long)buffer->kvaddr, |
| 47 | (unsigned long)buffer->dma_addr, | ||
| 48 | buffer->size); | ||
| 48 | 49 | ||
| 49 | return 0; | 50 | return 0; |
| 50 | } | 51 | } |
| 51 | 52 | ||
| 52 | static void lowlevel_buffer_deallocate(struct drm_device *dev, | 53 | static void lowlevel_buffer_deallocate(struct drm_device *dev, |
| 53 | struct exynos_drm_buf_entry *entry) | 54 | struct exynos_drm_gem_buf *buffer) |
| 54 | { | 55 | { |
| 55 | DRM_DEBUG_KMS("%s.\n", __FILE__); | 56 | DRM_DEBUG_KMS("%s.\n", __FILE__); |
| 56 | 57 | ||
| 57 | if (entry->paddr && entry->vaddr && entry->size) | 58 | if (buffer->dma_addr && buffer->size) |
| 58 | dma_free_writecombine(dev->dev, entry->size, entry->vaddr, | 59 | dma_free_writecombine(dev->dev, buffer->size, buffer->kvaddr, |
| 59 | entry->paddr); | 60 | (dma_addr_t)buffer->dma_addr); |
| 60 | else | 61 | else |
| 61 | DRM_DEBUG_KMS("entry data is null.\n"); | 62 | DRM_DEBUG_KMS("buffer data are invalid.\n"); |
| 62 | } | 63 | } |
| 63 | 64 | ||
| 64 | struct exynos_drm_buf_entry *exynos_drm_buf_create(struct drm_device *dev, | 65 | struct exynos_drm_gem_buf *exynos_drm_buf_create(struct drm_device *dev, |
| 65 | unsigned int size) | 66 | unsigned int size) |
| 66 | { | 67 | { |
| 67 | struct exynos_drm_buf_entry *entry; | 68 | struct exynos_drm_gem_buf *buffer; |
| 68 | 69 | ||
| 69 | DRM_DEBUG_KMS("%s.\n", __FILE__); | 70 | DRM_DEBUG_KMS("%s.\n", __FILE__); |
| 71 | DRM_DEBUG_KMS("desired size = 0x%x\n", size); | ||
| 70 | 72 | ||
| 71 | entry = kzalloc(sizeof(*entry), GFP_KERNEL); | 73 | buffer = kzalloc(sizeof(*buffer), GFP_KERNEL); |
| 72 | if (!entry) { | 74 | if (!buffer) { |
| 73 | DRM_ERROR("failed to allocate exynos_drm_buf_entry.\n"); | 75 | DRM_ERROR("failed to allocate exynos_drm_gem_buf.\n"); |
| 74 | return ERR_PTR(-ENOMEM); | 76 | return ERR_PTR(-ENOMEM); |
| 75 | } | 77 | } |
| 76 | 78 | ||
| 77 | entry->size = size; | 79 | buffer->size = size; |
| 78 | 80 | ||
| 79 | /* | 81 | /* |
| 80 | * allocate memory region with size and set the memory information | 82 | * allocate memory region with size and set the memory information |
| 81 | * to vaddr and paddr of a entry object. | 83 | * to vaddr and dma_addr of a buffer object. |
| 82 | */ | 84 | */ |
| 83 | if (lowlevel_buffer_allocate(dev, entry) < 0) { | 85 | if (lowlevel_buffer_allocate(dev, buffer) < 0) { |
| 84 | kfree(entry); | 86 | kfree(buffer); |
| 85 | entry = NULL; | 87 | buffer = NULL; |
| 86 | return ERR_PTR(-ENOMEM); | 88 | return ERR_PTR(-ENOMEM); |
| 87 | } | 89 | } |
| 88 | 90 | ||
| 89 | return entry; | 91 | return buffer; |
| 90 | } | 92 | } |
| 91 | 93 | ||
| 92 | void exynos_drm_buf_destroy(struct drm_device *dev, | 94 | void exynos_drm_buf_destroy(struct drm_device *dev, |
| 93 | struct exynos_drm_buf_entry *entry) | 95 | struct exynos_drm_gem_buf *buffer) |
| 94 | { | 96 | { |
| 95 | DRM_DEBUG_KMS("%s.\n", __FILE__); | 97 | DRM_DEBUG_KMS("%s.\n", __FILE__); |
| 96 | 98 | ||
| 97 | if (!entry) { | 99 | if (!buffer) { |
| 98 | DRM_DEBUG_KMS("entry is null.\n"); | 100 | DRM_DEBUG_KMS("buffer is null.\n"); |
| 99 | return; | 101 | return; |
| 100 | } | 102 | } |
| 101 | 103 | ||
| 102 | lowlevel_buffer_deallocate(dev, entry); | 104 | lowlevel_buffer_deallocate(dev, buffer); |
| 103 | 105 | ||
| 104 | kfree(entry); | 106 | kfree(buffer); |
| 105 | entry = NULL; | 107 | buffer = NULL; |
| 106 | } | 108 | } |
| 107 | 109 | ||
| 108 | MODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>"); | 110 | MODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>"); |
