[PATCH] drm/amd/display: Enabling eDP no power sequencing with DAL feature mask
Cornij, Nikola
Nikola.Cornij at amd.com
Tue Jun 22 01:30:58 UTC 2021
[Public]
>From: Liu, Zhan <Zhan.Liu at amd.com>
>Sent: Monday, June 21, 2021 9:13 PM
>To: amd-gfx at lists.freedesktop.org <amd-gfx at lists.freedesktop.org>; Cornij, Nikola <Nikola.Cornij at amd.com>
>Cc: Liu, Charlene <Charlene.Liu at amd.com>
>Subject: [PATCH] drm/amd/display: Enabling eDP no power sequencing with DAL feature mask
>
>[Public]
>
>[Why]
>Sometimes, DP receiver chip power-controlled externally by an
>Embedded Controller could be treated and used as eDP,
>if it drives mobile display. In this case,
>we shouldn't be doing power-sequencing, hence we can skip
>waiting for T7-ready and T9-ready."
>
>[How]
>Added a feature mask to enable eDP no power sequencing feature.
>
>To enable this, set 0x10 flag in amdgpu.dcfeaturemask on
>Linux command line.
>
>Signed-off-by: Zhan Liu <zhan.liu at amd.com>
Reviewed-by: Nikola Cornij <Nikola.Cornij at amd.com>
>Change-Id: I15e8fb2979fe3ff5491ccf1ee384693d4dce787c
>---
> drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 1 +
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++
> drivers/gpu/drm/amd/display/dc/dc.h | 1 +
> .../display/dc/dce110/dce110_hw_sequencer.c | 31 ++++++++++++++++---
> drivers/gpu/drm/amd/include/amd_shared.h | 10 +++---
> 5 files changed, 38 insertions(+), 8 deletions(-)
>
>diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>index 3de1accb060e..b588cf4398db 100644
>--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
>@@ -159,6 +159,7 @@ int amdgpu_smu_pptable_id = -1;
> * highest. That helps saving some idle power.
> * DISABLE_FRACTIONAL_PWM (bit 2) disabled by default
> * PSR (bit 3) disabled by default
>+ * EDP NO POWER SEQUENCING (bit 4) disabled by default
> */
> uint amdgpu_dc_feature_mask = 2;
> uint amdgpu_dc_debug_mask;
>diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>index c0a3119982b0..abba26c8f20a 100644
>--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
>@@ -1174,6 +1174,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
> if (amdgpu_dc_feature_mask & DC_DISABLE_FRACTIONAL_PWM_MASK)
> init_data.flags.disable_fractional_pwm = true;
>
>+ if (amdgpu_dc_feature_mask & DC_EDP_NO_POWER_SEQUENCING)
>+ init_data.flags.edp_no_power_sequencing = true;
>+
> init_data.flags.power_down_display_on_boot = true;
>
> INIT_LIST_HEAD(&adev->dm.da_list);
>diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
>index a70697898025..7f1d2d6f9de8 100644
>--- a/drivers/gpu/drm/amd/display/dc/dc.h
>+++ b/drivers/gpu/drm/amd/display/dc/dc.h
>@@ -297,6 +297,7 @@ struct dc_config {
> bool allow_seamless_boot_optimization;
> bool power_down_display_on_boot;
> bool edp_not_connected;
>+ bool edp_no_power_sequencing;
> bool force_enum_edp;
> bool forced_clocks;
> bool allow_lttpr_non_transparent_mode;
>diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
>index 53dd305fa6b0..013d94c9506a 100644
>--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
>+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
>@@ -1023,8 +1023,20 @@ void dce110_edp_backlight_control(
> /* dc_service_sleep_in_milliseconds(50); */
> /*edp 1.2*/
> panel_instance = link->panel_cntl->inst;
>- if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_ON)
>- edp_receiver_ready_T7(link);
>+
>+ if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_ON) {
>+ if (!link->dc->config.edp_no_power_sequencing)
>+ /*
>+ * Sometimes, DP receiver chip power-controlled externally by an
>+ * Embedded Controller could be treated and used as eDP,
>+ * if it drives mobile display. In this case,
>+ * we shouldn't be doing power-sequencing, hence we can skip
>+ * waiting for T7-ready.
>+ */
>+ edp_receiver_ready_T7(link);
>+ else
>+ DC_LOG_DC("edp_receiver_ready_T7 skipped\n");
>+ }
>
> if (ctx->dc->ctx->dmub_srv &&
> ctx->dc->debug.dmub_command_table) {
>@@ -1049,8 +1061,19 @@ void dce110_edp_backlight_control(
> dc_link_backlight_enable_aux(link, enable);
>
> /*edp 1.2*/
>- if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_OFF)
>- edp_add_delay_for_T9(link);
>+ if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_OFF) {
>+ if (!link->dc->config.edp_no_power_sequencing)
>+ /*
>+ * Sometimes, DP receiver chip power-controlled externally by an
>+ * Embedded Controller could be treated and used as eDP,
>+ * if it drives mobile display. In this case,
>+ * we shouldn't be doing power-sequencing, hence we can skip
>+ * waiting for T9-ready.
>+ */
>+ edp_add_delay_for_T9(link);
>+ else
>+ DC_LOG_DC("edp_receiver_ready_T9 skipped\n");
>+ }
>
> if (!enable && link->dpcd_sink_ext_caps.bits.oled)
> msleep(OLED_PRE_T11_DELAY);
>diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h
>index 9ab706cd07ff..d326339cb3cd 100644
>--- a/drivers/gpu/drm/amd/include/amd_shared.h
>+++ b/drivers/gpu/drm/amd/include/amd_shared.h
>@@ -223,10 +223,12 @@ enum amd_harvest_ip_mask {
> };
>
> enum DC_FEATURE_MASK {
>- DC_FBC_MASK = 0x1,
>- DC_MULTI_MON_PP_MCLK_SWITCH_MASK = 0x2,
>- DC_DISABLE_FRACTIONAL_PWM_MASK = 0x4,
>- DC_PSR_MASK = 0x8,
>+ //Default value can be found at "uint amdgpu_dc_feature_mask"
>+ DC_FBC_MASK = (1 << 0), //0x1, disabled by default
>+ DC_MULTI_MON_PP_MCLK_SWITCH_MASK = (1 << 1), //0x2, enabled by default
>+ DC_DISABLE_FRACTIONAL_PWM_MASK = (1 << 2), //0x4, disabled by default
>+ DC_PSR_MASK = (1 << 3), //0x8, disabled by default
>+ DC_EDP_NO_POWER_SEQUENCING = (1 << 4), //0x10, disabled by default
> };
>
> enum DC_DEBUG_MASK {
>--
>2.25.1
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20210622/f20b9cbb/attachment-0001.htm>
More information about the amd-gfx
mailing list