diff options
author | Joonyoung Shim <jy0922.shim@samsung.com> | 2011-12-13 00:46:57 -0500 |
---|---|---|
committer | Inki Dae <inki.dae@samsung.com> | 2011-12-28 21:21:41 -0500 |
commit | e1533c086fc882474fb339953082072bec8c4e71 (patch) | |
tree | 2881b0bea84ab83258bbb4b2ade5e2d4c8b9da3b /drivers/gpu/drm/exynos/exynos_drm_fb.c | |
parent | 2364839a1aca677842b0dfd7ed0449acda3c3175 (diff) |
drm/exynos: remove buffer creation of fbdev from drm framebuffer creation
The fbdev fb and the user fb is created from same function -
exynos_drm_fb_create, but this function creates not only drm framebuffer
but buffer of fbdev. Remove it because it complicates codes and use
exynos_drm_gem_create() than exynos_drm_buf_create() to create buffer of
fbdev, it give better consistency of codes and more clear
implementation.
Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_fb.c')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fb.c | 136 |
1 files changed, 27 insertions, 109 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c index 5231759dfd47..8f36ae5e5d71 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c | |||
@@ -43,14 +43,10 @@ | |||
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 | * @buffer: pointer to exynos_drm_gem_buffer object. | ||
47 | * - contain the memory information to memory region allocated | ||
48 | * at default framebuffer creation. | ||
49 | */ | 46 | */ |
50 | struct exynos_drm_fb { | 47 | struct exynos_drm_fb { |
51 | struct drm_framebuffer fb; | 48 | struct drm_framebuffer fb; |
52 | struct exynos_drm_gem_obj *exynos_gem_obj; | 49 | struct exynos_drm_gem_obj *exynos_gem_obj; |
53 | struct exynos_drm_gem_buf *buffer; | ||
54 | }; | 50 | }; |
55 | 51 | ||
56 | static void exynos_drm_fb_destroy(struct drm_framebuffer *fb) | 52 | static void exynos_drm_fb_destroy(struct drm_framebuffer *fb) |
@@ -61,13 +57,6 @@ static void exynos_drm_fb_destroy(struct drm_framebuffer *fb) | |||
61 | 57 | ||
62 | drm_framebuffer_cleanup(fb); | 58 | drm_framebuffer_cleanup(fb); |
63 | 59 | ||
64 | /* | ||
65 | * default framebuffer has no gem object so | ||
66 | * a buffer of the default framebuffer should be released at here. | ||
67 | */ | ||
68 | if (!exynos_fb->exynos_gem_obj && exynos_fb->buffer) | ||
69 | exynos_drm_buf_destroy(fb->dev, exynos_fb->buffer); | ||
70 | |||
71 | kfree(exynos_fb); | 60 | kfree(exynos_fb); |
72 | exynos_fb = NULL; | 61 | exynos_fb = NULL; |
73 | } | 62 | } |
@@ -102,120 +91,49 @@ static struct drm_framebuffer_funcs exynos_drm_fb_funcs = { | |||
102 | .dirty = exynos_drm_fb_dirty, | 91 | .dirty = exynos_drm_fb_dirty, |
103 | }; | 92 | }; |
104 | 93 | ||
105 | static struct drm_framebuffer * | 94 | struct drm_framebuffer * |
106 | exynos_drm_fb_init(struct drm_file *file_priv, struct drm_device *dev, | 95 | exynos_drm_framebuffer_init(struct drm_device *dev, |
107 | struct drm_mode_fb_cmd2 *mode_cmd) | 96 | struct drm_mode_fb_cmd2 *mode_cmd, |
97 | struct drm_gem_object *obj) | ||
108 | { | 98 | { |
109 | struct exynos_drm_fb *exynos_fb; | 99 | struct exynos_drm_fb *exynos_fb; |
110 | struct drm_framebuffer *fb; | ||
111 | struct exynos_drm_gem_obj *exynos_gem_obj = NULL; | ||
112 | struct drm_gem_object *obj; | ||
113 | unsigned int size; | ||
114 | int ret; | 100 | int ret; |
115 | 101 | ||
116 | DRM_DEBUG_KMS("%s\n", __FILE__); | ||
117 | |||
118 | DRM_LOG_KMS("drm fb create(%dx%d)\n", | ||
119 | mode_cmd->width, mode_cmd->height); | ||
120 | |||
121 | exynos_fb = kzalloc(sizeof(*exynos_fb), GFP_KERNEL); | 102 | exynos_fb = kzalloc(sizeof(*exynos_fb), GFP_KERNEL); |
122 | if (!exynos_fb) { | 103 | if (!exynos_fb) { |
123 | DRM_ERROR("failed to allocate exynos drm framebuffer.\n"); | 104 | DRM_ERROR("failed to allocate exynos drm framebuffer\n"); |
124 | return ERR_PTR(-ENOMEM); | 105 | return ERR_PTR(-ENOMEM); |
125 | } | 106 | } |
126 | 107 | ||
127 | fb = &exynos_fb->fb; | 108 | ret = drm_framebuffer_init(dev, &exynos_fb->fb, &exynos_drm_fb_funcs); |
128 | ret = drm_framebuffer_init(dev, fb, &exynos_drm_fb_funcs); | ||
129 | if (ret) { | 109 | if (ret) { |
130 | DRM_ERROR("failed to initialize framebuffer.\n"); | 110 | DRM_ERROR("failed to initialize framebuffer\n"); |
131 | goto err_init; | 111 | return ERR_PTR(ret); |
132 | } | 112 | } |
133 | 113 | ||
134 | DRM_LOG_KMS("create: fb id: %d\n", fb->base.id); | 114 | drm_helper_mode_fill_fb_struct(&exynos_fb->fb, mode_cmd); |
135 | 115 | exynos_fb->exynos_gem_obj = to_exynos_gem_obj(obj); | |
136 | size = mode_cmd->pitches[0] * mode_cmd->height; | ||
137 | |||
138 | /* | ||
139 | * mode_cmd->handles[0] could be NULL at booting time or | ||
140 | * with user request. if NULL, a new buffer or a gem object | ||
141 | * would be allocated. | ||
142 | */ | ||
143 | if (!mode_cmd->handles[0]) { | ||
144 | if (!file_priv) { | ||
145 | struct exynos_drm_gem_buf *buffer; | ||
146 | |||
147 | /* | ||
148 | * in case that file_priv is NULL, it allocates | ||
149 | * only buffer and this buffer would be used | ||
150 | * for default framebuffer. | ||
151 | */ | ||
152 | buffer = exynos_drm_buf_create(dev, size); | ||
153 | if (!buffer) { | ||
154 | ret = -ENOMEM; | ||
155 | goto err_buffer; | ||
156 | } | ||
157 | |||
158 | exynos_fb->buffer = buffer; | ||
159 | |||
160 | DRM_LOG_KMS("default: dma_addr = 0x%lx, size = 0x%x\n", | ||
161 | (unsigned long)buffer->dma_addr, size); | ||
162 | |||
163 | goto out; | ||
164 | } else { | ||
165 | exynos_gem_obj = exynos_drm_gem_create(dev, size); | ||
166 | if (IS_ERR(exynos_gem_obj)) { | ||
167 | ret = PTR_ERR(exynos_gem_obj); | ||
168 | goto err_buffer; | ||
169 | } | ||
170 | } | ||
171 | } else { | ||
172 | obj = drm_gem_object_lookup(dev, file_priv, | ||
173 | mode_cmd->handles[0]); | ||
174 | if (!obj) { | ||
175 | DRM_ERROR("failed to lookup gem object.\n"); | ||
176 | goto err_buffer; | ||
177 | } | ||
178 | |||
179 | exynos_gem_obj = to_exynos_gem_obj(obj); | ||
180 | |||
181 | drm_gem_object_unreference_unlocked(obj); | ||
182 | } | ||
183 | |||
184 | /* | ||
185 | * if got a exynos_gem_obj from either a handle or | ||
186 | * a new creation then exynos_fb->exynos_gem_obj is NULL | ||
187 | * so that default framebuffer has no its own gem object, | ||
188 | * only its own buffer object. | ||
189 | */ | ||
190 | exynos_fb->buffer = exynos_gem_obj->buffer; | ||
191 | |||
192 | DRM_LOG_KMS("dma_addr = 0x%lx, size = 0x%x, gem object = 0x%x\n", | ||
193 | (unsigned long)exynos_fb->buffer->dma_addr, size, | ||
194 | (unsigned int)&exynos_gem_obj->base); | ||
195 | |||
196 | out: | ||
197 | exynos_fb->exynos_gem_obj = exynos_gem_obj; | ||
198 | |||
199 | drm_helper_mode_fill_fb_struct(fb, mode_cmd); | ||
200 | 116 | ||
201 | return fb; | 117 | return &exynos_fb->fb; |
202 | |||
203 | err_buffer: | ||
204 | drm_framebuffer_cleanup(fb); | ||
205 | |||
206 | err_init: | ||
207 | kfree(exynos_fb); | ||
208 | |||
209 | return ERR_PTR(ret); | ||
210 | } | 118 | } |
211 | 119 | ||
212 | struct drm_framebuffer *exynos_drm_fb_create(struct drm_device *dev, | 120 | static struct drm_framebuffer * |
213 | struct drm_file *file_priv, | 121 | exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, |
214 | struct drm_mode_fb_cmd2 *mode_cmd) | 122 | struct drm_mode_fb_cmd2 *mode_cmd) |
215 | { | 123 | { |
124 | struct drm_gem_object *obj; | ||
125 | |||
216 | DRM_DEBUG_KMS("%s\n", __FILE__); | 126 | DRM_DEBUG_KMS("%s\n", __FILE__); |
217 | 127 | ||
218 | return exynos_drm_fb_init(file_priv, dev, mode_cmd); | 128 | obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]); |
129 | if (!obj) { | ||
130 | DRM_ERROR("failed to lookup gem object\n"); | ||
131 | return ERR_PTR(-ENOENT); | ||
132 | } | ||
133 | |||
134 | drm_gem_object_unreference_unlocked(obj); | ||
135 | |||
136 | return exynos_drm_framebuffer_init(dev, mode_cmd, obj); | ||
219 | } | 137 | } |
220 | 138 | ||
221 | struct exynos_drm_gem_buf *exynos_drm_fb_get_buf(struct drm_framebuffer *fb) | 139 | struct exynos_drm_gem_buf *exynos_drm_fb_get_buf(struct drm_framebuffer *fb) |
@@ -225,7 +143,7 @@ struct exynos_drm_gem_buf *exynos_drm_fb_get_buf(struct drm_framebuffer *fb) | |||
225 | 143 | ||
226 | DRM_DEBUG_KMS("%s\n", __FILE__); | 144 | DRM_DEBUG_KMS("%s\n", __FILE__); |
227 | 145 | ||
228 | buffer = exynos_fb->buffer; | 146 | buffer = exynos_fb->exynos_gem_obj->buffer; |
229 | if (!buffer) | 147 | if (!buffer) |
230 | return NULL; | 148 | return NULL; |
231 | 149 | ||
@@ -246,7 +164,7 @@ static void exynos_drm_output_poll_changed(struct drm_device *dev) | |||
246 | } | 164 | } |
247 | 165 | ||
248 | static struct drm_mode_config_funcs exynos_drm_mode_config_funcs = { | 166 | static struct drm_mode_config_funcs exynos_drm_mode_config_funcs = { |
249 | .fb_create = exynos_drm_fb_create, | 167 | .fb_create = exynos_user_fb_create, |
250 | .output_poll_changed = exynos_drm_output_poll_changed, | 168 | .output_poll_changed = exynos_drm_output_poll_changed, |
251 | }; | 169 | }; |
252 | 170 | ||