diff options
author | Dave Airlie <airlied@redhat.com> | 2015-07-16 20:25:02 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2015-07-16 20:25:02 -0400 |
commit | aaab3bbab8bf847fb390dd7033e7d049fd9c7325 (patch) | |
tree | a86abf51ade0307d3b2dde21e19c692097d97a78 | |
parent | e1e50e1e1e2d0e515527f0f10b1c495100e582d1 (diff) | |
parent | 0915da7dd75f0f5f38dc9b82415417e7a2b40385 (diff) |
Merge branch 'drm-rockchip-2015-07-13' of https://github.com/markyzq/kernel-drm-rockchip into drm-fixes
misc rockchip fixes.
* 'drm-rockchip-2015-07-13' of https://github.com/markyzq/kernel-drm-rockchip:
drm/rockchip: vop: remove hardware cursor window
drm/rockchip: vop: switch cursor plane to window 3
drm/rockchip: Drop owner assignment from platform_driver
drm/rockchip: use drm_gem_mmap helpers
drm/rockchip: only call drm_fb_helper_hotplug_event if fb_helper present
drm/rockchip: Add BGR formats to VOP
-rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 49 |
3 files changed, 38 insertions, 15 deletions
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 01b558fe3695..9a0c2911272a 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c | |||
@@ -555,7 +555,6 @@ static struct platform_driver rockchip_drm_platform_driver = { | |||
555 | .probe = rockchip_drm_platform_probe, | 555 | .probe = rockchip_drm_platform_probe, |
556 | .remove = rockchip_drm_platform_remove, | 556 | .remove = rockchip_drm_platform_remove, |
557 | .driver = { | 557 | .driver = { |
558 | .owner = THIS_MODULE, | ||
559 | .name = "rockchip-drm", | 558 | .name = "rockchip-drm", |
560 | .of_match_table = rockchip_drm_dt_ids, | 559 | .of_match_table = rockchip_drm_dt_ids, |
561 | .pm = &rockchip_drm_pm_ops, | 560 | .pm = &rockchip_drm_pm_ops, |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c index 77d52893d40f..002645bb5bbf 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c | |||
@@ -162,7 +162,8 @@ static void rockchip_drm_output_poll_changed(struct drm_device *dev) | |||
162 | struct rockchip_drm_private *private = dev->dev_private; | 162 | struct rockchip_drm_private *private = dev->dev_private; |
163 | struct drm_fb_helper *fb_helper = &private->fbdev_helper; | 163 | struct drm_fb_helper *fb_helper = &private->fbdev_helper; |
164 | 164 | ||
165 | drm_fb_helper_hotplug_event(fb_helper); | 165 | if (fb_helper) |
166 | drm_fb_helper_hotplug_event(fb_helper); | ||
166 | } | 167 | } |
167 | 168 | ||
168 | static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = { | 169 | static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = { |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index dc65161d7cad..34b78e736532 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c | |||
@@ -170,6 +170,7 @@ struct vop_win_phy { | |||
170 | 170 | ||
171 | struct vop_reg enable; | 171 | struct vop_reg enable; |
172 | struct vop_reg format; | 172 | struct vop_reg format; |
173 | struct vop_reg rb_swap; | ||
173 | struct vop_reg act_info; | 174 | struct vop_reg act_info; |
174 | struct vop_reg dsp_info; | 175 | struct vop_reg dsp_info; |
175 | struct vop_reg dsp_st; | 176 | struct vop_reg dsp_st; |
@@ -199,8 +200,12 @@ struct vop_data { | |||
199 | static const uint32_t formats_01[] = { | 200 | static const uint32_t formats_01[] = { |
200 | DRM_FORMAT_XRGB8888, | 201 | DRM_FORMAT_XRGB8888, |
201 | DRM_FORMAT_ARGB8888, | 202 | DRM_FORMAT_ARGB8888, |
203 | DRM_FORMAT_XBGR8888, | ||
204 | DRM_FORMAT_ABGR8888, | ||
202 | DRM_FORMAT_RGB888, | 205 | DRM_FORMAT_RGB888, |
206 | DRM_FORMAT_BGR888, | ||
203 | DRM_FORMAT_RGB565, | 207 | DRM_FORMAT_RGB565, |
208 | DRM_FORMAT_BGR565, | ||
204 | DRM_FORMAT_NV12, | 209 | DRM_FORMAT_NV12, |
205 | DRM_FORMAT_NV16, | 210 | DRM_FORMAT_NV16, |
206 | DRM_FORMAT_NV24, | 211 | DRM_FORMAT_NV24, |
@@ -209,8 +214,12 @@ static const uint32_t formats_01[] = { | |||
209 | static const uint32_t formats_234[] = { | 214 | static const uint32_t formats_234[] = { |
210 | DRM_FORMAT_XRGB8888, | 215 | DRM_FORMAT_XRGB8888, |
211 | DRM_FORMAT_ARGB8888, | 216 | DRM_FORMAT_ARGB8888, |
217 | DRM_FORMAT_XBGR8888, | ||
218 | DRM_FORMAT_ABGR8888, | ||
212 | DRM_FORMAT_RGB888, | 219 | DRM_FORMAT_RGB888, |
220 | DRM_FORMAT_BGR888, | ||
213 | DRM_FORMAT_RGB565, | 221 | DRM_FORMAT_RGB565, |
222 | DRM_FORMAT_BGR565, | ||
214 | }; | 223 | }; |
215 | 224 | ||
216 | static const struct vop_win_phy win01_data = { | 225 | static const struct vop_win_phy win01_data = { |
@@ -218,6 +227,7 @@ static const struct vop_win_phy win01_data = { | |||
218 | .nformats = ARRAY_SIZE(formats_01), | 227 | .nformats = ARRAY_SIZE(formats_01), |
219 | .enable = VOP_REG(WIN0_CTRL0, 0x1, 0), | 228 | .enable = VOP_REG(WIN0_CTRL0, 0x1, 0), |
220 | .format = VOP_REG(WIN0_CTRL0, 0x7, 1), | 229 | .format = VOP_REG(WIN0_CTRL0, 0x7, 1), |
230 | .rb_swap = VOP_REG(WIN0_CTRL0, 0x1, 12), | ||
221 | .act_info = VOP_REG(WIN0_ACT_INFO, 0x1fff1fff, 0), | 231 | .act_info = VOP_REG(WIN0_ACT_INFO, 0x1fff1fff, 0), |
222 | .dsp_info = VOP_REG(WIN0_DSP_INFO, 0x0fff0fff, 0), | 232 | .dsp_info = VOP_REG(WIN0_DSP_INFO, 0x0fff0fff, 0), |
223 | .dsp_st = VOP_REG(WIN0_DSP_ST, 0x1fff1fff, 0), | 233 | .dsp_st = VOP_REG(WIN0_DSP_ST, 0x1fff1fff, 0), |
@@ -234,6 +244,7 @@ static const struct vop_win_phy win23_data = { | |||
234 | .nformats = ARRAY_SIZE(formats_234), | 244 | .nformats = ARRAY_SIZE(formats_234), |
235 | .enable = VOP_REG(WIN2_CTRL0, 0x1, 0), | 245 | .enable = VOP_REG(WIN2_CTRL0, 0x1, 0), |
236 | .format = VOP_REG(WIN2_CTRL0, 0x7, 1), | 246 | .format = VOP_REG(WIN2_CTRL0, 0x7, 1), |
247 | .rb_swap = VOP_REG(WIN2_CTRL0, 0x1, 12), | ||
237 | .dsp_info = VOP_REG(WIN2_DSP_INFO0, 0x0fff0fff, 0), | 248 | .dsp_info = VOP_REG(WIN2_DSP_INFO0, 0x0fff0fff, 0), |
238 | .dsp_st = VOP_REG(WIN2_DSP_ST0, 0x1fff1fff, 0), | 249 | .dsp_st = VOP_REG(WIN2_DSP_ST0, 0x1fff1fff, 0), |
239 | .yrgb_mst = VOP_REG(WIN2_MST0, 0xffffffff, 0), | 250 | .yrgb_mst = VOP_REG(WIN2_MST0, 0xffffffff, 0), |
@@ -242,15 +253,6 @@ static const struct vop_win_phy win23_data = { | |||
242 | .dst_alpha_ctl = VOP_REG(WIN2_DST_ALPHA_CTRL, 0xff, 0), | 253 | .dst_alpha_ctl = VOP_REG(WIN2_DST_ALPHA_CTRL, 0xff, 0), |
243 | }; | 254 | }; |
244 | 255 | ||
245 | static const struct vop_win_phy cursor_data = { | ||
246 | .data_formats = formats_234, | ||
247 | .nformats = ARRAY_SIZE(formats_234), | ||
248 | .enable = VOP_REG(HWC_CTRL0, 0x1, 0), | ||
249 | .format = VOP_REG(HWC_CTRL0, 0x7, 1), | ||
250 | .dsp_st = VOP_REG(HWC_DSP_ST, 0x1fff1fff, 0), | ||
251 | .yrgb_mst = VOP_REG(HWC_MST, 0xffffffff, 0), | ||
252 | }; | ||
253 | |||
254 | static const struct vop_ctrl ctrl_data = { | 256 | static const struct vop_ctrl ctrl_data = { |
255 | .standby = VOP_REG(SYS_CTRL, 0x1, 22), | 257 | .standby = VOP_REG(SYS_CTRL, 0x1, 22), |
256 | .gate_en = VOP_REG(SYS_CTRL, 0x1, 23), | 258 | .gate_en = VOP_REG(SYS_CTRL, 0x1, 23), |
@@ -282,14 +284,14 @@ static const struct vop_reg_data vop_init_reg_table[] = { | |||
282 | /* | 284 | /* |
283 | * Note: rk3288 has a dedicated 'cursor' window, however, that window requires | 285 | * Note: rk3288 has a dedicated 'cursor' window, however, that window requires |
284 | * special support to get alpha blending working. For now, just use overlay | 286 | * special support to get alpha blending working. For now, just use overlay |
285 | * window 1 for the drm cursor. | 287 | * window 3 for the drm cursor. |
288 | * | ||
286 | */ | 289 | */ |
287 | static const struct vop_win_data rk3288_vop_win_data[] = { | 290 | static const struct vop_win_data rk3288_vop_win_data[] = { |
288 | { .base = 0x00, .phy = &win01_data, .type = DRM_PLANE_TYPE_PRIMARY }, | 291 | { .base = 0x00, .phy = &win01_data, .type = DRM_PLANE_TYPE_PRIMARY }, |
289 | { .base = 0x40, .phy = &win01_data, .type = DRM_PLANE_TYPE_CURSOR }, | 292 | { .base = 0x40, .phy = &win01_data, .type = DRM_PLANE_TYPE_OVERLAY }, |
290 | { .base = 0x00, .phy = &win23_data, .type = DRM_PLANE_TYPE_OVERLAY }, | 293 | { .base = 0x00, .phy = &win23_data, .type = DRM_PLANE_TYPE_OVERLAY }, |
291 | { .base = 0x50, .phy = &win23_data, .type = DRM_PLANE_TYPE_OVERLAY }, | 294 | { .base = 0x50, .phy = &win23_data, .type = DRM_PLANE_TYPE_CURSOR }, |
292 | { .base = 0x00, .phy = &cursor_data, .type = DRM_PLANE_TYPE_OVERLAY }, | ||
293 | }; | 295 | }; |
294 | 296 | ||
295 | static const struct vop_data rk3288_vop = { | 297 | static const struct vop_data rk3288_vop = { |
@@ -352,15 +354,32 @@ static inline void vop_mask_write_relaxed(struct vop *vop, uint32_t offset, | |||
352 | } | 354 | } |
353 | } | 355 | } |
354 | 356 | ||
357 | static bool has_rb_swapped(uint32_t format) | ||
358 | { | ||
359 | switch (format) { | ||
360 | case DRM_FORMAT_XBGR8888: | ||
361 | case DRM_FORMAT_ABGR8888: | ||
362 | case DRM_FORMAT_BGR888: | ||
363 | case DRM_FORMAT_BGR565: | ||
364 | return true; | ||
365 | default: | ||
366 | return false; | ||
367 | } | ||
368 | } | ||
369 | |||
355 | static enum vop_data_format vop_convert_format(uint32_t format) | 370 | static enum vop_data_format vop_convert_format(uint32_t format) |
356 | { | 371 | { |
357 | switch (format) { | 372 | switch (format) { |
358 | case DRM_FORMAT_XRGB8888: | 373 | case DRM_FORMAT_XRGB8888: |
359 | case DRM_FORMAT_ARGB8888: | 374 | case DRM_FORMAT_ARGB8888: |
375 | case DRM_FORMAT_XBGR8888: | ||
376 | case DRM_FORMAT_ABGR8888: | ||
360 | return VOP_FMT_ARGB8888; | 377 | return VOP_FMT_ARGB8888; |
361 | case DRM_FORMAT_RGB888: | 378 | case DRM_FORMAT_RGB888: |
379 | case DRM_FORMAT_BGR888: | ||
362 | return VOP_FMT_RGB888; | 380 | return VOP_FMT_RGB888; |
363 | case DRM_FORMAT_RGB565: | 381 | case DRM_FORMAT_RGB565: |
382 | case DRM_FORMAT_BGR565: | ||
364 | return VOP_FMT_RGB565; | 383 | return VOP_FMT_RGB565; |
365 | case DRM_FORMAT_NV12: | 384 | case DRM_FORMAT_NV12: |
366 | return VOP_FMT_YUV420SP; | 385 | return VOP_FMT_YUV420SP; |
@@ -378,6 +397,7 @@ static bool is_alpha_support(uint32_t format) | |||
378 | { | 397 | { |
379 | switch (format) { | 398 | switch (format) { |
380 | case DRM_FORMAT_ARGB8888: | 399 | case DRM_FORMAT_ARGB8888: |
400 | case DRM_FORMAT_ABGR8888: | ||
381 | return true; | 401 | return true; |
382 | default: | 402 | default: |
383 | return false; | 403 | return false; |
@@ -588,6 +608,7 @@ static int vop_update_plane_event(struct drm_plane *plane, | |||
588 | enum vop_data_format format; | 608 | enum vop_data_format format; |
589 | uint32_t val; | 609 | uint32_t val; |
590 | bool is_alpha; | 610 | bool is_alpha; |
611 | bool rb_swap; | ||
591 | bool visible; | 612 | bool visible; |
592 | int ret; | 613 | int ret; |
593 | struct drm_rect dest = { | 614 | struct drm_rect dest = { |
@@ -621,6 +642,7 @@ static int vop_update_plane_event(struct drm_plane *plane, | |||
621 | return 0; | 642 | return 0; |
622 | 643 | ||
623 | is_alpha = is_alpha_support(fb->pixel_format); | 644 | is_alpha = is_alpha_support(fb->pixel_format); |
645 | rb_swap = has_rb_swapped(fb->pixel_format); | ||
624 | format = vop_convert_format(fb->pixel_format); | 646 | format = vop_convert_format(fb->pixel_format); |
625 | if (format < 0) | 647 | if (format < 0) |
626 | return format; | 648 | return format; |
@@ -689,6 +711,7 @@ static int vop_update_plane_event(struct drm_plane *plane, | |||
689 | val = (dsp_sty - 1) << 16; | 711 | val = (dsp_sty - 1) << 16; |
690 | val |= (dsp_stx - 1) & 0xffff; | 712 | val |= (dsp_stx - 1) & 0xffff; |
691 | VOP_WIN_SET(vop, win, dsp_st, val); | 713 | VOP_WIN_SET(vop, win, dsp_st, val); |
714 | VOP_WIN_SET(vop, win, rb_swap, rb_swap); | ||
692 | 715 | ||
693 | if (is_alpha) { | 716 | if (is_alpha) { |
694 | VOP_WIN_SET(vop, win, dst_alpha_ctl, | 717 | VOP_WIN_SET(vop, win, dst_alpha_ctl, |