Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: fix an UMC hw arbitrator bug(v3)

issue:
the UMC6 h/w bug is that when MCLK is doing the switch
in the middle of a page access being preempted by high
priority client (e.g. DISPLAY) then UMC and the mclk switch
would stuck there due to deadlock

how:
fixed by disabling auto PreChg for UMC to avoid high
priority client preempting other client's access on
the same page, thus the deadlock could be avoided

v2:
put the patch in callback of UMC6
v3:
rename the callback to "init_registers"

Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Hawking Zhang <hawking.zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Monk Liu and committed by
Alex Deucher
e7da754b 6de088a0

+77 -1
+1 -1
drivers/gpu/drm/amd/amdgpu/Makefile
··· 84 84 85 85 # add UMC block 86 86 amdgpu-y += \ 87 - umc_v6_1.o 87 + umc_v6_1.o umc_v6_0.o 88 88 89 89 # add IH block 90 90 amdgpu-y += \
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
··· 63 63 void (*enable_umc_index_mode)(struct amdgpu_device *adev, 64 64 uint32_t umc_instance); 65 65 void (*disable_umc_index_mode)(struct amdgpu_device *adev); 66 + void (*init_registers)(struct amdgpu_device *adev); 66 67 }; 67 68 68 69 struct amdgpu_umc {
+7
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
··· 51 51 #include "gfxhub_v1_1.h" 52 52 #include "mmhub_v9_4.h" 53 53 #include "umc_v6_1.h" 54 + #include "umc_v6_0.h" 54 55 55 56 #include "ivsrcid/vmc/irqsrcs_vmc_1_0.h" 56 57 ··· 697 696 static void gmc_v9_0_set_umc_funcs(struct amdgpu_device *adev) 698 697 { 699 698 switch (adev->asic_type) { 699 + case CHIP_VEGA10: 700 + adev->umc.funcs = &umc_v6_0_funcs; 701 + break; 700 702 case CHIP_VEGA20: 701 703 adev->umc.max_ras_err_cnt_per_query = UMC_V6_1_TOTAL_CHANNEL_NUM; 702 704 adev->umc.channel_inst_num = UMC_V6_1_CHANNEL_INSTANCE_NUM; ··· 1306 1302 1307 1303 for (i = 0; i < adev->num_vmhubs; ++i) 1308 1304 gmc_v9_0_flush_gpu_tlb(adev, 0, i, 0); 1305 + 1306 + if (adev->umc.funcs && adev->umc.funcs->init_registers) 1307 + adev->umc.funcs->init_registers(adev); 1309 1308 1310 1309 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 1311 1310 (unsigned)(adev->gmc.gart_size >> 20),
+37
drivers/gpu/drm/amd/amdgpu/umc_v6_0.c
··· 1 + /* 2 + * Copyright 2019 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + */ 23 + #include "umc_v6_0.h" 24 + #include "amdgpu.h" 25 + 26 + static void umc_v6_0_init_registers(struct amdgpu_device *adev) 27 + { 28 + unsigned i,j; 29 + 30 + for (i = 0; i < 4; i++) 31 + for (j = 0; j < 4; j++) 32 + WREG32((i*0x100000 + 0x5010c + j*0x2000)/4, 0x1002); 33 + } 34 + 35 + const struct amdgpu_umc_funcs umc_v6_0_funcs = { 36 + .init_registers = umc_v6_0_init_registers, 37 + };
+31
drivers/gpu/drm/amd/amdgpu/umc_v6_0.h
··· 1 + /* 2 + * Copyright 2019 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + */ 23 + #ifndef __UMC_V6_0_H__ 24 + #define __UMC_V6_0_H__ 25 + 26 + #include "soc15_common.h" 27 + #include "amdgpu.h" 28 + 29 + extern const struct amdgpu_umc_funcs umc_v6_0_funcs; 30 + 31 + #endif