aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0692-drm-amd-dal-Define-interface-for-External-VBIOS-part.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0692-drm-amd-dal-Define-interface-for-External-VBIOS-part.patch')
-rw-r--r--common/recipes-kernel/linux/files/0692-drm-amd-dal-Define-interface-for-External-VBIOS-part.patch3301
1 files changed, 3301 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0692-drm-amd-dal-Define-interface-for-External-VBIOS-part.patch b/common/recipes-kernel/linux/files/0692-drm-amd-dal-Define-interface-for-External-VBIOS-part.patch
new file mode 100644
index 00000000..315c116c
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0692-drm-amd-dal-Define-interface-for-External-VBIOS-part.patch
@@ -0,0 +1,3301 @@
+From 777022b361d791813c9e399bd7d7b1e3efe28232 Mon Sep 17 00:00:00 2001
+From: David Rokhvarg <David.Rokhvarg@amd.com>
+Date: Tue, 12 Jan 2016 12:01:10 -0500
+Subject: [PATCH 0692/1110] drm/amd/dal: Define interface for External VBIOS -
+ part 2.
+
+Signed-off-by: David Rokhvarg <David.Rokhvarg@amd.com>
+Acked-by: Jordan Lazare <Jordan.Lazare@amd.com>
+---
+ .../gpu/drm/amd/dal/dc/adapter/adapter_service.c | 140 ++--
+ .../gpu/drm/amd/dal/dc/adapter/adapter_service.h | 5 +-
+ .../drm/amd/dal/dc/adapter/wireless_data_source.c | 9 +-
+ .../drm/amd/dal/dc/adapter/wireless_data_source.h | 4 +-
+ drivers/gpu/drm/amd/dal/dc/bios/bios_parser.c | 807 ++++++++++++++-------
+ .../gpu/drm/amd/dal/dc/bios/bios_parser_helper.c | 1 -
+ drivers/gpu/drm/amd/dal/dc/core/dc.c | 4 +-
+ drivers/gpu/drm/amd/dal/dc/dc.h | 5 +-
+ drivers/gpu/drm/amd/dal/dc/dc_bios_types.h | 248 ++++++-
+ drivers/gpu/drm/amd/dal/dc/dc_helpers.h | 2 +
+ .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c | 51 +-
+ .../drm/amd/dal/dc/dce110/dce110_link_encoder.c | 59 +-
+ .../gpu/drm/amd/dal/dc/dce110/dce110_resource.c | 2 +-
+ .../drm/amd/dal/dc/dce110/dce110_stream_encoder.c | 7 +-
+ .../drm/amd/dal/dc/dce110/dce110_stream_encoder.h | 2 +-
+ .../amd/dal/dc/dce110/dce110_timing_generator.c | 7 +-
+ .../gpu/drm/amd/dal/dc/gpu/calc_pll_clock_source.c | 2 +-
+ .../gpu/drm/amd/dal/dc/gpu/calc_pll_clock_source.h | 4 +-
+ drivers/gpu/drm/amd/dal/dc/gpu/clock_source.c | 7 +-
+ drivers/gpu/drm/amd/dal/dc/gpu/clock_source.h | 2 +-
+ .../amd/dal/dc/gpu/dce110/display_clock_dce110.c | 4 +-
+ .../dal/dc/gpu/dce110/pll_clock_source_dce110.c | 6 +-
+ .../dal/dc/gpu/dce110/vce_clock_source_dce110.c | 4 +-
+ drivers/gpu/drm/amd/dal/dc/gpu/ext_clock_source.c | 11 +-
+ drivers/gpu/drm/amd/dal/dc/gpu/pll_clock_source.c | 7 +-
+ drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h | 2 +-
+ drivers/gpu/drm/amd/dal/dc/inc/stream_encoder.h | 4 +-
+ .../amd/dal/include/adapter_service_interface.h | 3 +-
+ .../drm/amd/dal/include/adapter_service_types.h | 1 +
+ .../drm/amd/dal/include/bios_parser_interface.h | 216 +-----
+ .../gpu/drm/amd/dal/include/bios_parser_types.h | 19 +-
+ .../drm/amd/dal/include/timing_generator_types.h | 3 +-
+ 32 files changed, 1007 insertions(+), 641 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.c b/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.c
+index 6084466..b3b3be7 100644
+--- a/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.c
++++ b/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.c
+@@ -26,15 +26,15 @@
+
+ #include "dal_services.h"
+
++#include "dc_bios_types.h"
++
+ #include "include/adapter_service_interface.h"
+ #include "include/i2caux_interface.h"
+ #include "include/asic_capability_types.h"
+-#include "include/bios_parser_interface.h"
+ #include "include/gpio_service_interface.h"
+ #include "include/asic_capability_interface.h"
+ #include "include/logger_interface.h"
+
+-#include "dc_bios_types.h"
+ #include "adapter_service.h"
+ #include "hw_ctx_adapter_service.h"
+ #include "wireless_data_source.h"
+@@ -233,10 +233,8 @@ static void initialize_backlight_caps(
+ return;
+ }
+
+- if (dal_bios_parser_get_firmware_info
+- (as->bios_parser, &fw_info) != BP_RESULT_OK ||
+- dal_bios_parser_get_embedded_panel_info
+- (as->bios_parser, &panel_info) != BP_RESULT_OK)
++ if (as->dcb->funcs->get_firmware_info(as->dcb, &fw_info) != BP_RESULT_OK ||
++ as->dcb->funcs->get_embedded_panel_info(as->dcb, &panel_info) != BP_RESULT_OK)
+ return;
+
+ params.data = &caps;
+@@ -553,7 +551,7 @@ static bool get_hpd_info(struct adapter_service *as,
+ struct graphics_object_hpd_info *info)
+ {
+ return BP_RESULT_OK ==
+- dal_bios_parser_get_hpd_info(as->bios_parser, id, info);
++ as->dcb->funcs->get_hpd_info(as->dcb, id, info);
+ }
+
+ /*
+@@ -687,10 +685,10 @@ static void adapter_service_destruct(
+ {
+ dal_adapter_service_destroy_hw_ctx(&as->hw_ctx);
+ dal_i2caux_destroy(&as->i2caux);
+- dal_bios_parser_destroy(&as->bios_parser);
+ dal_gpio_service_destroy(&as->gpio_service);
+ dal_asic_capability_destroy(&as->asic_cap);
+- dal_bios_parser_destroy_integrated_info(as->ctx, &as->integrated_info);
++ as->dcb->funcs->destroy_integrated_info(as->dcb, &as->integrated_info);
++ dal_bios_parser_destroy(&as->dcb);
+ }
+
+ /*
+@@ -736,18 +734,16 @@ static bool adapter_service_construct(
+ goto failed_to_generate_features;
+ }
+
+- if (init_data->vbios_override) {
+- /* TODO: remove the typecast */
+- as->bios_parser = (struct bios_parser *)init_data->vbios_override;
+- } else {
++ if (init_data->vbios_override)
++ as->dcb = init_data->vbios_override;
++ else {
+ /* Create BIOS parser */
+ init_data->bp_init_data.ctx = init_data->ctx;
+
+- as->bios_parser =
+- dal_bios_parser_create(&init_data->bp_init_data, as);
++ as->dcb = dal_bios_parser_create(&init_data->bp_init_data, as);
+ }
+
+- if (!as->bios_parser) {
++ if (!as->dcb) {
+ ASSERT_CRITICAL(false);
+ goto failed_to_create_bios_parser;
+ }
+@@ -784,10 +780,10 @@ static bool adapter_service_construct(
+ /* Avoid wireless encoder creation in upstream branch. */
+
+ /* Integrated info is not provided on discrete ASIC. NULL is allowed */
+- as->integrated_info = dal_bios_parser_create_integrated_info(
+- as->bios_parser);
++ as->integrated_info = as->dcb->funcs->create_integrated_info(
++ as->dcb);
+
+- dal_bios_parser_post_init(as->bios_parser);
++ as->dcb->funcs->post_init(as->dcb);
+
+ /* Generate backlight translation table and initializes
+ other brightness properties */
+@@ -809,7 +805,7 @@ failed_to_create_i2caux:
+ dal_gpio_service_destroy(&as->gpio_service);
+
+ failed_to_create_gpio_service:
+- dal_bios_parser_destroy(&as->bios_parser);
++ dal_bios_parser_destroy(&as->dcb);
+
+ failed_to_create_bios_parser:
+ dal_asic_capability_destroy(&as->asic_cap);
+@@ -926,8 +922,7 @@ uint8_t dal_adapter_service_get_connectors_num(
+ uint8_t wireless_connectors_num = 0;
+ struct dc_bios *dcb;
+
+- /* TODO: remove type cast */
+- dcb = (struct dc_bios*)dal_adapter_service_get_bios_parser(as);
++ dcb = dal_adapter_service_get_bios_parser(as);
+
+ vbios_connectors_num = dcb->funcs->get_connectors_number(dcb);
+
+@@ -964,7 +959,7 @@ uint32_t dal_adapter_service_get_src_num(
+ if (is_wireless_object(id))
+ return wireless_get_srcs_num(as, id);
+ else
+- return dal_bios_parser_get_src_number(as->bios_parser, id);
++ return as->dcb->funcs->get_src_number(as->dcb, id);
+ }
+
+ /**
+@@ -989,8 +984,8 @@ struct graphics_object_id dal_adapter_service_get_src_obj(
+ src_object_id = wireless_get_src_obj_id(as, id, index);
+ else {
+ if (BP_RESULT_OK !=
+- dal_bios_parser_get_src_obj(
+- as->bios_parser, id, index, &src_object_id))
++ as->dcb->funcs->get_src_obj(
++ as->dcb, id, index, &src_object_id))
+ src_object_id =
+ dal_graphics_object_id_init(
+ 0,
+@@ -1017,8 +1012,7 @@ struct graphics_object_id dal_adapter_service_get_connector_obj_id(
+ struct dc_bios *dcb;
+ uint8_t bios_connectors_num;
+
+- /* TODO: remove type cast */
+- dcb = (struct dc_bios*)dal_adapter_service_get_bios_parser(as);
++ dcb = dal_adapter_service_get_bios_parser(as);
+
+ bios_connectors_num = dcb->funcs->get_connectors_number(dcb);
+
+@@ -1027,8 +1021,8 @@ struct graphics_object_id dal_adapter_service_get_connector_obj_id(
+ as,
+ connector_index);
+ else
+- return dal_bios_parser_get_connector_id(
+- as->bios_parser,
++ return as->dcb->funcs->get_connector_id(
++ as->dcb,
+ connector_index);
+ }
+
+@@ -1038,7 +1032,7 @@ bool dal_adapter_service_get_device_tag(
+ uint32_t device_tag_index,
+ struct connector_device_tag_info *info)
+ {
+- if (BP_RESULT_OK == dal_bios_parser_get_device_tag(as->bios_parser,
++ if (BP_RESULT_OK == as->dcb->funcs->get_device_tag(as->dcb,
+ connector_object_id, device_tag_index, info))
+ return true;
+ else
+@@ -1049,7 +1043,7 @@ bool dal_adapter_service_get_device_tag(
+ bool dal_adapter_service_is_device_id_supported(struct adapter_service *as,
+ struct device_id id)
+ {
+- return dal_bios_parser_is_device_id_supported(as->bios_parser, id);
++ return as->dcb->funcs->is_device_id_supported(as->dcb, id);
+ }
+
+ bool dal_adapter_service_is_meet_underscan_req(struct adapter_service *as)
+@@ -1092,7 +1086,7 @@ uint8_t dal_adapter_service_get_clock_sources_num(
+ * as a clock source for DP
+ */
+ enum bp_result bp_result =
+- dal_bios_parser_get_firmware_info(as->bios_parser,
++ as->dcb->funcs->get_firmware_info(as->dcb,
+ &fw_info);
+
+ if (BP_RESULT_OK == bp_result &&
+@@ -1211,7 +1205,7 @@ bool dal_adapter_service_get_i2c_info(
+ }
+
+ return BP_RESULT_OK ==
+- dal_bios_parser_get_i2c_info(as->bios_parser, id, i2c_info);
++ as->dcb->funcs->get_i2c_info(as->dcb, id, i2c_info);
+ }
+
+ /*
+@@ -1269,7 +1263,7 @@ struct irq *dal_adapter_service_obtain_hpd_irq(
+ if (!get_hpd_info(as, id, &hpd_info))
+ return NULL;
+
+- bp_result = dal_bios_parser_get_gpio_pin_info(as->bios_parser,
++ bp_result = as->dcb->funcs->get_gpio_pin_info(as->dcb,
+ hpd_info.hpd_int_gpio_uid, &pin_info);
+
+ if (bp_result != BP_RESULT_OK) {
+@@ -1304,7 +1298,7 @@ uint32_t dal_adapter_service_get_ss_info_num(
+ struct adapter_service *as,
+ enum as_signal_type signal)
+ {
+- return dal_bios_parser_get_ss_entry_number(as->bios_parser, signal);
++ return as->dcb->funcs->get_ss_entry_number(as->dcb, signal);
+ }
+
+ /*
+@@ -1319,8 +1313,8 @@ bool dal_adapter_service_get_ss_info(
+ struct spread_spectrum_info *info)
+ {
+ enum bp_result bp_result =
+- dal_bios_parser_get_spread_spectrum_info(
+- as->bios_parser, signal, idx, info);
++ as->dcb->funcs->get_spread_spectrum_info(
++ as->dcb, signal, idx, info);
+
+ return BP_RESULT_OK == bp_result;
+ }
+@@ -1510,22 +1504,20 @@ struct gpio *dal_adapter_service_obtain_stereo_gpio(
+ result.raw = as->asic_cap->data[ASIC_DATA_FEATURE_FLAGS];
+
+ /* Case 1 : Workstation stereo */
+- if (result.bits.WORKSTATION_STEREO)
++ if (result.bits.WORKSTATION_STEREO) {
+ /* "active low" <--> "default 3d right eye polarity" = false */
+- return dal_gpio_service_create_gpio_ex(
+- as->gpio_service, GPIO_ID_GENERIC, GPIO_GENERIC_A,
+- GPIO_PIN_OUTPUT_STATE_ACTIVE_LOW);
++ return dal_gpio_service_create_gpio_ex(as->gpio_service,
++ GPIO_ID_GENERIC, GPIO_GENERIC_A,
++ GPIO_PIN_OUTPUT_STATE_ACTIVE_LOW);
+ /* Case 2 : runtime parameter override for sideband stereo */
+- else if (have_param_stereo_gpio) {
++ } else if (have_param_stereo_gpio) {
+ /* TODO implement */
+ return NULL;
+- /* Case 3 : VBIOS gives us GPIO for sideband stereo */
++ /* Case 3 : VBIOS gives us GPIO for sideband stereo */
+ } else {
+ const struct graphics_object_id id =
+- dal_graphics_object_id_init(
+- GENERIC_ID_STEREO,
+- ENUM_ID_1,
+- OBJECT_TYPE_GENERIC);
++ dal_graphics_object_id_init(GENERIC_ID_STEREO,
++ ENUM_ID_1, OBJECT_TYPE_GENERIC);
+
+ struct bp_gpio_cntl_info cntl_info;
+ struct gpio_pin_info pin_info;
+@@ -1533,18 +1525,21 @@ struct gpio *dal_adapter_service_obtain_stereo_gpio(
+ /* Get GPIO record for this object.
+ * Stereo GPIO record should have exactly one entry
+ * where active state defines stereosync polarity */
+- if (1 != dal_bios_parser_get_gpio_record(
+- as->bios_parser, id, &cntl_info, 1)) {
++ if (1 != as->dcb->funcs->get_gpio_record(
++ as->dcb, id, &cntl_info,
++ 1)) {
+ return NULL;
+- } else if (BP_RESULT_OK != dal_bios_parser_get_gpio_pin_info(
+- as->bios_parser, cntl_info.id, &pin_info)) {
++ } else if (BP_RESULT_OK
++ != as->dcb->funcs->get_gpio_pin_info(
++ as->dcb, cntl_info.id,
++ &pin_info)) {
+ /*ASSERT_CRITICAL(false);*/
+ return NULL;
+- } else
+- return dal_gpio_service_create_gpio_ex(
+- as->gpio_service,
+- pin_info.offset, pin_info.mask,
+- cntl_info.state);
++ } else {
++ return dal_gpio_service_create_gpio_ex(as->gpio_service,
++ pin_info.offset, pin_info.mask,
++ cntl_info.state);
++ }
+ }
+ }
+
+@@ -1569,7 +1564,7 @@ bool dal_adapter_service_get_firmware_info(
+ struct adapter_service *as,
+ struct firmware_info *info)
+ {
+- return dal_bios_parser_get_firmware_info(as->bios_parser, info) ==
++ return as->dcb->funcs->get_firmware_info(as->dcb, info) ==
+ BP_RESULT_OK;
+ }
+
+@@ -1666,13 +1661,10 @@ uint32_t dal_adapter_service_get_memory_type_multiplier(
+ *
+ * Get BIOS parser handler
+ */
+-/* TODO: change return type to 'dc_bios'. */
+-struct bios_parser *dal_adapter_service_get_bios_parser(
++struct dc_bios *dal_adapter_service_get_bios_parser(
+ struct adapter_service *as)
+ {
+- /* TODO: conditionally return 'override' or 'real'.
+- * Works for now because 'base' is first member of 'bios parser' */
+- return as->bios_parser;
++ return as->dcb;
+ }
+
+ /*
+@@ -1764,8 +1756,7 @@ bool dal_adapter_service_get_embedded_panel_info(
+ /*TODO: add DALASSERT_MSG here*/
+ return false;
+
+- result = dal_bios_parser_get_embedded_panel_info(
+- as->bios_parser, info);
++ result = as->dcb->funcs->get_embedded_panel_info(as->dcb, info);
+
+ return result == BP_RESULT_OK;
+ }
+@@ -1781,8 +1772,8 @@ bool dal_adapter_service_enum_embedded_panel_patch_mode(
+ /*TODO: add DALASSERT_MSG here*/
+ return false;
+
+- result = dal_bios_parser_enum_embedded_panel_patch_mode(
+- as->bios_parser, index, mode);
++ result = as->dcb->funcs->enum_embedded_panel_patch_mode(
++ as->dcb, index, mode);
+
+ return result == BP_RESULT_OK;
+ }
+@@ -1793,9 +1784,8 @@ bool dal_adapter_service_get_faked_edid_len(
+ {
+ enum bp_result result;
+
+- result = dal_bios_parser_get_faked_edid_len(
+- as->bios_parser,
+- len);
++ result = as->dcb->funcs->get_faked_edid_len(as->dcb, len);
++
+ return result == BP_RESULT_OK;
+ }
+
+@@ -1806,8 +1796,8 @@ bool dal_adapter_service_get_faked_edid_buf(
+ {
+ enum bp_result result;
+
+- result = dal_bios_parser_get_faked_edid_buf(
+- as->bios_parser,
++ result = as->dcb->funcs->get_faked_edid_buf(
++ as->dcb,
+ buf,
+ len);
+ return result == BP_RESULT_OK;
+@@ -1896,7 +1886,7 @@ bool dal_adapter_service_should_optimize(
+ */
+ bool dal_adapter_service_is_in_accelerated_mode(struct adapter_service *as)
+ {
+- return dal_bios_parser_is_accelerated_mode(as->bios_parser);
++ return as->dcb->funcs->is_accelerated_mode(as->dcb);
+ }
+
+ struct ddc *dal_adapter_service_obtain_ddc_from_i2c_info(
+@@ -1946,7 +1936,7 @@ bool dal_adapter_service_is_lid_open(struct adapter_service *as)
+ return is_lid_open;
+
+ #if defined(CONFIG_DRM_AMD_DAL_VBIOS_PRESENT)
+- return dal_bios_parser_is_lid_open(as->bios_parser);
++ return as->dcb->funcs->is_lid_open(as->dcb);
+ #else
+ return false;
+ #endif
+@@ -2033,8 +2023,8 @@ bool dal_adapter_service_get_encoder_cap_info(
+ * - dpHbr2Cap: indicates supported/not supported by HW Encoder
+ * - dpHbr2En : indicates DP spec compliant/not compliant
+ */
+- result = dal_bios_parser_get_encoder_cap_info(
+- as->bios_parser,
++ result = as->dcb->funcs->get_encoder_cap_info(
++ as->dcb,
+ id,
+ &bp_cap_info);
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.h b/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.h
+index dd5bb00..5bb4446 100644
+--- a/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.h
++++ b/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.h
+@@ -27,6 +27,7 @@
+ #define __DAL_ADAPTER_SERVICE_H__
+
+ /* Include */
++#include "dc_bios_types.h"
+ #include "include/adapter_service_interface.h"
+ #include "wireless_data_source.h"
+
+@@ -35,13 +36,13 @@
+ */
+ struct gpio_service;
+ struct asic_cap;
+-struct dc_bios;
++
+
+ /* Adapter service */
+ struct adapter_service {
+ struct dc_context *ctx;
+ struct asic_capability *asic_cap;
+- struct bios_parser *bios_parser;/* TODO: remove it. replace by struct dc_bios *dcb; */
++ struct dc_bios *dcb;
+ struct gpio_service *gpio_service;
+ struct i2caux *i2caux;
+ struct wireless_data wireless_data;
+diff --git a/drivers/gpu/drm/amd/dal/dc/adapter/wireless_data_source.c b/drivers/gpu/drm/amd/dal/dc/adapter/wireless_data_source.c
+index dcb885d..0249829 100644
+--- a/drivers/gpu/drm/amd/dal/dc/adapter/wireless_data_source.c
++++ b/drivers/gpu/drm/amd/dal/dc/adapter/wireless_data_source.c
+@@ -32,12 +32,12 @@
+
+ /*construct wireless data*/
+ bool wireless_data_init(struct wireless_data *data,
+- struct bios_parser *bp,
++ struct dc_bios *dcb,
+ struct wireless_init_data *init_data)
+ {
+ struct firmware_info info;
+
+- if (data == NULL || bp == NULL || init_data == NULL) {
++ if (data == NULL || dcb == NULL || init_data == NULL) {
+ ASSERT_CRITICAL(false);
+ return false;
+ }
+@@ -66,10 +66,9 @@ bool wireless_data_init(struct wireless_data *data,
+ * Check if SBIOS sets remote display enable, exposed
+ * through VBIOS. This is only valid for APU, not dGPU
+ */
+- dal_bios_parser_get_firmware_info(bp, &info);
++ dcb->funcs->get_firmware_info(dcb, &info);
+
+- if ((REMOTE_DISPLAY_ENABLE ==
+- info.remote_display_config) &&
++ if ((REMOTE_DISPLAY_ENABLE == info.remote_display_config) &&
+ init_data->fusion) {
+ data->wireless_enable = true;
+ data->wireless_disp_path_enable = true;
+diff --git a/drivers/gpu/drm/amd/dal/dc/adapter/wireless_data_source.h b/drivers/gpu/drm/amd/dal/dc/adapter/wireless_data_source.h
+index 54b140a..b64089e 100644
+--- a/drivers/gpu/drm/amd/dal/dc/adapter/wireless_data_source.h
++++ b/drivers/gpu/drm/amd/dal/dc/adapter/wireless_data_source.h
+@@ -33,7 +33,7 @@
+ * Forward declaration
+ */
+ struct adapter_service;
+-struct bios_parser;
++struct dc_bios;
+
+ /* Wireless data init structure */
+ struct wireless_init_data {
+@@ -55,7 +55,7 @@ struct wireless_data {
+ /*construct wireless data*/
+ bool wireless_data_init(
+ struct wireless_data *data,
+- struct bios_parser *bp,
++ struct dc_bios *dcb,
+ struct wireless_init_data *init_data);
+
+ uint8_t wireless_get_clocks_num(
+diff --git a/drivers/gpu/drm/amd/dal/dc/bios/bios_parser.c b/drivers/gpu/drm/amd/dal/dc/bios/bios_parser.c
+index 3329322..3ca165b 100644
+--- a/drivers/gpu/drm/amd/dal/dc/bios/bios_parser.c
++++ b/drivers/gpu/drm/amd/dal/dc/bios/bios_parser.c
+@@ -40,6 +40,7 @@
+ #endif
+ #include "command_table_helper.h"
+ #include "bios_parser.h"
++#include "bios_parser_interface.h"
+
+ #define THREE_PERCENT_OF_10000 300
+
+@@ -100,101 +101,21 @@ static void process_ext_display_connection_info(struct bios_parser *bp);
+ #define BIOS_IMAGE_SIZE_UNIT 512
+
+ /*****************************************************************************/
+-static uint8_t bios_parser_get_connectors_number(struct dc_bios *dcb);
+-
+-const struct dc_vbios_funcs vbios_funcs = {
+- .get_connectors_number = bios_parser_get_connectors_number
+-};
+-
+ static bool bios_parser_construct(
+ struct bios_parser *bp,
+ struct bp_init_data *init,
+- struct adapter_service *as)
+-{
+- uint16_t *rom_header_offset = NULL;
+- ATOM_ROM_HEADER *rom_header = NULL;
+- ATOM_OBJECT_HEADER *object_info_tbl;
+- enum dce_version dce_version;
+-
+- if (!as)
+- return false;
++ struct adapter_service *as);
+
+- if (!init)
+- return false;
++static uint8_t bios_parser_get_connectors_number(
++ struct dc_bios *dcb);
+
+- if (!init->bios)
+- return false;
+-
+- bp->base.funcs = &vbios_funcs;
+-
+- dce_version = dal_adapter_service_get_dce_version(as);
+- bp->ctx = init->ctx;
+- bp->as = as;
+- bp->bios = init->bios;
+- bp->bios_size = bp->bios[BIOS_IMAGE_SIZE_OFFSET] * BIOS_IMAGE_SIZE_UNIT;
+- bp->bios_local_image = NULL;
+- bp->lcd_scale = LCD_SCALE_UNKNOWN;
+-
+- rom_header_offset =
+- GET_IMAGE(uint16_t, OFFSET_TO_POINTER_TO_ATOM_ROM_HEADER);
+-
+- if (!rom_header_offset)
+- return false;
+-
+- rom_header = GET_IMAGE(ATOM_ROM_HEADER, *rom_header_offset);
+-
+- if (!rom_header)
+- return false;
+-
+- bp->master_data_tbl =
+- GET_IMAGE(ATOM_MASTER_DATA_TABLE,
+- rom_header->usMasterDataTableOffset);
+-
+- if (!bp->master_data_tbl)
+- return false;
+-
+- bp->object_info_tbl_offset = DATA_TABLES(Object_Header);
+-
+- if (!bp->object_info_tbl_offset)
+- return false;
+-
+- object_info_tbl =
+- GET_IMAGE(ATOM_OBJECT_HEADER, bp->object_info_tbl_offset);
+-
+- if (!object_info_tbl)
+- return false;
+-
+- get_atom_data_table_revision(&object_info_tbl->sHeader,
+- &bp->object_info_tbl.revision);
+-
+- if (bp->object_info_tbl.revision.major == 1
+- && bp->object_info_tbl.revision.minor >= 3) {
+- ATOM_OBJECT_HEADER_V3 *tbl_v3;
+-
+- tbl_v3 = GET_IMAGE(ATOM_OBJECT_HEADER_V3,
+- bp->object_info_tbl_offset);
+- if (!tbl_v3)
+- return false;
+-
+- bp->object_info_tbl.v1_3 = tbl_v3;
+- } else if (bp->object_info_tbl.revision.major == 1
+- && bp->object_info_tbl.revision.minor >= 1)
+- bp->object_info_tbl.v1_1 = object_info_tbl;
+- else
+- return false;
+-
+-#if defined(CONFIG_DRM_AMD_DAL_VBIOS_PRESENT)
+- bp->vbios_helper_data.active = 0;
+- bp->vbios_helper_data.requested = 0;
+- dal_bios_parser_init_bios_helper(bp, dce_version);
+-#endif
+- dal_bios_parser_init_cmd_tbl(bp);
+- dal_bios_parser_init_cmd_tbl_helper(&bp->cmd_helper, dce_version);
++static enum bp_result bios_parser_get_embedded_panel_info(
++ struct dc_bios *dcb,
++ struct embedded_panel_info *info);
+
+- return true;
+-}
++/*****************************************************************************/
+
+-struct bios_parser *dal_bios_parser_create(
++struct dc_bios *dal_bios_parser_create(
+ struct bp_init_data *init, struct adapter_service *as)
+ {
+ struct bios_parser *bp = NULL;
+@@ -204,7 +125,7 @@ struct bios_parser *dal_bios_parser_create(
+ return NULL;
+
+ if (bios_parser_construct(bp, init, as))
+- return bp;
++ return &bp->base;
+
+ dc_service_free(init->ctx, bp);
+ BREAK_TO_DEBUGGER();
+@@ -217,29 +138,35 @@ static void destruct(struct bios_parser *bp)
+ dc_service_free(bp->ctx, bp->bios_local_image);
+ }
+
+-void dal_bios_parser_destroy(struct bios_parser **bp)
++void dal_bios_parser_destroy(struct dc_bios **dcb)
+ {
+- if (!bp || !*bp) {
++ struct bios_parser *bp = BP_FROM_DCB(*dcb);
++
++ if (!bp) {
+ BREAK_TO_DEBUGGER();
+ return;
+ }
+
+- destruct(*bp);
++ destruct(bp);
+
+- dc_service_free((*bp)->ctx, *bp);
+- *bp = NULL;
++ dc_service_free((bp)->ctx, bp);
++ *dcb = NULL;
+ }
+
+-void dal_bios_parser_power_down(struct bios_parser *bp)
++static void bios_parser_power_down(struct dc_bios *dcb)
+ {
+ #if defined(CONFIG_DRM_AMD_DAL_VBIOS_PRESENT)
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ dal_bios_parser_set_scratch_lcd_scale(bp, bp->lcd_scale);
+ #endif
+ }
+
+-void dal_bios_parser_power_up(struct bios_parser *bp)
++static void bios_parser_power_up(struct dc_bios *dcb)
+ {
+ #if defined(CONFIG_DRM_AMD_DAL_VBIOS_PRESENT)
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (bp->lcd_scale == LCD_SCALE_UNKNOWN)
+ bp->lcd_scale = dal_bios_parser_get_scratch_lcd_scale(bp);
+ #endif
+@@ -259,8 +186,10 @@ static uint8_t get_number_of_objects(struct bios_parser *bp, uint32_t offset)
+ return table->ucNumberOfObjects;
+ }
+
+-uint8_t dal_bios_parser_get_encoders_number(struct bios_parser *bp)
++static uint8_t bios_parser_get_encoders_number(struct dc_bios *dcb)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ return get_number_of_objects(bp,
+ le16_to_cpu(bp->object_info_tbl.v1_1->usEncoderObjectTableOffset));
+ }
+@@ -273,9 +202,10 @@ static uint8_t bios_parser_get_connectors_number(struct dc_bios *dcb)
+ le16_to_cpu(bp->object_info_tbl.v1_1->usConnectorObjectTableOffset));
+ }
+
+-uint32_t dal_bios_parser_get_oem_ddc_lines_number(struct bios_parser *bp)
++static uint32_t bios_parser_get_oem_ddc_lines_number(struct dc_bios *dcb)
+ {
+ uint32_t number = 0;
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+
+ if (DATA_TABLES(OemInfo) != 0) {
+ ATOM_OEM_INFO *info;
+@@ -296,9 +226,11 @@ uint32_t dal_bios_parser_get_oem_ddc_lines_number(struct bios_parser *bp)
+ return number;
+ }
+
+-struct graphics_object_id dal_bios_parser_get_encoder_id(struct bios_parser *bp,
++static struct graphics_object_id bios_parser_get_encoder_id(
++ struct dc_bios *dcb,
+ uint32_t i)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ struct graphics_object_id object_id = dal_graphics_object_id_init(
+ 0, ENUM_ID_UNKNOWN, OBJECT_TYPE_UNKNOWN);
+
+@@ -317,10 +249,11 @@ struct graphics_object_id dal_bios_parser_get_encoder_id(struct bios_parser *bp,
+ return object_id;
+ }
+
+-struct graphics_object_id dal_bios_parser_get_connector_id(
+- struct bios_parser *bp,
++static struct graphics_object_id bios_parser_get_connector_id(
++ struct dc_bios *dcb,
+ uint8_t i)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ struct graphics_object_id object_id = dal_graphics_object_id_init(
+ 0, ENUM_ID_UNKNOWN, OBJECT_TYPE_UNKNOWN);
+
+@@ -339,12 +272,13 @@ struct graphics_object_id dal_bios_parser_get_connector_id(
+ return object_id;
+ }
+
+-uint32_t dal_bios_parser_get_src_number(struct bios_parser *bp,
++static uint32_t bios_parser_get_src_number(struct dc_bios *dcb,
+ struct graphics_object_id id)
+ {
+ uint32_t offset;
+ uint8_t *number;
+ ATOM_OBJECT *object;
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+
+ object = get_bios_object(bp, id);
+
+@@ -363,21 +297,23 @@ uint32_t dal_bios_parser_get_src_number(struct bios_parser *bp,
+ return *number;
+ }
+
+-uint32_t dal_bios_parser_get_dst_number(struct bios_parser *bp,
++static uint32_t bios_parser_get_dst_number(struct dc_bios *dcb,
+ struct graphics_object_id id)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ ATOM_OBJECT *object = get_bios_object(bp, id);
+
+ return get_dst_number_from_object(bp, object);
+ }
+
+-enum bp_result dal_bios_parser_get_src_obj(struct bios_parser *bp,
++static enum bp_result bios_parser_get_src_obj(struct dc_bios *dcb,
+ struct graphics_object_id object_id, uint32_t index,
+ struct graphics_object_id *src_object_id)
+ {
+ uint32_t number;
+ uint16_t *id;
+ ATOM_OBJECT *object;
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+
+ if (!src_object_id)
+ return BP_RESULT_BADINPUT;
+@@ -399,13 +335,14 @@ enum bp_result dal_bios_parser_get_src_obj(struct bios_parser *bp,
+ return BP_RESULT_OK;
+ }
+
+-enum bp_result dal_bios_parser_get_dst_obj(struct bios_parser *bp,
++static enum bp_result bios_parser_get_dst_obj(struct dc_bios *dcb,
+ struct graphics_object_id object_id, uint32_t index,
+ struct graphics_object_id *dest_object_id)
+ {
+ uint32_t number;
+ uint16_t *id;
+ ATOM_OBJECT *object;
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+
+ if (!dest_object_id)
+ return BP_RESULT_BADINPUT;
+@@ -422,10 +359,11 @@ enum bp_result dal_bios_parser_get_dst_obj(struct bios_parser *bp,
+ return BP_RESULT_OK;
+ }
+
+-enum bp_result dal_bios_parser_get_oem_ddc_info(struct bios_parser *bp,
++static enum bp_result bios_parser_get_oem_ddc_info(struct dc_bios *dcb,
+ uint32_t index,
+ struct graphics_object_i2c_info *info)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+
+ if (!info)
+ return BP_RESULT_BADINPUT;
+@@ -458,7 +396,7 @@ enum bp_result dal_bios_parser_get_oem_ddc_info(struct bios_parser *bp,
+ return BP_RESULT_NORECORD;
+ }
+
+-enum bp_result dal_bios_parser_get_i2c_info(struct bios_parser *bp,
++static enum bp_result bios_parser_get_i2c_info(struct dc_bios *dcb,
+ struct graphics_object_id id,
+ struct graphics_object_i2c_info *info)
+ {
+@@ -466,6 +404,7 @@ enum bp_result dal_bios_parser_get_i2c_info(struct bios_parser *bp,
+ ATOM_OBJECT *object;
+ ATOM_COMMON_RECORD_HEADER *header;
+ ATOM_I2C_RECORD *record;
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+
+ if (!info)
+ return BP_RESULT_BADINPUT;
+@@ -563,7 +502,28 @@ static enum bp_result get_voltage_ddc_info_v3(uint8_t *i2c_line,
+ return result;
+ }
+
+-enum bp_result dal_bios_parser_get_voltage_ddc_info(struct bios_parser *bp,
++static enum bp_result bios_parser_get_thermal_ddc_info(
++ struct dc_bios *dcb,
++ uint32_t i2c_channel_id,
++ struct graphics_object_i2c_info *info)
++{
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++ ATOM_I2C_ID_CONFIG_ACCESS *config;
++ ATOM_I2C_RECORD record;
++
++ if (!info)
++ return BP_RESULT_BADINPUT;
++
++ config = (ATOM_I2C_ID_CONFIG_ACCESS *) &i2c_channel_id;
++
++ record.sucI2cId.bfHW_Capable = config->sbfAccess.bfHW_Capable;
++ record.sucI2cId.bfI2C_LineMux = config->sbfAccess.bfI2C_LineMux;
++ record.sucI2cId.bfHW_EngineID = config->sbfAccess.bfHW_EngineID;
++
++ return get_gpio_i2c_info(bp, &record, info);
++}
++
++static enum bp_result bios_parser_get_voltage_ddc_info(struct dc_bios *dcb,
+ uint32_t index,
+ struct graphics_object_i2c_info *info)
+ {
+@@ -572,6 +532,7 @@ enum bp_result dal_bios_parser_get_voltage_ddc_info(struct bios_parser *bp,
+ uint8_t *voltage_info_address;
+ ATOM_COMMON_TABLE_HEADER *header;
+ struct atom_data_revision revision = {0};
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+
+ if (!DATA_TABLES(VoltageObjectInfo))
+ return result;
+@@ -599,34 +560,14 @@ enum bp_result dal_bios_parser_get_voltage_ddc_info(struct bios_parser *bp,
+ }
+
+ if (result == BP_RESULT_OK)
+- result = dal_bios_parser_get_thermal_ddc_info(bp,
++ result = bios_parser_get_thermal_ddc_info(dcb,
+ i2c_line, info);
+
+
+ return result;
+ }
+
+-enum bp_result dal_bios_parser_get_thermal_ddc_info(
+- struct bios_parser *bp,
+- uint32_t i2c_channel_id,
+- struct graphics_object_i2c_info *info)
+-{
+- ATOM_I2C_ID_CONFIG_ACCESS *config;
+- ATOM_I2C_RECORD record;
+-
+- if (!info)
+- return BP_RESULT_BADINPUT;
+-
+- config = (ATOM_I2C_ID_CONFIG_ACCESS *) &i2c_channel_id;
+-
+- record.sucI2cId.bfHW_Capable = config->sbfAccess.bfHW_Capable;
+- record.sucI2cId.bfI2C_LineMux = config->sbfAccess.bfI2C_LineMux;
+- record.sucI2cId.bfHW_EngineID = config->sbfAccess.bfHW_EngineID;
+-
+- return get_gpio_i2c_info(bp, &record, info);
+-}
+-
+-enum bp_result dal_bios_parser_get_ddc_info_for_i2c_line(struct bios_parser *bp,
++enum bp_result bios_parser_get_ddc_info_for_i2c_line(struct bios_parser *bp,
+ uint8_t i2c_line, struct graphics_object_i2c_info *info)
+ {
+ uint32_t offset;
+@@ -690,10 +631,11 @@ enum bp_result dal_bios_parser_get_ddc_info_for_i2c_line(struct bios_parser *bp,
+ return BP_RESULT_NORECORD;
+ }
+
+-enum bp_result dal_bios_parser_get_hpd_info(struct bios_parser *bp,
++static enum bp_result bios_parser_get_hpd_info(struct dc_bios *dcb,
+ struct graphics_object_id id,
+ struct graphics_object_hpd_info *info)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ ATOM_OBJECT *object;
+ ATOM_HPD_INT_RECORD *record = NULL;
+
+@@ -716,12 +658,13 @@ enum bp_result dal_bios_parser_get_hpd_info(struct bios_parser *bp,
+ return BP_RESULT_NORECORD;
+ }
+
+-uint32_t dal_bios_parser_get_gpio_record(
+- struct bios_parser *bp,
++static uint32_t bios_parser_get_gpio_record(
++ struct dc_bios *dcb,
+ struct graphics_object_id id,
+ struct bp_gpio_cntl_info *gpio_record,
+ uint32_t record_size)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ ATOM_COMMON_RECORD_HEADER *header = NULL;
+ ATOM_OBJECT_GPIO_CNTL_RECORD *record = NULL;
+ ATOM_OBJECT *object = get_bios_object(bp, id);
+@@ -789,7 +732,7 @@ uint32_t dal_bios_parser_get_gpio_record(
+ return pins_number;
+ }
+
+-enum bp_result dal_bios_parser_get_device_tag_record(
++enum bp_result bios_parser_get_device_tag_record(
+ struct bios_parser *bp,
+ ATOM_OBJECT *object,
+ ATOM_CONNECTOR_DEVICE_TAG_RECORD **record)
+@@ -826,12 +769,13 @@ enum bp_result dal_bios_parser_get_device_tag_record(
+ return BP_RESULT_NORECORD;
+ }
+
+-enum bp_result dal_bios_parser_get_device_tag(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_get_device_tag(
++ struct dc_bios *dcb,
+ struct graphics_object_id connector_object_id,
+ uint32_t device_tag_index,
+ struct connector_device_tag_info *info)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ ATOM_OBJECT *object;
+ ATOM_CONNECTOR_DEVICE_TAG_RECORD *record = NULL;
+ ATOM_CONNECTOR_DEVICE_TAG *device_tag;
+@@ -847,7 +791,7 @@ enum bp_result dal_bios_parser_get_device_tag(
+ return BP_RESULT_BADINPUT;
+ }
+
+- if (dal_bios_parser_get_device_tag_record(bp, object, &record)
++ if (bios_parser_get_device_tag_record(bp, object, &record)
+ != BP_RESULT_OK)
+ return BP_RESULT_NORECORD;
+
+@@ -873,10 +817,11 @@ static enum bp_result get_firmware_info_v2_2(
+ struct bios_parser *bp,
+ struct firmware_info *info);
+
+-enum bp_result dal_bios_parser_get_firmware_info(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_get_firmware_info(
++ struct dc_bios *dcb,
+ struct firmware_info *info)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ enum bp_result result = BP_RESULT_BADBIOSTABLE;
+ ATOM_COMMON_TABLE_HEADER *header;
+ struct atom_data_revision revision;
+@@ -1223,61 +1168,73 @@ static enum bp_result get_ss_info_v3_1(
+ return BP_RESULT_NORECORD;
+ }
+
+-enum bp_result dal_bios_parser_transmitter_control(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_transmitter_control(
++ struct dc_bios *dcb,
+ struct bp_transmitter_control *cntl)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.transmitter_control)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.transmitter_control(bp, cntl);
+ }
+
+-enum bp_result dal_bios_parser_encoder_control(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_encoder_control(
++ struct dc_bios *dcb,
+ struct bp_encoder_control *cntl)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.dig_encoder_control)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.dig_encoder_control(bp, cntl);
+ }
+
+-enum bp_result dal_bios_parser_adjust_pixel_clock(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_adjust_pixel_clock(
++ struct dc_bios *dcb,
+ struct bp_adjust_pixel_clock_parameters *bp_params)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.adjust_display_pll)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.adjust_display_pll(bp, bp_params);
+ }
+
+-enum bp_result dal_bios_parser_set_pixel_clock(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_set_pixel_clock(
++ struct dc_bios *dcb,
+ struct bp_pixel_clock_parameters *bp_params)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.set_pixel_clock)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.set_pixel_clock(bp, bp_params);
+ }
+
+-enum bp_result dal_bios_parser_set_dce_clock(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_set_dce_clock(
++ struct dc_bios *dcb,
+ struct bp_set_dce_clock_parameters *bp_params)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.set_dce_clock)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.set_dce_clock(bp, bp_params);
+ }
+
+-enum bp_result dal_bios_parser_enable_spread_spectrum_on_ppll(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_enable_spread_spectrum_on_ppll(
++ struct dc_bios *dcb,
+ struct bp_spread_spectrum_parameters *bp_params,
+ bool enable)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.enable_spread_spectrum_on_ppll)
+ return BP_RESULT_FAILURE;
+
+@@ -1286,20 +1243,23 @@ enum bp_result dal_bios_parser_enable_spread_spectrum_on_ppll(
+
+ }
+
+-enum bp_result dal_bios_parser_program_crtc_timing(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_program_crtc_timing(
++ struct dc_bios *dcb,
+ struct bp_hw_crtc_timing_parameters *bp_params)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.set_crtc_timing)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.set_crtc_timing(bp, bp_params);
+ }
+
+-enum bp_result dal_bios_parser_program_display_engine_pll(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_program_display_engine_pll(
++ struct dc_bios *dcb,
+ struct bp_pixel_clock_parameters *bp_params)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+
+ if (!bp->cmd_tbl.program_clock)
+ return BP_RESULT_FAILURE;
+@@ -1308,12 +1268,14 @@ enum bp_result dal_bios_parser_program_display_engine_pll(
+
+ }
+
+-enum signal_type dal_bios_parser_dac_load_detect(
+- struct bios_parser *bp,
++static enum signal_type bios_parser_dac_load_detect(
++ struct dc_bios *dcb,
+ struct graphics_object_id encoder,
+ struct graphics_object_id connector,
+ enum signal_type display_signal)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.dac_load_detection)
+ return SIGNAL_TYPE_NONE;
+
+@@ -1321,62 +1283,73 @@ enum signal_type dal_bios_parser_dac_load_detect(
+ display_signal);
+ }
+
+-enum bp_result dal_bios_parser_get_divider_for_target_display_clock(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_get_divider_for_target_display_clock(
++ struct dc_bios *dcb,
+ struct bp_display_clock_parameters *bp_params)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.compute_memore_engine_pll)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.compute_memore_engine_pll(bp, bp_params);
+ }
+
+-enum bp_result dal_bios_parser_dvo_encoder_control(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_dvo_encoder_control(
++ struct dc_bios *dcb,
+ struct bp_dvo_encoder_control *cntl)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.dvo_encoder_control)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.dvo_encoder_control(bp, cntl);
+ }
+
+-enum bp_result dal_bios_parser_enable_crtc(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_enable_crtc(
++ struct dc_bios *dcb,
+ enum controller_id id,
+ bool enable)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.enable_crtc)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.enable_crtc(bp, id, enable);
+ }
+
+-enum bp_result dal_bios_parser_blank_crtc(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_blank_crtc(
++ struct dc_bios *dcb,
+ struct bp_blank_crtc_parameters *bp_params,
+ bool blank)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.blank_crtc)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.blank_crtc(bp, bp_params, blank);
+ }
+
+-enum bp_result dal_bios_parser_crtc_source_select(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_crtc_source_select(
++ struct dc_bios *dcb,
+ struct bp_crtc_source_select *bp_params)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.select_crtc_source)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.select_crtc_source(bp, bp_params);
+ }
+
+-enum bp_result dal_bios_parser_set_overscan(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_set_overscan(
++ struct dc_bios *dcb,
+ struct bp_hw_crtc_overscan_parameters *bp_params)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+
+ if (!bp->cmd_tbl.set_crtc_overscan)
+ return BP_RESULT_FAILURE;
+@@ -1384,32 +1357,38 @@ enum bp_result dal_bios_parser_set_overscan(
+ return bp->cmd_tbl.set_crtc_overscan(bp, bp_params);
+ }
+
+-enum bp_result dal_bios_parser_enable_memory_requests(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_enable_memory_requests(
++ struct dc_bios *dcb,
+ enum controller_id controller_id,
+ bool enable)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.enable_crtc_mem_req)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.enable_crtc_mem_req(bp, controller_id, enable);
+ }
+
+-enum bp_result dal_bios_parser_external_encoder_control(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_external_encoder_control(
++ struct dc_bios *dcb,
+ struct bp_external_encoder_control *cntl)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.external_encoder_control)
+ return BP_RESULT_FAILURE;
+
+ return bp->cmd_tbl.external_encoder_control(bp, cntl);
+ }
+
+-enum bp_result dal_bios_parser_enable_disp_power_gating(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_enable_disp_power_gating(
++ struct dc_bios *dcb,
+ enum controller_id controller_id,
+ enum bp_pipe_control_action action)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (!bp->cmd_tbl.enable_disp_power_gating)
+ return BP_RESULT_FAILURE;
+
+@@ -1417,21 +1396,24 @@ enum bp_result dal_bios_parser_enable_disp_power_gating(
+ action);
+ }
+
+-bool dal_bios_parser_is_device_id_supported(
+- struct bios_parser *bp,
++static bool bios_parser_is_device_id_supported(
++ struct dc_bios *dcb,
+ struct device_id id)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ uint32_t mask = get_support_mask_for_device_id(id);
+
+ return (le16_to_cpu(bp->object_info_tbl.v1_1->usDeviceSupport) & mask) != 0;
+ }
+
+-enum bp_result dal_bios_parser_crt_control(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_crt_control(
++ struct dc_bios *dcb,
+ enum engine_id engine_id,
+ bool enable,
+ uint32_t pixel_clock)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ uint8_t standard;
+
+ if (!bp->cmd_tbl.dac1_encoder_control &&
+@@ -1568,7 +1550,7 @@ static enum bp_result get_ss_info_from_tbl(
+ uint32_t id,
+ struct spread_spectrum_info *ss_info);
+ /**
+- * dal_bios_parser_get_spread_spectrum_info
++ * bios_parser_get_spread_spectrum_info
+ * Get spread spectrum information from the ASIC_InternalSS_Info(ver 2.1 or
+ * ver 3.1) or SS_Info table from the VBIOS. Currently ASIC_InternalSS_Info
+ * ver 2.1 can co-exist with SS_Info table. Expect ASIC_InternalSS_Info ver 3.1,
+@@ -1580,12 +1562,13 @@ static enum bp_result get_ss_info_from_tbl(
+ * @param [out] ss_info, sprectrum information structure,
+ * @return Bios parser result code
+ */
+-enum bp_result dal_bios_parser_get_spread_spectrum_info(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_get_spread_spectrum_info(
++ struct dc_bios *dcb,
+ enum as_signal_type signal,
+ uint32_t index,
+ struct spread_spectrum_info *ss_info)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ enum bp_result result = BP_RESULT_UNSUPPORTED;
+ uint32_t clk_id_ss = 0;
+ ATOM_COMMON_TABLE_HEADER *header;
+@@ -1777,7 +1760,7 @@ static enum bp_result get_ss_info_from_ss_info_table(
+ {
+ struct embedded_panel_info panel_info;
+
+- if (dal_bios_parser_get_embedded_panel_info(bp, &panel_info)
++ if (bios_parser_get_embedded_panel_info(&bp->base, &panel_info)
+ == BP_RESULT_OK)
+ id_local = panel_info.ss_id;
+ break;
+@@ -1833,10 +1816,11 @@ static enum bp_result get_embedded_panel_info_v1_3(
+ struct bios_parser *bp,
+ struct embedded_panel_info *info);
+
+-enum bp_result dal_bios_parser_get_embedded_panel_info(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_get_embedded_panel_info(
++ struct dc_bios *dcb,
+ struct embedded_panel_info *info)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ ATOM_COMMON_TABLE_HEADER *hdr;
+
+ if (!DATA_TABLES(LCD_Info))
+@@ -2111,7 +2095,7 @@ static enum bp_result get_embedded_panel_info_v1_3(
+ }
+
+ /**
+- * dal_bios_parser_get_encoder_cap_info
++ * bios_parser_get_encoder_cap_info
+ *
+ * @brief
+ * Get encoder capability information of input object id
+@@ -2122,11 +2106,12 @@ static enum bp_result get_embedded_panel_info_v1_3(
+ * @return Bios parser result code
+ *
+ */
+-enum bp_result dal_bios_parser_get_encoder_cap_info(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_get_encoder_cap_info(
++ struct dc_bios *dcb,
+ struct graphics_object_id object_id,
+ struct bp_encoder_cap_info *info)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ ATOM_OBJECT *object;
+ ATOM_ENCODER_CAP_RECORD *record = NULL;
+
+@@ -2198,7 +2183,7 @@ static ATOM_ENCODER_CAP_RECORD *get_encoder_cap_record(
+ }
+
+ /**
+- * dal_bios_parser_get_din_connector_info
++ * bios_parser_get_din_connector_info
+ * @brief
+ * Get GPIO record for the DIN connector, this GPIO tells whether there is a
+ * CV dumb dongle
+@@ -2209,11 +2194,12 @@ static ATOM_ENCODER_CAP_RECORD *get_encoder_cap_record(
+ * @param info - GPIO record infor
+ * @return Bios parser result code
+ */
+-enum bp_result dal_bios_parser_get_din_connector_info(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_get_din_connector_info(
++ struct dc_bios *dcb,
+ struct graphics_object_id id,
+ struct din_connector_info *info)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ ATOM_COMMON_RECORD_HEADER *header;
+ ATOM_CONNECTOR_CVTV_SHARE_DIN_RECORD *record = NULL;
+ ATOM_OBJECT *object;
+@@ -2294,10 +2280,11 @@ static uint32_t get_ss_entry_number_from_ss_info_tbl(
+ * @param[in] signal, ASSignalType to be converted to SSid
+ * @return number of SS Entry that match the signal
+ */
+-uint32_t dal_bios_parser_get_ss_entry_number(
+- struct bios_parser *bp,
++static uint32_t bios_parser_get_ss_entry_number(
++ struct dc_bios *dcb,
+ enum as_signal_type signal)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ uint32_t ss_id = 0;
+ ATOM_COMMON_TABLE_HEADER *header;
+ struct atom_data_revision revision;
+@@ -2381,7 +2368,7 @@ static uint32_t get_ss_entry_number_from_ss_info_tbl(
+ case ASIC_INTERNAL_SS_ON_LVDS: {
+ struct embedded_panel_info panel_info;
+
+- if (dal_bios_parser_get_embedded_panel_info(bp, &panel_info)
++ if (bios_parser_get_embedded_panel_info(&bp->base, &panel_info)
+ == BP_RESULT_OK)
+ id_local = panel_info.ss_id;
+ break;
+@@ -2544,10 +2531,11 @@ static ATOM_FAKE_EDID_PATCH_RECORD *get_faked_edid_record(
+ return (ATOM_FAKE_EDID_PATCH_RECORD *)record;
+ }
+
+-enum bp_result dal_bios_parser_get_faked_edid_len(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_get_faked_edid_len(
++ struct dc_bios *dcb,
+ uint32_t *len)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ ATOM_FAKE_EDID_PATCH_RECORD *edid_record = get_faked_edid_record(bp);
+
+ if (!edid_record)
+@@ -2558,11 +2546,12 @@ enum bp_result dal_bios_parser_get_faked_edid_len(
+ return BP_RESULT_OK;
+ }
+
+-enum bp_result dal_bios_parser_get_faked_edid_buf(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_get_faked_edid_buf(
++ struct dc_bios *dcb,
+ uint8_t *buff,
+ uint32_t len)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ ATOM_FAKE_EDID_PATCH_RECORD *edid_record = get_faked_edid_record(bp);
+ uint32_t edid_size;
+
+@@ -2580,7 +2569,7 @@ enum bp_result dal_bios_parser_get_faked_edid_buf(
+ }
+
+ /**
+- * dal_bios_parser_get_gpio_pin_info
++ * bios_parser_get_gpio_pin_info
+ * Get GpioPin information of input gpio id
+ *
+ * @param gpio_id, GPIO ID
+@@ -2592,11 +2581,12 @@ enum bp_result dal_bios_parser_get_faked_edid_buf(
+ * 2. in DATA_TABLE.GPIO_Pin_LUT, search all records, to get the registerA
+ * offset/mask
+ */
+-enum bp_result dal_bios_parser_get_gpio_pin_info(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_get_gpio_pin_info(
++ struct dc_bios *dcb,
+ uint32_t gpio_id,
+ struct gpio_pin_info *info)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ ATOM_GPIO_PIN_LUT *header;
+ uint32_t count = 0;
+ uint32_t i = 0;
+@@ -2648,11 +2638,12 @@ enum bp_result dal_bios_parser_get_gpio_pin_info(
+ * @param info, embedded panel patch mode structure
+ * @return Bios parser result code
+ */
+-enum bp_result dal_bios_parser_enum_embedded_panel_patch_mode(
+- struct bios_parser *bp,
++static enum bp_result bios_parser_enum_embedded_panel_patch_mode(
++ struct dc_bios *dcb,
+ uint32_t index,
+ struct embedded_panel_patch_mode *mode)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ uint32_t record_size;
+ uint32_t record_index;
+ uint8_t *record;
+@@ -3711,7 +3702,7 @@ static void add_device_tag_from_ext_display_path(
+ ATOM_CONNECTOR_DEVICE_TAG *device_tag = NULL;
+ ATOM_CONNECTOR_DEVICE_TAG_RECORD *device_tag_record = NULL;
+ enum bp_result result =
+- dal_bios_parser_get_device_tag_record(
++ bios_parser_get_device_tag_record(
+ bp, object, &device_tag_record);
+
+ if ((le16_to_cpu(ext_display_path->usDeviceTag) != CONNECTOR_OBJECT_ID_NONE)
+@@ -3958,7 +3949,7 @@ static enum bp_result patch_bios_image_from_ext_display_connection_info(
+ continue;
+
+ /* Remove support for all device tags. */
+- if (dal_bios_parser_get_device_tag_record(
++ if (bios_parser_get_device_tag_record(
+ bp, object, &dev_tag_record) != BP_RESULT_OK)
+ continue;
+
+@@ -4212,14 +4203,18 @@ static void process_ext_display_connection_info(struct bios_parser *bp)
+ }
+ }
+
+-void dal_bios_parser_post_init(struct bios_parser *bp)
++static void bios_parser_post_init(struct dc_bios *dcb)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ process_ext_display_connection_info(bp);
+ }
+
+-bool dal_bios_parser_is_accelerated_mode(
+- struct bios_parser *bp)
++static bool bios_parser_is_accelerated_mode(
++ struct dc_bios *dcb)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ #ifdef CONFIG_DRM_AMD_DAL_VBIOS_PRESENT
+ return bp->bios_helper->is_accelerated_mode(
+ bp->ctx);
+@@ -4233,7 +4228,7 @@ bool dal_bios_parser_is_accelerated_mode(
+ }
+
+ /**
+- * dal_bios_parser_set_scratch_connected
++ * bios_parser_set_scratch_connected
+ *
+ * @brief
+ * update VBIOS scratch register about connected displays
+@@ -4243,12 +4238,14 @@ bool dal_bios_parser_is_accelerated_mode(
+ * bool - connection state
+ * const ConnectorDeviceTagInfo* - pointer to device type and enum ID
+ */
+-void dal_bios_parser_set_scratch_connected(
+- struct bios_parser *bp,
++static void bios_parser_set_scratch_connected(
++ struct dc_bios *dcb,
+ struct graphics_object_id connector_id,
+ bool connected,
+ const struct connector_device_tag_info *device_tag)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ #ifdef CONFIG_DRM_AMD_DAL_VBIOS_PRESENT
+ bp->bios_helper->set_scratch_connected(
+ bp->ctx,
+@@ -4262,7 +4259,7 @@ void dal_bios_parser_set_scratch_connected(
+ }
+
+ /**
+- * dal_bios_parser_set_scratch_critical_state
++ * bios_parser_set_scratch_critical_state
+ *
+ * @brief
+ * update critical state bit in VBIOS scratch register
+@@ -4270,10 +4267,12 @@ void dal_bios_parser_set_scratch_connected(
+ * @param
+ * bool - to set or reset state
+ */
+-void dal_bios_parser_set_scratch_critical_state(
+- struct bios_parser *bp,
++static void bios_parser_set_scratch_critical_state(
++ struct dc_bios *dcb,
+ bool state)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ #ifdef CONFIG_DRM_AMD_DAL_VBIOS_PRESENT
+ bp->bios_helper->set_scratch_critical_state(
+ bp->ctx, state);
+@@ -4285,9 +4284,11 @@ void dal_bios_parser_set_scratch_critical_state(
+ #endif
+ }
+
+-void dal_bios_parser_set_scratch_acc_mode_change(
+- struct bios_parser *bp)
++static void bios_parser_set_scratch_acc_mode_change(
++ struct dc_bios *dcb)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ #ifdef CONFIG_DRM_AMD_DAL_VBIOS_PRESENT
+ bp->bios_helper->set_scratch_acc_mode_change(
+ bp->ctx);
+@@ -4300,7 +4301,7 @@ void dal_bios_parser_set_scratch_acc_mode_change(
+ }
+
+ /**
+- * dal_bios_parser_prepare_scratch_active_and_requested
++ * bios_parser_prepare_scratch_active_and_requested
+ *
+ * @brief
+ * update VBIOS scratch registers about active and requested displays
+@@ -4311,12 +4312,14 @@ void dal_bios_parser_set_scratch_acc_mode_change(
+ * const struct connector_device_tag_info * - pointer to display type and
+ * enum Id
+ */
+-void dal_bios_parser_prepare_scratch_active_and_requested(
+- struct bios_parser *bp,
++static void bios_parser_prepare_scratch_active_and_requested(
++ struct dc_bios *dcb,
+ enum controller_id controller_id,
+ enum signal_type signal,
+ const struct connector_device_tag_info *device_tag)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ #ifdef CONFIG_DRM_AMD_DAL_VBIOS_PRESENT
+ bp->bios_helper->prepare_scratch_active_and_requested(
+ bp->ctx,
+@@ -4332,9 +4335,11 @@ void dal_bios_parser_prepare_scratch_active_and_requested(
+ #endif
+ }
+
+-void dal_bios_parser_set_scratch_active_and_requested(
+- struct bios_parser *bp)
++static void bios_parser_set_scratch_active_and_requested(
++ struct dc_bios *dcb)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ #ifdef CONFIG_DRM_AMD_DAL_VBIOS_PRESENT
+ bp->bios_helper->set_scratch_active_and_requested(
+ bp->ctx,
+@@ -4726,21 +4731,11 @@ static enum bp_result construct_integrated_info(
+ return result;
+ }
+
+-/*
+- * dal_bios_parser_create_integrated_info
+- *
+- * @brief
+- * Create integrated info
+- *
+- * @param
+- * bios_parser *bp - [in] BIOS parser handler
+- *
+- * @return
+- * struct integrated_info * - pointer to the newly created integrated info
+- */
+-struct integrated_info *dal_bios_parser_create_integrated_info(
+- struct bios_parser *bp)
++
++static struct integrated_info *bios_parser_create_integrated_info(
++ struct dc_bios *dcb)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
+ struct integrated_info *info = NULL;
+
+ info = dc_service_alloc(bp->ctx, sizeof(struct integrated_info));
+@@ -4758,24 +4753,344 @@ struct integrated_info *dal_bios_parser_create_integrated_info(
+ return NULL;
+ }
+
+-/*
+- * dal_bios_parser_destroy_integrated_info
+- *
+- * @brief
+- * Destroy provided integrated info
+- *
+- * @param
+- * struct integrated_info **info - [in] info to be destroied
+- */
+-void dal_bios_parser_destroy_integrated_info(struct dc_context *ctx, struct integrated_info **info)
++static void bios_parser_destroy_integrated_info(
++ struct dc_bios *dcb,
++ struct integrated_info **info)
+ {
++ struct bios_parser *bp = BP_FROM_DCB(dcb);
++
+ if (info == NULL) {
+ ASSERT_CRITICAL(0);
+ return;
+ }
+
+ if (*info != NULL) {
+- dc_service_free(ctx, *info);
++ dc_service_free(bp->ctx, *info);
+ *info = NULL;
+ }
+ }
++
++/******************************************************************************
++ * Stub-functions */
++static bool is_lid_open(
++ struct dc_bios *bios)
++{
++ BREAK_TO_DEBUGGER();
++ return false;
++}
++
++static bool is_lid_status_changed(
++ struct dc_bios *bios)
++{
++ BREAK_TO_DEBUGGER();
++ return false;
++}
++
++static bool is_display_config_changed(
++ struct dc_bios *bios)
++{
++ BREAK_TO_DEBUGGER();
++ return false;
++}
++
++static void set_scratch_lcd_scale(
++ struct dc_bios *bios,
++ enum lcd_scale scale)
++{
++ BREAK_TO_DEBUGGER();
++}
++
++static enum lcd_scale get_scratch_lcd_scale(
++ struct dc_bios *bios)
++{
++ BREAK_TO_DEBUGGER();
++ return LCD_SCALE_NONE;
++}
++
++static void get_bios_event_info(
++ struct dc_bios *bios,
++ struct bios_event_info *info)
++{
++ BREAK_TO_DEBUGGER();
++}
++
++static void update_requested_backlight_level(
++ struct dc_bios *bios,
++ uint32_t backlight_8bit)
++{
++ BREAK_TO_DEBUGGER();
++}
++
++static uint32_t get_requested_backlight_level(
++ struct dc_bios *bios)
++{
++ BREAK_TO_DEBUGGER();
++ return 0;
++}
++
++static void take_backlight_control(
++ struct dc_bios *bios,
++ bool cntl)
++{
++ BREAK_TO_DEBUGGER();
++}
++
++static bool is_active_display(
++ struct dc_bios *bios,
++ enum signal_type signal,
++ const struct connector_device_tag_info *device_tag)
++{
++ BREAK_TO_DEBUGGER();
++ return false;
++}
++
++static enum controller_id get_embedded_display_controller_id(
++ struct dc_bios *bios)
++{
++ BREAK_TO_DEBUGGER();
++ return CONTROLLER_ID_UNDEFINED;
++}
++
++static uint32_t get_embedded_display_refresh_rate(
++ struct dc_bios *bios)
++{
++ BREAK_TO_DEBUGGER();
++ return 0;
++}
++
++/******************************************************************************/
++
++static const struct dc_vbios_funcs vbios_funcs = {
++ .get_connectors_number = bios_parser_get_connectors_number,
++
++ .power_down = bios_parser_power_down,
++
++ .power_up = bios_parser_power_up,
++
++ .get_encoders_number = bios_parser_get_encoders_number,
++
++ .get_oem_ddc_lines_number = bios_parser_get_oem_ddc_lines_number,
++
++ .get_encoder_id = bios_parser_get_encoder_id,
++
++ .get_connector_id = bios_parser_get_connector_id,
++
++ .get_src_number = bios_parser_get_src_number,
++
++ .get_dst_number = bios_parser_get_dst_number,
++
++ .get_gpio_record = bios_parser_get_gpio_record,
++
++ .get_src_obj = bios_parser_get_src_obj,
++
++ .get_dst_obj = bios_parser_get_dst_obj,
++
++ .get_i2c_info = bios_parser_get_i2c_info,
++
++ .get_oem_ddc_info = bios_parser_get_oem_ddc_info,
++
++ .get_voltage_ddc_info = bios_parser_get_voltage_ddc_info,
++
++ .get_thermal_ddc_info = bios_parser_get_thermal_ddc_info,
++
++ .get_hpd_info = bios_parser_get_hpd_info,
++
++ .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,
++
++ .get_embedded_panel_info = bios_parser_get_embedded_panel_info,
++
++ .enum_embedded_panel_patch_mode = bios_parser_enum_embedded_panel_patch_mode,
++
++ .get_gpio_pin_info = bios_parser_get_gpio_pin_info,
++
++ .get_embedded_panel_info = bios_parser_get_embedded_panel_info,
++
++ .get_gpio_pin_info = bios_parser_get_gpio_pin_info,
++
++ .get_faked_edid_len = bios_parser_get_faked_edid_len,
++
++ .get_faked_edid_buf = bios_parser_get_faked_edid_buf,
++
++ .get_encoder_cap_info = bios_parser_get_encoder_cap_info,
++
++ .get_din_connector_info = bios_parser_get_din_connector_info,
++
++ .is_lid_open = is_lid_open,
++
++ .is_lid_status_changed = is_lid_status_changed,
++
++ .is_display_config_changed = is_display_config_changed,
++
++ .is_accelerated_mode = bios_parser_is_accelerated_mode,
++
++ .set_scratch_lcd_scale = set_scratch_lcd_scale,
++
++ .get_scratch_lcd_scale = get_scratch_lcd_scale,
++
++ .get_bios_event_info = get_bios_event_info,
++
++ .update_requested_backlight_level = update_requested_backlight_level,
++
++ .get_requested_backlight_level = get_requested_backlight_level,
++
++ .take_backlight_control = take_backlight_control,
++
++ .is_active_display = is_active_display,
++
++ .get_embedded_display_controller_id = get_embedded_display_controller_id,
++
++ .get_embedded_display_refresh_rate = get_embedded_display_refresh_rate,
++
++ .set_scratch_connected = bios_parser_set_scratch_connected,
++
++ .prepare_scratch_active_and_requested = bios_parser_prepare_scratch_active_and_requested,
++
++ .set_scratch_active_and_requested = bios_parser_set_scratch_active_and_requested,
++
++ .set_scratch_critical_state = bios_parser_set_scratch_critical_state,
++
++ .set_scratch_acc_mode_change = bios_parser_set_scratch_acc_mode_change,
++
++ .is_device_id_supported = bios_parser_is_device_id_supported,
++
++ /* COMMANDS */
++ .encoder_control = bios_parser_encoder_control,
++
++ .transmitter_control = bios_parser_transmitter_control,
++
++ .crt_control = bios_parser_crt_control,
++
++ .dvo_encoder_control = bios_parser_dvo_encoder_control,
++
++ .enable_crtc = bios_parser_enable_crtc,
++
++ .adjust_pixel_clock = bios_parser_adjust_pixel_clock,
++
++ .set_pixel_clock = bios_parser_set_pixel_clock,
++
++ .set_dce_clock = bios_parser_set_dce_clock,
++
++ .enable_spread_spectrum_on_ppll = bios_parser_enable_spread_spectrum_on_ppll,
++
++ .program_crtc_timing = bios_parser_program_crtc_timing,
++
++ .blank_crtc = bios_parser_blank_crtc,
++
++ .set_overscan = bios_parser_set_overscan,
++
++ .crtc_source_select = bios_parser_crtc_source_select,
++
++ .program_display_engine_pll = bios_parser_program_display_engine_pll,
++
++ .get_divider_for_target_display_clock = bios_parser_get_divider_for_target_display_clock,
++
++ .dac_load_detect = bios_parser_dac_load_detect,
++
++ .enable_memory_requests = bios_parser_enable_memory_requests,
++
++ .external_encoder_control = bios_parser_external_encoder_control,
++
++ .enable_disp_power_gating = bios_parser_enable_disp_power_gating,
++
++ .post_init = bios_parser_post_init,
++
++ .create_integrated_info = bios_parser_create_integrated_info,
++
++ .destroy_integrated_info = bios_parser_destroy_integrated_info,
++};
++
++static bool bios_parser_construct(
++ struct bios_parser *bp,
++ struct bp_init_data *init,
++ struct adapter_service *as)
++{
++ uint16_t *rom_header_offset = NULL;
++ ATOM_ROM_HEADER *rom_header = NULL;
++ ATOM_OBJECT_HEADER *object_info_tbl;
++ enum dce_version dce_version;
++
++ if (!as)
++ return false;
++
++ if (!init)
++ return false;
++
++ if (!init->bios)
++ return false;
++
++ bp->base.funcs = &vbios_funcs;
++
++ dce_version = dal_adapter_service_get_dce_version(as);
++ bp->ctx = init->ctx;
++ bp->as = as;
++ bp->bios = init->bios;
++ bp->bios_size = bp->bios[BIOS_IMAGE_SIZE_OFFSET] * BIOS_IMAGE_SIZE_UNIT;
++ bp->bios_local_image = NULL;
++ bp->lcd_scale = LCD_SCALE_UNKNOWN;
++
++ rom_header_offset =
++ GET_IMAGE(uint16_t, OFFSET_TO_POINTER_TO_ATOM_ROM_HEADER);
++
++ if (!rom_header_offset)
++ return false;
++
++ rom_header = GET_IMAGE(ATOM_ROM_HEADER, *rom_header_offset);
++
++ if (!rom_header)
++ return false;
++
++ bp->master_data_tbl =
++ GET_IMAGE(ATOM_MASTER_DATA_TABLE,
++ rom_header->usMasterDataTableOffset);
++
++ if (!bp->master_data_tbl)
++ return false;
++
++ bp->object_info_tbl_offset = DATA_TABLES(Object_Header);
++
++ if (!bp->object_info_tbl_offset)
++ return false;
++
++ object_info_tbl =
++ GET_IMAGE(ATOM_OBJECT_HEADER, bp->object_info_tbl_offset);
++
++ if (!object_info_tbl)
++ return false;
++
++ get_atom_data_table_revision(&object_info_tbl->sHeader,
++ &bp->object_info_tbl.revision);
++
++ if (bp->object_info_tbl.revision.major == 1
++ && bp->object_info_tbl.revision.minor >= 3) {
++ ATOM_OBJECT_HEADER_V3 *tbl_v3;
++
++ tbl_v3 = GET_IMAGE(ATOM_OBJECT_HEADER_V3,
++ bp->object_info_tbl_offset);
++ if (!tbl_v3)
++ return false;
++
++ bp->object_info_tbl.v1_3 = tbl_v3;
++ } else if (bp->object_info_tbl.revision.major == 1
++ && bp->object_info_tbl.revision.minor >= 1)
++ bp->object_info_tbl.v1_1 = object_info_tbl;
++ else
++ return false;
++
++#if defined(CONFIG_DRM_AMD_DAL_VBIOS_PRESENT)
++ bp->vbios_helper_data.active = 0;
++ bp->vbios_helper_data.requested = 0;
++ dal_bios_parser_init_bios_helper(bp, dce_version);
++#endif
++ dal_bios_parser_init_cmd_tbl(bp);
++ dal_bios_parser_init_cmd_tbl_helper(&bp->cmd_helper, dce_version);
++
++ return true;
++}
++
++/******************************************************************************/
+diff --git a/drivers/gpu/drm/amd/dal/dc/bios/bios_parser_helper.c b/drivers/gpu/drm/amd/dal/dc/bios/bios_parser_helper.c
+index 0089800..a0927cf 100644
+--- a/drivers/gpu/drm/amd/dal/dc/bios/bios_parser_helper.c
++++ b/drivers/gpu/drm/amd/dal/dc/bios/bios_parser_helper.c
+@@ -28,7 +28,6 @@
+ #include "atom.h"
+
+ #include "include/bios_parser_types.h"
+-#include "include/adapter_service_types.h"
+ #include "bios_parser_helper.h"
+ #include "command_table_helper.h"
+ #include "command_table.h"
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc.c b/drivers/gpu/drm/amd/dal/dc/core/dc.c
+index 00a2453..841e02e 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc.c
+@@ -143,7 +143,7 @@ failed_alloc:
+ static void init_hw(struct dc *dc)
+ {
+ int i;
+- struct bios_parser *bp;
++ struct dc_bios *bp;
+ struct transform *xfm;
+
+ bp = dal_adapter_service_get_bios_parser(dc->res_pool.adapter_srv);
+@@ -164,7 +164,7 @@ static void init_hw(struct dc *dc)
+ }
+
+ dc->hwss.clock_gating_power_up(dc->ctx, false);
+- dal_bios_parser_power_up(bp);
++ bp->funcs->power_up(bp);
+ /***************************************/
+
+ for (i = 0; i < dc->link_count; i++) {
+diff --git a/drivers/gpu/drm/amd/dal/dc/dc.h b/drivers/gpu/drm/amd/dal/dc/dc.h
+index f86ddb0..341c968 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dc.h
++++ b/drivers/gpu/drm/amd/dal/dc/dc.h
+@@ -27,9 +27,8 @@
+ #define DC_INTERFACE_H_
+
+ #include "dc_types.h"
+-/* TODO: We should not include audio_interface.h here. Maybe just define
+- * struct audio_info here */
+-#include "audio_interface.h"
++#include "dal_types.h"
++#include "audio_types.h"
+ #include "logger_types.h"
+
+ #define MAX_SINKS_PER_LINK 4
+diff --git a/drivers/gpu/drm/amd/dal/dc/dc_bios_types.h b/drivers/gpu/drm/amd/dal/dc/dc_bios_types.h
+index a82cbee..0f85f63 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dc_bios_types.h
++++ b/drivers/gpu/drm/amd/dal/dc/dc_bios_types.h
+@@ -26,15 +26,255 @@
+ #ifndef DC_BIOS_TYPES_H
+ #define DC_BIOS_TYPES_H
+
+-struct dc_vbios_funcs;
++/******************************************************************************
++ * Interface file for VBIOS implementations.
++ *
++ * The default implementation is inside DC.
++ * Display Manager (which instantiates DC) has the option to supply it's own
++ * (external to DC) implementation of VBIOS, which will be called by DC, using
++ * this interface.
++ * (The intended use is Diagnostics, but other uses may appear.)
++ *****************************************************************************/
++
++#include "include/bios_parser_types.h"
+
+-struct dc_bios {
+- const struct dc_vbios_funcs *funcs;
+-};
+
+ struct dc_vbios_funcs {
+ uint8_t (*get_connectors_number)(struct dc_bios *bios);
++
++ void (*power_down)(struct dc_bios *bios);
++ void (*power_up)(struct dc_bios *bios);
++
++ uint8_t (*get_encoders_number)(struct dc_bios *bios);
++ uint32_t (*get_oem_ddc_lines_number)(struct dc_bios *bios);
++
++ struct graphics_object_id (*get_encoder_id)(
++ struct dc_bios *bios,
++ uint32_t i);
++ struct graphics_object_id (*get_connector_id)(
++ struct dc_bios *bios,
++ uint8_t connector_index);
++ uint32_t (*get_src_number)(
++ struct dc_bios *bios,
++ struct graphics_object_id id);
++ uint32_t (*get_dst_number)(
++ struct dc_bios *bios,
++ struct graphics_object_id id);
++
++ uint32_t (*get_gpio_record)(
++ struct dc_bios *dcb,
++ struct graphics_object_id id,
++ struct bp_gpio_cntl_info *gpio_record,
++ uint32_t record_size);
++
++ enum bp_result (*get_src_obj)(
++ struct dc_bios *bios,
++ struct graphics_object_id object_id, uint32_t index,
++ struct graphics_object_id *src_object_id);
++ enum bp_result (*get_dst_obj)(
++ struct dc_bios *bios,
++ struct graphics_object_id object_id, uint32_t index,
++ struct graphics_object_id *dest_object_id);
++ enum bp_result (*get_oem_ddc_info)(
++ struct dc_bios *bios,
++ uint32_t index,
++ struct graphics_object_i2c_info *info);
++
++ enum bp_result (*get_i2c_info)(
++ struct dc_bios *dcb,
++ struct graphics_object_id id,
++ struct graphics_object_i2c_info *info);
++
++ enum bp_result (*get_voltage_ddc_info)(
++ struct dc_bios *bios,
++ uint32_t index,
++ struct graphics_object_i2c_info *info);
++ enum bp_result (*get_thermal_ddc_info)(
++ struct dc_bios *bios,
++ uint32_t i2c_channel_id,
++ struct graphics_object_i2c_info *info);
++ enum bp_result (*get_hpd_info)(
++ struct dc_bios *bios,
++ struct graphics_object_id id,
++ struct graphics_object_hpd_info *info);
++ enum bp_result (*get_device_tag)(
++ struct dc_bios *bios,
++ 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 firmware_info *info);
++ enum bp_result (*get_spread_spectrum_info)(
++ struct dc_bios *bios,
++ enum as_signal_type signal,
++ uint32_t index,
++ struct spread_spectrum_info *ss_info);
++ uint32_t (*get_ss_entry_number)(
++ struct dc_bios *bios,
++ enum as_signal_type signal);
++ enum bp_result (*get_embedded_panel_info)(
++ struct dc_bios *bios,
++ struct embedded_panel_info *info);
++ enum bp_result (*enum_embedded_panel_patch_mode)(
++ struct dc_bios *bios,
++ uint32_t index,
++ struct embedded_panel_patch_mode *mode);
++ enum bp_result (*get_gpio_pin_info)(
++ struct dc_bios *bios,
++ uint32_t gpio_id,
++ struct gpio_pin_info *info);
++ enum bp_result (*get_faked_edid_len)(
++ struct dc_bios *bios,
++ uint32_t *len);
++ enum bp_result (*get_faked_edid_buf)(
++ struct dc_bios *bios,
++ uint8_t *buff,
++ uint32_t len);
++ enum bp_result (*get_encoder_cap_info)(
++ struct dc_bios *bios,
++ struct graphics_object_id object_id,
++ struct bp_encoder_cap_info *info);
++ enum bp_result (*get_din_connector_info)(
++ struct dc_bios *bios,
++ struct graphics_object_id id,
++ struct din_connector_info *info);
++
++ bool (*is_lid_open)(
++ struct dc_bios *bios);
++ bool (*is_lid_status_changed)(
++ struct dc_bios *bios);
++ bool (*is_display_config_changed)(
++ struct dc_bios *bios);
++ bool (*is_accelerated_mode)(
++ struct dc_bios *bios);
++ void (*set_scratch_lcd_scale)(
++ struct dc_bios *bios,
++ enum lcd_scale scale);
++ enum lcd_scale (*get_scratch_lcd_scale)(
++ struct dc_bios *bios);
++ void (*get_bios_event_info)(
++ struct dc_bios *bios,
++ struct bios_event_info *info);
++ void (*update_requested_backlight_level)(
++ struct dc_bios *bios,
++ uint32_t backlight_8bit);
++ uint32_t (*get_requested_backlight_level)(
++ struct dc_bios *bios);
++ void (*take_backlight_control)(
++ struct dc_bios *bios,
++ bool cntl);
++ bool (*is_active_display)(
++ struct dc_bios *bios,
++ enum signal_type signal,
++ const struct connector_device_tag_info *device_tag);
++ enum controller_id (*get_embedded_display_controller_id)(
++ struct dc_bios *bios);
++ uint32_t (*get_embedded_display_refresh_rate)(
++ struct dc_bios *bios);
++ void (*set_scratch_connected)(
++ struct dc_bios *bios,
++ struct graphics_object_id connector_id,
++ bool connected,
++ const struct connector_device_tag_info *device_tag);
++ void (*prepare_scratch_active_and_requested)(
++ struct dc_bios *bios,
++ enum controller_id controller_id,
++ enum signal_type signal,
++ const struct connector_device_tag_info *device_tag);
++ void (*set_scratch_active_and_requested)(
++ struct dc_bios *bios);
++ void (*set_scratch_critical_state)(
++ struct dc_bios *bios,
++ bool state);
++ void (*set_scratch_acc_mode_change)(
++ struct dc_bios *bios);
++
++ bool (*is_device_id_supported)(
++ struct dc_bios *bios,
++ struct device_id id);
++
++ /* COMMANDS */
++
++ enum bp_result (*encoder_control)(
++ struct dc_bios *bios,
++ struct bp_encoder_control *cntl);
++ enum bp_result (*transmitter_control)(
++ struct dc_bios *bios,
++ struct bp_transmitter_control *cntl);
++ enum bp_result (*crt_control)(
++ struct dc_bios *bios,
++ enum engine_id engine_id,
++ bool enable,
++ uint32_t pixel_clock);
++ enum bp_result (*dvo_encoder_control)(
++ struct dc_bios *bios,
++ struct bp_dvo_encoder_control *cntl);
++ enum bp_result (*enable_crtc)(
++ struct dc_bios *bios,
++ enum controller_id id,
++ bool enable);
++ enum bp_result (*adjust_pixel_clock)(
++ struct dc_bios *bios,
++ struct bp_adjust_pixel_clock_parameters *bp_params);
++ enum bp_result (*set_pixel_clock)(
++ struct dc_bios *bios,
++ struct bp_pixel_clock_parameters *bp_params);
++ enum bp_result (*set_dce_clock)(
++ struct dc_bios *bios,
++ struct bp_set_dce_clock_parameters *bp_params);
++ enum bp_result (*enable_spread_spectrum_on_ppll)(
++ struct dc_bios *bios,
++ struct bp_spread_spectrum_parameters *bp_params,
++ bool enable);
++ enum bp_result (*program_crtc_timing)(
++ struct dc_bios *bios,
++ struct bp_hw_crtc_timing_parameters *bp_params);
++ enum bp_result (*blank_crtc)(
++ struct dc_bios *bios,
++ struct bp_blank_crtc_parameters *bp_params,
++ bool blank);
++ enum bp_result (*set_overscan)(
++ struct dc_bios *bios,
++ struct bp_hw_crtc_overscan_parameters *bp_params);
++ enum bp_result (*crtc_source_select)(
++ struct dc_bios *bios,
++ struct bp_crtc_source_select *bp_params);
++ enum bp_result (*program_display_engine_pll)(
++ struct dc_bios *bios,
++ struct bp_pixel_clock_parameters *bp_params);
++ enum bp_result (*get_divider_for_target_display_clock)(
++ struct dc_bios *bios,
++ struct bp_display_clock_parameters *bp_params);
++ enum signal_type (*dac_load_detect)(
++ struct dc_bios *bios,
++ struct graphics_object_id encoder,
++ struct graphics_object_id connector,
++ enum signal_type display_signal);
++ enum bp_result (*enable_memory_requests)(
++ struct dc_bios *bios,
++ enum controller_id controller_id,
++ bool enable);
++ enum bp_result (*external_encoder_control)(
++ struct dc_bios *bios,
++ struct bp_external_encoder_control *cntl);
++ enum bp_result (*enable_disp_power_gating)(
++ struct dc_bios *bios,
++ enum controller_id controller_id,
++ enum bp_pipe_control_action action);
++
++ void (*post_init)(struct dc_bios *bios);
++
++ struct integrated_info *(*create_integrated_info)(
++ struct dc_bios *bios);
++
++ void (*destroy_integrated_info)(
++ struct dc_bios *dcb,
++ struct integrated_info **info);
+ };
+
++struct dc_bios {
++ const struct dc_vbios_funcs *funcs;
++};
+
+ #endif /* DC_BIOS_TYPES_H */
+diff --git a/drivers/gpu/drm/amd/dal/dc/dc_helpers.h b/drivers/gpu/drm/amd/dal/dc/dc_helpers.h
+index 7a14300..bd082d8 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dc_helpers.h
++++ b/drivers/gpu/drm/amd/dal/dc/dc_helpers.h
+@@ -33,6 +33,8 @@
+ #include "dc_types.h"
+ #include "dc.h"
+
++struct dp_mst_stream_allocation_table;
++
+ enum dc_edid_status dc_helpers_parse_edid_caps(
+ struct dc_context *ctx,
+ const struct dc_edid *edid,
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
+index 4f37282..fbcd799 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
+@@ -24,6 +24,7 @@
+ */
+ #include "dc_services.h"
+ #include "dc.h"
++#include "dc_bios_types.h"
+ #include "core_types.h"
+ #include "core_status.h"
+ #include "resource.h"
+@@ -146,7 +147,7 @@ static void dce110_enable_display_pipe_clock_gating(
+ static bool dce110_enable_display_power_gating(
+ struct dc_context *ctx,
+ uint8_t controller_id,
+- struct bios_parser *bp,
++ struct dc_bios *dcb,
+ enum pipe_gating_control power_gating)
+ {
+ enum bp_result bp_result = BP_RESULT_OK;
+@@ -161,8 +162,8 @@ static bool dce110_enable_display_power_gating(
+
+ if (!(power_gating == PIPE_GATING_CONTROL_INIT &&
+ (controller_id + 1) != CONTROLLER_ID_D0))
+- bp_result = dal_bios_parser_enable_disp_power_gating(
+- bp, controller_id + 1, cntl);
++ bp_result = dcb->funcs->enable_disp_power_gating(
++ dcb, controller_id + 1, cntl);
+
+ if (power_gating != PIPE_GATING_CONTROL_ENABLE)
+ init_pte(ctx);
+@@ -235,12 +236,13 @@ static bool set_gamma_ramp(
+ static enum dc_status bios_parser_crtc_source_select(
+ struct core_stream *stream)
+ {
++ struct dc_bios *dcb;
+ /* call VBIOS table to set CRTC source for the HW
+ * encoder block
+ * note: video bios clears all FMT setting here. */
+-
+ struct bp_crtc_source_select crtc_source_select = {0};
+ const struct core_sink *sink = stream->sink;
++
+ crtc_source_select.engine_id = stream->stream_enc->id;
+ crtc_source_select.controller_id = stream->controller_idx + 1;
+ /*TODO: Need to un-hardcode color depth, dp_audio and account for
+@@ -249,14 +251,16 @@ static enum dc_status bios_parser_crtc_source_select(
+ crtc_source_select.signal = sink->public.sink_signal;
+ crtc_source_select.enable_dp_audio = false;
+ crtc_source_select.sink_signal = sink->public.sink_signal;
+- crtc_source_select.display_output_bit_depth
+- = PANEL_8BIT_COLOR;
++ crtc_source_select.display_output_bit_depth = PANEL_8BIT_COLOR;
++
++ dcb = dal_adapter_service_get_bios_parser(sink->link->adapter_srv);
+
+- if (BP_RESULT_OK != dal_bios_parser_crtc_source_select(
+- dal_adapter_service_get_bios_parser(sink->link->adapter_srv),
++ if (BP_RESULT_OK != dcb->funcs->crtc_source_select(
++ dcb,
+ &crtc_source_select)) {
+ return DC_ERROR_UNEXPECTED;
+ }
++
+ return DC_OK;
+ }
+
+@@ -625,9 +629,9 @@ static void set_blender_mode(
+ static void update_bios_scratch_critical_state(struct adapter_service *as,
+ bool state)
+ {
+- dal_bios_parser_set_scratch_critical_state(
+- dal_adapter_service_get_bios_parser(as),
+- state);
++ struct dc_bios *dcb = dal_adapter_service_get_bios_parser(as);
++
++ dcb->funcs->set_scratch_critical_state(dcb, state);
+ }
+
+ static void update_info_frame(struct core_stream *stream)
+@@ -787,14 +791,14 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
+ bool timing_changed = context->res_ctx.controller_ctx[controller_idx]
+ .flags.timing_changed;
+ enum color_space color_space;
+- struct bios_parser *bp;
++ struct dc_bios *dcb;
+
+- bp = dal_adapter_service_get_bios_parser(
++ dcb = dal_adapter_service_get_bios_parser(
+ context->res_ctx.pool.adapter_srv);
+
+ if (timing_changed) {
+ dce110_enable_display_power_gating(
+- stream->ctx, controller_idx, bp,
++ stream->ctx, controller_idx, dcb,
+ PIPE_GATING_CONTROL_DISABLE);
+
+ /* Must blank CRTC after disabling power gating and before any
+@@ -961,10 +965,10 @@ static void disable_vga_and_power_gate_all_controllers(
+ {
+ int i;
+ struct timing_generator *tg;
+- struct bios_parser *bp;
++ struct dc_bios *dcb;
+ struct dc_context *ctx;
+
+- bp = dal_adapter_service_get_bios_parser(
++ dcb = dal_adapter_service_get_bios_parser(
+ dc->res_pool.adapter_srv);
+
+ for (i = 0; i < dc->res_pool.controller_count; i++) {
+@@ -977,7 +981,7 @@ static void disable_vga_and_power_gate_all_controllers(
+ * powergating. */
+ dce110_enable_display_pipe_clock_gating(ctx,
+ true);
+- dce110_enable_display_power_gating(ctx, i+1, bp,
++ dce110_enable_display_power_gating(ctx, i+1, dcb,
+ PIPE_GATING_CONTROL_ENABLE);
+ }
+ }
+@@ -991,16 +995,15 @@ static void disable_vga_and_power_gate_all_controllers(
+ */
+ static void enable_accelerated_mode(struct dc *dc)
+ {
+- struct bios_parser *bp;
++ struct dc_bios *dcb;
+
+- bp = dal_adapter_service_get_bios_parser(
+- dc->res_pool.adapter_srv);
++ dcb = dal_adapter_service_get_bios_parser(dc->res_pool.adapter_srv);
+
+ power_down_all_hw_blocks(dc);
+
+ disable_vga_and_power_gate_all_controllers(dc);
+
+- dal_bios_parser_set_scratch_acc_mode_change(bp);
++ dcb->funcs->set_scratch_acc_mode_change(dcb);
+ }
+
+ #if 0
+@@ -1559,9 +1562,9 @@ static bool update_plane_address(
+ static void reset_single_stream_hw_ctx(struct core_stream *stream,
+ struct validate_context *context)
+ {
+- struct bios_parser *bp;
++ struct dc_bios *dcb;
+
+- bp = dal_adapter_service_get_bios_parser(
++ dcb = dal_adapter_service_get_bios_parser(
+ context->res_ctx.pool.adapter_srv);
+ if (stream->audio) {
+ dal_audio_disable_output(stream->audio,
+@@ -1580,7 +1583,7 @@ static void reset_single_stream_hw_ctx(struct core_stream *stream,
+ disable_stereo_mixer(stream->ctx);
+ unreference_clock_source(&context->res_ctx, stream->clock_source);
+ dce110_enable_display_power_gating(
+- stream->ctx, stream->controller_idx, bp,
++ stream->ctx, stream->controller_idx, dcb,
+ PIPE_GATING_CONTROL_ENABLE);
+ }
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c
+index deaf94d..73ba7b8 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c
+@@ -29,6 +29,8 @@
+ #include "stream_encoder.h"
+ #include "dce110_link_encoder.h"
+ #include "i2caux_interface.h"
++#include "dc_bios_types.h"
++
+ #include "dce/dce_11_0_d.h"
+ #include "dce/dce_11_0_sh_mask.h"
+ #include "dce/dce_11_0_enum.h"
+@@ -168,6 +170,19 @@ static enum transmitter translate_encoder_to_transmitter(
+ }
+ }
+
++static enum bp_result link_transmitter_control(
++ struct dce110_link_encoder *enc110,
++ struct bp_transmitter_control *cntl)
++{
++ enum bp_result result;
++ struct dc_bios *bp = dal_adapter_service_get_bios_parser(
++ enc110->base.adapter_service);
++
++ result = bp->funcs->transmitter_control(bp, cntl);
++
++ return result;
++}
++
+ static void enable_phy_bypass_mode(
+ struct dce110_link_encoder *enc110,
+ bool enable)
+@@ -672,9 +687,7 @@ static void link_encoder_edp_power_control(
+ cntl.lanes_number = LANE_COUNT_FOUR;
+ cntl.hpd_sel = enc110->base.hpd_source;
+
+- bp_result = dal_bios_parser_transmitter_control(
+- dal_adapter_service_get_bios_parser(
+- enc110->base.adapter_service), &cntl);
++ bp_result = link_transmitter_control(enc110, &cntl);
+
+ if (BP_RESULT_OK != bp_result) {
+
+@@ -866,10 +879,7 @@ static void link_encoder_edp_backlight_control(
+ * Enable it in the future if necessary.
+ */
+ /* dc_service_sleep_in_milliseconds(50); */
+-
+- dal_bios_parser_transmitter_control(
+- dal_adapter_service_get_bios_parser(
+- enc110->base.adapter_service), &cntl);
++ link_transmitter_control(enc110, &cntl);
+ }
+
+ static bool is_dig_enabled(const struct dce110_link_encoder *enc110)
+@@ -1299,10 +1309,7 @@ void dce110_link_encoder_hw_init(
+ cntl.coherent = false;
+ cntl.hpd_sel = enc110->base.hpd_source;
+
+- result = dal_bios_parser_transmitter_control(
+- dal_adapter_service_get_bios_parser(
+- enc110->base.adapter_service),
+- &cntl);
++ result = link_transmitter_control(enc110, &cntl);
+
+ if (result != BP_RESULT_OK) {
+ dal_logger_write(ctx->logger,
+@@ -1317,10 +1324,8 @@ void dce110_link_encoder_hw_init(
+ if (enc110->base.connector.id == CONNECTOR_ID_LVDS) {
+ cntl.action = TRANSMITTER_CONTROL_BACKLIGHT_BRIGHTNESS;
+
+- result = dal_bios_parser_transmitter_control(
+- dal_adapter_service_get_bios_parser(
+- enc110->base.adapter_service),
+- &cntl);
++ result = link_transmitter_control(enc110, &cntl);
++
+ ASSERT(result == BP_RESULT_OK);
+
+ } else if (enc110->base.connector.id == CONNECTOR_ID_EDP) {
+@@ -1416,10 +1421,7 @@ void dce110_link_encoder_enable_tmds_output(
+ cntl.pixel_clock = pixel_clock;
+ cntl.color_depth = color_depth;
+
+- result = dal_bios_parser_transmitter_control(
+- dal_adapter_service_get_bios_parser(
+- enc110->base.adapter_service),
+- &cntl);
++ result = link_transmitter_control(enc110, &cntl);
+
+ if (result != BP_RESULT_OK) {
+ dal_logger_write(ctx->logger,
+@@ -1475,10 +1477,7 @@ void dce110_link_encoder_enable_dp_output(
+ /* TODO: check if undefined works */
+ cntl.color_depth = COLOR_DEPTH_UNDEFINED;
+
+- result = dal_bios_parser_transmitter_control(
+- dal_adapter_service_get_bios_parser(
+- enc110->base.adapter_service),
+- &cntl);
++ result = link_transmitter_control(enc110, &cntl);
+
+ if (result != BP_RESULT_OK) {
+ dal_logger_write(ctx->logger,
+@@ -1521,10 +1520,7 @@ void dce110_link_encoder_enable_dp_mst_output(
+ /* TODO: check if undefined works */
+ cntl.color_depth = COLOR_DEPTH_UNDEFINED;
+
+- result = dal_bios_parser_transmitter_control(
+- dal_adapter_service_get_bios_parser(
+- enc110->base.adapter_service),
+- &cntl);
++ result = link_transmitter_control(enc110, &cntl);
+
+ if (result != BP_RESULT_OK) {
+ dal_logger_write(ctx->logger,
+@@ -1578,9 +1574,7 @@ void dce110_link_encoder_disable_output(
+ cntl.signal = signal;
+ cntl.connector_obj_id = enc110->base.connector;
+
+- result = dal_bios_parser_transmitter_control(
+- dal_adapter_service_get_bios_parser(
+- enc110->base.adapter_service), &cntl);
++ result = link_transmitter_control(enc110, &cntl);
+
+ if (result != BP_RESULT_OK) {
+ dal_logger_write(ctx->logger,
+@@ -1654,10 +1648,7 @@ void dce110_link_encoder_dp_set_lane_settings(
+ cntl.lane_settings = training_lane_set.raw;
+
+ /* call VBIOS table to set voltage swing and pre-emphasis */
+-
+- dal_bios_parser_transmitter_control(
+- dal_adapter_service_get_bios_parser(
+- enc110->base.adapter_service), &cntl);
++ link_transmitter_control(enc110, &cntl);
+ }
+ }
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
+index 80d3f8a..565f9cb 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
+@@ -104,7 +104,7 @@ static struct timing_generator *dce110_timing_generator_create(
+ static struct stream_encoder *dce110_stream_encoder_create(
+ enum engine_id eng_id,
+ struct dc_context *ctx,
+- struct bios_parser *bp,
++ struct dc_bios *bp,
+ const struct dce110_stream_enc_offsets *offsets)
+ {
+ struct dce110_stream_encoder *enc110 =
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_stream_encoder.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_stream_encoder.c
+index 81996f7..87f59ee 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_stream_encoder.c
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_stream_encoder.c
+@@ -24,6 +24,7 @@
+ */
+
+ #include "dal_services.h"
++#include "dc_bios_types.h"
+ #include "dce110_stream_encoder.h"
+ #include "dce/dce_11_0_d.h"
+ #include "dce/dce_11_0_sh_mask.h"
+@@ -282,7 +283,7 @@ static void dce110_update_hdmi_info_packet(
+ bool dce110_stream_encoder_construct(
+ struct dce110_stream_encoder *enc110,
+ struct dc_context *ctx,
+- struct bios_parser *bp,
++ struct dc_bios *bp,
+ enum engine_id eng_id,
+ const struct dce110_stream_enc_offsets *offsets)
+ {
+@@ -411,7 +412,7 @@ void dce110_stream_encoder_hdmi_set_stream_attribute(
+ cntl.lanes_number = LANE_COUNT_FOUR;
+ cntl.color_depth = crtc_timing->display_color_depth;
+
+- if (dal_bios_parser_encoder_control(
++ if (enc110->base.bp->funcs->encoder_control(
+ enc110->base.bp, &cntl) != BP_RESULT_OK)
+ return;
+
+@@ -592,7 +593,7 @@ void dce110_stream_encoder_dvi_set_stream_attribute(
+ LANE_COUNT_EIGHT : LANE_COUNT_FOUR;
+ cntl.color_depth = crtc_timing->display_color_depth;
+
+- if (dal_bios_parser_encoder_control(
++ if (enc110->base.bp->funcs->encoder_control(
+ enc110->base.bp, &cntl) != BP_RESULT_OK)
+ return;
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_stream_encoder.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_stream_encoder.h
+index 200308c..ddc16cd 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_stream_encoder.h
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_stream_encoder.h
+@@ -44,7 +44,7 @@ struct dce110_stream_encoder {
+ bool dce110_stream_encoder_construct(
+ struct dce110_stream_encoder *enc110,
+ struct dc_context *ctx,
+- struct bios_parser *bp,
++ struct dc_bios *bp,
+ enum engine_id eng_id,
+ const struct dce110_stream_enc_offsets *offsets);
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c
+index 2c7c27f..5dc3605 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c
+@@ -30,6 +30,7 @@
+ #include "dce/dce_11_0_sh_mask.h"
+
+ #include "dc_types.h"
++#include "dc_bios_types.h"
+
+ #include "include/grph_object_id.h"
+ #include "include/adapter_service_interface.h"
+@@ -288,7 +289,7 @@ bool dce110_timing_generator_enable_crtc(struct timing_generator *tg)
+ dal_write_reg(tg->ctx,
+ CRTC_REG(mmCRTC_MASTER_UPDATE_MODE), value);
+
+- result = dal_bios_parser_enable_crtc(tg->bp, tg110->controller_id, true);
++ result = tg->bp->funcs->enable_crtc(tg->bp, tg110->controller_id, true);
+
+ return result == BP_RESULT_OK;
+ }
+@@ -467,7 +468,7 @@ bool dce110_timing_generator_disable_crtc(struct timing_generator *tg)
+
+ struct dce110_timing_generator *tg110 = DCE110TG_FROM_TG(tg);
+
+- result = dal_bios_parser_enable_crtc(tg->bp, tg110->controller_id, false);
++ result = tg->bp->funcs->enable_crtc(tg->bp, tg110->controller_id, false);
+
+ /* Need to make sure stereo is disabled according to the DCE5.0 spec */
+
+@@ -572,7 +573,7 @@ bool dce110_timing_generator_program_timing_generator(
+ if (patched_crtc_timing.flags.HORZ_COUNT_BY_TWO == 1)
+ bp_params.flags.HORZ_COUNT_BY_TWO = 1;
+
+- result = dal_bios_parser_program_crtc_timing(tg->bp, &bp_params);
++ result = tg->bp->funcs->program_crtc_timing(tg->bp, &bp_params);
+
+ program_horz_count_by_2(tg, &patched_crtc_timing);
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/gpu/calc_pll_clock_source.c b/drivers/gpu/drm/amd/dal/dc/gpu/calc_pll_clock_source.c
+index 7c94733..acc8838 100644
+--- a/drivers/gpu/drm/amd/dal/dc/gpu/calc_pll_clock_source.c
++++ b/drivers/gpu/drm/amd/dal/dc/gpu/calc_pll_clock_source.c
+@@ -326,7 +326,7 @@ static bool calc_pll_clock_source_max_vco_construct(
+ init_data->bp == NULL)
+ return false;
+
+- if (dal_bios_parser_get_firmware_info(
++ if (init_data->bp->funcs->get_firmware_info(
+ init_data->bp,
+ &fw_info) != BP_RESULT_OK)
+ return false;
+diff --git a/drivers/gpu/drm/amd/dal/dc/gpu/calc_pll_clock_source.h b/drivers/gpu/drm/amd/dal/dc/gpu/calc_pll_clock_source.h
+index be44d06..48db3d6 100644
+--- a/drivers/gpu/drm/amd/dal/dc/gpu/calc_pll_clock_source.h
++++ b/drivers/gpu/drm/amd/dal/dc/gpu/calc_pll_clock_source.h
+@@ -24,10 +24,12 @@
+ #ifndef __DAL_CALC_PLL_CLOCK_SOURCE_H__
+ #define __DAL_CALC_PLL_CLOCK_SOURCE_H__
+
++#include "dc_bios_types.h"
++
+ #include "include/clock_source_types.h"
+
+ struct calc_pll_clock_source_init_data {
+- struct bios_parser *bp;
++ struct dc_bios *bp;
+ uint32_t min_pix_clk_pll_post_divider;
+ uint32_t max_pix_clk_pll_post_divider;
+ uint32_t min_pll_ref_divider;
+diff --git a/drivers/gpu/drm/amd/dal/dc/gpu/clock_source.c b/drivers/gpu/drm/amd/dal/dc/gpu/clock_source.c
+index 11f16b7..cd4a91e 100644
+--- a/drivers/gpu/drm/amd/dal/dc/gpu/clock_source.c
++++ b/drivers/gpu/drm/amd/dal/dc/gpu/clock_source.c
+@@ -265,9 +265,10 @@ void dal_clock_source_get_ss_info_from_atombios(
+ spread_spectrum_data[0] = NULL;
+ *ss_entries_num = 0;
+
+- *ss_entries_num = dal_bios_parser_get_ss_entry_number(
++ *ss_entries_num = clk_src->bios_parser->funcs->get_ss_entry_number(
+ clk_src->bios_parser,
+ as_signal);
++
+ if (*ss_entries_num == 0)
+ return;
+
+@@ -285,11 +286,13 @@ void dal_clock_source_get_ss_info_from_atombios(
+ for (i = 0, ss_info_cur = ss_info;
+ i < (*ss_entries_num);
+ ++i, ++ss_info_cur) {
+- bp_result = dal_bios_parser_get_spread_spectrum_info(
++
++ bp_result = clk_src->bios_parser->funcs->get_spread_spectrum_info(
+ clk_src->bios_parser,
+ as_signal,
+ i,
+ ss_info_cur);
++
+ if (bp_result != BP_RESULT_OK)
+ goto out_free_data;
+ }
+diff --git a/drivers/gpu/drm/amd/dal/dc/gpu/clock_source.h b/drivers/gpu/drm/amd/dal/dc/gpu/clock_source.h
+index 67ececd..a7863cd 100644
+--- a/drivers/gpu/drm/amd/dal/dc/gpu/clock_source.h
++++ b/drivers/gpu/drm/amd/dal/dc/gpu/clock_source.h
+@@ -100,7 +100,7 @@ struct clock_source {
+ struct graphics_object_id id;
+ enum clock_source_id clk_src_id;
+ struct adapter_service *adapter_service;
+- struct bios_parser *bios_parser;
++ struct dc_bios *bios_parser;
+
+ struct spread_spectrum_data *ep_ss_params;
+ uint32_t ep_ss_params_cnt;
+diff --git a/drivers/gpu/drm/amd/dal/dc/gpu/dce110/display_clock_dce110.c b/drivers/gpu/drm/amd/dal/dc/gpu/dce110/display_clock_dce110.c
+index e582ba0..a2a615a 100644
+--- a/drivers/gpu/drm/amd/dal/dc/gpu/dce110/display_clock_dce110.c
++++ b/drivers/gpu/drm/amd/dal/dc/gpu/dce110/display_clock_dce110.c
+@@ -774,7 +774,7 @@ static void set_clock(
+ {
+ struct bp_pixel_clock_parameters pxl_clk_params;
+ struct display_clock_dce110 *dc = DCLCK110_FROM_BASE(base);
+- struct bios_parser *bp = dal_adapter_service_get_bios_parser(base->as);
++ struct dc_bios *bp = dal_adapter_service_get_bios_parser(base->as);
+
+ /* Prepare to program display clock*/
+ dc_service_memset(&pxl_clk_params, 0, sizeof(pxl_clk_params));
+@@ -782,7 +782,7 @@ static void set_clock(
+ pxl_clk_params.target_pixel_clock = requested_clk_khz;
+ pxl_clk_params.pll_id = base->id;
+
+- dal_bios_parser_program_display_engine_pll(bp, &pxl_clk_params);
++ bp->funcs->program_display_engine_pll(bp, &pxl_clk_params);
+
+ if (dc->dfs_bypass_enabled) {
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/gpu/dce110/pll_clock_source_dce110.c b/drivers/gpu/drm/amd/dal/dc/gpu/dce110/pll_clock_source_dce110.c
+index d83eea3..cce9b0b 100644
+--- a/drivers/gpu/drm/amd/dal/dc/gpu/dce110/pll_clock_source_dce110.c
++++ b/drivers/gpu/drm/amd/dal/dc/gpu/dce110/pll_clock_source_dce110.c
+@@ -127,7 +127,7 @@ static bool disable_spread_spectrum(struct pll_clock_source_dce110 *clk_src)
+ bp_ss_params.pll_id = clock_source->clk_src_id;
+
+ /*Call ASICControl to process ATOMBIOS Exec table*/
+- result = dal_bios_parser_enable_spread_spectrum_on_ppll(
++ result = clock_source->bios_parser->funcs->enable_spread_spectrum_on_ppll(
+ clock_source->bios_parser,
+ &bp_ss_params,
+ false);
+@@ -171,7 +171,7 @@ static bool enable_spread_spectrum(
+ bp_params.flags.EXTERNAL_SS = 1;
+
+ if (BP_RESULT_OK !=
+- dal_bios_parser_enable_spread_spectrum_on_ppll(
++ clock_source->bios_parser->funcs->enable_spread_spectrum_on_ppll(
+ clock_source->bios_parser,
+ &bp_params,
+ true))
+@@ -283,7 +283,7 @@ static bool program_pix_clk(
+ bp_pc_params.flags.SET_EXTERNAL_REF_DIV_SRC =
+ pll_settings->use_external_clk;
+
+- if (dal_bios_parser_set_pixel_clock(clk_src->bios_parser,
++ if (clk_src->bios_parser->funcs->set_pixel_clock(clk_src->bios_parser,
+ &bp_pc_params) != BP_RESULT_OK)
+ return false;
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/gpu/dce110/vce_clock_source_dce110.c b/drivers/gpu/drm/amd/dal/dc/gpu/dce110/vce_clock_source_dce110.c
+index ce59228..0a0b516 100644
+--- a/drivers/gpu/drm/amd/dal/dc/gpu/dce110/vce_clock_source_dce110.c
++++ b/drivers/gpu/drm/amd/dal/dc/gpu/dce110/vce_clock_source_dce110.c
+@@ -79,7 +79,7 @@ static bool program_pix_clk(struct clock_source *clk_src,
+ bp_pix_clk_params.encoder_object_id = pix_clk_params->encoder_object_id;
+ bp_pix_clk_params.signal_type = pix_clk_params->signal_type;
+
+- if (dal_bios_parser_set_pixel_clock(clk_src->bios_parser,
++ if (clk_src->bios_parser->funcs->set_pixel_clock(clk_src->bios_parser,
+ &bp_pix_clk_params) == BP_RESULT_OK)
+ return true;
+
+@@ -162,7 +162,7 @@ static bool construct(
+ /*Get Reference frequency, Input frequency range into PLL
+ * and Output frequency range of the PLL
+ * from ATOMBIOS Data table */
+- if (dal_bios_parser_get_firmware_info(
++ if (vce_clk_src->base.bios_parser->funcs->get_firmware_info(
+ vce_clk_src->base.bios_parser,
+ &fw_info) != BP_RESULT_OK)
+ return false;
+diff --git a/drivers/gpu/drm/amd/dal/dc/gpu/ext_clock_source.c b/drivers/gpu/drm/amd/dal/dc/gpu/ext_clock_source.c
+index ac27cd7..3a26312 100644
+--- a/drivers/gpu/drm/amd/dal/dc/gpu/ext_clock_source.c
++++ b/drivers/gpu/drm/amd/dal/dc/gpu/ext_clock_source.c
+@@ -23,8 +23,9 @@
+ */
+
+ #include "dal_services.h"
+-#include "include/clock_source_types.h"
++
+ #include "include/bios_parser_interface.h"
++#include "include/clock_source_types.h"
+ #include "include/logger_interface.h"
+ #include "ext_clock_source.h"
+
+@@ -71,11 +72,11 @@ bool dal_ext_clock_source_program_pix_clk(
+ bp_pix_clk_params.signal_type = pix_clk_params->signal_type;
+ bp_pix_clk_params.dvo_config = pix_clk_params->dvo_cfg;
+
+-
+- if (dal_bios_parser_set_pixel_clock(
++ if (clk_src->bios_parser->funcs->set_pixel_clock(
+ clk_src->bios_parser,
+ &bp_pix_clk_params) == BP_RESULT_OK)
+ return true;
++
+ return false;
+
+ }
+@@ -108,11 +109,13 @@ bool dal_ext_clock_source_construct(
+ SIGNAL_TYPE_DISPLAY_PORT_MST |
+ SIGNAL_TYPE_EDP;
+
++
+ /*Get External clock frequency from ATOMBIOS Data table */
+- if (dal_bios_parser_get_firmware_info(
++ if (ext_clk_src->base.bios_parser->funcs->get_firmware_info(
+ ext_clk_src->base.bios_parser,
+ &fw_info) != BP_RESULT_OK)
+ return false;
++
+ ext_clk_src->ext_clk_freq_khz = fw_info.
+ external_clock_source_frequency_for_dp;
+ return true;
+diff --git a/drivers/gpu/drm/amd/dal/dc/gpu/pll_clock_source.c b/drivers/gpu/drm/amd/dal/dc/gpu/pll_clock_source.c
+index 8bb0304..3049842 100644
+--- a/drivers/gpu/drm/amd/dal/dc/gpu/pll_clock_source.c
++++ b/drivers/gpu/drm/amd/dal/dc/gpu/pll_clock_source.c
+@@ -40,7 +40,7 @@ bool dal_pll_clock_source_power_down_pll(
+ bp_pixel_clock_params.flags.FORCE_PROGRAMMING_OF_PLL = 1;
+
+ /*Call ASICControl to process ATOMBIOS Exec table*/
+- bp_result = dal_bios_parser_set_pixel_clock(
++ bp_result = clk_src->bios_parser->funcs->set_pixel_clock(
+ clk_src->bios_parser,
+ &bp_pixel_clock_params);
+
+@@ -102,7 +102,7 @@ bool dal_pll_clock_source_adjust_pix_clk(
+ display_pll_config = pix_clk_params->disp_pll_cfg;
+ bp_adjust_pixel_clock_params.
+ ss_enable = pix_clk_params->flags.ENABLE_SS;
+- bp_result = dal_bios_parser_adjust_pixel_clock(
++ bp_result = pll_clk_src->base.bios_parser->funcs->adjust_pixel_clock(
+ pll_clk_src->base.bios_parser,
+ &bp_adjust_pixel_clock_params);
+ if (bp_result == BP_RESULT_OK) {
+@@ -131,10 +131,11 @@ bool dal_pll_clock_source_construct(
+ clk_src_init_data))
+ return false;
+
+- if (dal_bios_parser_get_firmware_info(
++ if (pll_clk_src->base.bios_parser->funcs->get_firmware_info(
+ pll_clk_src->base.bios_parser,
+ &fw_info) != BP_RESULT_OK)
+ return false;
++
+ pll_clk_src->ref_freq_khz = fw_info.pll_info.crystal_frequency;
+
+ return true;
+diff --git a/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h
+index 317110e..a5ccb5e 100644
+--- a/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h
++++ b/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h
+@@ -141,7 +141,7 @@ struct hw_sequencer_funcs {
+ bool (*enable_display_power_gating)(
+ struct dc_context *ctx,
+ uint8_t controller_id,
+- struct bios_parser *bp,
++ struct dc_bios *dcb,
+ enum pipe_gating_control power_gating);
+
+ /* resource management and validation*/
+diff --git a/drivers/gpu/drm/amd/dal/dc/inc/stream_encoder.h b/drivers/gpu/drm/amd/dal/dc/inc/stream_encoder.h
+index 25028b7..9665356 100644
+--- a/drivers/gpu/drm/amd/dal/dc/inc/stream_encoder.h
++++ b/drivers/gpu/drm/amd/dal/dc/inc/stream_encoder.h
+@@ -9,10 +9,12 @@
+ #include "include/encoder_types.h"
+ #include "include/bios_parser_interface.h"
+
++struct dc_bios;
++
+ struct stream_encoder {
+ struct stream_encoder_funcs *funcs;
+ struct dc_context *ctx;
+- struct bios_parser *bp;
++ struct dc_bios *bp;
+ enum engine_id id;
+ };
+
+diff --git a/drivers/gpu/drm/amd/dal/include/adapter_service_interface.h b/drivers/gpu/drm/amd/dal/include/adapter_service_interface.h
+index e449db6..2851266 100644
+--- a/drivers/gpu/drm/amd/dal/include/adapter_service_interface.h
++++ b/drivers/gpu/drm/amd/dal/include/adapter_service_interface.h
+@@ -36,7 +36,6 @@
+ #include "asic_capability_types.h"
+
+ /* forward declaration */
+-struct bios_parser;
+ struct i2caux;
+ struct adapter_service;
+
+@@ -481,7 +480,7 @@ bool dal_adapter_service_get_i2c_info(
+ struct graphics_object_i2c_info *i2c_info);
+
+ /* Get bios parser handler */
+-struct bios_parser *dal_adapter_service_get_bios_parser(
++struct dc_bios *dal_adapter_service_get_bios_parser(
+ struct adapter_service *as);
+
+ /* Get i2c aux handler */
+diff --git a/drivers/gpu/drm/amd/dal/include/adapter_service_types.h b/drivers/gpu/drm/amd/dal/include/adapter_service_types.h
+index fb47ef3..4cb4b4b 100644
+--- a/drivers/gpu/drm/amd/dal/include/adapter_service_types.h
++++ b/drivers/gpu/drm/amd/dal/include/adapter_service_types.h
+@@ -26,6 +26,7 @@
+ #ifndef __DAL_ADAPTER_SERVICE_TYPES_H__
+ #define __DAL_ADAPTER_SERVICE_TYPES_H__
+
++/* TODO: include signal_types.h and remove this enum */
+ enum as_signal_type {
+ AS_SIGNAL_TYPE_NONE = 0L, /* no signal */
+ AS_SIGNAL_TYPE_DVI,
+diff --git a/drivers/gpu/drm/amd/dal/include/bios_parser_interface.h b/drivers/gpu/drm/amd/dal/include/bios_parser_interface.h
+index 77999fc..e4291b9 100644
+--- a/drivers/gpu/drm/amd/dal/include/bios_parser_interface.h
++++ b/drivers/gpu/drm/amd/dal/include/bios_parser_interface.h
+@@ -26,143 +26,25 @@
+ #ifndef __DAL_BIOS_PARSER_INTERFACE_H__
+ #define __DAL_BIOS_PARSER_INTERFACE_H__
+
+-#include "bios_parser_types.h"
+-#include "adapter_service_types.h"
+-#include "gpio_types.h"
++#include "dc_bios_types.h"
+
+ struct adapter_service;
+ struct bios_parser;
+
+-struct bp_gpio_cntl_info {
+- uint32_t id;
+- enum gpio_pin_output_state state;
+-};
+-
+-enum bp_result {
+- BP_RESULT_OK = 0, /* There was no error */
+- BP_RESULT_BADINPUT, /*Bad input parameter */
+- BP_RESULT_BADBIOSTABLE, /* Bad BIOS table */
+- BP_RESULT_UNSUPPORTED, /* BIOS Table is not supported */
+- BP_RESULT_NORECORD, /* Record can't be found */
+- BP_RESULT_FAILURE
+-};
+-
+ struct bp_init_data {
+ struct dc_context *ctx;
+ uint8_t *bios;
+ };
+
+-struct bios_parser *dal_bios_parser_create(
++struct dc_bios *dal_bios_parser_create(
+ struct bp_init_data *init,
+ struct adapter_service *as);
+-void dal_bios_parser_destroy(
+- struct bios_parser **bp);
+-
+-
+-void dal_bios_parser_power_down(
+- struct bios_parser *bp);
+-void dal_bios_parser_power_up(
+- struct bios_parser *bp);
+
+-uint8_t dal_bios_parser_get_encoders_number(
+- struct bios_parser *bp);
+-uint32_t dal_bios_parser_get_oem_ddc_lines_number(
+- struct bios_parser *bp);
+-struct graphics_object_id dal_bios_parser_get_encoder_id(
+- struct bios_parser *bp,
+- uint32_t i);
+-struct graphics_object_id dal_bios_parser_get_connector_id(
+- struct bios_parser *bp,
+- uint8_t connector_index);
+-uint32_t dal_bios_parser_get_src_number(
+- struct bios_parser *bp,
+- struct graphics_object_id id);
+-uint32_t dal_bios_parser_get_dst_number(
+- struct bios_parser *bp,
+- struct graphics_object_id id);
+-uint32_t dal_bios_parser_get_gpio_record(
+- struct bios_parser *bp,
+- struct graphics_object_id id,
+- struct bp_gpio_cntl_info *gpio_record,
+- uint32_t record_size);
+-enum bp_result dal_bios_parser_get_src_obj(
+- struct bios_parser *bp,
+- struct graphics_object_id object_id, uint32_t index,
+- struct graphics_object_id *src_object_id);
+-enum bp_result dal_bios_parser_get_dst_obj(
+- struct bios_parser *bp,
+- struct graphics_object_id object_id, uint32_t index,
+- struct graphics_object_id *dest_object_id);
+-enum bp_result dal_bios_parser_get_i2c_info(
+- struct bios_parser *bp,
+- struct graphics_object_id id,
+- struct graphics_object_i2c_info *info);
+-enum bp_result dal_bios_parser_get_oem_ddc_info(
+- struct bios_parser *bp,
+- uint32_t index,
+- struct graphics_object_i2c_info *info);
+-enum bp_result dal_bios_parser_get_voltage_ddc_info(
+- struct bios_parser *bp,
+- uint32_t index,
+- struct graphics_object_i2c_info *info);
+-enum bp_result dal_bios_parser_get_thermal_ddc_info(
+- struct bios_parser *bp,
+- uint32_t i2c_channel_id,
+- struct graphics_object_i2c_info *info);
+-enum bp_result dal_bios_parser_get_hpd_info(
+- struct bios_parser *bp,
+- struct graphics_object_id id,
+- struct graphics_object_hpd_info *info);
+-enum bp_result dal_bios_parser_get_device_tag(
+- struct bios_parser *bp,
+- struct graphics_object_id connector_object_id,
+- uint32_t device_tag_index,
+- struct connector_device_tag_info *info);
+-enum bp_result dal_bios_parser_get_firmware_info(
+- struct bios_parser *bp,
+- struct firmware_info *info);
+-enum bp_result dal_bios_parser_get_spread_spectrum_info(
+- struct bios_parser *bp,
+- enum as_signal_type signal,
+- uint32_t index,
+- struct spread_spectrum_info *ss_info);
+-uint32_t dal_bios_parser_get_ss_entry_number(
+- struct bios_parser *bp,
+- enum as_signal_type signal);
+-enum bp_result dal_bios_parser_get_embedded_panel_info(
+- struct bios_parser *bp,
+- struct embedded_panel_info *info);
+-enum bp_result dal_bios_parser_enum_embedded_panel_patch_mode(
+- struct bios_parser *bp,
+- uint32_t index,
+- struct embedded_panel_patch_mode *mode);
+-enum bp_result dal_bios_parser_get_gpio_pin_info(
+- struct bios_parser *bp,
+- uint32_t gpio_id,
+- struct gpio_pin_info *info);
+-enum bp_result dal_bios_parser_get_embedded_panel_info(
+- struct bios_parser *bp,
+- struct embedded_panel_info *info);
+-enum bp_result dal_bios_parser_get_gpio_pin_info(
+- struct bios_parser *bp,
+- uint32_t gpio_id,
+- struct gpio_pin_info *info);
+-enum bp_result dal_bios_parser_get_faked_edid_len(
+- struct bios_parser *bp,
+- uint32_t *len);
+-enum bp_result dal_bios_parser_get_faked_edid_buf(
+- struct bios_parser *bp,
+- uint8_t *buff,
+- uint32_t len);
+-enum bp_result dal_bios_parser_get_encoder_cap_info(
+- struct bios_parser *bp,
+- struct graphics_object_id object_id,
+- struct bp_encoder_cap_info *info);
+-enum bp_result dal_bios_parser_get_din_connector_info(
+- struct bios_parser *bp,
+- struct graphics_object_id id,
+- struct din_connector_info *info);
++void dal_bios_parser_destroy(
++ struct dc_bios **dcb);
+
++/*****************************************************************************/
++/* Interfaces of BIOS Parser Helper */
+ bool dal_bios_parser_is_lid_open(
+ struct bios_parser *bp);
+ bool dal_bios_parser_is_lid_status_changed(
+@@ -213,88 +95,4 @@ void dal_bios_parser_set_scratch_critical_state(
+ void dal_bios_parser_set_scratch_acc_mode_change(
+ struct bios_parser *bp);
+
+-bool dal_bios_parser_is_device_id_supported(
+- struct bios_parser *bp,
+- struct device_id id);
+-
+-/* COMMANDS */
+-
+-enum bp_result dal_bios_parser_encoder_control(
+- struct bios_parser *bp,
+- struct bp_encoder_control *cntl);
+-enum bp_result dal_bios_parser_transmitter_control(
+- struct bios_parser *bp,
+- struct bp_transmitter_control *cntl);
+-enum bp_result dal_bios_parser_crt_control(
+- struct bios_parser *bp,
+- enum engine_id engine_id,
+- bool enable,
+- uint32_t pixel_clock);
+-enum bp_result dal_bios_parser_dvo_encoder_control(
+- struct bios_parser *bp,
+- struct bp_dvo_encoder_control *cntl);
+-enum bp_result dal_bios_parser_enable_crtc(
+- struct bios_parser *bp,
+- enum controller_id id,
+- bool enable);
+-enum bp_result dal_bios_parser_adjust_pixel_clock(
+- struct bios_parser *bp,
+- struct bp_adjust_pixel_clock_parameters *bp_params);
+-enum bp_result dal_bios_parser_set_pixel_clock(
+- struct bios_parser *bp,
+- struct bp_pixel_clock_parameters *bp_params);
+-enum bp_result dal_bios_parser_set_dce_clock(
+- struct bios_parser *bp,
+- struct bp_set_dce_clock_parameters *bp_params);
+-enum bp_result dal_bios_parser_enable_spread_spectrum_on_ppll(
+- struct bios_parser *bp,
+- struct bp_spread_spectrum_parameters *bp_params,
+- bool enable);
+-enum bp_result dal_bios_parser_program_crtc_timing(
+- struct bios_parser *bp,
+- struct bp_hw_crtc_timing_parameters *bp_params);
+-enum bp_result dal_bios_parser_blank_crtc(
+- struct bios_parser *bp,
+- struct bp_blank_crtc_parameters *bp_params,
+- bool blank);
+-enum bp_result dal_bios_parser_set_overscan(
+- struct bios_parser *bp,
+- struct bp_hw_crtc_overscan_parameters *bp_params);
+-enum bp_result dal_bios_parser_crtc_source_select(
+- struct bios_parser *bp,
+- struct bp_crtc_source_select *bp_params);
+-enum bp_result dal_bios_parser_program_display_engine_pll(
+- struct bios_parser *bp,
+- struct bp_pixel_clock_parameters *bp_params);
+-enum bp_result dal_bios_parser_get_divider_for_target_display_clock(
+- struct bios_parser *bp,
+- struct bp_display_clock_parameters *bp_params);
+-enum signal_type dal_bios_parser_dac_load_detect(
+- struct bios_parser *bp,
+- struct graphics_object_id encoder,
+- struct graphics_object_id connector,
+- enum signal_type display_signal);
+-enum bp_result dal_bios_parser_enable_memory_requests(
+- struct bios_parser *bp,
+- enum controller_id controller_id,
+- bool enable);
+-enum bp_result dal_bios_parser_external_encoder_control(
+- struct bios_parser *bp,
+- struct bp_external_encoder_control *cntl);
+-enum bp_result dal_bios_parser_enable_disp_power_gating(
+- struct bios_parser *bp,
+- enum controller_id controller_id,
+- enum bp_pipe_control_action action);
+-
+-void dal_bios_parser_post_init(struct bios_parser *bp);
+-
+-/* Parse integrated BIOS info */
+-struct integrated_info *dal_bios_parser_create_integrated_info(
+- struct bios_parser *bp);
+-
+-/* Destroy provided integrated info */
+-void dal_bios_parser_destroy_integrated_info(struct dc_context *ctx, struct integrated_info **info);
+-
+-
+-
+-#endif
++#endif /* __DAL_BIOS_PARSER_INTERFACE_H__ */
+diff --git a/drivers/gpu/drm/amd/dal/include/bios_parser_types.h b/drivers/gpu/drm/amd/dal/include/bios_parser_types.h
+index 4176f28..7b93997 100644
+--- a/drivers/gpu/drm/amd/dal/include/bios_parser_types.h
++++ b/drivers/gpu/drm/amd/dal/include/bios_parser_types.h
+@@ -28,7 +28,17 @@
+
+ #include "include/signal_types.h"
+ #include "include/grph_object_ctrl_defs.h"
+-#include "link_service_types.h"
++#include "include/gpio_types.h"
++#include "include/adapter_service_types.h" /* for as_signal_type */
++
++enum bp_result {
++ BP_RESULT_OK = 0, /* There was no error */
++ BP_RESULT_BADINPUT, /*Bad input parameter */
++ BP_RESULT_BADBIOSTABLE, /* Bad BIOS table */
++ BP_RESULT_UNSUPPORTED, /* BIOS Table is not supported */
++ BP_RESULT_NORECORD, /* Record can't be found */
++ BP_RESULT_FAILURE
++};
+
+ enum bp_encoder_control_action {
+ /* direct VBIOS translation! Just to simplify the translation */
+@@ -337,4 +347,9 @@ struct bp_encoder_cap_info {
+ uint32_t RESERVED:30;
+ };
+
+-#endif
++struct bp_gpio_cntl_info {
++ uint32_t id;
++ enum gpio_pin_output_state state;
++};
++
++#endif /*__DAL_BIOS_PARSER_TYPES_H__ */
+diff --git a/drivers/gpu/drm/amd/dal/include/timing_generator_types.h b/drivers/gpu/drm/amd/dal/include/timing_generator_types.h
+index 3f5f1ec..75dfbab 100644
+--- a/drivers/gpu/drm/amd/dal/include/timing_generator_types.h
++++ b/drivers/gpu/drm/amd/dal/include/timing_generator_types.h
+@@ -28,6 +28,7 @@
+
+ #include "include/grph_csc_types.h"
+
++struct dc_bios;
+
+ /**
+ * These parameters are required as input when doing blanking/Unblanking
+@@ -142,7 +143,7 @@ enum crtc_state {
+
+ struct timing_generator {
+ struct timing_generator_funcs *funcs;
+- struct bios_parser *bp;
++ struct dc_bios *bp;
+ struct dc_context *ctx;
+ };
+
+--
+2.7.4
+