aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorInki Dae <inki.dae@samsung.com>2011-11-12 01:23:32 -0500
committerInki Dae <inki.dae@samsung.com>2011-11-15 00:58:46 -0500
commit2c871127e994a678b82104a4110eb7fcc87f05ad (patch)
tree76ec83f5dc4232b57202eb916009932ed1b471bc /drivers/gpu
parentc7493668eeced636afabfed57dfead8329c3d7fa (diff)
drm/exynos: changed buffer structure.
the purpose of this patch is to consider IOMMU support in the future. EXYNOS4 SoC supports IOMMU also so the address for DMA could be physical address with IOMMU or device address with IOMMU. Signed-off-by: Inki Dae <inki.dae@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_buf.c60
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_buf.h21
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_crtc.c47
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_crtc.h25
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_drv.h6
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fb.c48
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fbdev.c15
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fimd.c12
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_gem.c25
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_gem.h22
10 files changed, 148 insertions, 133 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_buf.c b/drivers/gpu/drm/exynos/exynos_drm_buf.c
index 303189c78cf1..2bb07bca511a 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_buf.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_buf.c
@@ -27,80 +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
32static int lowlevel_buffer_allocate(struct drm_device *dev, 33static int lowlevel_buffer_allocate(struct drm_device *dev,
33 struct exynos_drm_buf_entry *entry) 34 struct exynos_drm_gem_buf *buffer)
34{ 35{
35 DRM_DEBUG_KMS("%s\n", __FILE__); 36 DRM_DEBUG_KMS("%s\n", __FILE__);
36 37
37 entry->vaddr = dma_alloc_writecombine(dev->dev, entry->size, 38 buffer->kvaddr = dma_alloc_writecombine(dev->dev, buffer->size,
38 (dma_addr_t *)&entry->paddr, GFP_KERNEL); 39 &buffer->dma_addr, GFP_KERNEL);
39 if (!entry->paddr) { 40 if (!buffer->kvaddr) {
40 DRM_ERROR("failed to allocate buffer.\n"); 41 DRM_ERROR("failed to allocate buffer.\n");
41 return -ENOMEM; 42 return -ENOMEM;
42 } 43 }
43 44
44 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",
45 (unsigned int)entry->vaddr, entry->paddr, entry->size); 46 (unsigned long)buffer->kvaddr,
47 (unsigned long)buffer->dma_addr,
48 buffer->size);
46 49
47 return 0; 50 return 0;
48} 51}
49 52
50static void lowlevel_buffer_deallocate(struct drm_device *dev, 53static void lowlevel_buffer_deallocate(struct drm_device *dev,
51 struct exynos_drm_buf_entry *entry) 54 struct exynos_drm_gem_buf *buffer)
52{ 55{
53 DRM_DEBUG_KMS("%s.\n", __FILE__); 56 DRM_DEBUG_KMS("%s.\n", __FILE__);
54 57
55 if (entry->paddr && entry->vaddr && entry->size) 58 if (buffer->dma_addr && buffer->size)
56 dma_free_writecombine(dev->dev, entry->size, entry->vaddr, 59 dma_free_writecombine(dev->dev, buffer->size, buffer->kvaddr,
57 entry->paddr); 60 (dma_addr_t)buffer->dma_addr);
58 else 61 else
59 DRM_DEBUG_KMS("entry data is null.\n"); 62 DRM_DEBUG_KMS("buffer data are invalid.\n");
60} 63}
61 64
62struct exynos_drm_buf_entry *exynos_drm_buf_create(struct drm_device *dev, 65struct exynos_drm_gem_buf *exynos_drm_buf_create(struct drm_device *dev,
63 unsigned int size) 66 unsigned int size)
64{ 67{
65 struct exynos_drm_buf_entry *entry; 68 struct exynos_drm_gem_buf *buffer;
66 69
67 DRM_DEBUG_KMS("%s.\n", __FILE__); 70 DRM_DEBUG_KMS("%s.\n", __FILE__);
71 DRM_DEBUG_KMS("desired size = 0x%x\n", size);
68 72
69 entry = kzalloc(sizeof(*entry), GFP_KERNEL); 73 buffer = kzalloc(sizeof(*buffer), GFP_KERNEL);
70 if (!entry) { 74 if (!buffer) {
71 DRM_ERROR("failed to allocate exynos_drm_buf_entry.\n"); 75 DRM_ERROR("failed to allocate exynos_drm_gem_buf.\n");
72 return ERR_PTR(-ENOMEM); 76 return ERR_PTR(-ENOMEM);
73 } 77 }
74 78
75 entry->size = size; 79 buffer->size = size;
76 80
77 /* 81 /*
78 * allocate memory region with size and set the memory information 82 * allocate memory region with size and set the memory information
79 * to vaddr and paddr of a entry object. 83 * to vaddr and dma_addr of a buffer object.
80 */ 84 */
81 if (lowlevel_buffer_allocate(dev, entry) < 0) { 85 if (lowlevel_buffer_allocate(dev, buffer) < 0) {
82 kfree(entry); 86 kfree(buffer);
83 entry = NULL; 87 buffer = NULL;
84 return ERR_PTR(-ENOMEM); 88 return ERR_PTR(-ENOMEM);
85 } 89 }
86 90
87 return entry; 91 return buffer;
88} 92}
89 93
90void exynos_drm_buf_destroy(struct drm_device *dev, 94void exynos_drm_buf_destroy(struct drm_device *dev,
91 struct exynos_drm_buf_entry *entry) 95 struct exynos_drm_gem_buf *buffer)
92{ 96{
93 DRM_DEBUG_KMS("%s.\n", __FILE__); 97 DRM_DEBUG_KMS("%s.\n", __FILE__);
94 98
95 if (!entry) { 99 if (!buffer) {
96 DRM_DEBUG_KMS("entry is null.\n"); 100 DRM_DEBUG_KMS("buffer is null.\n");
97 return; 101 return;
98 } 102 }
99 103
100 lowlevel_buffer_deallocate(dev, entry); 104 lowlevel_buffer_deallocate(dev, buffer);
101 105
102 kfree(entry); 106 kfree(buffer);
103 entry = NULL; 107 buffer = NULL;
104} 108}
105 109
106MODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>"); 110MODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>");
diff --git a/drivers/gpu/drm/exynos/exynos_drm_buf.h b/drivers/gpu/drm/exynos/exynos_drm_buf.h
index 045d59eab01a..6e91f9caa5db 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_buf.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_buf.h
@@ -26,28 +26,15 @@
26#ifndef _EXYNOS_DRM_BUF_H_ 26#ifndef _EXYNOS_DRM_BUF_H_
27#define _EXYNOS_DRM_BUF_H_ 27#define _EXYNOS_DRM_BUF_H_
28 28
29/*
30 * exynos drm buffer entry structure.
31 *
32 * @paddr: physical address of allocated memory.
33 * @vaddr: kernel virtual address of allocated memory.
34 * @size: size of allocated memory.
35 */
36struct exynos_drm_buf_entry {
37 dma_addr_t paddr;
38 void __iomem *vaddr;
39 unsigned int size;
40};
41
42/* allocate physical memory. */ 29/* allocate physical memory. */
43struct exynos_drm_buf_entry *exynos_drm_buf_create(struct drm_device *dev, 30struct exynos_drm_gem_buf *exynos_drm_buf_create(struct drm_device *dev,
44 unsigned int size); 31 unsigned int size);
45 32
46/* get physical memory information of a drm framebuffer. */ 33/* get memory information of a drm framebuffer. */
47struct exynos_drm_buf_entry *exynos_drm_fb_get_buf(struct drm_framebuffer *fb); 34struct exynos_drm_gem_buf *exynos_drm_fb_get_buf(struct drm_framebuffer *fb);
48 35
49/* remove allocated physical memory. */ 36/* remove allocated physical memory. */
50void exynos_drm_buf_destroy(struct drm_device *dev, 37void exynos_drm_buf_destroy(struct drm_device *dev,
51 struct exynos_drm_buf_entry *entry); 38 struct exynos_drm_gem_buf *buffer);
52 39
53#endif 40#endif
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
index b1d6526340bb..ee43cc220853 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
@@ -29,36 +29,17 @@
29#include "drmP.h" 29#include "drmP.h"
30#include "drm_crtc_helper.h" 30#include "drm_crtc_helper.h"
31 31
32#include "exynos_drm_crtc.h"
32#include "exynos_drm_drv.h" 33#include "exynos_drm_drv.h"
33#include "exynos_drm_fb.h" 34#include "exynos_drm_fb.h"
34#include "exynos_drm_encoder.h" 35#include "exynos_drm_encoder.h"
36#include "exynos_drm_gem.h"
35#include "exynos_drm_buf.h" 37#include "exynos_drm_buf.h"
36 38
37#define to_exynos_crtc(x) container_of(x, struct exynos_drm_crtc,\ 39#define to_exynos_crtc(x) container_of(x, struct exynos_drm_crtc,\
38 drm_crtc) 40 drm_crtc)
39 41
40/* 42/*
41 * Exynos specific crtc postion structure.
42 *
43 * @fb_x: offset x on a framebuffer to be displyed
44 * - the unit is screen coordinates.
45 * @fb_y: offset y on a framebuffer to be displayed
46 * - the unit is screen coordinates.
47 * @crtc_x: offset x on hardware screen.
48 * @crtc_y: offset y on hardware screen.
49 * @crtc_w: width of hardware screen.
50 * @crtc_h: height of hardware screen.
51 */
52struct exynos_drm_crtc_pos {
53 unsigned int fb_x;
54 unsigned int fb_y;
55 unsigned int crtc_x;
56 unsigned int crtc_y;
57 unsigned int crtc_w;
58 unsigned int crtc_h;
59};
60
61/*
62 * Exynos specific crtc structure. 43 * Exynos specific crtc structure.
63 * 44 *
64 * @drm_crtc: crtc object. 45 * @drm_crtc: crtc object.
@@ -89,27 +70,27 @@ static void exynos_drm_crtc_apply(struct drm_crtc *crtc)
89 exynos_drm_encoder_crtc_commit); 70 exynos_drm_encoder_crtc_commit);
90} 71}
91 72
92static int exynos_drm_overlay_update(struct exynos_drm_overlay *overlay, 73int exynos_drm_overlay_update(struct exynos_drm_overlay *overlay,
93 struct drm_framebuffer *fb, 74 struct drm_framebuffer *fb,
94 struct drm_display_mode *mode, 75 struct drm_display_mode *mode,
95 struct exynos_drm_crtc_pos *pos) 76 struct exynos_drm_crtc_pos *pos)
96{ 77{
97 struct exynos_drm_buf_entry *entry; 78 struct exynos_drm_gem_buf *buffer;
98 unsigned int actual_w; 79 unsigned int actual_w;
99 unsigned int actual_h; 80 unsigned int actual_h;
100 81
101 entry = exynos_drm_fb_get_buf(fb); 82 buffer = exynos_drm_fb_get_buf(fb);
102 if (!entry) { 83 if (!buffer) {
103 DRM_LOG_KMS("entry is null.\n"); 84 DRM_LOG_KMS("buffer is null.\n");
104 return -EFAULT; 85 return -EFAULT;
105 } 86 }
106 87
107 overlay->paddr = entry->paddr; 88 overlay->dma_addr = buffer->dma_addr;
108 overlay->vaddr = entry->vaddr; 89 overlay->vaddr = buffer->kvaddr;
109 90
110 DRM_DEBUG_KMS("vaddr = 0x%lx, paddr = 0x%lx\n", 91 DRM_DEBUG_KMS("vaddr = 0x%lx, dma_addr = 0x%lx\n",
111 (unsigned long)overlay->vaddr, 92 (unsigned long)overlay->vaddr,
112 (unsigned long)overlay->paddr); 93 (unsigned long)overlay->dma_addr);
113 94
114 actual_w = min((mode->hdisplay - pos->crtc_x), pos->crtc_w); 95 actual_w = min((mode->hdisplay - pos->crtc_x), pos->crtc_w);
115 actual_h = min((mode->vdisplay - pos->crtc_y), pos->crtc_h); 96 actual_h = min((mode->vdisplay - pos->crtc_y), pos->crtc_h);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.h b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
index c584042d6d2c..25f72a62cb88 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
@@ -35,4 +35,29 @@ int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr);
35int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc); 35int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc);
36void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc); 36void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc);
37 37
38/*
39 * Exynos specific crtc postion structure.
40 *
41 * @fb_x: offset x on a framebuffer to be displyed
42 * - the unit is screen coordinates.
43 * @fb_y: offset y on a framebuffer to be displayed
44 * - the unit is screen coordinates.
45 * @crtc_x: offset x on hardware screen.
46 * @crtc_y: offset y on hardware screen.
47 * @crtc_w: width of hardware screen.
48 * @crtc_h: height of hardware screen.
49 */
50struct exynos_drm_crtc_pos {
51 unsigned int fb_x;
52 unsigned int fb_y;
53 unsigned int crtc_x;
54 unsigned int crtc_y;
55 unsigned int crtc_w;
56 unsigned int crtc_h;
57};
58
59int exynos_drm_overlay_update(struct exynos_drm_overlay *overlay,
60 struct drm_framebuffer *fb,
61 struct drm_display_mode *mode,
62 struct exynos_drm_crtc_pos *pos);
38#endif 63#endif
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
index 1575e5fef51e..38a6f1df75c6 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
@@ -79,8 +79,8 @@ struct exynos_drm_overlay_ops {
79 * @scan_flag: interlace or progressive way. 79 * @scan_flag: interlace or progressive way.
80 * (it could be DRM_MODE_FLAG_*) 80 * (it could be DRM_MODE_FLAG_*)
81 * @bpp: pixel size.(in bit) 81 * @bpp: pixel size.(in bit)
82 * @paddr: bus(accessed by dma) physical memory address to this overlay 82 * @dma_addr: bus(accessed by dma) address to the memory region allocated
83 * and this is physically continuous. 83 * for a overlay.
84 * @vaddr: virtual memory addresss to this overlay. 84 * @vaddr: virtual memory addresss to this overlay.
85 * @default_win: a window to be enabled. 85 * @default_win: a window to be enabled.
86 * @color_key: color key on or off. 86 * @color_key: color key on or off.
@@ -108,7 +108,7 @@ struct exynos_drm_overlay {
108 unsigned int scan_flag; 108 unsigned int scan_flag;
109 unsigned int bpp; 109 unsigned int bpp;
110 unsigned int pitch; 110 unsigned int pitch;
111 dma_addr_t paddr; 111 dma_addr_t dma_addr;
112 void __iomem *vaddr; 112 void __iomem *vaddr;
113 113
114 bool default_win; 114 bool default_win;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c
index 8d0f66224045..5bf4a1ac7f82 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fb.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c
@@ -43,14 +43,14 @@
43 * 43 *
44 * @fb: drm framebuffer obejct. 44 * @fb: drm framebuffer obejct.
45 * @exynos_gem_obj: exynos specific gem object containing a gem object. 45 * @exynos_gem_obj: exynos specific gem object containing a gem object.
46 * @entry: pointer to exynos drm buffer entry object. 46 * @buffer: pointer to exynos_drm_gem_buffer object.
47 * - containing only the information to physically continuous memory 47 * - contain the memory information to memory region allocated
48 * region allocated at default framebuffer creation. 48 * at default framebuffer creation.
49 */ 49 */
50struct exynos_drm_fb { 50struct exynos_drm_fb {
51 struct drm_framebuffer fb; 51 struct drm_framebuffer fb;
52 struct exynos_drm_gem_obj *exynos_gem_obj; 52 struct exynos_drm_gem_obj *exynos_gem_obj;
53 struct exynos_drm_buf_entry *entry; 53 struct exynos_drm_gem_buf *buffer;
54}; 54};
55 55
56static void exynos_drm_fb_destroy(struct drm_framebuffer *fb) 56static void exynos_drm_fb_destroy(struct drm_framebuffer *fb)
@@ -65,8 +65,8 @@ static void exynos_drm_fb_destroy(struct drm_framebuffer *fb)
65 * default framebuffer has no gem object so 65 * default framebuffer has no gem object so
66 * a buffer of the default framebuffer should be released at here. 66 * a buffer of the default framebuffer should be released at here.
67 */ 67 */
68 if (!exynos_fb->exynos_gem_obj && exynos_fb->entry) 68 if (!exynos_fb->exynos_gem_obj && exynos_fb->buffer)
69 exynos_drm_buf_destroy(fb->dev, exynos_fb->entry); 69 exynos_drm_buf_destroy(fb->dev, exynos_fb->buffer);
70 70
71 kfree(exynos_fb); 71 kfree(exynos_fb);
72 exynos_fb = NULL; 72 exynos_fb = NULL;
@@ -145,23 +145,23 @@ exynos_drm_fb_init(struct drm_file *file_priv, struct drm_device *dev,
145 */ 145 */
146 if (!mode_cmd->handle) { 146 if (!mode_cmd->handle) {
147 if (!file_priv) { 147 if (!file_priv) {
148 struct exynos_drm_buf_entry *entry; 148 struct exynos_drm_gem_buf *buffer;
149 149
150 /* 150 /*
151 * in case that file_priv is NULL, it allocates 151 * in case that file_priv is NULL, it allocates
152 * only buffer and this buffer would be used 152 * only buffer and this buffer would be used
153 * for default framebuffer. 153 * for default framebuffer.
154 */ 154 */
155 entry = exynos_drm_buf_create(dev, size); 155 buffer = exynos_drm_buf_create(dev, size);
156 if (IS_ERR(entry)) { 156 if (IS_ERR(buffer)) {
157 ret = PTR_ERR(entry); 157 ret = PTR_ERR(buffer);
158 goto err_buffer; 158 goto err_buffer;
159 } 159 }
160 160
161 exynos_fb->entry = entry; 161 exynos_fb->buffer = buffer;
162 162
163 DRM_LOG_KMS("default fb: paddr = 0x%lx, size = 0x%x\n", 163 DRM_LOG_KMS("default: dma_addr = 0x%lx, size = 0x%x\n",
164 (unsigned long)entry->paddr, size); 164 (unsigned long)buffer->dma_addr, size);
165 165
166 goto out; 166 goto out;
167 } else { 167 } else {
@@ -191,10 +191,10 @@ exynos_drm_fb_init(struct drm_file *file_priv, struct drm_device *dev,
191 * so that default framebuffer has no its own gem object, 191 * so that default framebuffer has no its own gem object,
192 * only its own buffer object. 192 * only its own buffer object.
193 */ 193 */
194 exynos_fb->entry = exynos_gem_obj->entry; 194 exynos_fb->buffer = exynos_gem_obj->buffer;
195 195
196 DRM_LOG_KMS("paddr = 0x%lx, size = 0x%x, gem object = 0x%x\n", 196 DRM_LOG_KMS("dma_addr = 0x%lx, size = 0x%x, gem object = 0x%x\n",
197 (unsigned long)exynos_fb->entry->paddr, size, 197 (unsigned long)exynos_fb->buffer->dma_addr, size,
198 (unsigned int)&exynos_gem_obj->base); 198 (unsigned int)&exynos_gem_obj->base);
199 199
200out: 200out:
@@ -222,22 +222,22 @@ struct drm_framebuffer *exynos_drm_fb_create(struct drm_device *dev,
222 return exynos_drm_fb_init(file_priv, dev, mode_cmd); 222 return exynos_drm_fb_init(file_priv, dev, mode_cmd);
223} 223}
224 224
225struct exynos_drm_buf_entry *exynos_drm_fb_get_buf(struct drm_framebuffer *fb) 225struct exynos_drm_gem_buf *exynos_drm_fb_get_buf(struct drm_framebuffer *fb)
226{ 226{
227 struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); 227 struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb);
228 struct exynos_drm_buf_entry *entry; 228 struct exynos_drm_gem_buf *buffer;
229 229
230 DRM_DEBUG_KMS("%s\n", __FILE__); 230 DRM_DEBUG_KMS("%s\n", __FILE__);
231 231
232 entry = exynos_fb->entry; 232 buffer = exynos_fb->buffer;
233 if (!entry) 233 if (!buffer)
234 return NULL; 234 return NULL;
235 235
236 DRM_DEBUG_KMS("vaddr = 0x%lx, paddr = 0x%lx\n", 236 DRM_DEBUG_KMS("vaddr = 0x%lx, dma_addr = 0x%lx\n",
237 (unsigned long)entry->vaddr, 237 (unsigned long)buffer->kvaddr,
238 (unsigned long)entry->paddr); 238 (unsigned long)buffer->dma_addr);
239 239
240 return entry; 240 return buffer;
241} 241}
242 242
243static void exynos_drm_output_poll_changed(struct drm_device *dev) 243static void exynos_drm_output_poll_changed(struct drm_device *dev)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
index 0effd77d569b..836f41008187 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
@@ -33,6 +33,7 @@
33 33
34#include "exynos_drm_drv.h" 34#include "exynos_drm_drv.h"
35#include "exynos_drm_fb.h" 35#include "exynos_drm_fb.h"
36#include "exynos_drm_gem.h"
36#include "exynos_drm_buf.h" 37#include "exynos_drm_buf.h"
37 38
38#define MAX_CONNECTOR 4 39#define MAX_CONNECTOR 4
@@ -90,7 +91,7 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,
90 struct fb_info *fbi = helper->fbdev; 91 struct fb_info *fbi = helper->fbdev;
91 struct drm_device *dev = helper->dev; 92 struct drm_device *dev = helper->dev;
92 struct exynos_drm_fbdev *exynos_fb = to_exynos_fbdev(helper); 93 struct exynos_drm_fbdev *exynos_fb = to_exynos_fbdev(helper);
93 struct exynos_drm_buf_entry *entry; 94 struct exynos_drm_gem_buf *buffer;
94 unsigned int size = fb->width * fb->height * (fb->bits_per_pixel >> 3); 95 unsigned int size = fb->width * fb->height * (fb->bits_per_pixel >> 3);
95 unsigned long offset; 96 unsigned long offset;
96 97
@@ -101,18 +102,18 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,
101 drm_fb_helper_fill_fix(fbi, fb->pitch, fb->depth); 102 drm_fb_helper_fill_fix(fbi, fb->pitch, fb->depth);
102 drm_fb_helper_fill_var(fbi, helper, fb->width, fb->height); 103 drm_fb_helper_fill_var(fbi, helper, fb->width, fb->height);
103 104
104 entry = exynos_drm_fb_get_buf(fb); 105 buffer = exynos_drm_fb_get_buf(fb);
105 if (!entry) { 106 if (!buffer) {
106 DRM_LOG_KMS("entry is null.\n"); 107 DRM_LOG_KMS("buffer is null.\n");
107 return -EFAULT; 108 return -EFAULT;
108 } 109 }
109 110
110 offset = fbi->var.xoffset * (fb->bits_per_pixel >> 3); 111 offset = fbi->var.xoffset * (fb->bits_per_pixel >> 3);
111 offset += fbi->var.yoffset * fb->pitch; 112 offset += fbi->var.yoffset * fb->pitch;
112 113
113 dev->mode_config.fb_base = entry->paddr; 114 dev->mode_config.fb_base = (resource_size_t)buffer->dma_addr;
114 fbi->screen_base = entry->vaddr + offset; 115 fbi->screen_base = buffer->kvaddr + offset;
115 fbi->fix.smem_start = entry->paddr + offset; 116 fbi->fix.smem_start = (unsigned long)(buffer->dma_addr + offset);
116 fbi->screen_size = size; 117 fbi->screen_size = size;
117 fbi->fix.smem_len = size; 118 fbi->fix.smem_len = size;
118 119
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index f2d883f2999e..f5c8b072e497 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -64,7 +64,7 @@ struct fimd_win_data {
64 unsigned int fb_width; 64 unsigned int fb_width;
65 unsigned int fb_height; 65 unsigned int fb_height;
66 unsigned int bpp; 66 unsigned int bpp;
67 dma_addr_t paddr; 67 dma_addr_t dma_addr;
68 void __iomem *vaddr; 68 void __iomem *vaddr;
69 unsigned int buf_offsize; 69 unsigned int buf_offsize;
70 unsigned int line_size; /* bytes */ 70 unsigned int line_size; /* bytes */
@@ -251,7 +251,7 @@ static void fimd_win_mode_set(struct device *dev,
251 win_data->ovl_height = overlay->crtc_height; 251 win_data->ovl_height = overlay->crtc_height;
252 win_data->fb_width = overlay->fb_width; 252 win_data->fb_width = overlay->fb_width;
253 win_data->fb_height = overlay->fb_height; 253 win_data->fb_height = overlay->fb_height;
254 win_data->paddr = overlay->paddr + offset; 254 win_data->dma_addr = overlay->dma_addr + offset;
255 win_data->vaddr = overlay->vaddr + offset; 255 win_data->vaddr = overlay->vaddr + offset;
256 win_data->bpp = overlay->bpp; 256 win_data->bpp = overlay->bpp;
257 win_data->buf_offsize = (overlay->fb_width - overlay->crtc_width) * 257 win_data->buf_offsize = (overlay->fb_width - overlay->crtc_width) *
@@ -263,7 +263,7 @@ static void fimd_win_mode_set(struct device *dev,
263 DRM_DEBUG_KMS("ovl_width = %d, ovl_height = %d\n", 263 DRM_DEBUG_KMS("ovl_width = %d, ovl_height = %d\n",
264 win_data->ovl_width, win_data->ovl_height); 264 win_data->ovl_width, win_data->ovl_height);
265 DRM_DEBUG_KMS("paddr = 0x%lx, vaddr = 0x%lx\n", 265 DRM_DEBUG_KMS("paddr = 0x%lx, vaddr = 0x%lx\n",
266 (unsigned long)win_data->paddr, 266 (unsigned long)win_data->dma_addr,
267 (unsigned long)win_data->vaddr); 267 (unsigned long)win_data->vaddr);
268 DRM_DEBUG_KMS("fb_width = %d, crtc_width = %d\n", 268 DRM_DEBUG_KMS("fb_width = %d, crtc_width = %d\n",
269 overlay->fb_width, overlay->crtc_width); 269 overlay->fb_width, overlay->crtc_width);
@@ -376,16 +376,16 @@ static void fimd_win_commit(struct device *dev)
376 writel(val, ctx->regs + SHADOWCON); 376 writel(val, ctx->regs + SHADOWCON);
377 377
378 /* buffer start address */ 378 /* buffer start address */
379 val = win_data->paddr; 379 val = (unsigned long)win_data->dma_addr;
380 writel(val, ctx->regs + VIDWx_BUF_START(win, 0)); 380 writel(val, ctx->regs + VIDWx_BUF_START(win, 0));
381 381
382 /* buffer end address */ 382 /* buffer end address */
383 size = win_data->fb_width * win_data->ovl_height * (win_data->bpp >> 3); 383 size = win_data->fb_width * win_data->ovl_height * (win_data->bpp >> 3);
384 val = win_data->paddr + size; 384 val = (unsigned long)(win_data->dma_addr + size);
385 writel(val, ctx->regs + VIDWx_BUF_END(win, 0)); 385 writel(val, ctx->regs + VIDWx_BUF_END(win, 0));
386 386
387 DRM_DEBUG_KMS("start addr = 0x%lx, end addr = 0x%lx, size = 0x%lx\n", 387 DRM_DEBUG_KMS("start addr = 0x%lx, end addr = 0x%lx, size = 0x%lx\n",
388 (unsigned long)win_data->paddr, val, size); 388 (unsigned long)win_data->dma_addr, val, size);
389 DRM_DEBUG_KMS("ovl_width = %d, ovl_height = %d\n", 389 DRM_DEBUG_KMS("ovl_width = %d, ovl_height = %d\n",
390 win_data->ovl_width, win_data->ovl_height); 390 win_data->ovl_width, win_data->ovl_height);
391 391
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c
index bd6ede83b684..b1b94b1e4400 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gem.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c
@@ -127,15 +127,15 @@ struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev,
127{ 127{
128 128
129 struct exynos_drm_gem_obj *exynos_gem_obj = NULL; 129 struct exynos_drm_gem_obj *exynos_gem_obj = NULL;
130 struct exynos_drm_buf_entry *entry; 130 struct exynos_drm_gem_buf *buffer;
131 int ret; 131 int ret;
132 132
133 size = roundup(size, PAGE_SIZE); 133 size = roundup(size, PAGE_SIZE);
134 134
135 DRM_DEBUG_KMS("%s: size = 0x%lx\n", __FILE__, size); 135 DRM_DEBUG_KMS("%s: size = 0x%lx\n", __FILE__, size);
136 136
137 entry = exynos_drm_buf_create(dev, size); 137 buffer = exynos_drm_buf_create(dev, size);
138 if (!entry) 138 if (!buffer)
139 return ERR_PTR(-ENOMEM); 139 return ERR_PTR(-ENOMEM);
140 140
141 exynos_gem_obj = exynos_drm_gem_init(dev, file_priv, handle, size); 141 exynos_gem_obj = exynos_drm_gem_init(dev, file_priv, handle, size);
@@ -144,12 +144,12 @@ struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev,
144 goto err_gem_init; 144 goto err_gem_init;
145 } 145 }
146 146
147 exynos_gem_obj->entry = entry; 147 exynos_gem_obj->buffer = buffer;
148 148
149 return exynos_gem_obj; 149 return exynos_gem_obj;
150 150
151err_gem_init: 151err_gem_init:
152 exynos_drm_buf_destroy(dev, exynos_gem_obj->entry); 152 exynos_drm_buf_destroy(dev, exynos_gem_obj->buffer);
153 153
154 return ERR_PTR(ret); 154 return ERR_PTR(ret);
155} 155}
@@ -194,7 +194,7 @@ static int exynos_drm_gem_mmap_buffer(struct file *filp,
194{ 194{
195 struct drm_gem_object *obj = filp->private_data; 195 struct drm_gem_object *obj = filp->private_data;
196 struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj); 196 struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);
197 struct exynos_drm_buf_entry *entry; 197 struct exynos_drm_gem_buf *buffer;
198 unsigned long pfn, vm_size; 198 unsigned long pfn, vm_size;
199 199
200 DRM_DEBUG_KMS("%s\n", __FILE__); 200 DRM_DEBUG_KMS("%s\n", __FILE__);
@@ -206,20 +206,20 @@ static int exynos_drm_gem_mmap_buffer(struct file *filp,
206 206
207 vm_size = vma->vm_end - vma->vm_start; 207 vm_size = vma->vm_end - vma->vm_start;
208 /* 208 /*
209 * a entry contains information to physically continuous memory 209 * a buffer contains information to physically continuous memory
210 * allocated by user request or at framebuffer creation. 210 * allocated by user request or at framebuffer creation.
211 */ 211 */
212 entry = exynos_gem_obj->entry; 212 buffer = exynos_gem_obj->buffer;
213 213
214 /* check if user-requested size is valid. */ 214 /* check if user-requested size is valid. */
215 if (vm_size > entry->size) 215 if (vm_size > buffer->size)
216 return -EINVAL; 216 return -EINVAL;
217 217
218 /* 218 /*
219 * get page frame number to physical memory to be mapped 219 * get page frame number to physical memory to be mapped
220 * to user space. 220 * to user space.
221 */ 221 */
222 pfn = exynos_gem_obj->entry->paddr >> PAGE_SHIFT; 222 pfn = ((unsigned long)exynos_gem_obj->buffer->dma_addr) >> PAGE_SHIFT;
223 223
224 DRM_DEBUG_KMS("pfn = 0x%lx\n", pfn); 224 DRM_DEBUG_KMS("pfn = 0x%lx\n", pfn);
225 225
@@ -300,7 +300,7 @@ void exynos_drm_gem_free_object(struct drm_gem_object *gem_obj)
300 300
301 exynos_gem_obj = to_exynos_gem_obj(gem_obj); 301 exynos_gem_obj = to_exynos_gem_obj(gem_obj);
302 302
303 exynos_drm_buf_destroy(gem_obj->dev, exynos_gem_obj->entry); 303 exynos_drm_buf_destroy(gem_obj->dev, exynos_gem_obj->buffer);
304 304
305 kfree(exynos_gem_obj); 305 kfree(exynos_gem_obj);
306} 306}
@@ -379,7 +379,8 @@ int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
379 379
380 mutex_lock(&dev->struct_mutex); 380 mutex_lock(&dev->struct_mutex);
381 381
382 pfn = (exynos_gem_obj->entry->paddr >> PAGE_SHIFT) + page_offset; 382 pfn = (((unsigned long)exynos_gem_obj->buffer->dma_addr) >>
383 PAGE_SHIFT) + page_offset;
383 384
384 ret = vm_insert_mixed(vma, (unsigned long)vmf->virtual_address, pfn); 385 ret = vm_insert_mixed(vma, (unsigned long)vmf->virtual_address, pfn);
385 386
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h
index 213838d9606e..ef8797334e6d 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gem.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h
@@ -30,13 +30,29 @@
30 struct exynos_drm_gem_obj, base) 30 struct exynos_drm_gem_obj, base)
31 31
32/* 32/*
33 * exynos drm gem buffer structure.
34 *
35 * @kvaddr: kernel virtual address to allocated memory region.
36 * @dma_addr: bus address(accessed by dma) to allocated memory region.
37 * - this address could be physical address without IOMMU and
38 * device address with IOMMU.
39 * @size: size of allocated memory region.
40 */
41struct exynos_drm_gem_buf {
42 void __iomem *kvaddr;
43 dma_addr_t dma_addr;
44 unsigned long size;
45};
46
47/*
33 * exynos drm buffer structure. 48 * exynos drm buffer structure.
34 * 49 *
35 * @base: a gem object. 50 * @base: a gem object.
36 * - a new handle to this gem object would be created 51 * - a new handle to this gem object would be created
37 * by drm_gem_handle_create(). 52 * by drm_gem_handle_create().
38 * @entry: pointer to exynos drm buffer entry object. 53 * @buffer: a pointer to exynos_drm_gem_buffer object.
39 * - containing the information to physically 54 * - contain the information to memory region allocated
55 * by user request or at framebuffer creation.
40 * continuous memory region allocated by user request 56 * continuous memory region allocated by user request
41 * or at framebuffer creation. 57 * or at framebuffer creation.
42 * 58 *
@@ -45,7 +61,7 @@
45 */ 61 */
46struct exynos_drm_gem_obj { 62struct exynos_drm_gem_obj {
47 struct drm_gem_object base; 63 struct drm_gem_object base;
48 struct exynos_drm_buf_entry *entry; 64 struct exynos_drm_gem_buf *buffer;
49}; 65};
50 66
51/* create a new buffer and get a new gem handle. */ 67/* create a new buffer and get a new gem handle. */