Skip to content

Commit 2ac4853

Browse files
committed
Merge tag 'amd-drm-fixes-5.6-2020-03-05' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
amd-drm-fixes-5.6-2020-03-05: amdgpu: - Gfx reset fix for gfx9, 10 - Fix for gfx10 - DP MST fix - DCC fix - Renoir power fixes - Navi power fix Signed-off-by: Dave Airlie <[email protected]> From: Alex Deucher <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 64c3fd5 + 09ed6ba commit 2ac4853

File tree

8 files changed

+129
-55
lines changed

8 files changed

+129
-55
lines changed

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

Lines changed: 52 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
* 1. Primary ring
5353
* 2. Async ring
5454
*/
55-
#define GFX10_NUM_GFX_RINGS 2
55+
#define GFX10_NUM_GFX_RINGS_NV1X 1
5656
#define GFX10_MEC_HPD_SIZE 2048
5757

5858
#define F32_CE_PROGRAM_RAM_SIZE 65536
@@ -1304,7 +1304,7 @@ static int gfx_v10_0_sw_init(void *handle)
13041304
case CHIP_NAVI14:
13051305
case CHIP_NAVI12:
13061306
adev->gfx.me.num_me = 1;
1307-
adev->gfx.me.num_pipe_per_me = 2;
1307+
adev->gfx.me.num_pipe_per_me = 1;
13081308
adev->gfx.me.num_queue_per_pipe = 1;
13091309
adev->gfx.mec.num_mec = 2;
13101310
adev->gfx.mec.num_pipe_per_mec = 4;
@@ -2710,18 +2710,20 @@ static int gfx_v10_0_cp_gfx_start(struct amdgpu_device *adev)
27102710
amdgpu_ring_commit(ring);
27112711

27122712
/* submit cs packet to copy state 0 to next available state */
2713-
ring = &adev->gfx.gfx_ring[1];
2714-
r = amdgpu_ring_alloc(ring, 2);
2715-
if (r) {
2716-
DRM_ERROR("amdgpu: cp failed to lock ring (%d).\n", r);
2717-
return r;
2718-
}
2719-
2720-
amdgpu_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
2721-
amdgpu_ring_write(ring, 0);
2713+
if (adev->gfx.num_gfx_rings > 1) {
2714+
/* maximum supported gfx ring is 2 */
2715+
ring = &adev->gfx.gfx_ring[1];
2716+
r = amdgpu_ring_alloc(ring, 2);
2717+
if (r) {
2718+
DRM_ERROR("amdgpu: cp failed to lock ring (%d).\n", r);
2719+
return r;
2720+
}
27222721

2723-
amdgpu_ring_commit(ring);
2722+
amdgpu_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
2723+
amdgpu_ring_write(ring, 0);
27242724

2725+
amdgpu_ring_commit(ring);
2726+
}
27252727
return 0;
27262728
}
27272729

@@ -2818,39 +2820,41 @@ static int gfx_v10_0_cp_gfx_resume(struct amdgpu_device *adev)
28182820
mutex_unlock(&adev->srbm_mutex);
28192821

28202822
/* Init gfx ring 1 for pipe 1 */
2821-
mutex_lock(&adev->srbm_mutex);
2822-
gfx_v10_0_cp_gfx_switch_pipe(adev, PIPE_ID1);
2823-
ring = &adev->gfx.gfx_ring[1];
2824-
rb_bufsz = order_base_2(ring->ring_size / 8);
2825-
tmp = REG_SET_FIELD(0, CP_RB1_CNTL, RB_BUFSZ, rb_bufsz);
2826-
tmp = REG_SET_FIELD(tmp, CP_RB1_CNTL, RB_BLKSZ, rb_bufsz - 2);
2827-
WREG32_SOC15(GC, 0, mmCP_RB1_CNTL, tmp);
2828-
/* Initialize the ring buffer's write pointers */
2829-
ring->wptr = 0;
2830-
WREG32_SOC15(GC, 0, mmCP_RB1_WPTR, lower_32_bits(ring->wptr));
2831-
WREG32_SOC15(GC, 0, mmCP_RB1_WPTR_HI, upper_32_bits(ring->wptr));
2832-
/* Set the wb address wether it's enabled or not */
2833-
rptr_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4);
2834-
WREG32_SOC15(GC, 0, mmCP_RB1_RPTR_ADDR, lower_32_bits(rptr_addr));
2835-
WREG32_SOC15(GC, 0, mmCP_RB1_RPTR_ADDR_HI, upper_32_bits(rptr_addr) &
2836-
CP_RB1_RPTR_ADDR_HI__RB_RPTR_ADDR_HI_MASK);
2837-
wptr_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);
2838-
WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_ADDR_LO,
2839-
lower_32_bits(wptr_gpu_addr));
2840-
WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_ADDR_HI,
2841-
upper_32_bits(wptr_gpu_addr));
2842-
2843-
mdelay(1);
2844-
WREG32_SOC15(GC, 0, mmCP_RB1_CNTL, tmp);
2845-
2846-
rb_addr = ring->gpu_addr >> 8;
2847-
WREG32_SOC15(GC, 0, mmCP_RB1_BASE, rb_addr);
2848-
WREG32_SOC15(GC, 0, mmCP_RB1_BASE_HI, upper_32_bits(rb_addr));
2849-
WREG32_SOC15(GC, 0, mmCP_RB1_ACTIVE, 1);
2850-
2851-
gfx_v10_0_cp_gfx_set_doorbell(adev, ring);
2852-
mutex_unlock(&adev->srbm_mutex);
2853-
2823+
if (adev->gfx.num_gfx_rings > 1) {
2824+
mutex_lock(&adev->srbm_mutex);
2825+
gfx_v10_0_cp_gfx_switch_pipe(adev, PIPE_ID1);
2826+
/* maximum supported gfx ring is 2 */
2827+
ring = &adev->gfx.gfx_ring[1];
2828+
rb_bufsz = order_base_2(ring->ring_size / 8);
2829+
tmp = REG_SET_FIELD(0, CP_RB1_CNTL, RB_BUFSZ, rb_bufsz);
2830+
tmp = REG_SET_FIELD(tmp, CP_RB1_CNTL, RB_BLKSZ, rb_bufsz - 2);
2831+
WREG32_SOC15(GC, 0, mmCP_RB1_CNTL, tmp);
2832+
/* Initialize the ring buffer's write pointers */
2833+
ring->wptr = 0;
2834+
WREG32_SOC15(GC, 0, mmCP_RB1_WPTR, lower_32_bits(ring->wptr));
2835+
WREG32_SOC15(GC, 0, mmCP_RB1_WPTR_HI, upper_32_bits(ring->wptr));
2836+
/* Set the wb address wether it's enabled or not */
2837+
rptr_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4);
2838+
WREG32_SOC15(GC, 0, mmCP_RB1_RPTR_ADDR, lower_32_bits(rptr_addr));
2839+
WREG32_SOC15(GC, 0, mmCP_RB1_RPTR_ADDR_HI, upper_32_bits(rptr_addr) &
2840+
CP_RB1_RPTR_ADDR_HI__RB_RPTR_ADDR_HI_MASK);
2841+
wptr_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);
2842+
WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_ADDR_LO,
2843+
lower_32_bits(wptr_gpu_addr));
2844+
WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_ADDR_HI,
2845+
upper_32_bits(wptr_gpu_addr));
2846+
2847+
mdelay(1);
2848+
WREG32_SOC15(GC, 0, mmCP_RB1_CNTL, tmp);
2849+
2850+
rb_addr = ring->gpu_addr >> 8;
2851+
WREG32_SOC15(GC, 0, mmCP_RB1_BASE, rb_addr);
2852+
WREG32_SOC15(GC, 0, mmCP_RB1_BASE_HI, upper_32_bits(rb_addr));
2853+
WREG32_SOC15(GC, 0, mmCP_RB1_ACTIVE, 1);
2854+
2855+
gfx_v10_0_cp_gfx_set_doorbell(adev, ring);
2856+
mutex_unlock(&adev->srbm_mutex);
2857+
}
28542858
/* Switch to pipe 0 */
28552859
mutex_lock(&adev->srbm_mutex);
28562860
gfx_v10_0_cp_gfx_switch_pipe(adev, PIPE_ID0);
@@ -3513,6 +3517,7 @@ static int gfx_v10_0_kcq_init_queue(struct amdgpu_ring *ring)
35133517

35143518
/* reset ring buffer */
35153519
ring->wptr = 0;
3520+
atomic64_set((atomic64_t *)&adev->wb.wb[ring->wptr_offs], 0);
35163521
amdgpu_ring_clear_ring(ring);
35173522
} else {
35183523
amdgpu_ring_clear_ring(ring);
@@ -3966,7 +3971,8 @@ static int gfx_v10_0_early_init(void *handle)
39663971
{
39673972
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
39683973

3969-
adev->gfx.num_gfx_rings = GFX10_NUM_GFX_RINGS;
3974+
adev->gfx.num_gfx_rings = GFX10_NUM_GFX_RINGS_NV1X;
3975+
39703976
adev->gfx.num_compute_rings = AMDGPU_MAX_COMPUTE_RINGS;
39713977

39723978
gfx_v10_0_set_kiq_pm4_funcs(adev);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3663,6 +3663,7 @@ static int gfx_v9_0_kcq_init_queue(struct amdgpu_ring *ring)
36633663

36643664
/* reset ring buffer */
36653665
ring->wptr = 0;
3666+
atomic64_set((atomic64_t *)&adev->wb.wb[ring->wptr_offs], 0);
36663667
amdgpu_ring_clear_ring(ring);
36673668
} else {
36683669
amdgpu_ring_clear_ring(ring);

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,6 +1422,73 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend)
14221422
drm_kms_helper_hotplug_event(dev);
14231423
}
14241424

1425+
static int amdgpu_dm_smu_write_watermarks_table(struct amdgpu_device *adev)
1426+
{
1427+
struct smu_context *smu = &adev->smu;
1428+
int ret = 0;
1429+
1430+
if (!is_support_sw_smu(adev))
1431+
return 0;
1432+
1433+
/* This interface is for dGPU Navi1x.Linux dc-pplib interface depends
1434+
* on window driver dc implementation.
1435+
* For Navi1x, clock settings of dcn watermarks are fixed. the settings
1436+
* should be passed to smu during boot up and resume from s3.
1437+
* boot up: dc calculate dcn watermark clock settings within dc_create,
1438+
* dcn20_resource_construct
1439+
* then call pplib functions below to pass the settings to smu:
1440+
* smu_set_watermarks_for_clock_ranges
1441+
* smu_set_watermarks_table
1442+
* navi10_set_watermarks_table
1443+
* smu_write_watermarks_table
1444+
*
1445+
* For Renoir, clock settings of dcn watermark are also fixed values.
1446+
* dc has implemented different flow for window driver:
1447+
* dc_hardware_init / dc_set_power_state
1448+
* dcn10_init_hw
1449+
* notify_wm_ranges
1450+
* set_wm_ranges
1451+
* -- Linux
1452+
* smu_set_watermarks_for_clock_ranges
1453+
* renoir_set_watermarks_table
1454+
* smu_write_watermarks_table
1455+
*
1456+
* For Linux,
1457+
* dc_hardware_init -> amdgpu_dm_init
1458+
* dc_set_power_state --> dm_resume
1459+
*
1460+
* therefore, this function apply to navi10/12/14 but not Renoir
1461+
* *
1462+
*/
1463+
switch(adev->asic_type) {
1464+
case CHIP_NAVI10:
1465+
case CHIP_NAVI14:
1466+
case CHIP_NAVI12:
1467+
break;
1468+
default:
1469+
return 0;
1470+
}
1471+
1472+
mutex_lock(&smu->mutex);
1473+
1474+
/* pass data to smu controller */
1475+
if ((smu->watermarks_bitmap & WATERMARKS_EXIST) &&
1476+
!(smu->watermarks_bitmap & WATERMARKS_LOADED)) {
1477+
ret = smu_write_watermarks_table(smu);
1478+
1479+
if (ret) {
1480+
mutex_unlock(&smu->mutex);
1481+
DRM_ERROR("Failed to update WMTABLE!\n");
1482+
return ret;
1483+
}
1484+
smu->watermarks_bitmap |= WATERMARKS_LOADED;
1485+
}
1486+
1487+
mutex_unlock(&smu->mutex);
1488+
1489+
return 0;
1490+
}
1491+
14251492
/**
14261493
* dm_hw_init() - Initialize DC device
14271494
* @handle: The base driver device containing the amdgpu_dm device.
@@ -1700,6 +1767,8 @@ static int dm_resume(void *handle)
17001767

17011768
amdgpu_dm_irq_resume_late(adev);
17021769

1770+
amdgpu_dm_smu_write_watermarks_table(adev);
1771+
17031772
return 0;
17041773
}
17051774

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
451451
aconnector->dc_sink);
452452
dc_sink_release(aconnector->dc_sink);
453453
aconnector->dc_sink = NULL;
454+
aconnector->dc_link->cur_link_settings.lane_count = 0;
454455
}
455456

456457
drm_connector_unregister(connector);

drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -840,8 +840,8 @@ static void hubbub1_det_request_size(
840840

841841
hubbub1_get_blk256_size(&blk256_width, &blk256_height, bpe);
842842

843-
swath_bytes_horz_wc = height * blk256_height * bpe;
844-
swath_bytes_vert_wc = width * blk256_width * bpe;
843+
swath_bytes_horz_wc = width * blk256_height * bpe;
844+
swath_bytes_vert_wc = height * blk256_width * bpe;
845845

846846
*req128_horz_wc = (2 * swath_bytes_horz_wc <= detile_buf_size) ?
847847
false : /* full 256B request */

drivers/gpu/drm/amd/powerplay/amdgpu_smu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ int smu_set_soft_freq_range(struct smu_context *smu, enum smu_clk_type clk_type,
222222
{
223223
int ret = 0;
224224

225-
if (min <= 0 && max <= 0)
225+
if (min < 0 && max < 0)
226226
return -EINVAL;
227227

228228
if (!smu_clk_dpm_is_enabled(smu, clk_type))

drivers/gpu/drm/amd/powerplay/renoir_ppt.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ static struct smu_12_0_cmn2aisc_mapping renoir_clk_map[SMU_CLK_COUNT] = {
111111
CLK_MAP(GFXCLK, CLOCK_GFXCLK),
112112
CLK_MAP(SCLK, CLOCK_GFXCLK),
113113
CLK_MAP(SOCCLK, CLOCK_SOCCLK),
114-
CLK_MAP(UCLK, CLOCK_UMCCLK),
115-
CLK_MAP(MCLK, CLOCK_UMCCLK),
114+
CLK_MAP(UCLK, CLOCK_FCLK),
115+
CLK_MAP(MCLK, CLOCK_FCLK),
116116
};
117117

118118
static struct smu_12_0_cmn2aisc_mapping renoir_table_map[SMU_TABLE_COUNT] = {
@@ -280,7 +280,7 @@ static int renoir_print_clk_levels(struct smu_context *smu,
280280
break;
281281
case SMU_MCLK:
282282
count = NUM_MEMCLK_DPM_LEVELS;
283-
cur_value = metrics.ClockFrequency[CLOCK_UMCCLK];
283+
cur_value = metrics.ClockFrequency[CLOCK_FCLK];
284284
break;
285285
case SMU_DCEFCLK:
286286
count = NUM_DCFCLK_DPM_LEVELS;

drivers/gpu/drm/amd/powerplay/smu_v12_0.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,9 +458,6 @@ int smu_v12_0_set_soft_freq_limited_range(struct smu_context *smu, enum smu_clk_
458458
{
459459
int ret = 0;
460460

461-
if (max < min)
462-
return -EINVAL;
463-
464461
switch (clk_type) {
465462
case SMU_GFXCLK:
466463
case SMU_SCLK:

0 commit comments

Comments
 (0)