From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2EADEC4345F for ; Wed, 17 Apr 2024 10:24:34 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8365710F578; Wed, 17 Apr 2024 10:24:33 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="ZjHrnpqV"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 082A610F578 for ; Wed, 17 Apr 2024 10:24:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1713349470; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=s8GTW0i88xl/JS1mRZ35z01GlS2wquacIUzRNCCag+4=; b=ZjHrnpqVWaDU/KSuIZl4uRb+bbYcgEmw+FnwBIoKB8dOCloqbkDZ1wcK4ymfKkyTDggETC WlnbhNtt9CQPQTet4ghtZs5gyvJqAgCrG9HhZEGLB92n+jV2jCuC154E119m3D4loVjo8/ itj+jg4m5FgW+WhrJ37IDgIObtevNhI= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-196-Y2QJaJ6vOrWsIuVkpgPLqw-1; Wed, 17 Apr 2024 06:24:29 -0400 X-MC-Unique: Y2QJaJ6vOrWsIuVkpgPLqw-1 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-417df7b0265so21615365e9.3 for ; Wed, 17 Apr 2024 03:24:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713349468; x=1713954268; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=s8GTW0i88xl/JS1mRZ35z01GlS2wquacIUzRNCCag+4=; b=w9Zh2FNJkRga4WhxuzzuXJt510rsvqP4/dL7CT4y0ZD5c9c7jtygEJRy0fBB9g1YnL zBu4NzDDbR5KRZ1qKjrw+GhXBMHRV9t6Sv7otXuVEc9e2VlW9D213v59nItLhNNxPEJB At/3PRI10zWBu2P0d0DHYMkVXbTJHFBrRf6CiAptWTDv+3JQtCg369QZdMAJba1o///h YgZOUfeDqpn59kyzaBahrSJIwFnVzsRfHgWyvDettDLwcVoNXVHub71Z62s1J4Wn5Und 3i0YE3JhD37aCP11Wznac2su1pYvsXFb43oyydxOan4dL1UzKTkvqQMBz25lvtYTncp6 zQfA== X-Gm-Message-State: AOJu0YwQZqm2lWqw9YPRFtUap3Lql9Y+FRzYeXxN6hYRlvZleLEpLRyX Bg1PkCH6+r45OYLq4ceYPcTkBnSiDHn6EV7yjtbbHSmpmNqLN1alhTQBNNS3lX61fG0/sNxhLuA yp8TnZgrKdZFFSWxCqDpx0NjfA2UPWCx+N3bOBfc/TseoAj8wcvhYMyGdIc8Tj6zBsg== X-Received: by 2002:a05:600c:19c8:b0:413:38c6:2c7a with SMTP id u8-20020a05600c19c800b0041338c62c7amr11119728wmq.22.1713349467934; Wed, 17 Apr 2024 03:24:27 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEuOZGH+/Z0cyylOVB0dWMsm1YHTjjW+149iFy8UtyCS58eQvJDO7olJ7FypWMDJTj4w773Zw== X-Received: by 2002:a05:600c:19c8:b0:413:38c6:2c7a with SMTP id u8-20020a05600c19c800b0041338c62c7amr11119714wmq.22.1713349467473; Wed, 17 Apr 2024 03:24:27 -0700 (PDT) Received: from toolbox ([2001:9e8:89b5:5c00:c2f9:29ac:aa89:168]) by smtp.gmail.com with ESMTPSA id g3-20020a05600c310300b00417bab31bd2sm2313459wmo.26.2024.04.17.03.24.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Apr 2024 03:24:27 -0700 (PDT) Date: Wed, 17 Apr 2024 12:24:25 +0200 From: Sebastian Wick To: "Kandpal, Suraj" Cc: "intel-gfx@lists.freedesktop.org" , "Borah, Chaitanya Kumar" , "Shankar, Uma" , "Nautiyal, Ankit K" , "Murthy, Arun R" , "Nikula, Jani" , "Kumar, Naveen1" Subject: Re: [5/6] drm/i915/dp: Enable AUX based backlight for HDR Message-ID: <20240417102425.GA141053@toolbox> References: <20240411060925.475456-6-suraj.kandpal@intel.com> <20240416134022.GA40393@toolbox> MIME-Version: 1.0 In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" On Wed, Apr 17, 2024 at 04:58:06AM +0000, Kandpal, Suraj wrote: > > > > -----Original Message----- > > From: Sebastian Wick > > Sent: Tuesday, April 16, 2024 7:10 PM > > To: Kandpal, Suraj > > Cc: intel-gfx@lists.freedesktop.org; Borah, Chaitanya Kumar > > ; Shankar, Uma > > ; Nautiyal, Ankit K ; > > Murthy, Arun R ; Nikula, Jani > > ; Kumar, Naveen1 > > Subject: Re: [5/6] drm/i915/dp: Enable AUX based backlight for HDR > > > > On Thu, Apr 11, 2024 at 11:39:24AM +0530, Suraj Kandpal wrote: > > > As of now whenerver HDR is switched on we use the PWM to change the > > > backlight as opposed to AUX based backlight changes in terms of nits. > > > This patch writes to the appropriate DPCD registers to enable aux > > > based backlight using values in nits. > > > > > > --v2 > > > -Fix max_cll and max_fall assignment [Jani] -Fix the size sent in > > > drm_dpcd_write [Jani] > > > > > > --v3 > > > -Content Luminance needs to be sent only for pre-ICL after that it is > > > directly picked up from hdr metadata [Ville] > > > > > > --v4 > > > -Add checks for HDR TCON cap bits [Ville] -Check eotf of > > > hdr_output_data and sets bits base of that value. > > > > > > --v5 > > > -Fix capability check bits. > > > -Check colorspace before setting BT2020 > > > > > > --v6 > > > -Use intel_dp_has_gamut_dip to check if we have capability to send sdp > > > [Ville] -Seprate filling of all hdr tcon related bits into it's own > > > function. > > > -Check eotf data to make sure we are in HDR mode [Sebastian] > > > > > > --v7 > > > -Fix confusion function name for hdr mode check [Jani] -Fix the > > > condition which tells us if we are in HDR mode or not [Sebastian] > > > > > > Signed-off-by: Suraj Kandpal > > > --- > > > .../drm/i915/display/intel_dp_aux_backlight.c | 105 > > > ++++++++++++++++-- > > > 1 file changed, 94 insertions(+), 11 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > > b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > > index b61bad218994..b13eee250dc4 100644 > > > --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > > +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > > @@ -40,11 +40,6 @@ > > > #include "intel_dp.h" > > > #include "intel_dp_aux_backlight.h" > > > > > > -/* TODO: > > > - * Implement HDR, right now we just implement the bare minimum to > > > bring us back into SDR mode so we > > > - * can make people's backlights work in the mean time > > > - */ > > > - > > > /* > > > * DP AUX registers for Intel's proprietary HDR backlight interface. We define > > > * them here since we'll likely be the only driver to ever use these. > > > @@ -127,9 +122,6 @@ intel_dp_aux_supports_hdr_backlight(struct > > intel_connector *connector) > > > if (ret != sizeof(tcon_cap)) > > > return false; > > > > > > - if (!(tcon_cap[1] & INTEL_EDP_HDR_TCON_BRIGHTNESS_NITS_CAP)) > > > - return false; > > > - > > > drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] Detected %s HDR > > backlight interface version %d\n", > > > connector->base.base.id, connector->base.name, > > > is_intel_tcon_cap(tcon_cap) ? "Intel" : "unsupported", > > > tcon_cap[0]); @@ -137,6 +129,9 @@ > > intel_dp_aux_supports_hdr_backlight(struct intel_connector *connector) > > > if (!is_intel_tcon_cap(tcon_cap)) > > > return false; > > > > > > + if (!(tcon_cap[1] & INTEL_EDP_HDR_TCON_BRIGHTNESS_NITS_CAP)) > > > + return false; > > > + > > > /* > > > * If we don't have HDR static metadata there is no way to > > > * runtime detect used range for nits based control. For now @@ > > > -225,13 +220,27 @@ intel_dp_aux_hdr_set_aux_backlight(const struct > > drm_connector_state *conn_state, > > > connector->base.base.id, connector->base.name); } > > > > > > +static bool > > > +intel_dp_in_hdr_mode(const struct drm_connector_state *conn_state) { > > > + struct hdr_output_metadata *hdr_metadata; > > > + > > > + if (!conn_state->hdr_output_metadata) > > > + return false; > > > + > > > + hdr_metadata = conn_state->hdr_output_metadata->data; > > > + > > > + return hdr_metadata->hdmi_metadata_type1.eotf == > > > +HDMI_EOTF_SMPTE_ST2084; } > > > + > > > static void > > > intel_dp_aux_hdr_set_backlight(const struct drm_connector_state > > > *conn_state, u32 level) { > > > struct intel_connector *connector = to_intel_connector(conn_state- > > >connector); > > > struct intel_panel *panel = &connector->panel; > > > > > > - if (panel->backlight.edp.intel.sdr_uses_aux) { > > > + if (intel_dp_in_hdr_mode(conn_state) || > > > + panel->backlight.edp.intel.sdr_uses_aux) { > > > intel_dp_aux_hdr_set_aux_backlight(conn_state, level); > > > } else { > > > const u32 pwm_level = > > intel_backlight_level_to_pwm(connector, > > > level); @@ -240,6 +249,70 @@ intel_dp_aux_hdr_set_backlight(const > > struct drm_connector_state *conn_state, u32 > > > } > > > } > > > > > > +static void > > > +intel_dp_aux_write_content_luminance(struct intel_connector *connector, > > > + struct hdr_output_metadata > > *hdr_metadata) { > > > + struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); > > > + struct drm_i915_private *i915 = to_i915(connector->base.dev); > > > + int ret; > > > + u8 buf[4]; > > > + > > > + if (!intel_dp_has_gamut_metadata_dip(connector->encoder)) > > > + return; > > > + > > > + buf[0] = hdr_metadata->hdmi_metadata_type1.max_cll & 0xFF; > > > + buf[1] = (hdr_metadata->hdmi_metadata_type1.max_cll & 0xFF00) > > >> 8; > > > + buf[2] = hdr_metadata->hdmi_metadata_type1.max_fall & 0xFF; > > > + buf[3] = (hdr_metadata->hdmi_metadata_type1.max_fall & 0xFF00) > > >> 8; > > > + > > > + ret = drm_dp_dpcd_write(&intel_dp->aux, > > > + INTEL_EDP_HDR_CONTENT_LUMINANCE, > > > + buf, sizeof(buf)); > > > + if (ret < 0) > > > + drm_dbg_kms(&i915->drm, > > > + "Content Luminance DPCD reg write failed, err:- > > %d\n", > > > + ret); > > > +} > > > + > > > +static void > > > +intel_dp_aux_fill_hdr_tcon_params(const struct drm_connector_state > > > +*conn_state, u8 *ctrl) { > > > + struct intel_connector *connector = to_intel_connector(conn_state- > > >connector); > > > + struct intel_panel *panel = &connector->panel; > > > + struct drm_i915_private *i915 = to_i915(connector->base.dev); > > > + struct hdr_output_metadata *hdr_metadata = > > > +conn_state->hdr_output_metadata->data; > > > + > > > + /* According to spec segmented backlight needs to be set whenever > > panel is in > > > + * HDR mode. > > > + */ > > > + *ctrl |= INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE; > > > + > > > + /* 2084 decode needs to set if eotf suggests so or in case of pre-ICL > > we disable > > > + * tone mapping and set 2084 decode. > > > + */ > > > + if (hdr_metadata->hdmi_metadata_type1.eotf == > > > + HDMI_EOTF_SMPTE_ST2084 || DISPLAY_VER(i915) < 11) { > > > > this function only gets called when eotf == HDMI_EOTF_SMPTE_ST2084 which > > means all of this is qeuivalent to > > > > *ctrl |= INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE; > > *ctrl |= INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE; > > *ctrl &= ~INTEL_EDP_HDR_TCON_TONE_MAPPING_ENABLE; > > > > Right will drop the SMPTE check altogether > > > The comment about pre-ICL is also really confusing to me, especially because it > > doesn't actually change the semantics. Can you explain what you're trying to > > achieve here? > > > > Spec states that we need to disable Tone mapping pre-ICL and after that it will > Be TCON's decision to enable TM based on panel override values Right, but the TCON will just ignore it so you always set it. > > > > + *ctrl |= INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE; > > > + *ctrl &= ~INTEL_EDP_HDR_TCON_TONE_MAPPING_ENABLE; > > > + } else { > > > + drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] TCON: > > Cannot decode requested EOTF\n", > > > + connector->base.base.id, connector->base.name); > > > + } > > > + > > > + if (panel->backlight.edp.intel.supports_2020_gamut && > > > + (conn_state->colorspace == > > DRM_MODE_COLORIMETRY_BT2020_RGB || > > > + conn_state->colorspace == > > DRM_MODE_COLORIMETRY_BT2020_YCC || > > > + conn_state->colorspace == > > DRM_MODE_COLORIMETRY_BT2020_CYCC)) > > > + *ctrl |= INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE; > > > > The Colorspace prop can be set independently of the > > HDR_OUTPUT_METADATA prop but this only enables the bt2020 gamut when > > in HDR mode > > (intel_dp_in_hdr_mode() == true). > > > > there's only two states in the DPCD register Standard gamma and bt2020 > now this case here is specific to when we are in HDR mode and do not want to write > in this register when not in HDR mode. That doesn't seem right. bt2020 gamut is completely independent of 2084 decode and segmented backlight (i.e. HDR mode). From a uAPI perspective when the Colorspace prop is set to bt2020 we need the sink to expect bt2020 content, no matter any other property. The question really is if on devices with the TCON are you able to get it to process bt2020 without setting INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE? I don't believe so. From the testing we've done it looks like DPCD is ignored unless INTEL_EDP_HDR_TCON_SDP_OVERRIDE_AUX is set. > > > > + > > > + if (panel->backlight.edp.intel.supports_sdp_colorimetry && > > > + intel_dp_has_gamut_metadata_dip(connector->encoder)) > > > + *ctrl |= INTEL_EDP_HDR_TCON_SDP_OVERRIDE_AUX; > > > + else > > > + *ctrl &= ~INTEL_EDP_HDR_TCON_SDP_OVERRIDE_AUX; > > > +} > > > + > > > static void > > > intel_dp_aux_hdr_enable_backlight(const struct intel_crtc_state *crtc_state, > > > const struct drm_connector_state > > *conn_state, u32 level) @@ > > > -248,6 +321,7 @@ intel_dp_aux_hdr_enable_backlight(const struct > > intel_crtc_state *crtc_state, > > > struct intel_panel *panel = &connector->panel; > > > struct drm_i915_private *i915 = to_i915(connector->base.dev); > > > struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); > > > + struct hdr_output_metadata *hdr_metadata; > > > int ret; > > > u8 old_ctrl, ctrl; > > > > > > @@ -261,8 +335,10 @@ intel_dp_aux_hdr_enable_backlight(const struct > > intel_crtc_state *crtc_state, > > > } > > > > > > ctrl = old_ctrl; > > > - if (panel->backlight.edp.intel.sdr_uses_aux) { > > > + if (intel_dp_in_hdr_mode(conn_state) || > > > + panel->backlight.edp.intel.sdr_uses_aux) { > > > ctrl |= INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE; > > > + > > > intel_dp_aux_hdr_set_aux_backlight(conn_state, level); > > > } else { > > > u32 pwm_level = intel_backlight_level_to_pwm(connector, > > level); @@ > > > -272,10 +348,18 @@ intel_dp_aux_hdr_enable_backlight(const struct > > intel_crtc_state *crtc_state, > > > ctrl &= ~INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE; > > > } > > > > > > + if (intel_dp_in_hdr_mode(conn_state)) > > > + intel_dp_aux_fill_hdr_tcon_params(conn_state, &ctrl); > > > + > > > > I think you should call intel_dp_aux_fill_hdr_tcon_params unconditionally and > > in there have the logic like this: > > > > if (hdr_metadata->hdmi_metadata_type1.eotf == > > HDMI_EOTF_SMPTE_ST2084) { > > *ctrl |= INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE; > > *ctrl |= INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE; > > *ctrl &= ~INTEL_EDP_HDR_TCON_TONE_MAPPING_ENABLE; > > } > > if (conn_state->colorspace == DRM_MODE_COLORIMETRY_BT2020_RGB ...) { > > *ctrl |= INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE; > > } > > > > I'll be dropping the condition inside the intel_dp_aux_fill_hdr_tcon_params > As writing to DPCD and filling in the params does not make sense until we are in HDR mode. See above. I believe HDR mode is just one thing you have to handle in the TCON and the gamut processing must be set independently. > > Regards, > Suraj Kandpal > > > > if (ctrl != old_ctrl && > > > drm_dp_dpcd_writeb(&intel_dp->aux, > > INTEL_EDP_HDR_GETSET_CTRL_PARAMS, ctrl) != 1) > > > drm_err(&i915->drm, "[CONNECTOR:%d:%s] Failed to > > configure DPCD brightness controls\n", > > > connector->base.base.id, connector->base.name); > > > + > > > + if (intel_dp_in_hdr_mode(conn_state)) { > > > + hdr_metadata = conn_state->hdr_output_metadata->data; > > > + intel_dp_aux_write_content_luminance(connector, > > hdr_metadata); > > > + } > > > } > > > > > > static void > > > @@ -332,7 +416,6 @@ intel_dp_aux_hdr_setup_backlight(struct > > intel_connector *connector, enum pipe pi > > > connector->base.base.id, connector->base.name, > > > panel->backlight.min, panel->backlight.max); > > > > > > - > > > panel->backlight.level = intel_dp_aux_hdr_get_backlight(connector, > > pipe); > > > panel->backlight.enabled = panel->backlight.level != 0; > > > >