Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756714AbdCUHre (ORCPT ); Tue, 21 Mar 2017 03:47:34 -0400 Received: from mailout4.w1.samsung.com ([210.118.77.14]:64577 "EHLO mailout4.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756634AbdCUHrc (ORCPT ); Tue, 21 Mar 2017 03:47:32 -0400 X-AuditID: cbfec7f4-f79716d000006f65-1a-58d0da8aa969 Subject: Re: [PATCH] drm: bridge: dw-hdmi: add HDMI vendor specific infoframe config To: Nickey Yang , architt@codeaurora.org, airlied@linux.ie Cc: laurent.pinchart+renesas@ideasonboard.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, dianders@chromium.org, linux-rockchip@lists.infradead.org, joabreu@synopsys.com, rmk+kernel@arm.linux.org.uk, andy.yan@rock-chips.com, vladimir_zapolskiy@mentor.com, zhengyang@rock-chips.com From: Andrzej Hajda Message-id: <9cf73d37-78bb-dab8-9c48-5a951fb41c75@samsung.com> Date: Tue, 21 Mar 2017 08:47:19 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 MIME-version: 1.0 In-reply-to: <1489990249-29152-1-git-send-email-nickey.yang@rock-chips.com> Content-type: text/plain; charset=utf-8 Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrFKsWRmVeSWpSXmKPExsWy7djP87pdty5EGCyZo2fRe+4kk0X/+ZuM Fk0db1ktzi47yGZx5et7Not7i96xWkxsusNicXnXHDaLTw/+M1ss/f2O0WLzh5dsFs8ObGOz WN+i78Dr0dLcw+Yxu+Eii8flvl4mj9kdM1k9tn97wOpxv/s4k8fmJfUeu782MXr8nbWfxWPL /s+MHp83yQVwR3HZpKTmZJalFunbJXBldP80KTgvV7Hw8g62BsaZkl2MnBwSAiYSX9ZsZ4Kw xSQu3FvPBmILCSxllJg0Ib2LkQvI/swo0dL7DijBAdYwYVkBRHwZo8ThN6/ZIZxnjBKn1hxg ASkSFgiTmPdfAmSQiECExNRtM9hAapgFtjBJTH62mxEkwSagKfF3802wbbwCdhL3JyxhBrFZ BFQlns24xQ5iiwI177jRA1UjKPFj8j0WEJtTwFti7u4esHpmoDkvvkxigbDlJTavecsMskxC oJVD4u6KiywQV8tKbDrADPGli8T8zdvYIWxhiVfHt0DZMhKXJ3ezQPR2M0p86j/BDuFMYZT4 92EGVLe1xOHjF1khtvFJTNo2nRliAa9ER5sQRImHxIavC6FB6ihx9cURFkgIzWOU2P7/INME RvlZSB6aheSJWUieWMDIvIpRJLW0ODc9tdhErzgxt7g0L10vOT93EyMwhZ3+d/zLDsbFx6wO MQpwMCrx8K64cj5CiDWxrLgy9xCjBAezkgiva9+FCCHelMTKqtSi/Pii0pzU4kOM0hwsSuK8 exZcCRcSSE8sSc1OTS1ILYLJMnFwSjUwlvYWOlVwpX5f8PThFRktq+V5L2JXhfvur5yfL7LU 6ouEqHQb4/PqX9KHrZ8sZTSuN1VZGnRd01VTyUhJxd4nq/vH4QuNEpYcNQcPJym599rdqDte 8sQh8JlufKGJel4wv3ftqsXpEQ96bPyi3GfNzElenvMlelv4R5+37N8ktE9MCLV8/1qJpTgj 0VCLuag4EQAmrlR0XQMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrJIsWRmVeSWpSXmKPExsVy+t/xK7ozbl2IMDhxR9Ki99xJJov+8zcZ LZo63rJanF12kM3iytf3bBb3Fr1jtZjYdIfF4vKuOWwWnx78Z7ZY+vsdo8XmDy/ZLJ4d2MZm sb5F34HXo6W5h81jdsNFFo/Lfb1MHrM7ZrJ6bP/2gNXjfvdxJo/NS+o9dn9tYvT4O2s/i8eW /Z8ZPT5vkgvgjnKzyUhNTEktUkjNS85PycxLt1UKDXHTtVBSyEvMTbVVitD1DQlSUihLzCkF 8owM0ICDc4B7sJK+XYJbRvdPk4LzchULL+9ga2CcKdnFyMEhIWAiMWFZQRcjJ5ApJnHh3nq2 LkYuDiGBJYwSDy8dZ4FwnjFK9Dx7xgRSJSwQJvHhzBk2EFtEIELicWcrO0TRAkaJy6fnMII4 zAJbmCS27X3ECFLFJqAp8XfzTbAOXgE7ifsTljCD2CwCqhLPZtxiB7FFgSbNf7qKCaJGUOLH 5HssIDangLfE3N09zCCnMguoS0yZkgsSZhaQl9i85i3zBEaBWUg6ZiFUzUJStYCReRWjSGpp cW56brGRXnFibnFpXrpecn7uJkZgNG879nPLDsaud8GHGAU4GJV4eFdcOR8hxJpYVlyZe4hR goNZSYTXte9ChBBvSmJlVWpRfnxRaU5q8SFGU6AXJjJLiSbnAxNNXkm8oYmhuaWhkbGFhbmR kZI479QPV8KFBNITS1KzU1MLUotg+pg4OKUaGJPWW6bwsHIf3X2mZMZks4/qrwM+fd3kpJHz 1kvnXa6U00uVxSe8I3ISjp7/f6CJ392wvf1G8W6r/c9W6u2affFB54bZq2wX2Pydl8J/q2Tr NiuZxTphZ3o2nJt6IvWHxK16y5VrX17bxbfohc6n0Kye6y21By8dcpLcIWB01ZV1orZR756D cdOVWIozEg21mIuKEwGHPLmW/AIAAA== X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170321074721eucas1p29a0ae7ae112d80abd71a7b1b43f3999e X-Msg-Generator: CA X-Sender-IP: 182.198.249.180 X-Local-Sender: =?UTF-8?B?QW5kcnplaiBIYWpkYRtTUlBPTC1LZXJuZWwgKFRQKRvsgrw=?= =?UTF-8?B?7ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?QW5kcnplaiBIYWpkYRtTUlBPTC1LZXJuZWwgKFRQKRtTYW1z?= =?UTF-8?B?dW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20170321003517epcas5p1ac97c55740345a7845e39b2133d925df X-RootMTR: 20170321003517epcas5p1ac97c55740345a7845e39b2133d925df References: <1489990249-29152-1-git-send-email-nickey.yang@rock-chips.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3810 Lines: 107 On 20.03.2017 07:10, Nickey Yang wrote: > Vendor specific infoframe is mandatory for 4K2K resolution. > Without this, the HDMI protocol compliance fails. > > Signed-off-by: Nickey Yang > --- > drivers/gpu/drm/bridge/dw-hdmi.c | 50 ++++++++++++++++++++++++++++++++++++++++ > drivers/gpu/drm/bridge/dw-hdmi.h | 4 ++++ > 2 files changed, 54 insertions(+) > > diff --git a/drivers/gpu/drm/bridge/dw-hdmi.c b/drivers/gpu/drm/bridge/dw-hdmi.c > index 9a9ec27..79e2e48 100644 > --- a/drivers/gpu/drm/bridge/dw-hdmi.c > +++ b/drivers/gpu/drm/bridge/dw-hdmi.c > @@ -1195,6 +1195,55 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > hdmi_writeb(hdmi, (frame.right_bar >> 8) & 0xff, HDMI_FC_AVISRB1); > } > > +static void hdmi_config_vendor_specific_infoframe(struct dw_hdmi *hdmi, > + struct drm_display_mode *mode) > +{ > + struct hdmi_vendor_infoframe frame; > + u8 buffer[10]; > + ssize_t err; > + > + err = drm_hdmi_vendor_infoframe_from_display_mode(&frame, mode); > + if (err) { > + dev_err(hdmi->dev, > + "Failed to get vendor infoframe from mode: %zd\n", err); > + return; > + } > + > + err = hdmi_vendor_infoframe_pack(&frame, buffer, sizeof(buffer)); > + if (!err) { > + dev_err(hdmi->dev, "Failed to pack vendor infoframe: %zd\n", > + err); > + return; > + } AFAIK function returns number of packed bytes or -EINVAL so the check is incorrect, and -EINVAL means that there is no need to generate vendor infoframe, so definitely not dev_err. > + hdmi_modb(hdmi, 0 << HDMI_FC_DATAUTO0_VSD_OFFSET, > + HDMI_FC_DATAUTO0_VSD_MASK, HDMI_FC_DATAUTO0); I see no gain in constructs (0 << HDMI_FC_DATAUTO0_VSD_OFFSET), additionally mask and offset are redundant (mask == 1 << offset), but it seems you follow existing practice, so I do not oppose :) Regards Andrzej > + > + /* Set the length of HDMI vendor specific InfoFrame payload */ > + hdmi_writeb(hdmi, buffer[2], HDMI_FC_VSDSIZE); > + > + /* Set 24bit IEEE Registration Identifier */ > + hdmi_writeb(hdmi, buffer[4], HDMI_FC_VSDIEEEID0); > + hdmi_writeb(hdmi, buffer[5], HDMI_FC_VSDIEEEID1); > + hdmi_writeb(hdmi, buffer[6], HDMI_FC_VSDIEEEID2); > + > + /* Set HDMI_Video_Format and HDMI_VIC/3D_Structure */ > + hdmi_writeb(hdmi, buffer[7], HDMI_FC_VSDPAYLOAD0); > + hdmi_writeb(hdmi, buffer[8], HDMI_FC_VSDPAYLOAD1); > + > + if (frame.s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF) > + hdmi_writeb(hdmi, buffer[9], HDMI_FC_VSDPAYLOAD2); > + > + /* Packet frame interpolation */ > + hdmi_writeb(hdmi, 1, HDMI_FC_DATAUTO1); > + > + /* Auto packets per frame and line spacing */ > + hdmi_writeb(hdmi, 0x11, HDMI_FC_DATAUTO2); > + > + /* Configures the Frame Composer On RDRB mode */ > + hdmi_modb(hdmi, 1 << HDMI_FC_DATAUTO0_VSD_OFFSET, > + HDMI_FC_DATAUTO0_VSD_MASK, HDMI_FC_DATAUTO0); > +} > + > static void hdmi_av_composer(struct dw_hdmi *hdmi, > const struct drm_display_mode *mode) > { > @@ -1446,6 +1495,7 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > > /* HDMI Initialization Step F - Configure AVI InfoFrame */ > hdmi_config_AVI(hdmi, mode); > + hdmi_config_vendor_specific_infoframe(hdmi, mode); > } else { > dev_dbg(hdmi->dev, "%s DVI mode\n", __func__); > } > diff --git a/drivers/gpu/drm/bridge/dw-hdmi.h b/drivers/gpu/drm/bridge/dw-hdmi.h > index 325b0b8..c59f87e 100644 > --- a/drivers/gpu/drm/bridge/dw-hdmi.h > +++ b/drivers/gpu/drm/bridge/dw-hdmi.h > @@ -854,6 +854,10 @@ enum { > HDMI_FC_DBGFORCE_FORCEAUDIO = 0x10, > HDMI_FC_DBGFORCE_FORCEVIDEO = 0x1, > > +/* FC_DATAUTO0 field values */ > + HDMI_FC_DATAUTO0_VSD_MASK = 0x08, > + HDMI_FC_DATAUTO0_VSD_OFFSET = 3, > + > /* PHY_CONF0 field values */ > HDMI_PHY_CONF0_PDZ_MASK = 0x80, > HDMI_PHY_CONF0_PDZ_OFFSET = 7,