lkml.org 
[lkml]   [2021]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.14 061/252] drm/amd/display: Fixed hardware power down bypass during headless boot
    Date
    From: Jake Wang <haonan.wang2@amd.com>

    [ Upstream commit 3addbde269f21ffc735f6d3d0c2237664923824e ]

    [Why]
    During headless boot, DIG may be on which causes HW/SW discrepancies.
    To avoid this we power down hardware on boot if DIG is turned on. With
    introduction of multiple eDP, hardware power down is being bypassed
    under certain conditions.

    [How]
    Fixed hardware power down bypass, and ensured hardware will power down
    if DIG is on and seamless boot is not enabled.

    Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
    Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
    Signed-off-by: Jake Wang <haonan.wang2@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 27 +++++++++----------
    .../drm/amd/display/dc/dcn30/dcn30_hwseq.c | 25 ++++++++---------
    .../drm/amd/display/dc/dcn31/dcn31_hwseq.c | 5 +++-
    3 files changed, 27 insertions(+), 30 deletions(-)

    diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
    index c545eddabdcc..dee1ce5f9609 100644
    --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
    +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
    @@ -1502,25 +1502,22 @@ void dcn10_init_hw(struct dc *dc)
    void dcn10_power_down_on_boot(struct dc *dc)
    {
    struct dc_link *edp_links[MAX_NUM_EDP];
    - struct dc_link *edp_link;
    + struct dc_link *edp_link = NULL;
    int edp_num;
    int i = 0;

    get_edp_links(dc, edp_links, &edp_num);
    -
    - if (edp_num) {
    - for (i = 0; i < edp_num; i++) {
    - edp_link = edp_links[i];
    - if (edp_link->link_enc->funcs->is_dig_enabled &&
    - edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc) &&
    - dc->hwseq->funcs.edp_backlight_control &&
    - dc->hwss.power_down &&
    - dc->hwss.edp_power_control) {
    - dc->hwseq->funcs.edp_backlight_control(edp_link, false);
    - dc->hwss.power_down(dc);
    - dc->hwss.edp_power_control(edp_link, false);
    - }
    - }
    + if (edp_num)
    + edp_link = edp_links[0];
    +
    + if (edp_link && edp_link->link_enc->funcs->is_dig_enabled &&
    + edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc) &&
    + dc->hwseq->funcs.edp_backlight_control &&
    + dc->hwss.power_down &&
    + dc->hwss.edp_power_control) {
    + dc->hwseq->funcs.edp_backlight_control(edp_link, false);
    + dc->hwss.power_down(dc);
    + dc->hwss.edp_power_control(edp_link, false);
    } else {
    for (i = 0; i < dc->link_count; i++) {
    struct dc_link *link = dc->links[i];
    diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
    index c68e3a708a33..2e8ab9775fa3 100644
    --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
    +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
    @@ -580,22 +580,19 @@ void dcn30_init_hw(struct dc *dc)
    */
    if (dc->config.power_down_display_on_boot) {
    struct dc_link *edp_links[MAX_NUM_EDP];
    - struct dc_link *edp_link;
    + struct dc_link *edp_link = NULL;

    get_edp_links(dc, edp_links, &edp_num);
    - if (edp_num) {
    - for (i = 0; i < edp_num; i++) {
    - edp_link = edp_links[i];
    - if (edp_link->link_enc->funcs->is_dig_enabled &&
    - edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc) &&
    - dc->hwss.edp_backlight_control &&
    - dc->hwss.power_down &&
    - dc->hwss.edp_power_control) {
    - dc->hwss.edp_backlight_control(edp_link, false);
    - dc->hwss.power_down(dc);
    - dc->hwss.edp_power_control(edp_link, false);
    - }
    - }
    + if (edp_num)
    + edp_link = edp_links[0];
    + if (edp_link && edp_link->link_enc->funcs->is_dig_enabled &&
    + edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc) &&
    + dc->hwss.edp_backlight_control &&
    + dc->hwss.power_down &&
    + dc->hwss.edp_power_control) {
    + dc->hwss.edp_backlight_control(edp_link, false);
    + dc->hwss.power_down(dc);
    + dc->hwss.edp_power_control(edp_link, false);
    } else {
    for (i = 0; i < dc->link_count; i++) {
    struct dc_link *link = dc->links[i];
    diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
    index 8a2119d8ca0d..8189606537c5 100644
    --- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
    +++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c
    @@ -226,6 +226,7 @@ void dcn31_init_hw(struct dc *dc)
    if (dc->config.power_down_display_on_boot) {
    struct dc_link *edp_links[MAX_NUM_EDP];
    struct dc_link *edp_link;
    + bool power_down = false;

    get_edp_links(dc, edp_links, &edp_num);
    if (edp_num) {
    @@ -239,9 +240,11 @@ void dcn31_init_hw(struct dc *dc)
    dc->hwss.edp_backlight_control(edp_link, false);
    dc->hwss.power_down(dc);
    dc->hwss.edp_power_control(edp_link, false);
    + power_down = true;
    }
    }
    - } else {
    + }
    + if (!power_down) {
    for (i = 0; i < dc->link_count; i++) {
    struct dc_link *link = dc->links[i];

    --
    2.30.2
    \
     
     \ /
      Last update: 2021-09-09 13:47    [W:4.200 / U:0.592 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site