Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp2162532ybp; Thu, 10 Oct 2019 03:15:52 -0700 (PDT) X-Google-Smtp-Source: APXvYqyISVvPdY8Pwm/DFT5NUvqZLDrifqwR0j2pUg3qgtejsYhj4UqPWFhA6dvrAuEIL7TcOUwX X-Received: by 2002:a17:907:10d3:: with SMTP id rv19mr7026040ejb.301.1570702552042; Thu, 10 Oct 2019 03:15:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570702552; cv=none; d=google.com; s=arc-20160816; b=DgzD1mJWMcAeI5R78oskezWJuceDbyEszPEH/yHcm/QaTRyt26GOq34R05QdgqA/OZ Witpj7kxht3Iuf9ptkV+oC7O66ROHZvx/2H2H5srRhXLtDhJf0uWKxnN+LuU6YuCTkCG WoBafORZjVbbRS3n6ZYUetTFXtf3cf+phm0KiaMcKpMEx3zvKfiI2jY8zMC+l4jYZeyD +ZHQ/ASUA2FueNrVbipdwvFPuf/Mlm3RS8hTQo+wVsGwIgQ6g5UBL1WMJBEFFdwWKHmW 2ngs0XA28DS2rv9b3imNT05nH3/7MgCj5Mymb2169UHRbbmADW5tpUtUzXTgLT4GJbnu +QAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:cms-type:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:from:cc:to:subject:dkim-signature:dkim-filter; bh=v/JaXaj0MgNSUEFrqPEXnp0yrg+UKF6YfGXKsGqn7A4=; b=F4vOfJNYkeM1aDUJerLwQ8zgr9XU4PId6KsjyiglBCEjddYRjA5X16tIS63EIx2QWT UP8ea/1yEoSZouOjypcA7fe7q3sl4oZIdtd3HgioOclEY0UMrpx7+a01oVIvPLWLOjJF 57NPqAYWFLSzgcmVoGxRLxRq8ZEQcjqsKJYkhNchbhxFfIhI44y2BnZa8LXB0BFdy+so xyXvowK7egqZyq+HBeqKnxOwRkdIwO8zBm4UueNGjcvGd7YwTF2+iZ8bBeJdTUCX7rDs VNGWBYVD3tPobc9b3AQsNf9WPI7vcNWk5bjvmnaQTEkSPy5dfb8Xrs5w0QmnYFLdViJF BapA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@samsung.com header.s=mail20170921 header.b="V3Y/aolF"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u17si2688499edy.145.2019.10.10.03.15.27; Thu, 10 Oct 2019 03:15:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@samsung.com header.s=mail20170921 header.b="V3Y/aolF"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=samsung.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387621AbfJJKMw (ORCPT + 99 others); Thu, 10 Oct 2019 06:12:52 -0400 Received: from mailout2.w1.samsung.com ([210.118.77.12]:40103 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726602AbfJJKMw (ORCPT ); Thu, 10 Oct 2019 06:12:52 -0400 Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20191010101249euoutp02d8197fdf1794d8893071c24812c4de55~MQXu8MJ9S0095100951euoutp02u for ; Thu, 10 Oct 2019 10:12:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20191010101249euoutp02d8197fdf1794d8893071c24812c4de55~MQXu8MJ9S0095100951euoutp02u DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1570702369; bh=v/JaXaj0MgNSUEFrqPEXnp0yrg+UKF6YfGXKsGqn7A4=; h=Subject:To:Cc:From:Date:In-Reply-To:References:From; b=V3Y/aolFJQcJLckIeP8HKMuYpjx9O1cwnNxXQDDJjgum6Gl8oUf9l1gSu0sA2GxKF 7NpV4ZI3JWQbwBpr4zLIN3yaUs1NusiP/81sSsrycZ5bqpOdSMTe4l24Xmm6E/nQZv 3hpfifjTLcTXbrej/xcfqq4KZPqrkI15ZdhNrjMw= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20191010101249eucas1p2945fa9eb685d5600b328d2d102d5981f~MQXun2CRm2185721857eucas1p2z; Thu, 10 Oct 2019 10:12:49 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id BD.07.04374.1240F9D5; Thu, 10 Oct 2019 11:12:49 +0100 (BST) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20191010101248eucas1p16377c1679740640841c177e6f208e1fb~MQXuK1iCH1474414744eucas1p18; Thu, 10 Oct 2019 10:12:48 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20191010101248eusmtrp298797c9a2d7dafabab74d1adf62d871d~MQXuKEMf52297922979eusmtrp2d; Thu, 10 Oct 2019 10:12:48 +0000 (GMT) X-AuditID: cbfec7f5-4ddff70000001116-9a-5d9f0421add7 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 23.1C.04166.0240F9D5; Thu, 10 Oct 2019 11:12:48 +0100 (BST) Received: from [106.120.51.74] (unknown [106.120.51.74]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20191010101248eusmtip18ab155154d9d9e489f6ad82342337dde~MQXtdloxx0886308863eusmtip1d; Thu, 10 Oct 2019 10:12:48 +0000 (GMT) Subject: Re: [PATCH v2 1/4] drm/bridge: dw-hdmi: Add Dynamic Range and Mastering InfoFrame support To: Jonas Karlman , Neil Armstrong Cc: Laurent Pinchart , Jernej Skrabec , Kevin Hilman , Sandy Huang , Heiko Stubner , Maxime Ripard , Chen-Yu Tsai , "zhengyang@rock-chips.com" , "dri-devel@lists.freedesktop.org" , "linux-kernel@vger.kernel.org" From: Andrzej Hajda Message-ID: Date: Thu, 10 Oct 2019 12:12:47 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: Content-Transfer-Encoding: 8bit Content-Language: en-US X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrJKsWRmVeSWpSXmKPExsWy7djP87qKLPNjDdZ/ErK48vU9m8X/R69Z LeZOqrW4+v0ls8XJN1dZLH62b2Gy6Jy4hN3i8q45bBZtnctYLQ71RVv8PHSeyWJ9i74Dj8f7 G63sHhserWb1mN0xk9Vj06pONo8TEy4xedzvPs7k8XfWfhaPA72TWTy2X5vH7PF5k1wAVxSX TUpqTmZZapG+XQJXxquuS0wFD7wqjn6dwNjA2G7RxcjJISFgInH57SZ2EFtIYAWjRMNh7S5G LiD7C6PEwetTGSGcz4wSh+feZYfpONZylh0isZxR4u3rZjYI5y1Qe9MFsCphgRSJE8/mMIPY IgL+En+774AVMQtcZpbYsOopWBGbgKbE38032UBsXgE7iT/LPzCB2CwCqhIvlk1hBbFFBSIk Pj04zApRIyhxcuYTFhCbUyBWYtncTWC9zALyEs1bZzND2OISt57MZwJZJiHwk13i/4XfTBB3 u0h8/76REcIWlnh1fAvUPzIS/3fOh6qpl7i/ooUZormDUWLrhp3MEAlricPHLwJdwQG0QVNi /S59EFNCwFGi80MVhMknceOtIMQJfBKTtk1nhgjzSnS0CUHMUJS4f3Yr1DxxiaUXvrJNYFSa heSxWUiemYXkmVkIaxcwsqxiFE8tLc5NTy02zkst1ytOzC0uzUvXS87P3cQITHCn/x3/uoNx 35+kQ4wCHIxKPLwZJ+fGCrEmlhVX5h5ilOBgVhLhXTRrTqwQb0piZVVqUX58UWlOavEhRmkO FiVx3mqGB9FCAumJJanZqakFqUUwWSYOTqkGxh3OIbMnee73Yfv0XKyy7iWvncKsZQYut53v 5Am5vYxYX6Qct0hqH1f587uTtxxq4PMK0OBwOX4wQH1P9btv9Zvsp3yRPFP2d8G8PYIz5xYc qeneuLBcOL5mag/veT73OcW2DXcLi31mOni1+0rqzXiaaPJbdHFzmPFatvkvU0/9S2g819Fs qMRSnJFoqMVcVJwIAJLgo3NsAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrHIsWRmVeSWpSXmKPExsVy+t/xu7oKLPNjDab/0Le48vU9m8X/R69Z LeZOqrW4+v0ls8XJN1dZLH62b2Gy6Jy4hN3i8q45bBZtnctYLQ71RVv8PHSeyWJ9i74Dj8f7 G63sHhserWb1mN0xk9Vj06pONo8TEy4xedzvPs7k8XfWfhaPA72TWTy2X5vH7PF5k1wAV5Se TVF+aUmqQkZ+cYmtUrShhZGeoaWFnpGJpZ6hsXmslZGpkr6dTUpqTmZZapG+XYJexquuS0wF D7wqjn6dwNjA2G7RxcjJISFgInGs5Sx7FyMXh5DAUkaJ8yfesUIkxCV2z3/LDGELS/y51sUG UfSaUWLdoYNsIAlhgRSJE8/mgBWJCPhKtD/+xQxSxCxwlVli2oNXUB3NTBKXpv8A62AT0JT4 u/kmmM0rYCfxZ/kHJhCbRUBV4sWyKWCrRQUiJA7vmMUIUSMocXLmExYQm1MgVmLZ3E1gvcwC 6hJ/5l1ihrDlJZq3zoayxSVuPZnPNIFRaBaS9llIWmYhaZmFpGUBI8sqRpHU0uLc9NxiQ73i xNzi0rx0veT83E2MwLjeduzn5h2MlzYGH2IU4GBU4uHNODk3Vog1say4MvcQowQHs5II76JZ c2KFeFMSK6tSi/Lji0pzUosPMZoCPTeRWUo0OR+YcvJK4g1NDc0tLA3Njc2NzSyUxHk7BA7G CAmkJ5akZqemFqQWwfQxcXBKNTC2JeezbJlzPMn92qdlKbWbuy5xnLHRazsvF3/r2OZ5C9Zu uS63+6B1cHhx79EFIet8z/27e/7Vm59zqhM+rQ9yuBw4X/PAxNWhOdp3ago2B/bPXL35sPUn Zfebrgeeb0+VcWCUqQ6rY2Nawut3ksNa5Pe6hd+EyhYd31553dboS+Ua9tsBSgsuK7EUZyQa ajEXFScCAO/Vc/kBAwAA X-CMS-MailID: 20191010101248eucas1p16377c1679740640841c177e6f208e1fb X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20191007192154epcas4p32fbfbce564847de5dac47a5e99972644 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20191007192154epcas4p32fbfbce564847de5dac47a5e99972644 References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 07.10.2019 21:21, Jonas Karlman wrote: > Add support for configuring Dynamic Range and Mastering InfoFrame from > the hdr_output_metadata connector property. > > This patch adds a use_drm_infoframe flag to dw_hdmi_plat_data that platform > drivers use to signal when Dynamic Range and Mastering infoframes is supported. > This flag is needed because Amlogic GXBB and GXL report same DW-HDMI version, > and only GXL support DRM InfoFrame. > > These changes were based on work done by Zheng Yang > to support DRM InfoFrame on the Rockchip 4.4 BSP kernel at [1] and [2] > > [1] https://github.com/rockchip-linux/kernel/tree/develop-4.4 > [2] https://github.com/rockchip-linux/kernel/commit/d1943fde81ff41d7cca87f4a42f03992e90bddd5 > > Cc: Zheng Yang > Signed-off-by: Jonas Karlman > Reviewed-by: Neil Armstrong Reviewed-by: Andrzej Hajda Neil, since you want to take care of patch3/4, will you take care of the whole patchset?  -- Regards Andrzej > --- > drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 81 +++++++++++++++++++++++ > drivers/gpu/drm/bridge/synopsys/dw-hdmi.h | 37 +++++++++++ > include/drm/bridge/dw_hdmi.h | 1 + > 3 files changed, 119 insertions(+) > > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > index a15fbf71b9d7..fdc29869d75a 100644 > --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > @@ -25,6 +25,7 @@ > #include > > #include > +#include > #include > #include > #include > @@ -1743,6 +1744,41 @@ static void hdmi_config_vendor_specific_infoframe(struct dw_hdmi *hdmi, > HDMI_FC_DATAUTO0_VSD_MASK); > } > > +static void hdmi_config_drm_infoframe(struct dw_hdmi *hdmi) > +{ > + const struct drm_connector_state *conn_state = hdmi->connector.state; > + struct hdmi_drm_infoframe frame; > + u8 buffer[30]; > + ssize_t err; > + int i; > + > + if (!hdmi->plat_data->use_drm_infoframe) > + return; > + > + hdmi_modb(hdmi, HDMI_FC_PACKET_TX_EN_DRM_DISABLE, > + HDMI_FC_PACKET_TX_EN_DRM_MASK, HDMI_FC_PACKET_TX_EN); > + > + err = drm_hdmi_infoframe_set_hdr_metadata(&frame, conn_state); > + if (err < 0) > + return; > + > + err = hdmi_drm_infoframe_pack(&frame, buffer, sizeof(buffer)); > + if (err < 0) { > + dev_err(hdmi->dev, "Failed to pack drm infoframe: %zd\n", err); > + return; > + } > + > + hdmi_writeb(hdmi, frame.version, HDMI_FC_DRM_HB0); > + hdmi_writeb(hdmi, frame.length, HDMI_FC_DRM_HB1); > + > + for (i = 0; i < frame.length; i++) > + hdmi_writeb(hdmi, buffer[4 + i], HDMI_FC_DRM_PB0 + i); > + > + hdmi_writeb(hdmi, 1, HDMI_FC_DRM_UP); > + hdmi_modb(hdmi, HDMI_FC_PACKET_TX_EN_DRM_ENABLE, > + HDMI_FC_PACKET_TX_EN_DRM_MASK, HDMI_FC_PACKET_TX_EN); > +} > + > static void hdmi_av_composer(struct dw_hdmi *hdmi, > const struct drm_display_mode *mode) > { > @@ -2064,6 +2100,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); > + hdmi_config_drm_infoframe(hdmi); > } else { > dev_dbg(hdmi->dev, "%s DVI mode\n", __func__); > } > @@ -2230,6 +2267,45 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector) > return ret; > } > > +static bool hdr_metadata_equal(const struct drm_connector_state *old_state, > + const struct drm_connector_state *new_state) > +{ > + struct drm_property_blob *old_blob = old_state->hdr_output_metadata; > + struct drm_property_blob *new_blob = new_state->hdr_output_metadata; > + > + if (!old_blob || !new_blob) > + return old_blob == new_blob; > + > + if (old_blob->length != new_blob->length) > + return false; > + > + return !memcmp(old_blob->data, new_blob->data, old_blob->length); > +} > + > +static int dw_hdmi_connector_atomic_check(struct drm_connector *connector, > + struct drm_atomic_state *state) > +{ > + struct drm_connector_state *old_state = > + drm_atomic_get_old_connector_state(state, connector); > + struct drm_connector_state *new_state = > + drm_atomic_get_new_connector_state(state, connector); > + struct drm_crtc *crtc = new_state->crtc; > + struct drm_crtc_state *crtc_state; > + > + if (!crtc) > + return 0; > + > + if (!hdr_metadata_equal(old_state, new_state)) { > + crtc_state = drm_atomic_get_crtc_state(state, crtc); > + if (IS_ERR(crtc_state)) > + return PTR_ERR(crtc_state); > + > + crtc_state->mode_changed = true; > + } > + > + return 0; > +} > + > static void dw_hdmi_connector_force(struct drm_connector *connector) > { > struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi, > @@ -2254,6 +2330,7 @@ static const struct drm_connector_funcs dw_hdmi_connector_funcs = { > > static const struct drm_connector_helper_funcs dw_hdmi_connector_helper_funcs = { > .get_modes = dw_hdmi_connector_get_modes, > + .atomic_check = dw_hdmi_connector_atomic_check, > }; > > static int dw_hdmi_bridge_attach(struct drm_bridge *bridge) > @@ -2274,6 +2351,10 @@ static int dw_hdmi_bridge_attach(struct drm_bridge *bridge) > DRM_MODE_CONNECTOR_HDMIA, > hdmi->ddc); > > + if (hdmi->version >= 0x200a && hdmi->plat_data->use_drm_infoframe) > + drm_object_attach_property(&connector->base, > + connector->dev->mode_config.hdr_output_metadata_property, 0); > + > drm_connector_attach_encoder(connector, encoder); > > cec_fill_conn_info_from_drm(&conn_info, connector); > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h > index fcff5059db24..1999db05bc3b 100644 > --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h > +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h > @@ -254,6 +254,7 @@ > #define HDMI_FC_POL2 0x10DB > #define HDMI_FC_PRCONF 0x10E0 > #define HDMI_FC_SCRAMBLER_CTRL 0x10E1 > +#define HDMI_FC_PACKET_TX_EN 0x10E3 > > #define HDMI_FC_GMD_STAT 0x1100 > #define HDMI_FC_GMD_EN 0x1101 > @@ -289,6 +290,37 @@ > #define HDMI_FC_GMD_PB26 0x111F > #define HDMI_FC_GMD_PB27 0x1120 > > +#define HDMI_FC_DRM_UP 0x1167 > +#define HDMI_FC_DRM_HB0 0x1168 > +#define HDMI_FC_DRM_HB1 0x1169 > +#define HDMI_FC_DRM_PB0 0x116A > +#define HDMI_FC_DRM_PB1 0x116B > +#define HDMI_FC_DRM_PB2 0x116C > +#define HDMI_FC_DRM_PB3 0x116D > +#define HDMI_FC_DRM_PB4 0x116E > +#define HDMI_FC_DRM_PB5 0x116F > +#define HDMI_FC_DRM_PB6 0x1170 > +#define HDMI_FC_DRM_PB7 0x1171 > +#define HDMI_FC_DRM_PB8 0x1172 > +#define HDMI_FC_DRM_PB9 0x1173 > +#define HDMI_FC_DRM_PB10 0x1174 > +#define HDMI_FC_DRM_PB11 0x1175 > +#define HDMI_FC_DRM_PB12 0x1176 > +#define HDMI_FC_DRM_PB13 0x1177 > +#define HDMI_FC_DRM_PB14 0x1178 > +#define HDMI_FC_DRM_PB15 0x1179 > +#define HDMI_FC_DRM_PB16 0x117A > +#define HDMI_FC_DRM_PB17 0x117B > +#define HDMI_FC_DRM_PB18 0x117C > +#define HDMI_FC_DRM_PB19 0x117D > +#define HDMI_FC_DRM_PB20 0x117E > +#define HDMI_FC_DRM_PB21 0x117F > +#define HDMI_FC_DRM_PB22 0x1180 > +#define HDMI_FC_DRM_PB23 0x1181 > +#define HDMI_FC_DRM_PB24 0x1182 > +#define HDMI_FC_DRM_PB25 0x1183 > +#define HDMI_FC_DRM_PB26 0x1184 > + > #define HDMI_FC_DBGFORCE 0x1200 > #define HDMI_FC_DBGAUD0CH0 0x1201 > #define HDMI_FC_DBGAUD1CH0 0x1202 > @@ -744,6 +776,11 @@ enum { > HDMI_FC_PRCONF_OUTPUT_PR_FACTOR_MASK = 0x0F, > HDMI_FC_PRCONF_OUTPUT_PR_FACTOR_OFFSET = 0, > > +/* FC_PACKET_TX_EN field values */ > + HDMI_FC_PACKET_TX_EN_DRM_MASK = 0x80, > + HDMI_FC_PACKET_TX_EN_DRM_ENABLE = 0x80, > + HDMI_FC_PACKET_TX_EN_DRM_DISABLE = 0x00, > + > /* FC_AVICONF0-FC_AVICONF3 field values */ > HDMI_FC_AVICONF0_PIX_FMT_MASK = 0x03, > HDMI_FC_AVICONF0_PIX_FMT_RGB = 0x00, > diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h > index 4b3e863c4f8a..fbf3812c4326 100644 > --- a/include/drm/bridge/dw_hdmi.h > +++ b/include/drm/bridge/dw_hdmi.h > @@ -126,6 +126,7 @@ struct dw_hdmi_plat_data { > const struct drm_display_mode *mode); > unsigned long input_bus_format; > unsigned long input_bus_encoding; > + bool use_drm_infoframe; > > /* Vendor PHY support */ > const struct dw_hdmi_phy_ops *phy_ops;