| From ef064187a9709393a981a56cce1e31880fd97107 Mon Sep 17 00:00:00 2001 |
| From: Yifan Zhang <yifan1.zhang@amd.com> |
| Date: Fri, 8 Sep 2023 16:46:39 +0800 |
| Subject: drm/amd/display: fix the white screen issue when >= 64GB DRAM |
| |
| From: Yifan Zhang <yifan1.zhang@amd.com> |
| |
| commit ef064187a9709393a981a56cce1e31880fd97107 upstream. |
| |
| Dropping bit 31:4 of page table base is wrong, it makes page table |
| base points to wrong address if phys addr is beyond 64GB; dropping |
| page_table_start/end bit 31:4 is unnecessary since dcn20_vmid_setup |
| will do that. Also, while we are at it, cleanup the assignments using |
| upper_32_bits()/lower_32_bits() and AMDGPU_GPU_PAGE_SHIFT. |
| |
| Cc: stable@vger.kernel.org |
| Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2354 |
| Fixes: 81d0bcf99009 ("drm/amdgpu: make display pinning more flexible (v2)") |
| Acked-by: Harry Wentland <harry.wentland@amd.com> |
| Reviewed-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Yifan Zhang <yifan1.zhang@amd.com> |
| Co-developed-by: Hamza Mahfooz <hamza.mahfooz@amd.com> |
| Signed-off-by: Hamza Mahfooz <hamza.mahfooz@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 14 +++++++++----- |
| 1 file changed, 9 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| @@ -1272,11 +1272,15 @@ static void mmhub_read_system_context(st |
| |
| pt_base = amdgpu_gmc_pd_addr(adev->gart.bo); |
| |
| - page_table_start.high_part = (u32)(adev->gmc.gart_start >> 44) & 0xF; |
| - page_table_start.low_part = (u32)(adev->gmc.gart_start >> 12); |
| - page_table_end.high_part = (u32)(adev->gmc.gart_end >> 44) & 0xF; |
| - page_table_end.low_part = (u32)(adev->gmc.gart_end >> 12); |
| - page_table_base.high_part = upper_32_bits(pt_base) & 0xF; |
| + page_table_start.high_part = upper_32_bits(adev->gmc.gart_start >> |
| + AMDGPU_GPU_PAGE_SHIFT); |
| + page_table_start.low_part = lower_32_bits(adev->gmc.gart_start >> |
| + AMDGPU_GPU_PAGE_SHIFT); |
| + page_table_end.high_part = upper_32_bits(adev->gmc.gart_end >> |
| + AMDGPU_GPU_PAGE_SHIFT); |
| + page_table_end.low_part = lower_32_bits(adev->gmc.gart_end >> |
| + AMDGPU_GPU_PAGE_SHIFT); |
| + page_table_base.high_part = upper_32_bits(pt_base); |
| page_table_base.low_part = lower_32_bits(pt_base); |
| |
| pa_config->system_aperture.start_addr = (uint64_t)logical_addr_low << 18; |