aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2015-07-16 20:25:02 -0400
committerDave Airlie <airlied@redhat.com>2015-07-16 20:25:02 -0400
commitaaab3bbab8bf847fb390dd7033e7d049fd9c7325 (patch)
treea86abf51ade0307d3b2dde21e19c692097d97a78
parente1e50e1e1e2d0e515527f0f10b1c495100e582d1 (diff)
parent0915da7dd75f0f5f38dc9b82415417e7a2b40385 (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.c1
-rw-r--r--drivers/gpu/drm/rockchip/rockchip_drm_fb.c3
-rw-r--r--drivers/gpu/drm/rockchip/rockchip_drm_vop.c49
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
168static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = { 169static 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 {
199static const uint32_t formats_01[] = { 200static 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[] = {
209static const uint32_t formats_234[] = { 214static 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
216static const struct vop_win_phy win01_data = { 225static 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
245static 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
254static const struct vop_ctrl ctrl_data = { 256static 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 */
287static const struct vop_win_data rk3288_vop_win_data[] = { 290static 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
295static const struct vop_data rk3288_vop = { 297static 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
357static 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
355static enum vop_data_format vop_convert_format(uint32_t format) 370static 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,