diff options
| -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; |
