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

drm/amdgpu: fix calltrace during kmd unload(v3)

issue:
kernel would report a warning from a double unpin
during the driver unloading on the CSB bo

why:
we unpin it during hw_fini, and there will be another
unpin in sw_fini on CSB bo.

fix:
actually we don't need to pin/unpin it during
hw_init/fini since it is created with kernel pinned,
we only need to fullfill the CSB again during hw_init
to prevent CSB/VRAM lost after S3

v2:
get_csb in init_rlc so hw_init() will make CSIB content
back even after reset or s3

v3:
use bo_create_kernel instead of bo_create_reserved for CSB
otherwise the bo_free_kernel() on CSB is not aligned and
would lead to its internal reserve pending there forever

take care of gfx7/8 as well

Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Xiaojie Yuan <xiaojie.yuan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Monk Liu and committed by
Alex Deucher
747d4f71 fa2b93e3

+6 -144
+1 -9
drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c
··· 124 124 */ 125 125 int amdgpu_gfx_rlc_init_csb(struct amdgpu_device *adev) 126 126 { 127 - volatile u32 *dst_ptr; 128 127 u32 dws; 129 128 int r; 130 129 131 130 /* allocate clear state block */ 132 131 adev->gfx.rlc.clear_state_size = dws = adev->gfx.rlc.funcs->get_csb_size(adev); 133 - r = amdgpu_bo_create_reserved(adev, dws * 4, PAGE_SIZE, 132 + r = amdgpu_bo_create_kernel(adev, dws * 4, PAGE_SIZE, 134 133 AMDGPU_GEM_DOMAIN_VRAM, 135 134 &adev->gfx.rlc.clear_state_obj, 136 135 &adev->gfx.rlc.clear_state_gpu_addr, ··· 139 140 amdgpu_gfx_rlc_fini(adev); 140 141 return r; 141 142 } 142 - 143 - /* set up the cs buffer */ 144 - dst_ptr = adev->gfx.rlc.cs_ptr; 145 - adev->gfx.rlc.funcs->get_csb_buffer(adev, dst_ptr); 146 - amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj); 147 - amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj); 148 - amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); 149 143 150 144 return 0; 151 145 }
+1 -57
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
··· 993 993 return 0; 994 994 } 995 995 996 - static int gfx_v10_0_csb_vram_pin(struct amdgpu_device *adev) 997 - { 998 - int r; 999 - 1000 - r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false); 1001 - if (unlikely(r != 0)) 1002 - return r; 1003 - 1004 - r = amdgpu_bo_pin(adev->gfx.rlc.clear_state_obj, 1005 - AMDGPU_GEM_DOMAIN_VRAM); 1006 - if (!r) 1007 - adev->gfx.rlc.clear_state_gpu_addr = 1008 - amdgpu_bo_gpu_offset(adev->gfx.rlc.clear_state_obj); 1009 - 1010 - amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); 1011 - 1012 - return r; 1013 - } 1014 - 1015 - static void gfx_v10_0_csb_vram_unpin(struct amdgpu_device *adev) 1016 - { 1017 - int r; 1018 - 1019 - if (!adev->gfx.rlc.clear_state_obj) 1020 - return; 1021 - 1022 - r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, true); 1023 - if (likely(r == 0)) { 1024 - amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj); 1025 - amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); 1026 - } 1027 - } 1028 - 1029 996 static void gfx_v10_0_mec_fini(struct amdgpu_device *adev) 1030 997 { 1031 998 amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL); ··· 1754 1787 1755 1788 static int gfx_v10_0_init_csb(struct amdgpu_device *adev) 1756 1789 { 1757 - int r; 1758 - 1759 - if (adev->in_gpu_reset) { 1760 - r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false); 1761 - if (r) 1762 - return r; 1763 - 1764 - r = amdgpu_bo_kmap(adev->gfx.rlc.clear_state_obj, 1765 - (void **)&adev->gfx.rlc.cs_ptr); 1766 - if (!r) { 1767 - adev->gfx.rlc.funcs->get_csb_buffer(adev, 1768 - adev->gfx.rlc.cs_ptr); 1769 - amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj); 1770 - } 1771 - 1772 - amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); 1773 - if (r) 1774 - return r; 1775 - } 1790 + adev->gfx.rlc.funcs->get_csb_buffer(adev, adev->gfx.rlc.cs_ptr); 1776 1791 1777 1792 /* csib */ 1778 1793 WREG32_SOC15(GC, 0, mmRLC_CSIB_ADDR_HI, ··· 3725 3776 int r; 3726 3777 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3727 3778 3728 - r = gfx_v10_0_csb_vram_pin(adev); 3729 - if (r) 3730 - return r; 3731 - 3732 3779 if (!amdgpu_emu_mode) 3733 3780 gfx_v10_0_init_golden_registers(adev); 3734 3781 ··· 3812 3867 } 3813 3868 gfx_v10_0_cp_enable(adev, false); 3814 3869 gfx_v10_0_enable_gui_idle_interrupt(adev, false); 3815 - gfx_v10_0_csb_vram_unpin(adev); 3816 3870 3817 3871 return 0; 3818 3872 }
+2
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
··· 4554 4554 4555 4555 gfx_v7_0_constants_init(adev); 4556 4556 4557 + /* init CSB */ 4558 + adev->gfx.rlc.funcs->get_csb_buffer(adev, adev->gfx.rlc.cs_ptr); 4557 4559 /* init rlc */ 4558 4560 r = adev->gfx.rlc.funcs->resume(adev); 4559 4561 if (r)
+1 -39
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
··· 1321 1321 return 0; 1322 1322 } 1323 1323 1324 - static int gfx_v8_0_csb_vram_pin(struct amdgpu_device *adev) 1325 - { 1326 - int r; 1327 - 1328 - r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false); 1329 - if (unlikely(r != 0)) 1330 - return r; 1331 - 1332 - r = amdgpu_bo_pin(adev->gfx.rlc.clear_state_obj, 1333 - AMDGPU_GEM_DOMAIN_VRAM); 1334 - if (!r) 1335 - adev->gfx.rlc.clear_state_gpu_addr = 1336 - amdgpu_bo_gpu_offset(adev->gfx.rlc.clear_state_obj); 1337 - 1338 - amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); 1339 - 1340 - return r; 1341 - } 1342 - 1343 - static void gfx_v8_0_csb_vram_unpin(struct amdgpu_device *adev) 1344 - { 1345 - int r; 1346 - 1347 - if (!adev->gfx.rlc.clear_state_obj) 1348 - return; 1349 - 1350 - r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, true); 1351 - if (likely(r == 0)) { 1352 - amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj); 1353 - amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); 1354 - } 1355 - } 1356 - 1357 1324 static void gfx_v8_0_mec_fini(struct amdgpu_device *adev) 1358 1325 { 1359 1326 amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL); ··· 3884 3917 3885 3918 static void gfx_v8_0_init_csb(struct amdgpu_device *adev) 3886 3919 { 3920 + adev->gfx.rlc.funcs->get_csb_buffer(adev, adev->gfx.rlc.cs_ptr); 3887 3921 /* csib */ 3888 3922 WREG32(mmRLC_CSIB_ADDR_HI, 3889 3923 adev->gfx.rlc.clear_state_gpu_addr >> 32); ··· 4805 4837 gfx_v8_0_init_golden_registers(adev); 4806 4838 gfx_v8_0_constants_init(adev); 4807 4839 4808 - r = gfx_v8_0_csb_vram_pin(adev); 4809 - if (r) 4810 - return r; 4811 - 4812 4840 r = adev->gfx.rlc.funcs->resume(adev); 4813 4841 if (r) 4814 4842 return r; ··· 4921 4957 else 4922 4958 pr_err("rlc is busy, skip halt rlc\n"); 4923 4959 amdgpu_gfx_rlc_exit_safe_mode(adev); 4924 - 4925 - gfx_v8_0_csb_vram_unpin(adev); 4926 4960 4927 4961 return 0; 4928 4962 }
+1 -39
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
··· 1695 1695 return 0; 1696 1696 } 1697 1697 1698 - static int gfx_v9_0_csb_vram_pin(struct amdgpu_device *adev) 1699 - { 1700 - int r; 1701 - 1702 - r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false); 1703 - if (unlikely(r != 0)) 1704 - return r; 1705 - 1706 - r = amdgpu_bo_pin(adev->gfx.rlc.clear_state_obj, 1707 - AMDGPU_GEM_DOMAIN_VRAM); 1708 - if (!r) 1709 - adev->gfx.rlc.clear_state_gpu_addr = 1710 - amdgpu_bo_gpu_offset(adev->gfx.rlc.clear_state_obj); 1711 - 1712 - amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); 1713 - 1714 - return r; 1715 - } 1716 - 1717 - static void gfx_v9_0_csb_vram_unpin(struct amdgpu_device *adev) 1718 - { 1719 - int r; 1720 - 1721 - if (!adev->gfx.rlc.clear_state_obj) 1722 - return; 1723 - 1724 - r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, true); 1725 - if (likely(r == 0)) { 1726 - amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj); 1727 - amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); 1728 - } 1729 - } 1730 - 1731 1698 static void gfx_v9_0_mec_fini(struct amdgpu_device *adev) 1732 1699 { 1733 1700 amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL); ··· 2382 2415 2383 2416 static void gfx_v9_0_init_csb(struct amdgpu_device *adev) 2384 2417 { 2418 + adev->gfx.rlc.funcs->get_csb_buffer(adev, adev->gfx.rlc.cs_ptr); 2385 2419 /* csib */ 2386 2420 WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_ADDR_HI), 2387 2421 adev->gfx.rlc.clear_state_gpu_addr >> 32); ··· 3674 3706 3675 3707 gfx_v9_0_constants_init(adev); 3676 3708 3677 - r = gfx_v9_0_csb_vram_pin(adev); 3678 - if (r) 3679 - return r; 3680 - 3681 3709 r = adev->gfx.rlc.funcs->resume(adev); 3682 3710 if (r) 3683 3711 return r; ··· 3754 3790 3755 3791 gfx_v9_0_cp_enable(adev, false); 3756 3792 adev->gfx.rlc.funcs->stop(adev); 3757 - 3758 - gfx_v9_0_csb_vram_unpin(adev); 3759 3793 3760 3794 return 0; 3761 3795 }