drm/rockchip: Correct vop out_mode configure

Force vop output mode on encoder driver seem not a good idea,

EDP, HDMI, DisplayPort all have 10bit input on rk3399,
On non-10bit vop, vop 8bit output bit[0-7] connect to the
encoder high 8bit [2-9].

So force RGB10 to RGB888 on vop driver would be better.

And another problem, EDP check crtc id on atomic_check,
but encoder maybe NULL, so out_mode configure would fail,
it cause edp no display.

Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
Reviewed-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1495885416-22216-1-git-send-email-mark.yao@rock-chips.com
This commit is contained in:
Mark yao 2017-05-27 19:43:36 +08:00 committed by Mark Yao
parent 82bc9a42cf
commit efd11cc8fa
5 changed files with 15 additions and 19 deletions

View file

@ -245,8 +245,6 @@ rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder,
struct drm_connector_state *conn_state) struct drm_connector_state *conn_state)
{ {
struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_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 * The hardware IC designed that VOP must output the RGB10 video
@ -258,16 +256,6 @@ rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder,
s->output_mode = ROCKCHIP_OUT_MODE_AAAA; s->output_mode = ROCKCHIP_OUT_MODE_AAAA;
s->output_type = DRM_MODE_CONNECTOR_eDP; s->output_type = DRM_MODE_CONNECTOR_eDP;
if (dp->data->chip_type == RK3399_EDP) {
/*
* For RK3399, VOP Lit must code the out mode to RGB888,
* VOP Big must code the out mode to RGB10.
*/
ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node,
encoder);
if (ret > 0)
s->output_mode = ROCKCHIP_OUT_MODE_P888;
}
return 0; return 0;
} }

View file

@ -615,7 +615,6 @@ static void cdn_dp_encoder_enable(struct drm_encoder *encoder)
{ {
struct cdn_dp_device *dp = encoder_to_dp(encoder); struct cdn_dp_device *dp = encoder_to_dp(encoder);
int ret, val; int ret, val;
struct rockchip_crtc_state *state;
ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder);
if (ret < 0) { if (ret < 0) {
@ -625,14 +624,10 @@ static void cdn_dp_encoder_enable(struct drm_encoder *encoder)
DRM_DEV_DEBUG_KMS(dp->dev, "vop %s output to cdn-dp\n", DRM_DEV_DEBUG_KMS(dp->dev, "vop %s output to cdn-dp\n",
(ret) ? "LIT" : "BIG"); (ret) ? "LIT" : "BIG");
state = to_rockchip_crtc_state(encoder->crtc->state); if (ret)
if (ret) {
val = DP_SEL_VOP_LIT | (DP_SEL_VOP_LIT << 16); val = DP_SEL_VOP_LIT | (DP_SEL_VOP_LIT << 16);
state->output_mode = ROCKCHIP_OUT_MODE_P888; else
} else {
val = DP_SEL_VOP_LIT << 16; val = DP_SEL_VOP_LIT << 16;
state->output_mode = ROCKCHIP_OUT_MODE_AAAA;
}
ret = cdn_dp_grf_write(dp, GRF_SOC_CON9, val); ret = cdn_dp_grf_write(dp, GRF_SOC_CON9, val);
if (ret) if (ret)

View file

@ -875,6 +875,7 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
static void vop_crtc_enable(struct drm_crtc *crtc) static void vop_crtc_enable(struct drm_crtc *crtc)
{ {
struct vop *vop = to_vop(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 rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode; struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode;
u16 hsync_len = adjusted_mode->hsync_end - adjusted_mode->hsync_start; u16 hsync_len = adjusted_mode->hsync_end - adjusted_mode->hsync_start;
@ -967,6 +968,13 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
DRM_DEV_ERROR(vop->dev, "unsupported connector_type [%d]\n", DRM_DEV_ERROR(vop->dev, "unsupported connector_type [%d]\n",
s->output_type); s->output_type);
} }
/*
* if vop is not support RGB10 output, need force RGB10 to RGB888.
*/
if (s->output_mode == ROCKCHIP_OUT_MODE_AAAA &&
!(vop_data->feature & VOP_FEATURE_OUTPUT_RGB10))
s->output_mode = ROCKCHIP_OUT_MODE_P888;
VOP_CTRL_SET(vop, out_mode, s->output_mode); VOP_CTRL_SET(vop, out_mode, s->output_mode);
VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len); VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len);

View file

@ -142,6 +142,9 @@ struct vop_data {
const struct vop_intr *intr; const struct vop_intr *intr;
const struct vop_win_data *win; const struct vop_win_data *win;
unsigned int win_size; unsigned int win_size;
#define VOP_FEATURE_OUTPUT_RGB10 BIT(0)
u64 feature;
}; };
/* interrupt define */ /* interrupt define */

View file

@ -275,6 +275,7 @@ static const struct vop_intr rk3288_vop_intr = {
static const struct vop_data rk3288_vop = { static const struct vop_data rk3288_vop = {
.init_table = rk3288_init_reg_table, .init_table = rk3288_init_reg_table,
.table_size = ARRAY_SIZE(rk3288_init_reg_table), .table_size = ARRAY_SIZE(rk3288_init_reg_table),
.feature = VOP_FEATURE_OUTPUT_RGB10,
.intr = &rk3288_vop_intr, .intr = &rk3288_vop_intr,
.ctrl = &rk3288_ctrl_data, .ctrl = &rk3288_ctrl_data,
.win = rk3288_vop_win_data, .win = rk3288_vop_win_data,
@ -343,6 +344,7 @@ static const struct vop_reg_data rk3399_init_reg_table[] = {
static const struct vop_data rk3399_vop_big = { static const struct vop_data rk3399_vop_big = {
.init_table = rk3399_init_reg_table, .init_table = rk3399_init_reg_table,
.table_size = ARRAY_SIZE(rk3399_init_reg_table), .table_size = ARRAY_SIZE(rk3399_init_reg_table),
.feature = VOP_FEATURE_OUTPUT_RGB10,
.intr = &rk3399_vop_intr, .intr = &rk3399_vop_intr,
.ctrl = &rk3399_ctrl_data, .ctrl = &rk3399_ctrl_data,
/* /*