diff options
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_buf.c | 60 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_buf.h | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_crtc.c | 47 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_crtc.h | 25 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_drv.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fb.c | 48 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fimd.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gem.c | 25 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gem.h | 22 |
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 | ||
32 | static int lowlevel_buffer_allocate(struct drm_device *dev, | 33 | static 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 | ||
50 | static void lowlevel_buffer_deallocate(struct drm_device *dev, | 53 | static 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 | ||
62 | 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, |
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 | ||
90 | void exynos_drm_buf_destroy(struct drm_device *dev, | 94 | void 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 | ||
106 | MODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>"); | 110 | MODULE_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 | */ | ||
36 | struct 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. */ |
43 | struct exynos_drm_buf_entry *exynos_drm_buf_create(struct drm_device *dev, | 30 | struct 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. */ |
47 | struct exynos_drm_buf_entry *exynos_drm_fb_get_buf(struct drm_framebuffer *fb); | 34 | struct 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. */ |
50 | void exynos_drm_buf_destroy(struct drm_device *dev, | 37 | void 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 | */ | ||
52 | struct 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 | ||
92 | static int exynos_drm_overlay_update(struct exynos_drm_overlay *overlay, | 73 | int 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); | |||
35 | int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc); | 35 | int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int crtc); |
36 | void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int crtc); | 36 | void 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 | */ | ||
50 | struct 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 | |||
59 | int 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 | */ |
50 | struct exynos_drm_fb { | 50 | struct 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 | ||
56 | static void exynos_drm_fb_destroy(struct drm_framebuffer *fb) | 56 | static 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 | ||
200 | out: | 200 | out: |
@@ -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 | ||
225 | struct exynos_drm_buf_entry *exynos_drm_fb_get_buf(struct drm_framebuffer *fb) | 225 | struct 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 | ||
243 | static void exynos_drm_output_poll_changed(struct drm_device *dev) | 243 | static 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 | ||
151 | err_gem_init: | 151 | err_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 | */ | ||
41 | struct 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 | */ |
46 | struct exynos_drm_gem_obj { | 62 | struct 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. */ |