Skip to content

Commit 5353219

Browse files
committed
Merge tag 'amd-drm-fixes-5.10-2020-12-02' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
amd-drm-fixes-5.10-2020-12-02: amdgpu: - SMU11 manual fan fix - Renoir display clock fix - VCN3 dynamic powergating fix Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexdeucher@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20201203044815.41257-1-alexander.deucher@amd.com
2 parents 94cfbd0 + efd6d85 commit 5353219

3 files changed

Lines changed: 36 additions & 9 deletions

File tree

drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,11 @@ static int vcn_v3_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo
10111011
tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1);
10121012
WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_CNTL, tmp);
10131013

1014+
/* Stall DPG before WPTR/RPTR reset */
1015+
WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
1016+
UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK,
1017+
~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
1018+
10141019
/* set the write pointer delay */
10151020
WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR_CNTL, 0);
10161021

@@ -1033,6 +1038,10 @@ static int vcn_v3_0_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo
10331038
WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR,
10341039
lower_32_bits(ring->wptr));
10351040

1041+
/* Unstall DPG */
1042+
WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
1043+
0, ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
1044+
10361045
return 0;
10371046
}
10381047

@@ -1556,23 +1565,31 @@ static int vcn_v3_0_pause_dpg_mode(struct amdgpu_device *adev,
15561565
UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK,
15571566
UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK);
15581567

1568+
/* Stall DPG before WPTR/RPTR reset */
1569+
WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
1570+
UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK,
1571+
~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
1572+
15591573
/* Restore */
15601574
ring = &adev->vcn.inst[inst_idx].ring_enc[0];
1575+
ring->wptr = 0;
15611576
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_LO, ring->gpu_addr);
15621577
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
15631578
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_SIZE, ring->ring_size / 4);
15641579
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));
15651580
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));
15661581

15671582
ring = &adev->vcn.inst[inst_idx].ring_enc[1];
1583+
ring->wptr = 0;
15681584
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_LO2, ring->gpu_addr);
15691585
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
15701586
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_SIZE2, ring->ring_size / 4);
15711587
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));
15721588
WREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));
15731589

1574-
WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR,
1575-
RREG32_SOC15(VCN, inst_idx, mmUVD_SCRATCH2) & 0x7FFFFFFF);
1590+
/* Unstall DPG */
1591+
WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS),
1592+
0, ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);
15761593

15771594
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS,
15781595
UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON, UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);
@@ -1630,10 +1647,6 @@ static void vcn_v3_0_dec_ring_set_wptr(struct amdgpu_ring *ring)
16301647
{
16311648
struct amdgpu_device *adev = ring->adev;
16321649

1633-
if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)
1634-
WREG32_SOC15(VCN, ring->me, mmUVD_SCRATCH2,
1635-
lower_32_bits(ring->wptr) | 0x80000000);
1636-
16371650
if (ring->use_doorbell) {
16381651
adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
16391652
WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));

drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,17 @@ void rn_update_clocks(struct clk_mgr *clk_mgr_base,
163163
new_clocks->dppclk_khz = 100000;
164164
}
165165

166-
if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr->base.clks.dppclk_khz)) {
167-
if (clk_mgr->base.clks.dppclk_khz > new_clocks->dppclk_khz)
166+
/*
167+
* Temporally ignore thew 0 cases for disp and dpp clks.
168+
* We may have a new feature that requires 0 clks in the future.
169+
*/
170+
if (new_clocks->dppclk_khz == 0 || new_clocks->dispclk_khz == 0) {
171+
new_clocks->dppclk_khz = clk_mgr_base->clks.dppclk_khz;
172+
new_clocks->dispclk_khz = clk_mgr_base->clks.dispclk_khz;
173+
}
174+
175+
if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr_base->clks.dppclk_khz)) {
176+
if (clk_mgr_base->clks.dppclk_khz > new_clocks->dppclk_khz)
168177
dpp_clock_lowered = true;
169178
clk_mgr_base->clks.dppclk_khz = new_clocks->dppclk_khz;
170179
update_dppclk = true;

drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1164,7 +1164,12 @@ int smu_v11_0_set_fan_speed_rpm(struct smu_context *smu,
11641164
if (ret)
11651165
return ret;
11661166

1167-
crystal_clock_freq = amdgpu_asic_get_xclk(adev);
1167+
/*
1168+
* crystal_clock_freq div by 4 is required since the fan control
1169+
* module refers to 25MHz
1170+
*/
1171+
1172+
crystal_clock_freq = amdgpu_asic_get_xclk(adev) / 4;
11681173
tach_period = 60 * crystal_clock_freq * 10000 / (8 * speed);
11691174
WREG32_SOC15(THM, 0, mmCG_TACH_CTRL,
11701175
REG_SET_FIELD(RREG32_SOC15(THM, 0, mmCG_TACH_CTRL),

0 commit comments

Comments
 (0)