History

drm/amdgpu/mes: only invalid/prime icache when finish loading both pipe MES FWs.

invalid/prime icahce operation takes effect both pipes cuconrrently, therefore CP_MES_IC_BASE_LO/HI and CP_MES_MDBASE_LO/HI both have to be set before prime icache. Otherwise MES hardware gets garbage data in above regsters and causes page fault [ 470.873200] amdgpu 0000:33:00.0: amdgpu: [gfxhub] page fault (src_id:0 ring:217 vmid:0 pasid:0, for process pid 0 thread pid 0) [ 470.873222] amdgpu 0000:33:00.0: amdgpu: in page starting at address 0x000092cb89b00000 from client 10 [ 470.873234] amdgpu 0000:33:00.0: amdgpu: GCVM_L2_PROTECTION_FAULT_STATUS:0x00000BB3 [ 470.873242] amdgpu 0000:33:00.0: amdgpu: Faulty UTCL2 client ID: CPC (0x5) [ 470.873247] amdgpu 0000:33:00.0: amdgpu: MORE_FAULTS: 0x1 [ 470.873251] amdgpu 0000:33:00.0: amdgpu: WALKER_ERROR: 0x1 [ 470.873256] amdgpu 0000:33:00.0: amdgpu: PERMISSION_FAULTS: 0xb [ 470.873260] amdgpu 0000:33:00.0: amdgpu: MAPPING_ERROR: 0x1 [ 470.873264] amdgpu 0000:33:00.0: amdgpu: RW: 0x0

Yifan Zhang committed 4 years ago

Commit 431d0711 parent 578eb311 file · +20 −16Browse files

Unified · Split

drivers/gpu/drm/amd/amdgpu/mes_v11_0.c+20−16
@@ -541,7 +541,7 @@ static void mes_v11_0_enable(struct amdgpu_device *adev, bool enable) · 540 unmodified lines
541541
542542 /* This function is for backdoor MES firmware */
543543 static int mes_v11_0_load_microcode(struct amdgpu_device *adev,
544− enum admgpu_mes_pipe pipe)
544+ enum admgpu_mes_pipe pipe, bool prime_icache)
545545 {
546546 int r;
547547 uint32_t data;
@@ -593,16 +593,18 @@ static int mes_v11_0_load_microcode(struct amdgpu_device *adev, · 45 unmodified lines
593593 /* Set 0x3FFFF (256K-1) to CP_MES_MDBOUND_LO */
594594 WREG32_SOC15(GC, 0, regCP_MES_MDBOUND_LO, 0x3FFFF);
595595
596− /* invalidate ICACHE */
597− data = RREG32_SOC15(GC, 0, regCP_MES_IC_OP_CNTL);
598− data = REG_SET_FIELD(data, CP_MES_IC_OP_CNTL, PRIME_ICACHE, 0);
599− data = REG_SET_FIELD(data, CP_MES_IC_OP_CNTL, INVALIDATE_CACHE, 1);
600− WREG32_SOC15(GC, 0, regCP_MES_IC_OP_CNTL, data);
601−
602− /* prime the ICACHE. */
603− data = RREG32_SOC15(GC, 0, regCP_MES_IC_OP_CNTL);
604− data = REG_SET_FIELD(data, CP_MES_IC_OP_CNTL, PRIME_ICACHE, 1);
605− WREG32_SOC15(GC, 0, regCP_MES_IC_OP_CNTL, data);
596+ if (prime_icache) {
597+ /* invalidate ICACHE */
598+ data = RREG32_SOC15(GC, 0, regCP_MES_IC_OP_CNTL);
599+ data = REG_SET_FIELD(data, CP_MES_IC_OP_CNTL, PRIME_ICACHE, 0);
600+ data = REG_SET_FIELD(data, CP_MES_IC_OP_CNTL, INVALIDATE_CACHE, 1);
601+ WREG32_SOC15(GC, 0, regCP_MES_IC_OP_CNTL, data);
602+
603+ /* prime the ICACHE. */
604+ data = RREG32_SOC15(GC, 0, regCP_MES_IC_OP_CNTL);
605+ data = REG_SET_FIELD(data, CP_MES_IC_OP_CNTL, PRIME_ICACHE, 1);
606+ WREG32_SOC15(GC, 0, regCP_MES_IC_OP_CNTL, data);
607+ }
606608
607609 soc21_grbm_select(adev, 0, 0, 0, 0);
608610 mutex_unlock(&adev->srbm_mutex);
@@ -1044,17 +1046,19 @@ static int mes_v11_0_kiq_hw_init(struct amdgpu_device *adev) · 435 unmodified lines
10441046 int r = 0;
10451047
10461048 if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT) {
1047− r = mes_v11_0_load_microcode(adev, AMDGPU_MES_KIQ_PIPE);
1049+
1050+ r = mes_v11_0_load_microcode(adev, AMDGPU_MES_SCHED_PIPE, false);
10481051 if (r) {
1049− DRM_ERROR("failed to load MES kiq fw, r=%d\n", r);
1052+ DRM_ERROR("failed to load MES fw, r=%d\n", r);
10501053 return r;
10511054 }
10521055
1053− r = mes_v11_0_load_microcode(adev, AMDGPU_MES_SCHED_PIPE);
1056+ r = mes_v11_0_load_microcode(adev, AMDGPU_MES_KIQ_PIPE, true);
10541057 if (r) {
1055− DRM_ERROR("failed to load MES fw, r=%d\n", r);
1058+ DRM_ERROR("failed to load MES kiq fw, r=%d\n", r);
10561059 return r;
10571060 }
1061+
10581062 }
10591063
10601064 mes_v11_0_enable(adev, true);
@@ -1086,7 +1090,7 @@ static int mes_v11_0_hw_init(void *handle) · 25 unmodified lines
10861090 if (!adev->enable_mes_kiq) {
10871091 if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT) {
10881092 r = mes_v11_0_load_microcode(adev,
1089− AMDGPU_MES_SCHED_PIPE);
1093+ AMDGPU_MES_SCHED_PIPE, true);
10901094 if (r) {
10911095 DRM_ERROR("failed to MES fw, r=%d\n", r);
10921096 return r;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t