From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751245AbdEaCFn (ORCPT ); Tue, 30 May 2017 22:05:43 -0400 Received: from regular1.263xmail.com ([211.150.99.141]:48557 "EHLO regular1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751056AbdEaCFm (ORCPT ); Tue, 30 May 2017 22:05:42 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-RL-SENDER: jeffy.chen@rock-chips.com X-FST-TO: mark.yao@rock-chips.com X-SENDER-IP: 103.29.142.67 X-LOGIN-NAME: jeffy.chen@rock-chips.com X-UNIQUE-TAG: <0862e2871959fc33be075e435baefe03> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Message-ID: <592E24E3.3070001@rock-chips.com> Date: Wed, 31 May 2017 10:05:23 +0800 From: jeffy User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20130126 Thunderbird/19.0 MIME-Version: 1.0 To: yao mark , David Airlie , Heiko Stuebner CC: linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: Re: drm/rockchip: Correct vop out_mode configure References: <1495885416-22216-1-git-send-email-mark.yao@rock-chips.com> In-Reply-To: <1495885416-22216-1-git-send-email-mark.yao@rock-chips.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Mark, Reviewed-by: Jeffy Chen On 05/27/2017 07:43 PM, yao mark wrote: > 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 > --- > drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 12 ------------ > drivers/gpu/drm/rockchip/cdn-dp-core.c | 9 ++------- > drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 8 ++++++++ > drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 3 +++ > drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 2 ++ > 5 files changed, 15 insertions(+), 19 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > index 1bccd82..9606121 100644 > --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c > @@ -237,8 +237,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 > @@ -250,16 +248,6 @@ rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder, > > s->output_mode = ROCKCHIP_OUT_MODE_AAAA; > 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; > } > diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c > index a2169dd..14fa1f8 100644 > --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c > +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c > @@ -615,7 +615,6 @@ static void cdn_dp_encoder_enable(struct drm_encoder *encoder) > { > struct cdn_dp_device *dp = encoder_to_dp(encoder); > int ret, val; > - struct rockchip_crtc_state *state; > > ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); > 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", > (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); > - state->output_mode = ROCKCHIP_OUT_MODE_P888; > - } else { > + else > val = DP_SEL_VOP_LIT << 16; > - state->output_mode = ROCKCHIP_OUT_MODE_AAAA; > - } > > ret = cdn_dp_grf_write(dp, GRF_SOC_CON9, val); > if (ret) > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > index 40a5e6e..c83f481 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > @@ -874,6 +874,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; > @@ -966,6 +967,13 @@ static void vop_crtc_enable(struct drm_crtc *crtc) > DRM_DEV_ERROR(vop->dev, "unsupported connector_type [%d]\n", > 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, 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 5a4faa85..9979fd0 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h > @@ -142,6 +142,9 @@ struct vop_data { > const struct vop_intr *intr; > const struct vop_win_data *win; > unsigned int win_size; > + > +#define VOP_FEATURE_OUTPUT_RGB10 BIT(0) > + 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 0da4444..bafd698 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c > +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c > @@ -275,6 +275,7 @@ static const struct vop_intr rk3288_vop_intr = { > static const struct vop_data rk3288_vop = { > .init_table = rk3288_init_reg_table, > .table_size = ARRAY_SIZE(rk3288_init_reg_table), > + .feature = VOP_FEATURE_OUTPUT_RGB10, > .intr = &rk3288_vop_intr, > .ctrl = &rk3288_ctrl_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 = { > .init_table = rk3399_init_reg_table, > .table_size = ARRAY_SIZE(rk3399_init_reg_table), > + .feature = VOP_FEATURE_OUTPUT_RGB10, > .intr = &rk3399_vop_intr, > .ctrl = &rk3399_ctrl_data, > /* > >