Skip to content

Commit 335acfb

Browse files
Shaoyun Liualexdeucher
authored andcommitted
drm/amd/amdgpu: Enable scratch data dump for mes 12
MES internal will check CP_MES_MSCRATCH_LO/HI register to set scratch data location during ucode start, driver side need to start the MES one by one with different setting for each pipe Signed-off-by: Shaoyun Liu <shaoyun.liu@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 7e4cb7d commit 335acfb

File tree

2 files changed

+37
-14
lines changed

2 files changed

+37
-14
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
#define AMDGPU_MES_VERSION_MASK 0x00000fff
4141
#define AMDGPU_MES_API_VERSION_MASK 0x00fff000
4242
#define AMDGPU_MES_FEAT_VERSION_MASK 0xff000000
43-
#define AMDGPU_MES_MSCRATCH_SIZE 0x8000
43+
#define AMDGPU_MES_MSCRATCH_SIZE 0x40000
4444

4545
enum amdgpu_mes_priority_level {
4646
AMDGPU_MES_PRIORITY_LEVEL_LOW = 0,

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

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,8 @@ static int mes_v12_0_set_hw_resources(struct amdgpu_mes *mes, int pipe)
756756

757757
if (amdgpu_mes_log_enable) {
758758
mes_set_hw_res_pkt.enable_mes_event_int_logging = 1;
759-
mes_set_hw_res_pkt.event_intr_history_gpu_mc_ptr = mes->event_log_gpu_addr + pipe * AMDGPU_MES_LOG_BUFFER_SIZE;
759+
mes_set_hw_res_pkt.event_intr_history_gpu_mc_ptr = mes->event_log_gpu_addr +
760+
pipe * (AMDGPU_MES_LOG_BUFFER_SIZE + AMDGPU_MES_MSCRATCH_SIZE);
760761
}
761762

762763
if (enforce_isolation)
@@ -983,29 +984,50 @@ static void mes_v12_0_enable(struct amdgpu_device *adev, bool enable)
983984
uint32_t pipe, data = 0;
984985

985986
if (enable) {
986-
data = RREG32_SOC15(GC, 0, regCP_MES_CNTL);
987-
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE0_RESET, 1);
988-
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE1_RESET, 1);
989-
WREG32_SOC15(GC, 0, regCP_MES_CNTL, data);
990-
991987
mutex_lock(&adev->srbm_mutex);
992988
for (pipe = 0; pipe < AMDGPU_MAX_MES_PIPES; pipe++) {
993989
soc21_grbm_select(adev, 3, pipe, 0, 0);
990+
if (amdgpu_mes_log_enable) {
991+
u32 log_size = AMDGPU_MES_LOG_BUFFER_SIZE + AMDGPU_MES_MSCRATCH_SIZE;
992+
/* In case uni mes is not enabled, only program for pipe 0 */
993+
if (adev->mes.event_log_size >= (pipe + 1) * log_size) {
994+
WREG32_SOC15(GC, 0, regCP_MES_MSCRATCH_LO,
995+
lower_32_bits(adev->mes.event_log_gpu_addr +
996+
pipe * log_size + AMDGPU_MES_LOG_BUFFER_SIZE));
997+
WREG32_SOC15(GC, 0, regCP_MES_MSCRATCH_HI,
998+
upper_32_bits(adev->mes.event_log_gpu_addr +
999+
pipe * log_size + AMDGPU_MES_LOG_BUFFER_SIZE));
1000+
dev_info(adev->dev, "Setup CP MES MSCRATCH address : 0x%x. 0x%x\n",
1001+
RREG32_SOC15(GC, 0, regCP_MES_MSCRATCH_HI),
1002+
RREG32_SOC15(GC, 0, regCP_MES_MSCRATCH_LO));
1003+
}
1004+
}
1005+
1006+
data = RREG32_SOC15(GC, 0, regCP_MES_CNTL);
1007+
if (pipe == 0)
1008+
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE0_RESET, 1);
1009+
else
1010+
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE1_RESET, 1);
1011+
WREG32_SOC15(GC, 0, regCP_MES_CNTL, data);
9941012

9951013
ucode_addr = adev->mes.uc_start_addr[pipe] >> 2;
9961014
WREG32_SOC15(GC, 0, regCP_MES_PRGRM_CNTR_START,
9971015
lower_32_bits(ucode_addr));
9981016
WREG32_SOC15(GC, 0, regCP_MES_PRGRM_CNTR_START_HI,
9991017
upper_32_bits(ucode_addr));
1018+
1019+
/* unhalt MES and activate one pipe each loop */
1020+
data = REG_SET_FIELD(0, CP_MES_CNTL, MES_PIPE0_ACTIVE, 1);
1021+
if (pipe)
1022+
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE1_ACTIVE, 1);
1023+
dev_info(adev->dev, "program CP_MES_CNTL : 0x%x\n", data);
1024+
1025+
WREG32_SOC15(GC, 0, regCP_MES_CNTL, data);
1026+
10001027
}
10011028
soc21_grbm_select(adev, 0, 0, 0, 0);
10021029
mutex_unlock(&adev->srbm_mutex);
10031030

1004-
/* unhalt MES and activate pipe0 */
1005-
data = REG_SET_FIELD(0, CP_MES_CNTL, MES_PIPE0_ACTIVE, 1);
1006-
data = REG_SET_FIELD(data, CP_MES_CNTL, MES_PIPE1_ACTIVE, 1);
1007-
WREG32_SOC15(GC, 0, regCP_MES_CNTL, data);
1008-
10091031
if (amdgpu_emu_mode)
10101032
msleep(100);
10111033
else if (adev->enable_uni_mes)
@@ -1479,8 +1501,9 @@ static int mes_v12_0_sw_init(struct amdgpu_ip_block *ip_block)
14791501
adev->mes.kiq_hw_fini = &mes_v12_0_kiq_hw_fini;
14801502
adev->mes.enable_legacy_queue_map = true;
14811503

1482-
adev->mes.event_log_size = adev->enable_uni_mes ? (AMDGPU_MAX_MES_PIPES * AMDGPU_MES_LOG_BUFFER_SIZE) : AMDGPU_MES_LOG_BUFFER_SIZE;
1483-
1504+
adev->mes.event_log_size = adev->enable_uni_mes ?
1505+
(AMDGPU_MAX_MES_PIPES * (AMDGPU_MES_LOG_BUFFER_SIZE + AMDGPU_MES_MSCRATCH_SIZE)) :
1506+
(AMDGPU_MES_LOG_BUFFER_SIZE + AMDGPU_MES_MSCRATCH_SIZE);
14841507
r = amdgpu_mes_init(adev);
14851508
if (r)
14861509
return r;

0 commit comments

Comments
 (0)