From: Mark Yao Date: Wed, 6 Jul 2016 07:09:39 +0000 (+0800) Subject: drm/rockchip: force 8bit mode if vop not support 10bit output X-Git-Tag: firefly_0821_release~2196 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=4e02dd067fe69ba119bfb3beef3f7cbfb7e5abeb;p=firefly-linux-kernel-4.4.55.git drm/rockchip: force 8bit mode if vop not support 10bit output Some vop can't support 10bit mode, if connector needs 10bit output, force to use 8bit rgb888 mode, because the hardware would do the format convert. Change-Id: I8cdfbab12dd0ad63d36f3c52a4c7786a2bdbe6a1 Signed-off-by: Mark Yao --- diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index 5375df350223..2ad0c89a5d71 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c @@ -169,8 +169,6 @@ rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder, struct drm_connector_state *conn_state) { struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); - struct rockchip_dp_device *dp = to_dp(encoder); - int ret; /* * The hardware IC designed that VOP must output the RGB10 video @@ -179,28 +177,7 @@ rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder, * contoller, that's why we need to hardcode the VOP output mode * to RGA10 here. */ - - ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); - if (ret < 0) - return true; - - switch (dp->data->chip_type) { - case RK3399_EDP: - /* - * For RK3399, VOP Lit must code the out mode to RGB888, - * VOP Big must code the out mode to RGB10. - */ - if (ret) - s->output_mode = ROCKCHIP_OUT_MODE_P888; - else - s->output_mode = ROCKCHIP_OUT_MODE_AAAA; - break; - - default: - s->output_mode = ROCKCHIP_OUT_MODE_AAAA; - break; - } - + s->output_mode = ROCKCHIP_OUT_MODE_AAAA; s->output_type = DRM_MODE_CONNECTOR_eDP; return 0; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index b6eb2b0163ac..58fdb6d98629 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -990,6 +990,7 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc, static void vop_crtc_enable(struct drm_crtc *crtc) { struct vop *vop = to_vop(crtc); + const struct vop_data *vop_data = vop->data; struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode; u16 hsync_len = adjusted_mode->hsync_end - adjusted_mode->hsync_start; @@ -1065,6 +1066,11 @@ static void vop_crtc_enable(struct drm_crtc *crtc) default: DRM_ERROR("unsupport connector_type[%d]\n", s->output_type); } + + if (s->output_mode == ROCKCHIP_OUT_MODE_AAAA && + !(vop_data->feature & VOP_FEATURE_OUTPUT_10BIT)) + s->output_mode = ROCKCHIP_OUT_MODE_P888; + VOP_CTRL_SET(vop, out_mode, s->output_mode); VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len); diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index 4b8f14207687..fec8e1d688c5 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -134,6 +134,8 @@ struct vop_win_data { unsigned int area_size; }; +#define VOP_FEATURE_OUTPUT_10BIT BIT(0) + struct vop_data { const struct vop_reg_data *init_table; unsigned int table_size; @@ -141,6 +143,7 @@ struct vop_data { const struct vop_intr *intr; const struct vop_win_data *win; unsigned int win_size; + u64 feature; }; /* interrupt define */ diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index a3346ba168e4..13ce349be414 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -226,6 +226,7 @@ static const struct vop_intr rk3288_vop_intr = { }; static const struct vop_data rk3288_vop = { + .feature = VOP_FEATURE_OUTPUT_10BIT, .init_table = rk3288_init_reg_table, .table_size = ARRAY_SIZE(rk3288_init_reg_table), .intr = &rk3288_vop_intr, @@ -358,6 +359,7 @@ static const struct vop_win_data rk3399_vop_win_data[] = { }; static const struct vop_data rk3399_vop_big = { + .feature = VOP_FEATURE_OUTPUT_10BIT, .init_table = rk3399_init_reg_table, .table_size = ARRAY_SIZE(rk3399_init_reg_table), .intr = &rk3399_vop_intr,