From: Kevin Gao <kevin.g...@amd.com>

[Why] DCN301 needs specific functionality
[How] Add it

Reviewed-by: Aurabindo Pillai <aurabindo.pil...@amd.com>
Reviewed-by: Agustin Gutierrez <agustin.gutierr...@amd.com>
Signed-off-by: Kevin Gao <kevin.g...@amd.com>
Signed-off-by: Roman Li <roman...@amd.com>
---
 .../display/dc/hubbub/dcn301/dcn301_hubbub.c  | 34 ++++++++++++++++++-
 .../display/dc/hubbub/dcn301/dcn301_hubbub.h  |  3 ++
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/hubbub/dcn301/dcn301_hubbub.c 
b/drivers/gpu/drm/amd/display/dc/hubbub/dcn301/dcn301_hubbub.c
index c1959672df50..95cf0ff43a83 100644
--- a/drivers/gpu/drm/amd/display/dc/hubbub/dcn301/dcn301_hubbub.c
+++ b/drivers/gpu/drm/amd/display/dc/hubbub/dcn301/dcn301_hubbub.c
@@ -47,10 +47,42 @@
 #define FN(reg_name, field_name) \
        hubbub1->shifts->field_name, hubbub1->masks->field_name
 
+int hubbub301_init_dchub(struct hubbub *hubbub,
+               struct dcn_hubbub_phys_addr_config *pa_config)
+{
+       struct dcn20_hubbub *hubbub1 = TO_DCN20_HUBBUB(hubbub);
+       struct dcn_vmid_page_table_config phys_config;
+
+       REG_SET(DCN_VM_FB_LOCATION_BASE, 0,
+                       FB_BASE, pa_config->system_aperture.fb_base >> 24);
+       REG_SET(DCN_VM_FB_LOCATION_TOP, 0,
+                       FB_TOP, pa_config->system_aperture.fb_top >> 24);
+       REG_SET(DCN_VM_FB_OFFSET, 0,
+                       FB_OFFSET, pa_config->system_aperture.fb_offset >> 24);
+       REG_SET(DCN_VM_AGP_BOT, 0,
+                       AGP_BOT, pa_config->system_aperture.agp_bot >> 24);
+       REG_SET(DCN_VM_AGP_TOP, 0,
+                       AGP_TOP, pa_config->system_aperture.agp_top >> 24);
+       REG_SET(DCN_VM_AGP_BASE, 0,
+                       AGP_BASE, pa_config->system_aperture.agp_base >> 24);
+
+       if (pa_config->gart_config.page_table_start_addr != 
pa_config->gart_config.page_table_end_addr) {
+               phys_config.page_table_start_addr = 
pa_config->gart_config.page_table_start_addr >> 12;
+               phys_config.page_table_end_addr = 
pa_config->gart_config.page_table_end_addr >> 12;
+               phys_config.page_table_base_addr = 
pa_config->gart_config.page_table_base_addr | 1; //Note: hack
+               phys_config.depth = 0;
+               phys_config.block_size = 0;
+               // Init VMID 0 based on PA config
+               dcn20_vmid_setup(&hubbub1->vmid[0], &phys_config);
+       }
+
+       dcn21_dchvm_init(hubbub);
+       return hubbub1->num_vmid;
+}
 
 static const struct hubbub_funcs hubbub301_funcs = {
        .update_dchub = hubbub2_update_dchub,
-       .init_dchub_sys_ctx = hubbub21_init_dchub,
+       .init_dchub_sys_ctx = hubbub301_init_dchub,
        .init_vm_ctx = hubbub2_init_vm_ctx,
        .dcc_support_swizzle = hubbub3_dcc_support_swizzle,
        .dcc_support_pixel_format = hubbub2_dcc_support_pixel_format,
diff --git a/drivers/gpu/drm/amd/display/dc/hubbub/dcn301/dcn301_hubbub.h 
b/drivers/gpu/drm/amd/display/dc/hubbub/dcn301/dcn301_hubbub.h
index b599f4475479..e30573e1ecfd 100644
--- a/drivers/gpu/drm/amd/display/dc/hubbub/dcn301/dcn301_hubbub.h
+++ b/drivers/gpu/drm/amd/display/dc/hubbub/dcn301/dcn301_hubbub.h
@@ -50,6 +50,9 @@
        HUBBUB_SF(DCHVM_RIOMMU_STAT0, RIOMMU_ACTIVE, mask_sh), \
        HUBBUB_SF(DCHVM_RIOMMU_STAT0, HOSTVM_PREFETCH_DONE, mask_sh)
 
+int hubbub301_init_dchub(struct hubbub *hubbub,
+               struct dcn_hubbub_phys_addr_config *pa_config);
+
 void hubbub301_construct(struct dcn20_hubbub *hubbub3,
        struct dc_context *ctx,
        const struct dcn_hubbub_registers *hubbub_regs,
-- 
2.34.1

Reply via email to