@@ -756,7 +756,8 @@ static int mes_v12_0_set_hw_resources(struct amdgpu_mes *mes, int pipe)
756
756
757
757
if (amdgpu_mes_log_enable ) {
758
758
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 );
760
761
}
761
762
762
763
if (enforce_isolation )
@@ -983,29 +984,50 @@ static void mes_v12_0_enable(struct amdgpu_device *adev, bool enable)
983
984
uint32_t pipe , data = 0 ;
984
985
985
986
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
-
991
987
mutex_lock (& adev -> srbm_mutex );
992
988
for (pipe = 0 ; pipe < AMDGPU_MAX_MES_PIPES ; pipe ++ ) {
993
989
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 );
994
1012
995
1013
ucode_addr = adev -> mes .uc_start_addr [pipe ] >> 2 ;
996
1014
WREG32_SOC15 (GC , 0 , regCP_MES_PRGRM_CNTR_START ,
997
1015
lower_32_bits (ucode_addr ));
998
1016
WREG32_SOC15 (GC , 0 , regCP_MES_PRGRM_CNTR_START_HI ,
999
1017
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
+
1000
1027
}
1001
1028
soc21_grbm_select (adev , 0 , 0 , 0 , 0 );
1002
1029
mutex_unlock (& adev -> srbm_mutex );
1003
1030
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
-
1009
1031
if (amdgpu_emu_mode )
1010
1032
msleep (100 );
1011
1033
else if (adev -> enable_uni_mes )
@@ -1479,8 +1501,9 @@ static int mes_v12_0_sw_init(struct amdgpu_ip_block *ip_block)
1479
1501
adev -> mes .kiq_hw_fini = & mes_v12_0_kiq_hw_fini ;
1480
1502
adev -> mes .enable_legacy_queue_map = true;
1481
1503
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 );
1484
1507
r = amdgpu_mes_init (adev );
1485
1508
if (r )
1486
1509
return r ;
0 commit comments