From: Jani Nikula <jani.nikula@intel.com>
To: Rodrigo Vivi <rodrigo.vivi@intel.com>, Lyude Paul <lyude@redhat.com>
Cc: Rajeev Nandan <rajeevny@codeaurora.org>,
greg.depoire@gmail.com, nouveau@lists.freedesktop.org,
intel-gfx@lists.freedesktop.org,
Lucas De Marchi <lucas.demarchi@intel.com>,
open list <linux-kernel@vger.kernel.org>,
dri-devel@lists.freedesktop.org, David Airlie <airlied@linux.ie>,
Sean Paul <seanpaul@chromium.org>,
Dave Airlie <airlied@redhat.com>
Subject: Re: [Intel-gfx] [PATCH v6 1/9] drm/i915/dpcd_bl: Remove redundant AUX backlight frequency calculations
Date: Tue, 01 Jun 2021 22:13:25 +0300 [thread overview]
Message-ID: <87wnrdpfe2.fsf@intel.com> (raw)
In-Reply-To: <YKgSJ+0YtLYQnOQB@intel.com>
On Fri, 21 May 2021, Rodrigo Vivi <rodrigo.vivi@intel.com> wrote:
> On Fri, May 14, 2021 at 02:14:55PM -0400, Lyude Paul wrote:
>> Noticed this while moving all of the VESA backlight code in i915 over to
>> DRM helpers: it would appear that we calculate the frequency value we want
>> to write to DP_EDP_BACKLIGHT_FREQ_SET twice even though this value never
>> actually changes during runtime. So, let's simplify things by just caching
>> this value in intel_panel.backlight, and re-writing it as-needed.
>>
>> Changes since v1:
>> * Wrap panel->backlight.edp.vesa.pwm_freq_pre_divider in
>> DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP check - Jani
>
> This looks okay to me now... Jani, agree?
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
>
>>
>> Signed-off-by: Lyude Paul <lyude@redhat.com>
>> Cc: Jani Nikula <jani.nikula@intel.com>
>> Cc: Dave Airlie <airlied@gmail.com>
>> Cc: greg.depoire@gmail.com
>> ---
>> .../drm/i915/display/intel_display_types.h | 1 +
>> .../drm/i915/display/intel_dp_aux_backlight.c | 65 ++++++-------------
>> 2 files changed, 20 insertions(+), 46 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
>> index 9c0adfc60c6f..7054a37363fb 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
>> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
>> @@ -311,6 +311,7 @@ struct intel_panel {
>> union {
>> struct {
>> u8 pwmgen_bit_count;
>> + u8 pwm_freq_pre_divider;
>> } vesa;
>> struct {
>> bool sdr_uses_aux;
>> 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 8e9ac9ba1d38..68bfe50ada59 100644
>> --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
>> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
>> @@ -373,50 +373,6 @@ intel_dp_aux_vesa_set_backlight(const struct drm_connector_state *conn_state,
>> }
>> }
>>
>> -/*
>> - * Set PWM Frequency divider to match desired frequency in vbt.
>> - * The PWM Frequency is calculated as 27Mhz / (F x P).
>> - * - Where F = PWM Frequency Pre-Divider value programmed by field 7:0 of the
>> - * EDP_BACKLIGHT_FREQ_SET register (DPCD Address 00728h)
>> - * - Where P = 2^Pn, where Pn is the value programmed by field 4:0 of the
>> - * EDP_PWMGEN_BIT_COUNT register (DPCD Address 00724h)
>> - */
>> -static bool intel_dp_aux_vesa_set_pwm_freq(struct intel_connector *connector)
>> -{
>> - struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
>> - struct intel_dp *intel_dp = intel_attached_dp(connector);
>> - const u8 pn = connector->panel.backlight.edp.vesa.pwmgen_bit_count;
>> - int freq, fxp, f, fxp_actual, fxp_min, fxp_max;
>> -
>> - freq = dev_priv->vbt.backlight.pwm_freq_hz;
>> - if (!freq) {
>> - drm_dbg_kms(&dev_priv->drm,
>> - "Use panel default backlight frequency\n");
>> - return false;
>> - }
>> -
>> - fxp = DIV_ROUND_CLOSEST(KHz(DP_EDP_BACKLIGHT_FREQ_BASE_KHZ), freq);
>> - f = clamp(DIV_ROUND_CLOSEST(fxp, 1 << pn), 1, 255);
>> - fxp_actual = f << pn;
>> -
>> - /* Ensure frequency is within 25% of desired value */
>> - fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4);
>> - fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4);
>> -
>> - if (fxp_min > fxp_actual || fxp_actual > fxp_max) {
>> - drm_dbg_kms(&dev_priv->drm, "Actual frequency out of range\n");
>> - return false;
>> - }
>> -
>> - if (drm_dp_dpcd_writeb(&intel_dp->aux,
>> - DP_EDP_BACKLIGHT_FREQ_SET, (u8) f) < 0) {
>> - drm_dbg_kms(&dev_priv->drm,
>> - "Failed to write aux backlight freq\n");
>> - return false;
>> - }
>> - return true;
>> -}
>> -
>> static void
>> intel_dp_aux_vesa_enable_backlight(const struct intel_crtc_state *crtc_state,
>> const struct drm_connector_state *conn_state, u32 level)
>> @@ -459,9 +415,13 @@ intel_dp_aux_vesa_enable_backlight(const struct intel_crtc_state *crtc_state,
>> break;
>> }
>>
>> - if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP)
>> - if (intel_dp_aux_vesa_set_pwm_freq(connector))
>> + if (panel->backlight.edp.vesa.pwm_freq_pre_divider) {
>> + if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_EDP_BACKLIGHT_FREQ_SET,
>> + panel->backlight.edp.vesa.pwm_freq_pre_divider) == 1)
>> new_dpcd_buf |= DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE;
>> + else
>> + drm_dbg_kms(&i915->drm, "Failed to write aux backlight frequency\n");
>> + }
>>
>> if (new_dpcd_buf != dpcd_buf) {
>> if (drm_dp_dpcd_writeb(&intel_dp->aux,
>> @@ -482,6 +442,14 @@ static void intel_dp_aux_vesa_disable_backlight(const struct drm_connector_state
>> false);
>> }
>>
>> +/*
>> + * Compute PWM frequency divider value based off the frequency provided to us by the vbt.
>> + * The PWM Frequency is calculated as 27Mhz / (F x P).
>> + * - Where F = PWM Frequency Pre-Divider value programmed by field 7:0 of the
>> + * EDP_BACKLIGHT_FREQ_SET register (DPCD Address 00728h)
>> + * - Where P = 2^Pn, where Pn is the value programmed by field 4:0 of the
>> + * EDP_PWMGEN_BIT_COUNT register (DPCD Address 00724h)
>> + */
>> static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connector)
>> {
>> struct drm_i915_private *i915 = to_i915(connector->base.dev);
>> @@ -533,8 +501,10 @@ static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connecto
>> pn_min &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
>> pn_max &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
>>
>> + /* Ensure frequency is within 25% of desired value */
>> fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4);
>> fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4);
>> +
>> if (fxp_min < (1 << pn_min) || (255 << pn_max) < fxp_max) {
>> drm_dbg_kms(&i915->drm,
>> "VBT defined backlight frequency out of range\n");
>> @@ -555,7 +525,10 @@ static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connecto
>> "Failed to write aux pwmgen bit count\n");
>> return max_backlight;
>> }
>> +
>> panel->backlight.edp.vesa.pwmgen_bit_count = pn;
>> + if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP)
>> + panel->backlight.edp.vesa.pwm_freq_pre_divider = f;
>>
>> max_backlight = (1 << pn) - 1;
>>
>> --
>> 2.31.1
>>
--
Jani Nikula, Intel Open Source Graphics Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
WARNING: multiple messages have this Message-ID (diff)
From: Jani Nikula <jani.nikula@intel.com>
To: Rodrigo Vivi <rodrigo.vivi@intel.com>, Lyude Paul <lyude@redhat.com>
Cc: Rajeev Nandan <rajeevny@codeaurora.org>,
greg.depoire@gmail.com, nouveau@lists.freedesktop.org,
intel-gfx@lists.freedesktop.org,
Lucas De Marchi <lucas.demarchi@intel.com>,
open list <linux-kernel@vger.kernel.org>,
dri-devel@lists.freedesktop.org,
Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>,
David Airlie <airlied@linux.ie>,
Uma Shankar <uma.shankar@intel.com>,
Sean Paul <seanpaul@chromium.org>,
Anshuman Gupta <anshuman.gupta@intel.com>,
Dave Airlie <airlied@redhat.com>
Subject: Re: [Nouveau] [PATCH v6 1/9] drm/i915/dpcd_bl: Remove redundant AUX backlight frequency calculations
Date: Tue, 01 Jun 2021 22:13:25 +0300 [thread overview]
Message-ID: <87wnrdpfe2.fsf@intel.com> (raw)
In-Reply-To: <YKgSJ+0YtLYQnOQB@intel.com>
On Fri, 21 May 2021, Rodrigo Vivi <rodrigo.vivi@intel.com> wrote:
> On Fri, May 14, 2021 at 02:14:55PM -0400, Lyude Paul wrote:
>> Noticed this while moving all of the VESA backlight code in i915 over to
>> DRM helpers: it would appear that we calculate the frequency value we want
>> to write to DP_EDP_BACKLIGHT_FREQ_SET twice even though this value never
>> actually changes during runtime. So, let's simplify things by just caching
>> this value in intel_panel.backlight, and re-writing it as-needed.
>>
>> Changes since v1:
>> * Wrap panel->backlight.edp.vesa.pwm_freq_pre_divider in
>> DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP check - Jani
>
> This looks okay to me now... Jani, agree?
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
>
>>
>> Signed-off-by: Lyude Paul <lyude@redhat.com>
>> Cc: Jani Nikula <jani.nikula@intel.com>
>> Cc: Dave Airlie <airlied@gmail.com>
>> Cc: greg.depoire@gmail.com
>> ---
>> .../drm/i915/display/intel_display_types.h | 1 +
>> .../drm/i915/display/intel_dp_aux_backlight.c | 65 ++++++-------------
>> 2 files changed, 20 insertions(+), 46 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
>> index 9c0adfc60c6f..7054a37363fb 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
>> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
>> @@ -311,6 +311,7 @@ struct intel_panel {
>> union {
>> struct {
>> u8 pwmgen_bit_count;
>> + u8 pwm_freq_pre_divider;
>> } vesa;
>> struct {
>> bool sdr_uses_aux;
>> 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 8e9ac9ba1d38..68bfe50ada59 100644
>> --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
>> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
>> @@ -373,50 +373,6 @@ intel_dp_aux_vesa_set_backlight(const struct drm_connector_state *conn_state,
>> }
>> }
>>
>> -/*
>> - * Set PWM Frequency divider to match desired frequency in vbt.
>> - * The PWM Frequency is calculated as 27Mhz / (F x P).
>> - * - Where F = PWM Frequency Pre-Divider value programmed by field 7:0 of the
>> - * EDP_BACKLIGHT_FREQ_SET register (DPCD Address 00728h)
>> - * - Where P = 2^Pn, where Pn is the value programmed by field 4:0 of the
>> - * EDP_PWMGEN_BIT_COUNT register (DPCD Address 00724h)
>> - */
>> -static bool intel_dp_aux_vesa_set_pwm_freq(struct intel_connector *connector)
>> -{
>> - struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
>> - struct intel_dp *intel_dp = intel_attached_dp(connector);
>> - const u8 pn = connector->panel.backlight.edp.vesa.pwmgen_bit_count;
>> - int freq, fxp, f, fxp_actual, fxp_min, fxp_max;
>> -
>> - freq = dev_priv->vbt.backlight.pwm_freq_hz;
>> - if (!freq) {
>> - drm_dbg_kms(&dev_priv->drm,
>> - "Use panel default backlight frequency\n");
>> - return false;
>> - }
>> -
>> - fxp = DIV_ROUND_CLOSEST(KHz(DP_EDP_BACKLIGHT_FREQ_BASE_KHZ), freq);
>> - f = clamp(DIV_ROUND_CLOSEST(fxp, 1 << pn), 1, 255);
>> - fxp_actual = f << pn;
>> -
>> - /* Ensure frequency is within 25% of desired value */
>> - fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4);
>> - fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4);
>> -
>> - if (fxp_min > fxp_actual || fxp_actual > fxp_max) {
>> - drm_dbg_kms(&dev_priv->drm, "Actual frequency out of range\n");
>> - return false;
>> - }
>> -
>> - if (drm_dp_dpcd_writeb(&intel_dp->aux,
>> - DP_EDP_BACKLIGHT_FREQ_SET, (u8) f) < 0) {
>> - drm_dbg_kms(&dev_priv->drm,
>> - "Failed to write aux backlight freq\n");
>> - return false;
>> - }
>> - return true;
>> -}
>> -
>> static void
>> intel_dp_aux_vesa_enable_backlight(const struct intel_crtc_state *crtc_state,
>> const struct drm_connector_state *conn_state, u32 level)
>> @@ -459,9 +415,13 @@ intel_dp_aux_vesa_enable_backlight(const struct intel_crtc_state *crtc_state,
>> break;
>> }
>>
>> - if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP)
>> - if (intel_dp_aux_vesa_set_pwm_freq(connector))
>> + if (panel->backlight.edp.vesa.pwm_freq_pre_divider) {
>> + if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_EDP_BACKLIGHT_FREQ_SET,
>> + panel->backlight.edp.vesa.pwm_freq_pre_divider) == 1)
>> new_dpcd_buf |= DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE;
>> + else
>> + drm_dbg_kms(&i915->drm, "Failed to write aux backlight frequency\n");
>> + }
>>
>> if (new_dpcd_buf != dpcd_buf) {
>> if (drm_dp_dpcd_writeb(&intel_dp->aux,
>> @@ -482,6 +442,14 @@ static void intel_dp_aux_vesa_disable_backlight(const struct drm_connector_state
>> false);
>> }
>>
>> +/*
>> + * Compute PWM frequency divider value based off the frequency provided to us by the vbt.
>> + * The PWM Frequency is calculated as 27Mhz / (F x P).
>> + * - Where F = PWM Frequency Pre-Divider value programmed by field 7:0 of the
>> + * EDP_BACKLIGHT_FREQ_SET register (DPCD Address 00728h)
>> + * - Where P = 2^Pn, where Pn is the value programmed by field 4:0 of the
>> + * EDP_PWMGEN_BIT_COUNT register (DPCD Address 00724h)
>> + */
>> static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connector)
>> {
>> struct drm_i915_private *i915 = to_i915(connector->base.dev);
>> @@ -533,8 +501,10 @@ static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connecto
>> pn_min &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
>> pn_max &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
>>
>> + /* Ensure frequency is within 25% of desired value */
>> fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4);
>> fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4);
>> +
>> if (fxp_min < (1 << pn_min) || (255 << pn_max) < fxp_max) {
>> drm_dbg_kms(&i915->drm,
>> "VBT defined backlight frequency out of range\n");
>> @@ -555,7 +525,10 @@ static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connecto
>> "Failed to write aux pwmgen bit count\n");
>> return max_backlight;
>> }
>> +
>> panel->backlight.edp.vesa.pwmgen_bit_count = pn;
>> + if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP)
>> + panel->backlight.edp.vesa.pwm_freq_pre_divider = f;
>>
>> max_backlight = (1 << pn) - 1;
>>
>> --
>> 2.31.1
>>
--
Jani Nikula, Intel Open Source Graphics Center
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
WARNING: multiple messages have this Message-ID (diff)
From: Jani Nikula <jani.nikula@intel.com>
To: Rodrigo Vivi <rodrigo.vivi@intel.com>, Lyude Paul <lyude@redhat.com>
Cc: Rajeev Nandan <rajeevny@codeaurora.org>,
greg.depoire@gmail.com, nouveau@lists.freedesktop.org,
intel-gfx@lists.freedesktop.org,
Lucas De Marchi <lucas.demarchi@intel.com>,
open list <linux-kernel@vger.kernel.org>,
dri-devel@lists.freedesktop.org,
Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>,
David Airlie <airlied@linux.ie>,
Uma Shankar <uma.shankar@intel.com>,
Sean Paul <seanpaul@chromium.org>,
Anshuman Gupta <anshuman.gupta@intel.com>,
Dave Airlie <airlied@redhat.com>
Subject: Re: [PATCH v6 1/9] drm/i915/dpcd_bl: Remove redundant AUX backlight frequency calculations
Date: Tue, 01 Jun 2021 22:13:25 +0300 [thread overview]
Message-ID: <87wnrdpfe2.fsf@intel.com> (raw)
In-Reply-To: <YKgSJ+0YtLYQnOQB@intel.com>
On Fri, 21 May 2021, Rodrigo Vivi <rodrigo.vivi@intel.com> wrote:
> On Fri, May 14, 2021 at 02:14:55PM -0400, Lyude Paul wrote:
>> Noticed this while moving all of the VESA backlight code in i915 over to
>> DRM helpers: it would appear that we calculate the frequency value we want
>> to write to DP_EDP_BACKLIGHT_FREQ_SET twice even though this value never
>> actually changes during runtime. So, let's simplify things by just caching
>> this value in intel_panel.backlight, and re-writing it as-needed.
>>
>> Changes since v1:
>> * Wrap panel->backlight.edp.vesa.pwm_freq_pre_divider in
>> DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP check - Jani
>
> This looks okay to me now... Jani, agree?
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
>
>>
>> Signed-off-by: Lyude Paul <lyude@redhat.com>
>> Cc: Jani Nikula <jani.nikula@intel.com>
>> Cc: Dave Airlie <airlied@gmail.com>
>> Cc: greg.depoire@gmail.com
>> ---
>> .../drm/i915/display/intel_display_types.h | 1 +
>> .../drm/i915/display/intel_dp_aux_backlight.c | 65 ++++++-------------
>> 2 files changed, 20 insertions(+), 46 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
>> index 9c0adfc60c6f..7054a37363fb 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
>> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
>> @@ -311,6 +311,7 @@ struct intel_panel {
>> union {
>> struct {
>> u8 pwmgen_bit_count;
>> + u8 pwm_freq_pre_divider;
>> } vesa;
>> struct {
>> bool sdr_uses_aux;
>> 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 8e9ac9ba1d38..68bfe50ada59 100644
>> --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
>> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
>> @@ -373,50 +373,6 @@ intel_dp_aux_vesa_set_backlight(const struct drm_connector_state *conn_state,
>> }
>> }
>>
>> -/*
>> - * Set PWM Frequency divider to match desired frequency in vbt.
>> - * The PWM Frequency is calculated as 27Mhz / (F x P).
>> - * - Where F = PWM Frequency Pre-Divider value programmed by field 7:0 of the
>> - * EDP_BACKLIGHT_FREQ_SET register (DPCD Address 00728h)
>> - * - Where P = 2^Pn, where Pn is the value programmed by field 4:0 of the
>> - * EDP_PWMGEN_BIT_COUNT register (DPCD Address 00724h)
>> - */
>> -static bool intel_dp_aux_vesa_set_pwm_freq(struct intel_connector *connector)
>> -{
>> - struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
>> - struct intel_dp *intel_dp = intel_attached_dp(connector);
>> - const u8 pn = connector->panel.backlight.edp.vesa.pwmgen_bit_count;
>> - int freq, fxp, f, fxp_actual, fxp_min, fxp_max;
>> -
>> - freq = dev_priv->vbt.backlight.pwm_freq_hz;
>> - if (!freq) {
>> - drm_dbg_kms(&dev_priv->drm,
>> - "Use panel default backlight frequency\n");
>> - return false;
>> - }
>> -
>> - fxp = DIV_ROUND_CLOSEST(KHz(DP_EDP_BACKLIGHT_FREQ_BASE_KHZ), freq);
>> - f = clamp(DIV_ROUND_CLOSEST(fxp, 1 << pn), 1, 255);
>> - fxp_actual = f << pn;
>> -
>> - /* Ensure frequency is within 25% of desired value */
>> - fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4);
>> - fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4);
>> -
>> - if (fxp_min > fxp_actual || fxp_actual > fxp_max) {
>> - drm_dbg_kms(&dev_priv->drm, "Actual frequency out of range\n");
>> - return false;
>> - }
>> -
>> - if (drm_dp_dpcd_writeb(&intel_dp->aux,
>> - DP_EDP_BACKLIGHT_FREQ_SET, (u8) f) < 0) {
>> - drm_dbg_kms(&dev_priv->drm,
>> - "Failed to write aux backlight freq\n");
>> - return false;
>> - }
>> - return true;
>> -}
>> -
>> static void
>> intel_dp_aux_vesa_enable_backlight(const struct intel_crtc_state *crtc_state,
>> const struct drm_connector_state *conn_state, u32 level)
>> @@ -459,9 +415,13 @@ intel_dp_aux_vesa_enable_backlight(const struct intel_crtc_state *crtc_state,
>> break;
>> }
>>
>> - if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP)
>> - if (intel_dp_aux_vesa_set_pwm_freq(connector))
>> + if (panel->backlight.edp.vesa.pwm_freq_pre_divider) {
>> + if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_EDP_BACKLIGHT_FREQ_SET,
>> + panel->backlight.edp.vesa.pwm_freq_pre_divider) == 1)
>> new_dpcd_buf |= DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE;
>> + else
>> + drm_dbg_kms(&i915->drm, "Failed to write aux backlight frequency\n");
>> + }
>>
>> if (new_dpcd_buf != dpcd_buf) {
>> if (drm_dp_dpcd_writeb(&intel_dp->aux,
>> @@ -482,6 +442,14 @@ static void intel_dp_aux_vesa_disable_backlight(const struct drm_connector_state
>> false);
>> }
>>
>> +/*
>> + * Compute PWM frequency divider value based off the frequency provided to us by the vbt.
>> + * The PWM Frequency is calculated as 27Mhz / (F x P).
>> + * - Where F = PWM Frequency Pre-Divider value programmed by field 7:0 of the
>> + * EDP_BACKLIGHT_FREQ_SET register (DPCD Address 00728h)
>> + * - Where P = 2^Pn, where Pn is the value programmed by field 4:0 of the
>> + * EDP_PWMGEN_BIT_COUNT register (DPCD Address 00724h)
>> + */
>> static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connector)
>> {
>> struct drm_i915_private *i915 = to_i915(connector->base.dev);
>> @@ -533,8 +501,10 @@ static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connecto
>> pn_min &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
>> pn_max &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
>>
>> + /* Ensure frequency is within 25% of desired value */
>> fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4);
>> fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4);
>> +
>> if (fxp_min < (1 << pn_min) || (255 << pn_max) < fxp_max) {
>> drm_dbg_kms(&i915->drm,
>> "VBT defined backlight frequency out of range\n");
>> @@ -555,7 +525,10 @@ static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connecto
>> "Failed to write aux pwmgen bit count\n");
>> return max_backlight;
>> }
>> +
>> panel->backlight.edp.vesa.pwmgen_bit_count = pn;
>> + if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP)
>> + panel->backlight.edp.vesa.pwm_freq_pre_divider = f;
>>
>> max_backlight = (1 << pn) - 1;
>>
>> --
>> 2.31.1
>>
--
Jani Nikula, Intel Open Source Graphics Center
WARNING: multiple messages have this Message-ID (diff)
From: Jani Nikula <jani.nikula@intel.com>
To: Rodrigo Vivi <rodrigo.vivi@intel.com>, Lyude Paul <lyude@redhat.com>
Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
nouveau@lists.freedesktop.org,
Rajeev Nandan <rajeevny@codeaurora.org>,
greg.depoire@gmail.com, David Airlie <airlied@linux.ie>,
Lucas De Marchi <lucas.demarchi@intel.com>,
open list <linux-kernel@vger.kernel.org>,
Anshuman Gupta <anshuman.gupta@intel.com>,
Uma Shankar <uma.shankar@intel.com>,
Sean Paul <seanpaul@chromium.org>,
Dave Airlie <airlied@redhat.com>,
Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
Subject: Re: [PATCH v6 1/9] drm/i915/dpcd_bl: Remove redundant AUX backlight frequency calculations
Date: Tue, 01 Jun 2021 22:13:25 +0300 [thread overview]
Message-ID: <87wnrdpfe2.fsf@intel.com> (raw)
In-Reply-To: <YKgSJ+0YtLYQnOQB@intel.com>
On Fri, 21 May 2021, Rodrigo Vivi <rodrigo.vivi@intel.com> wrote:
> On Fri, May 14, 2021 at 02:14:55PM -0400, Lyude Paul wrote:
>> Noticed this while moving all of the VESA backlight code in i915 over to
>> DRM helpers: it would appear that we calculate the frequency value we want
>> to write to DP_EDP_BACKLIGHT_FREQ_SET twice even though this value never
>> actually changes during runtime. So, let's simplify things by just caching
>> this value in intel_panel.backlight, and re-writing it as-needed.
>>
>> Changes since v1:
>> * Wrap panel->backlight.edp.vesa.pwm_freq_pre_divider in
>> DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP check - Jani
>
> This looks okay to me now... Jani, agree?
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
>
>>
>> Signed-off-by: Lyude Paul <lyude@redhat.com>
>> Cc: Jani Nikula <jani.nikula@intel.com>
>> Cc: Dave Airlie <airlied@gmail.com>
>> Cc: greg.depoire@gmail.com
>> ---
>> .../drm/i915/display/intel_display_types.h | 1 +
>> .../drm/i915/display/intel_dp_aux_backlight.c | 65 ++++++-------------
>> 2 files changed, 20 insertions(+), 46 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
>> index 9c0adfc60c6f..7054a37363fb 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
>> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
>> @@ -311,6 +311,7 @@ struct intel_panel {
>> union {
>> struct {
>> u8 pwmgen_bit_count;
>> + u8 pwm_freq_pre_divider;
>> } vesa;
>> struct {
>> bool sdr_uses_aux;
>> 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 8e9ac9ba1d38..68bfe50ada59 100644
>> --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
>> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
>> @@ -373,50 +373,6 @@ intel_dp_aux_vesa_set_backlight(const struct drm_connector_state *conn_state,
>> }
>> }
>>
>> -/*
>> - * Set PWM Frequency divider to match desired frequency in vbt.
>> - * The PWM Frequency is calculated as 27Mhz / (F x P).
>> - * - Where F = PWM Frequency Pre-Divider value programmed by field 7:0 of the
>> - * EDP_BACKLIGHT_FREQ_SET register (DPCD Address 00728h)
>> - * - Where P = 2^Pn, where Pn is the value programmed by field 4:0 of the
>> - * EDP_PWMGEN_BIT_COUNT register (DPCD Address 00724h)
>> - */
>> -static bool intel_dp_aux_vesa_set_pwm_freq(struct intel_connector *connector)
>> -{
>> - struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
>> - struct intel_dp *intel_dp = intel_attached_dp(connector);
>> - const u8 pn = connector->panel.backlight.edp.vesa.pwmgen_bit_count;
>> - int freq, fxp, f, fxp_actual, fxp_min, fxp_max;
>> -
>> - freq = dev_priv->vbt.backlight.pwm_freq_hz;
>> - if (!freq) {
>> - drm_dbg_kms(&dev_priv->drm,
>> - "Use panel default backlight frequency\n");
>> - return false;
>> - }
>> -
>> - fxp = DIV_ROUND_CLOSEST(KHz(DP_EDP_BACKLIGHT_FREQ_BASE_KHZ), freq);
>> - f = clamp(DIV_ROUND_CLOSEST(fxp, 1 << pn), 1, 255);
>> - fxp_actual = f << pn;
>> -
>> - /* Ensure frequency is within 25% of desired value */
>> - fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4);
>> - fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4);
>> -
>> - if (fxp_min > fxp_actual || fxp_actual > fxp_max) {
>> - drm_dbg_kms(&dev_priv->drm, "Actual frequency out of range\n");
>> - return false;
>> - }
>> -
>> - if (drm_dp_dpcd_writeb(&intel_dp->aux,
>> - DP_EDP_BACKLIGHT_FREQ_SET, (u8) f) < 0) {
>> - drm_dbg_kms(&dev_priv->drm,
>> - "Failed to write aux backlight freq\n");
>> - return false;
>> - }
>> - return true;
>> -}
>> -
>> static void
>> intel_dp_aux_vesa_enable_backlight(const struct intel_crtc_state *crtc_state,
>> const struct drm_connector_state *conn_state, u32 level)
>> @@ -459,9 +415,13 @@ intel_dp_aux_vesa_enable_backlight(const struct intel_crtc_state *crtc_state,
>> break;
>> }
>>
>> - if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP)
>> - if (intel_dp_aux_vesa_set_pwm_freq(connector))
>> + if (panel->backlight.edp.vesa.pwm_freq_pre_divider) {
>> + if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_EDP_BACKLIGHT_FREQ_SET,
>> + panel->backlight.edp.vesa.pwm_freq_pre_divider) == 1)
>> new_dpcd_buf |= DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE;
>> + else
>> + drm_dbg_kms(&i915->drm, "Failed to write aux backlight frequency\n");
>> + }
>>
>> if (new_dpcd_buf != dpcd_buf) {
>> if (drm_dp_dpcd_writeb(&intel_dp->aux,
>> @@ -482,6 +442,14 @@ static void intel_dp_aux_vesa_disable_backlight(const struct drm_connector_state
>> false);
>> }
>>
>> +/*
>> + * Compute PWM frequency divider value based off the frequency provided to us by the vbt.
>> + * The PWM Frequency is calculated as 27Mhz / (F x P).
>> + * - Where F = PWM Frequency Pre-Divider value programmed by field 7:0 of the
>> + * EDP_BACKLIGHT_FREQ_SET register (DPCD Address 00728h)
>> + * - Where P = 2^Pn, where Pn is the value programmed by field 4:0 of the
>> + * EDP_PWMGEN_BIT_COUNT register (DPCD Address 00724h)
>> + */
>> static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connector)
>> {
>> struct drm_i915_private *i915 = to_i915(connector->base.dev);
>> @@ -533,8 +501,10 @@ static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connecto
>> pn_min &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
>> pn_max &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
>>
>> + /* Ensure frequency is within 25% of desired value */
>> fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4);
>> fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4);
>> +
>> if (fxp_min < (1 << pn_min) || (255 << pn_max) < fxp_max) {
>> drm_dbg_kms(&i915->drm,
>> "VBT defined backlight frequency out of range\n");
>> @@ -555,7 +525,10 @@ static u32 intel_dp_aux_vesa_calc_max_backlight(struct intel_connector *connecto
>> "Failed to write aux pwmgen bit count\n");
>> return max_backlight;
>> }
>> +
>> panel->backlight.edp.vesa.pwmgen_bit_count = pn;
>> + if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP)
>> + panel->backlight.edp.vesa.pwm_freq_pre_divider = f;
>>
>> max_backlight = (1 << pn) - 1;
>>
>> --
>> 2.31.1
>>
--
Jani Nikula, Intel Open Source Graphics Center
next prev parent reply other threads:[~2021-06-01 19:13 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-14 18:14 [Intel-gfx] [PATCH v6 0/9] drm: Extract DPCD backlight helpers from i915, add support in nouveau Lyude Paul
2021-05-14 18:14 ` Lyude Paul
2021-05-14 18:14 ` [Nouveau] " Lyude Paul
2021-05-14 18:14 ` [Intel-gfx] [PATCH v6 1/9] drm/i915/dpcd_bl: Remove redundant AUX backlight frequency calculations Lyude Paul
2021-05-14 18:14 ` Lyude Paul
2021-05-14 18:14 ` Lyude Paul
2021-05-14 18:14 ` [Nouveau] " Lyude Paul
2021-05-21 20:03 ` [Intel-gfx] " Rodrigo Vivi
2021-05-21 20:03 ` Rodrigo Vivi
2021-05-21 20:03 ` Rodrigo Vivi
2021-05-21 20:03 ` [Nouveau] " Rodrigo Vivi
2021-06-01 19:13 ` Jani Nikula [this message]
2021-06-01 19:13 ` Jani Nikula
2021-06-01 19:13 ` Jani Nikula
2021-06-01 19:13 ` [Nouveau] " Jani Nikula
2021-05-14 18:14 ` [Intel-gfx] [PATCH v6 2/9] drm/i915/dpcd_bl: Handle drm_dpcd_read/write() return values correctly Lyude Paul
2021-05-14 18:14 ` Lyude Paul
2021-05-14 18:14 ` Lyude Paul
2021-05-14 18:14 ` [Nouveau] " Lyude Paul
2021-05-14 18:14 ` [Intel-gfx] [PATCH v6 3/9] drm/i915/dpcd_bl: Cleanup intel_dp_aux_vesa_enable_backlight() a bit Lyude Paul
2021-05-14 18:14 ` Lyude Paul
2021-05-14 18:14 ` Lyude Paul
2021-05-14 18:14 ` [Nouveau] " Lyude Paul
2021-05-14 18:14 ` [Intel-gfx] [PATCH v6 4/9] drm/i915/dpcd_bl: Cache some backlight capabilities in intel_panel.backlight Lyude Paul
2021-05-14 18:14 ` Lyude Paul
2021-05-14 18:14 ` Lyude Paul
2021-05-14 18:14 ` [Nouveau] " Lyude Paul
2021-05-14 18:14 ` [Intel-gfx] [PATCH v6 5/9] drm/i915/dpcd_bl: Move VESA backlight enabling code closer together Lyude Paul
2021-05-14 18:14 ` Lyude Paul
2021-05-14 18:14 ` Lyude Paul
2021-05-14 18:14 ` [Nouveau] " Lyude Paul
2021-05-14 18:15 ` [Intel-gfx] [PATCH v6 6/9] drm/i915/dpcd_bl: Return early in vesa_calc_max_backlight if we can't read PWMGEN_BIT_COUNT Lyude Paul
2021-05-14 18:15 ` Lyude Paul
2021-05-14 18:15 ` Lyude Paul
2021-05-14 18:15 ` [Nouveau] " Lyude Paul
2021-05-14 18:15 ` [Intel-gfx] [PATCH v6 7/9] drm/i915/dpcd_bl: Print return codes for VESA backlight failures Lyude Paul
2021-05-14 18:15 ` Lyude Paul
2021-05-14 18:15 ` Lyude Paul
2021-05-14 18:15 ` [Nouveau] " Lyude Paul
2021-05-14 18:15 ` [Intel-gfx] [PATCH v6 8/9] drm/dp: Extract i915's eDP backlight code into DRM helpers Lyude Paul
2021-05-14 18:15 ` Lyude Paul
2021-05-14 18:15 ` Lyude Paul
2021-05-14 18:15 ` [Nouveau] " Lyude Paul
2021-05-21 20:02 ` [Intel-gfx] " Rodrigo Vivi
2021-05-21 20:02 ` Rodrigo Vivi
2021-05-21 20:02 ` Rodrigo Vivi
2021-05-21 20:02 ` [Nouveau] " Rodrigo Vivi
2021-05-14 18:15 ` [Intel-gfx] [PATCH v6 9/9] drm/nouveau/kms/nv50-: Add basic DPCD backlight support for nouveau Lyude Paul
2021-05-14 18:15 ` Lyude Paul
2021-05-14 18:15 ` Lyude Paul
2021-05-14 18:15 ` [Nouveau] " Lyude Paul
2021-05-14 18:32 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm: Extract DPCD backlight helpers from i915, add support in nouveau (rev8) Patchwork
2021-05-14 18:35 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2021-05-14 19:02 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2021-05-15 4:09 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
2021-05-17 17:01 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm: Extract DPCD backlight helpers from i915, add support in nouveau (rev9) Patchwork
2021-05-17 17:03 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2021-05-17 17:31 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
2021-05-18 19:41 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm: Extract DPCD backlight helpers from i915, add support in nouveau (rev10) Patchwork
2021-05-18 19:44 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2021-05-18 20:12 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2021-05-19 23:29 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87wnrdpfe2.fsf@intel.com \
--to=jani.nikula@intel.com \
--cc=airlied@linux.ie \
--cc=airlied@redhat.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=greg.depoire@gmail.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lucas.demarchi@intel.com \
--cc=lyude@redhat.com \
--cc=nouveau@lists.freedesktop.org \
--cc=rajeevny@codeaurora.org \
--cc=rodrigo.vivi@intel.com \
--cc=seanpaul@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.