aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2549-drm-amd-display-Add-missing-VM-conversion-from-hw-va.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2549-drm-amd-display-Add-missing-VM-conversion-from-hw-va.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2549-drm-amd-display-Add-missing-VM-conversion-from-hw-va.patch147
1 files changed, 147 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2549-drm-amd-display-Add-missing-VM-conversion-from-hw-va.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2549-drm-amd-display-Add-missing-VM-conversion-from-hw-va.patch
new file mode 100644
index 00000000..a90b13db
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2549-drm-amd-display-Add-missing-VM-conversion-from-hw-va.patch
@@ -0,0 +1,147 @@
+From 3026100a7adba531c3f9f92a4474ff6d8c83fbba Mon Sep 17 00:00:00 2001
+From: Jun Lei <Jun.Lei@amd.com>
+Date: Mon, 13 May 2019 15:09:13 -0400
+Subject: [PATCH 2549/2940] drm/amd/display: Add missing VM conversion from hw
+ values
+
+[why]
+VM implemenation is missing conversion from HW values in hubbub
+DM not passing actual PTB during flip
+
+[how]
+add proper HW conversion from logical values
+fix cases where we programmed VA even though we are in PA
+plumb in PTB from DM
+
+Signed-off-by: Jun Lei <Jun.Lei@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../drm/amd/display/dc/dcn20/dcn20_hubbub.c | 77 +++++++++++++++----
+ .../drm/amd/display/dc/dcn20/dcn20_hwseq.c | 5 +-
+ 2 files changed, 65 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubbub.c
+index a851574f118a..724f1c5ef614 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubbub.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubbub.c
+@@ -303,6 +303,49 @@ void hubbub2_setup_vmid_ptb(struct hubbub *hubbub,
+ dcn20_vmid_set_ptb(&hubbub1->vmid[vmid], ptb);
+ }
+
++static enum dcn_hubbub_page_table_depth page_table_depth_to_hw(unsigned int page_table_depth)
++{
++ enum dcn_hubbub_page_table_depth depth = 0;
++
++ switch (page_table_depth) {
++ case 1:
++ depth = DCN_PAGE_TABLE_DEPTH_1_LEVEL;
++ break;
++ case 2:
++ depth = DCN_PAGE_TABLE_DEPTH_2_LEVEL;
++ break;
++ case 3:
++ depth = DCN_PAGE_TABLE_DEPTH_3_LEVEL;
++ break;
++ case 4:
++ depth = DCN_PAGE_TABLE_DEPTH_4_LEVEL;
++ break;
++ default:
++ ASSERT(false);
++ break;
++ }
++
++ return depth;
++}
++
++static enum dcn_hubbub_page_table_block_size page_table_block_size_to_hw(unsigned int page_table_block_size)
++{
++ enum dcn_hubbub_page_table_block_size block_size = 0;
++
++ switch (page_table_block_size) {
++ case 4096:
++ block_size = DCN_PAGE_TABLE_BLOCK_SIZE_4KB;
++ break;
++ case 65536:
++ block_size = DCN_PAGE_TABLE_BLOCK_SIZE_64KB;
++ break;
++ default:
++ ASSERT(false);
++ break;
++ }
++
++ return block_size;
++}
+
+ void hubbub2_init_dchub(struct hubbub *hubbub,
+ struct hubbub_addr_config *config)
+@@ -312,11 +355,6 @@ void hubbub2_init_dchub(struct hubbub *hubbub,
+ struct dcn_vmid_page_table_config phys_config;
+ struct dcn_vmid_page_table_config virt_config;
+
+- phys_config.depth = 0; // Depth 1
+- phys_config.block_size = 0; // Block size 4KB
+- phys_config.page_table_start_addr = config->pa_config.gart_config.page_table_start_addr;
+- phys_config.page_table_end_addr = config->pa_config.gart_config.page_table_end_addr;
+-
+ REG_SET(DCN_VM_FB_LOCATION_BASE, 0,
+ FB_BASE, config->pa_config.system_aperture.fb_base);
+ REG_SET(DCN_VM_FB_LOCATION_TOP, 0,
+@@ -330,18 +368,27 @@ void hubbub2_init_dchub(struct hubbub *hubbub,
+ REG_SET(DCN_VM_AGP_BASE, 0,
+ AGP_BASE, config->pa_config.system_aperture.agp_base);
+
+- // Init VMID 0 based on PA config
+- dcn20_vmid_setup(&hubbub1->vmid[0], &phys_config);
+- dcn20_vmid_set_ptb(&hubbub1->vmid[0], config->pa_config.gart_config.page_table_base_addr);
++ if (config->pa_config.gart_config.page_table_start_addr != config->pa_config.gart_config.page_table_end_addr) {
++ phys_config.depth = 1;
++ phys_config.block_size = 4096;
++ phys_config.page_table_start_addr = config->pa_config.gart_config.page_table_start_addr >> 12;
++ phys_config.page_table_end_addr = config->pa_config.gart_config.page_table_end_addr >> 12;
+
+- // Init VMID 1-15 based on VA config
+- for (i = 1; i < 16; i++) {
+- virt_config.page_table_start_addr = config->va_config.page_table_start_addr;
+- virt_config.page_table_end_addr = config->va_config.page_table_end_addr;
+- virt_config.depth = config->va_config.page_table_depth;
+- virt_config.block_size = config->va_config.page_table_block_size;
++ // Init VMID 0 based on PA config
++ dcn20_vmid_setup(&hubbub1->vmid[0], &phys_config);
++ dcn20_vmid_set_ptb(&hubbub1->vmid[0], config->pa_config.gart_config.page_table_base_addr);
++ }
++
++ if (config->va_config.page_table_start_addr != config->va_config.page_table_end_addr) {
++ // Init VMID 1-15 based on VA config
++ for (i = 1; i < 16; i++) {
++ virt_config.page_table_start_addr = config->va_config.page_table_start_addr >> 12;
++ virt_config.page_table_end_addr = config->va_config.page_table_end_addr >> 12;
++ virt_config.depth = page_table_depth_to_hw(config->va_config.page_table_depth);
++ virt_config.block_size = page_table_block_size_to_hw(config->va_config.page_table_block_size);
+
+- dcn20_vmid_setup(&hubbub1->vmid[i], &virt_config);
++ dcn20_vmid_setup(&hubbub1->vmid[i], &virt_config);
++ }
+ }
+ }
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+index 914071393d1c..2cbffe2809b6 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+@@ -1631,8 +1631,9 @@ static void dcn20_update_plane_addr(const struct dc *dc, struct pipe_ctx *pipe_c
+ plane_state->address.page_table_base.quad_part,
+ pipe_ctx->pipe_idx);
+
+- // Call hubbub to program PTB of VMID
+- if (dc->res_pool->hubbub->funcs->setup_vmid_ptb)
++ // Call hubbub to program PTB of VMID only if its VA
++ // PA PTB is a one-time setup at init
++ if (vmid > 0 && dc->res_pool->hubbub->funcs->setup_vmid_ptb)
+ dc->res_pool->hubbub->funcs->setup_vmid_ptb(dc->res_pool->hubbub,
+ plane_state->address.page_table_base.quad_part,
+ vmid);
+--
+2.17.1
+