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