aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3449-Revert-drm-amd-display-make-firmware-info-only-load-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3449-Revert-drm-amd-display-make-firmware-info-only-load-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3449-Revert-drm-amd-display-make-firmware-info-only-load-.patch446
1 files changed, 446 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3449-Revert-drm-amd-display-make-firmware-info-only-load-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3449-Revert-drm-amd-display-make-firmware-info-only-load-.patch
new file mode 100644
index 00000000..6d50fd61
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3449-Revert-drm-amd-display-make-firmware-info-only-load-.patch
@@ -0,0 +1,446 @@
+From 9a506817f77080f092e0530dcaba63a428ef09e5 Mon Sep 17 00:00:00 2001
+From: changzhu <Changfeng.Zhu@amd.com>
+Date: Thu, 15 Aug 2019 18:56:07 +0800
+Subject: [PATCH 3449/4256] Revert "drm/amd/display: make firmware info only
+ load once during dc_bios create"
+
+Change-Id: I0df28763c7b73a29d0adeb0fe4df9aa61d3f8642
+Signed-off-by: changzhu <Changfeng.Zhu@amd.com>
+---
+ .../gpu/drm/amd/display/dc/bios/bios_parser.c | 3 +-
+ .../drm/amd/display/dc/bios/bios_parser2.c | 3 +-
+ .../display/dc/clk_mgr/dce100/dce_clk_mgr.c | 17 ++++++----
+ .../display/dc/clk_mgr/dcn10/rv1_clk_mgr.c | 6 ++--
+ .../gpu/drm/amd/display/dc/core/dc_resource.c | 7 ++--
+ .../gpu/drm/amd/display/dc/dc_bios_types.h | 5 +--
+ .../drm/amd/display/dc/dce/dce_clock_source.c | 32 ++++++++++++-------
+ .../gpu/drm/amd/display/dc/dce/dce_i2c_hw.c | 13 +++++++-
+ .../amd/display/dc/dce100/dce100_resource.c | 4 ++-
+ .../amd/display/dc/dce110/dce110_resource.c | 4 ++-
+ .../drm/amd/display/dc/dce80/dce80_resource.c | 12 +++++--
+ .../drm/amd/display/dc/dcn20/dcn20_hwseq.c | 9 +++---
+ 12 files changed, 79 insertions(+), 36 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
+index 207f6084525c..a4c97d32e751 100644
+--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
++++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
+@@ -2794,6 +2794,8 @@ static const struct dc_vbios_funcs vbios_funcs = {
+
+ .get_device_tag = bios_parser_get_device_tag,
+
++ .get_firmware_info = bios_parser_get_firmware_info,
++
+ .get_spread_spectrum_info = bios_parser_get_spread_spectrum_info,
+
+ .get_ss_entry_number = bios_parser_get_ss_entry_number,
+@@ -2918,7 +2920,6 @@ static bool bios_parser_construct(
+ dal_bios_parser_init_cmd_tbl_helper(&bp->cmd_helper, dce_version);
+
+ bp->base.integrated_info = bios_parser_create_integrated_info(&bp->base);
+- bp->base.fw_info_valid = bios_parser_get_firmware_info(&bp->base, &bp->base.fw_info) == BP_RESULT_OK;
+
+ return true;
+ }
+diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
+index c9f65c4df530..99f40b8a231c 100644
+--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
++++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
+@@ -1879,6 +1879,8 @@ static const struct dc_vbios_funcs vbios_funcs = {
+
+ .get_device_tag = bios_parser_get_device_tag,
+
++ .get_firmware_info = bios_parser_get_firmware_info,
++
+ .get_spread_spectrum_info = bios_parser_get_spread_spectrum_info,
+
+ .get_ss_entry_number = bios_parser_get_ss_entry_number,
+@@ -1994,7 +1996,6 @@ static bool bios_parser_construct(
+ dal_bios_parser_init_cmd_tbl_helper2(&bp->cmd_helper, dce_version);
+
+ bp->base.integrated_info = bios_parser_create_integrated_info(&bp->base);
+- bp->base.fw_info_valid = bios_parser_get_firmware_info(&bp->base, &bp->base.fw_info) == BP_RESULT_OK;
+
+ return true;
+ }
+diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c
+index 7634982a6bb0..6a0dd78ab65a 100644
+--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c
++++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c
+@@ -270,12 +270,18 @@ static void dce_clock_read_integrated_info(struct clk_mgr_internal *clk_mgr_dce)
+ {
+ struct dc_debug_options *debug = &clk_mgr_dce->base.ctx->dc->debug;
+ struct dc_bios *bp = clk_mgr_dce->base.ctx->dc_bios;
++ struct integrated_info info = { { { 0 } } };
++ struct dc_firmware_info fw_info = { { 0 } };
+ int i;
+
+ if (bp->integrated_info)
+- clk_mgr_dce->dentist_vco_freq_khz = bp->integrated_info->dentist_vco_freq;
++ info = *bp->integrated_info;
++
++ clk_mgr_dce->dentist_vco_freq_khz = info.dentist_vco_freq;
+ if (clk_mgr_dce->dentist_vco_freq_khz == 0) {
+- clk_mgr_dce->dentist_vco_freq_khz = bp->fw_info.smu_gpu_pll_output_freq;
++ bp->funcs->get_firmware_info(bp, &fw_info);
++ clk_mgr_dce->dentist_vco_freq_khz =
++ fw_info.smu_gpu_pll_output_freq;
+ if (clk_mgr_dce->dentist_vco_freq_khz == 0)
+ clk_mgr_dce->dentist_vco_freq_khz = 3600000;
+ }
+@@ -308,10 +314,9 @@ static void dce_clock_read_integrated_info(struct clk_mgr_internal *clk_mgr_dce)
+
+ /*Do not allow bad VBIOS/SBIOS to override with invalid values,
+ * check for > 100MHz*/
+- if (bp->integrated_info)
+- if (bp->integrated_info->disp_clk_voltage[i].max_supported_clk >= 100000)
+- clk_mgr_dce->max_clks_by_state[clk_state].display_clk_khz =
+- bp->integrated_info->disp_clk_voltage[i].max_supported_clk;
++ if (info.disp_clk_voltage[i].max_supported_clk >= 100000)
++ clk_mgr_dce->max_clks_by_state[clk_state].display_clk_khz =
++ info.disp_clk_voltage[i].max_supported_clk;
+ }
+
+ if (!debug->disable_dfs_bypass && bp->integrated_info)
+diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr.c
+index d00ee9fa04e4..a12a9606788f 100644
+--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr.c
++++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr.c
+@@ -254,6 +254,7 @@ void rv1_clk_mgr_construct(struct dc_context *ctx, struct clk_mgr_internal *clk_
+ {
+ struct dc_debug_options *debug = &ctx->dc->debug;
+ struct dc_bios *bp = ctx->dc_bios;
++ struct dc_firmware_info fw_info = { { 0 } };
+
+ clk_mgr->base.ctx = ctx;
+ clk_mgr->pp_smu = pp_smu;
+@@ -269,8 +270,9 @@ void rv1_clk_mgr_construct(struct dc_context *ctx, struct clk_mgr_internal *clk_
+
+ if (bp->integrated_info)
+ clk_mgr->dentist_vco_freq_khz = bp->integrated_info->dentist_vco_freq;
+- if (bp->fw_info_valid && clk_mgr->dentist_vco_freq_khz == 0) {
+- clk_mgr->dentist_vco_freq_khz = bp->fw_info.smu_gpu_pll_output_freq;
++ if (clk_mgr->dentist_vco_freq_khz == 0) {
++ bp->funcs->get_firmware_info(bp, &fw_info);
++ clk_mgr->dentist_vco_freq_khz = fw_info.smu_gpu_pll_output_freq;
+ if (clk_mgr->dentist_vco_freq_khz == 0)
+ clk_mgr->dentist_vco_freq_khz = 3600000;
+ }
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+index fa94dfc04dce..601020c9b03e 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+@@ -170,9 +170,12 @@ struct resource_pool *dc_create_resource_pool(struct dc *dc,
+ break;
+ }
+ if (res_pool != NULL) {
+- if (dc->ctx->dc_bios->fw_info_valid) {
++ struct dc_firmware_info fw_info = { { 0 } };
++
++ if (dc->ctx->dc_bios->funcs->get_firmware_info(dc->ctx->dc_bios,
++ &fw_info) == BP_RESULT_OK) {
+ res_pool->ref_clocks.xtalin_clock_inKhz =
+- dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
++ fw_info.pll_info.crystal_frequency;
+ /* initialize with firmware data first, no all
+ * ASIC have DCCG SW component. FPGA or
+ * simulation need initialization of
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_bios_types.h b/drivers/gpu/drm/amd/display/dc/dc_bios_types.h
+index b1dd0d60d98e..78c3b300ec45 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_bios_types.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_bios_types.h
+@@ -61,6 +61,9 @@ struct dc_vbios_funcs {
+ struct graphics_object_id connector_object_id,
+ uint32_t device_tag_index,
+ struct connector_device_tag_info *info);
++ enum bp_result (*get_firmware_info)(
++ struct dc_bios *bios,
++ struct dc_firmware_info *info);
+ enum bp_result (*get_spread_spectrum_info)(
+ struct dc_bios *bios,
+ enum as_signal_type signal,
+@@ -149,8 +152,6 @@ struct dc_bios {
+ struct dc_context *ctx;
+ const struct bios_registers *regs;
+ struct integrated_info *integrated_info;
+- struct dc_firmware_info fw_info;
+- bool fw_info_valid;
+ };
+
+ #endif /* DC_BIOS_TYPES_H */
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c
+index 990481b35682..09c4dd806525 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c
+@@ -1233,35 +1233,37 @@ static bool calc_pll_max_vco_construct(
+ struct calc_pll_clock_source_init_data *init_data)
+ {
+ uint32_t i;
+- struct dc_firmware_info *fw_info = &init_data->bp->fw_info;
++ struct dc_firmware_info fw_info = { { 0 } };
+ if (calc_pll_cs == NULL ||
+ init_data == NULL ||
+ init_data->bp == NULL)
+ return false;
+
+- if (init_data->bp->fw_info_valid)
++ if (init_data->bp->funcs->get_firmware_info(
++ init_data->bp,
++ &fw_info) != BP_RESULT_OK)
+ return false;
+
+ calc_pll_cs->ctx = init_data->ctx;
+- calc_pll_cs->ref_freq_khz = fw_info->pll_info.crystal_frequency;
++ calc_pll_cs->ref_freq_khz = fw_info.pll_info.crystal_frequency;
+ calc_pll_cs->min_vco_khz =
+- fw_info->pll_info.min_output_pxl_clk_pll_frequency;
++ fw_info.pll_info.min_output_pxl_clk_pll_frequency;
+ calc_pll_cs->max_vco_khz =
+- fw_info->pll_info.max_output_pxl_clk_pll_frequency;
++ fw_info.pll_info.max_output_pxl_clk_pll_frequency;
+
+ if (init_data->max_override_input_pxl_clk_pll_freq_khz != 0)
+ calc_pll_cs->max_pll_input_freq_khz =
+ init_data->max_override_input_pxl_clk_pll_freq_khz;
+ else
+ calc_pll_cs->max_pll_input_freq_khz =
+- fw_info->pll_info.max_input_pxl_clk_pll_frequency;
++ fw_info.pll_info.max_input_pxl_clk_pll_frequency;
+
+ if (init_data->min_override_input_pxl_clk_pll_freq_khz != 0)
+ calc_pll_cs->min_pll_input_freq_khz =
+ init_data->min_override_input_pxl_clk_pll_freq_khz;
+ else
+ calc_pll_cs->min_pll_input_freq_khz =
+- fw_info->pll_info.min_input_pxl_clk_pll_frequency;
++ fw_info.pll_info.min_input_pxl_clk_pll_frequency;
+
+ calc_pll_cs->min_pix_clock_pll_post_divider =
+ init_data->min_pix_clk_pll_post_divider;
+@@ -1313,6 +1315,7 @@ bool dce110_clk_src_construct(
+ const struct dce110_clk_src_shift *cs_shift,
+ const struct dce110_clk_src_mask *cs_mask)
+ {
++ struct dc_firmware_info fw_info = { { 0 } };
+ struct calc_pll_clock_source_init_data calc_pll_cs_init_data_hdmi;
+ struct calc_pll_clock_source_init_data calc_pll_cs_init_data;
+
+@@ -1325,12 +1328,14 @@ bool dce110_clk_src_construct(
+ clk_src->cs_shift = cs_shift;
+ clk_src->cs_mask = cs_mask;
+
+- if (!clk_src->bios->fw_info_valid) {
++ if (clk_src->bios->funcs->get_firmware_info(
++ clk_src->bios, &fw_info) != BP_RESULT_OK) {
+ ASSERT_CRITICAL(false);
+ goto unexpected_failure;
+ }
+
+- clk_src->ext_clk_khz = clk_src->bios->fw_info.external_clock_source_frequency_for_dp;
++ clk_src->ext_clk_khz =
++ fw_info.external_clock_source_frequency_for_dp;
+
+ /* structure normally used with PLL ranges from ATOMBIOS; DS on by default */
+ calc_pll_cs_init_data.bp = bios;
+@@ -1370,7 +1375,7 @@ bool dce110_clk_src_construct(
+ FRACT_FB_DIVIDER_DEC_POINTS_MAX_NUM;
+ calc_pll_cs_init_data_hdmi.ctx = ctx;
+
+- clk_src->ref_freq_khz = clk_src->bios->fw_info.pll_info.crystal_frequency;
++ clk_src->ref_freq_khz = fw_info.pll_info.crystal_frequency;
+
+ if (clk_src->base.id == CLOCK_SOURCE_ID_EXTERNAL)
+ return true;
+@@ -1413,6 +1418,8 @@ bool dce112_clk_src_construct(
+ const struct dce110_clk_src_shift *cs_shift,
+ const struct dce110_clk_src_mask *cs_mask)
+ {
++ struct dc_firmware_info fw_info = { { 0 } };
++
+ clk_src->base.ctx = ctx;
+ clk_src->bios = bios;
+ clk_src->base.id = id;
+@@ -1422,12 +1429,13 @@ bool dce112_clk_src_construct(
+ clk_src->cs_shift = cs_shift;
+ clk_src->cs_mask = cs_mask;
+
+- if (!clk_src->bios->fw_info_valid) {
++ if (clk_src->bios->funcs->get_firmware_info(
++ clk_src->bios, &fw_info) != BP_RESULT_OK) {
+ ASSERT_CRITICAL(false);
+ return false;
+ }
+
+- clk_src->ext_clk_khz = clk_src->bios->fw_info.external_clock_source_frequency_for_dp;
++ clk_src->ext_clk_khz = fw_info.external_clock_source_frequency_for_dp;
+
+ return true;
+ }
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
+index caace5229826..b2786a704708 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c_hw.c
+@@ -96,6 +96,17 @@ static uint32_t get_hw_buffer_available_size(
+ dce_i2c_hw->buffer_used_bytes;
+ }
+
++uint32_t get_reference_clock(
++ struct dc_bios *bios)
++{
++ struct dc_firmware_info info = { { 0 } };
++
++ if (bios->funcs->get_firmware_info(bios, &info) != BP_RESULT_OK)
++ return 0;
++
++ return info.pll_info.crystal_frequency;
++}
++
+ static uint32_t get_speed(
+ const struct dce_i2c_hw *dce_i2c_hw)
+ {
+@@ -618,7 +629,7 @@ void dce_i2c_hw_construct(
+ {
+ dce_i2c_hw->ctx = ctx;
+ dce_i2c_hw->engine_id = engine_id;
+- dce_i2c_hw->reference_frequency = (ctx->dc_bios->fw_info.pll_info.crystal_frequency) >> 1;
++ dce_i2c_hw->reference_frequency = get_reference_clock(ctx->dc_bios) >> 1;
+ dce_i2c_hw->regs = regs;
+ dce_i2c_hw->shifts = shifts;
+ dce_i2c_hw->masks = masks;
+diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
+index 9de2a0bda38a..bb199534ea3b 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
+@@ -907,6 +907,7 @@ static bool construct(
+ {
+ unsigned int i;
+ struct dc_context *ctx = dc->ctx;
++ struct dc_firmware_info info;
+ struct dc_bios *bp;
+
+ ctx->dc_bios->regs = &bios_regs;
+@@ -917,7 +918,8 @@ static bool construct(
+
+ bp = ctx->dc_bios;
+
+- if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
++ if ((bp->funcs->get_firmware_info(bp, &info) == BP_RESULT_OK) &&
++ info.external_clock_source_frequency_for_dp != 0) {
+ pool->base.dp_clock_source =
+ dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
+index dc1764f2f8c2..ae89721c3a99 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
+@@ -1272,6 +1272,7 @@ static bool construct(
+ {
+ unsigned int i;
+ struct dc_context *ctx = dc->ctx;
++ struct dc_firmware_info info;
+ struct dc_bios *bp;
+
+ ctx->dc_bios->regs = &bios_regs;
+@@ -1297,7 +1298,8 @@ static bool construct(
+
+ bp = ctx->dc_bios;
+
+- if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
++ if ((bp->funcs->get_firmware_info(bp, &info) == BP_RESULT_OK) &&
++ info.external_clock_source_frequency_for_dp != 0) {
+ pool->base.dp_clock_source =
+ dce110_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
+index 8e4effb1f439..2f224e1ae5f2 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
+@@ -877,6 +877,7 @@ static bool dce80_construct(
+ {
+ unsigned int i;
+ struct dc_context *ctx = dc->ctx;
++ struct dc_firmware_info info;
+ struct dc_bios *bp;
+
+ ctx->dc_bios->regs = &bios_regs;
+@@ -902,7 +903,8 @@ static bool dce80_construct(
+
+ bp = ctx->dc_bios;
+
+- if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
++ if ((bp->funcs->get_firmware_info(bp, &info) == BP_RESULT_OK) &&
++ info.external_clock_source_frequency_for_dp != 0) {
+ pool->base.dp_clock_source =
+ dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+
+@@ -1074,6 +1076,7 @@ static bool dce81_construct(
+ {
+ unsigned int i;
+ struct dc_context *ctx = dc->ctx;
++ struct dc_firmware_info info;
+ struct dc_bios *bp;
+
+ ctx->dc_bios->regs = &bios_regs;
+@@ -1099,7 +1102,8 @@ static bool dce81_construct(
+
+ bp = ctx->dc_bios;
+
+- if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
++ if ((bp->funcs->get_firmware_info(bp, &info) == BP_RESULT_OK) &&
++ info.external_clock_source_frequency_for_dp != 0) {
+ pool->base.dp_clock_source =
+ dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+
+@@ -1271,6 +1275,7 @@ static bool dce83_construct(
+ {
+ unsigned int i;
+ struct dc_context *ctx = dc->ctx;
++ struct dc_firmware_info info;
+ struct dc_bios *bp;
+
+ ctx->dc_bios->regs = &bios_regs;
+@@ -1296,7 +1301,8 @@ static bool dce83_construct(
+
+ bp = ctx->dc_bios;
+
+- if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
++ if ((bp->funcs->get_firmware_info(bp, &info) == BP_RESULT_OK) &&
++ info.external_clock_source_frequency_for_dp != 0) {
+ pool->base.dp_clock_source =
+ dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+
+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 bc9da43881cf..75c670d4443a 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+@@ -567,6 +567,7 @@ static void dcn20_init_hw(struct dc *dc)
+ struct dc_bios *dcb = dc->ctx->dc_bios;
+ struct resource_pool *res_pool = dc->res_pool;
+ struct dc_state *context = dc->current_state;
++ struct dc_firmware_info fw_info = { { 0 } };
+
+ if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)
+ dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);
+@@ -590,15 +591,15 @@ static void dcn20_init_hw(struct dc *dc)
+ } else {
+ if (!dcb->funcs->is_accelerated_mode(dcb)) {
+ bios_golden_init(dc);
+- if (dc->ctx->dc_bios->fw_info_valid) {
+- res_pool->ref_clocks.xtalin_clock_inKhz =
+- dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
++ if (dc->ctx->dc_bios->funcs->get_firmware_info(
++ dc->ctx->dc_bios, &fw_info) == BP_RESULT_OK) {
++ res_pool->ref_clocks.xtalin_clock_inKhz = fw_info.pll_info.crystal_frequency;
+
+ if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) {
+ if (res_pool->dccg && res_pool->hubbub) {
+
+ (res_pool->dccg->funcs->get_dccg_ref_freq)(res_pool->dccg,
+- dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency,
++ fw_info.pll_info.crystal_frequency,
+ &res_pool->ref_clocks.dccg_ref_clock_inKhz);
+
+ (res_pool->hubbub->funcs->get_dchub_ref_freq)(res_pool->hubbub,
+--
+2.17.1
+