lkml.org 
[lkml]   [2019]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 125/350] drm/amd/display: enable hostvm based on roimmu active for dcn2.1
    Date
    From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>

    [ Upstream commit 48d92e8eda3d9b61978377e7539bfc5958e850cf ]

    Enabling hostvm when ROIMMU is not active seems to break GPUVM.
    This fixes the issue by not enabling hostvm if ROIMMU is not
    activated.

    Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
    Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
    Reviewed-by: Roman Li <Roman.Li@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../drm/amd/display/dc/dcn21/dcn21_hubbub.c | 40 ++++++++++++-------
    1 file changed, 25 insertions(+), 15 deletions(-)

    diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubbub.c
    index d1266741763b9..f5f6b4a0f0aa4 100644
    --- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubbub.c
    +++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubbub.c
    @@ -22,6 +22,7 @@
    * Authors: AMD
    *
    */
    +#include <linux/delay.h>
    #include "dm_services.h"
    #include "dcn20/dcn20_hubbub.h"
    #include "dcn21_hubbub.h"
    @@ -71,30 +72,39 @@ static uint32_t convert_and_clamp(
    void dcn21_dchvm_init(struct hubbub *hubbub)
    {
    struct dcn20_hubbub *hubbub1 = TO_DCN20_HUBBUB(hubbub);
    + uint32_t riommu_active;
    + int i;

    //Init DCHVM block
    REG_UPDATE(DCHVM_CTRL0, HOSTVM_INIT_REQ, 1);

    //Poll until RIOMMU_ACTIVE = 1
    - //TODO: Figure out interval us and retry count
    - REG_WAIT(DCHVM_RIOMMU_STAT0, RIOMMU_ACTIVE, 1, 5, 100);
    + for (i = 0; i < 100; i++) {
    + REG_GET(DCHVM_RIOMMU_STAT0, RIOMMU_ACTIVE, &riommu_active);

    - //Reflect the power status of DCHUBBUB
    - REG_UPDATE(DCHVM_RIOMMU_CTRL0, HOSTVM_POWERSTATUS, 1);
    + if (riommu_active)
    + break;
    + else
    + udelay(5);
    + }
    +
    + if (riommu_active) {
    + //Reflect the power status of DCHUBBUB
    + REG_UPDATE(DCHVM_RIOMMU_CTRL0, HOSTVM_POWERSTATUS, 1);

    - //Start rIOMMU prefetching
    - REG_UPDATE(DCHVM_RIOMMU_CTRL0, HOSTVM_PREFETCH_REQ, 1);
    + //Start rIOMMU prefetching
    + REG_UPDATE(DCHVM_RIOMMU_CTRL0, HOSTVM_PREFETCH_REQ, 1);

    - // Enable dynamic clock gating
    - REG_UPDATE_4(DCHVM_CLK_CTRL,
    - HVM_DISPCLK_R_GATE_DIS, 0,
    - HVM_DISPCLK_G_GATE_DIS, 0,
    - HVM_DCFCLK_R_GATE_DIS, 0,
    - HVM_DCFCLK_G_GATE_DIS, 0);
    + // Enable dynamic clock gating
    + REG_UPDATE_4(DCHVM_CLK_CTRL,
    + HVM_DISPCLK_R_GATE_DIS, 0,
    + HVM_DISPCLK_G_GATE_DIS, 0,
    + HVM_DCFCLK_R_GATE_DIS, 0,
    + HVM_DCFCLK_G_GATE_DIS, 0);

    - //Poll until HOSTVM_PREFETCH_DONE = 1
    - //TODO: Figure out interval us and retry count
    - REG_WAIT(DCHVM_RIOMMU_STAT0, HOSTVM_PREFETCH_DONE, 1, 5, 100);
    + //Poll until HOSTVM_PREFETCH_DONE = 1
    + REG_WAIT(DCHVM_RIOMMU_STAT0, HOSTVM_PREFETCH_DONE, 1, 5, 100);
    + }
    }

    static int hubbub21_init_dchub(struct hubbub *hubbub,
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-12-10 22:32    [W:2.086 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site