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 <mark.yao@rock-chips.com>
This commit is contained in:
Mark Yao
2016-07-06 15:09:39 +08:00
committed by Huang, Tao
parent 0ac5bfd6d9
commit 4e02dd067f
4 changed files with 12 additions and 24 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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,