aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm')
-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. */