aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0976-drm-amd-display-Implement-HDMI-retimer-settings-for-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0976-drm-amd-display-Implement-HDMI-retimer-settings-for-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0976-drm-amd-display-Implement-HDMI-retimer-settings-for-.patch652
1 files changed, 0 insertions, 652 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0976-drm-amd-display-Implement-HDMI-retimer-settings-for-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0976-drm-amd-display-Implement-HDMI-retimer-settings-for-.patch
deleted file mode 100644
index a9dd9930..00000000
--- a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0976-drm-amd-display-Implement-HDMI-retimer-settings-for-.patch
+++ /dev/null
@@ -1,652 +0,0 @@
-From 4959d1c84f40af9539d70d24a7e273ec3d4d1622 Mon Sep 17 00:00:00 2001
-From: Zeyu Fan <Zeyu.Fan@amd.com>
-Date: Mon, 14 Aug 2017 18:43:11 -0400
-Subject: [PATCH 0976/4131] drm/amd/display: Implement HDMI retimer settings
- for RV AM4 support.
-
-Signed-off-by: Zeyu Fan <Zeyu.Fan@amd.com>
-Reviewed-by: Charlene Liu <Charlene.Liu@amd.com>
-Acked-by: Harry Wentland <Harry.Wentland@amd.com>
----
- drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c | 69 ++++
- drivers/gpu/drm/amd/display/dc/core/dc_link.c | 420 ++++++++++++++++++++-
- drivers/gpu/drm/amd/display/dc/dc.h | 1 +
- drivers/gpu/drm/amd/display/dc/dm_helpers.h | 5 -
- .../amd/display/include/grph_object_ctrl_defs.h | 38 ++
- 5 files changed, 524 insertions(+), 9 deletions(-)
-
-diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
-index 86fce5a..f8d4f08 100644
---- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
-+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
-@@ -993,6 +993,8 @@ static struct device_id device_type_from_device_id(uint16_t device_id)
-
- struct device_id result_device_id;
-
-+ result_device_id.raw_device_tag = device_id;
-+
- switch (device_id) {
- case ATOM_DISPLAY_LCD1_SUPPORT:
- result_device_id.device_type = DEVICE_TYPE_LCD;
-@@ -1812,10 +1814,77 @@ static enum bp_result get_integrated_info_v11(
- info_v11->extdispconninfo.path[i].hpdlut_index;
- info->ext_disp_conn_info.path[i].channel_mapping.raw =
- info_v11->extdispconninfo.path[i].channelmapping;
-+ info->ext_disp_conn_info.path[i].caps =
-+ le16_to_cpu(info_v11->extdispconninfo.path[i].caps);
- }
- info->ext_disp_conn_info.checksum =
- info_v11->extdispconninfo.checksum;
-
-+ info->dp0_ext_hdmi_slv_addr = info_v11->dp0_retimer_set.HdmiSlvAddr;
-+ info->dp0_ext_hdmi_reg_num = info_v11->dp0_retimer_set.HdmiRegNum;
-+ for (i = 0; i < info->dp0_ext_hdmi_reg_num; i++) {
-+ info->dp0_ext_hdmi_reg_settings[i].i2c_reg_index =
-+ info_v11->dp0_retimer_set.HdmiRegSetting[i].ucI2cRegIndex;
-+ info->dp0_ext_hdmi_reg_settings[i].i2c_reg_val =
-+ info_v11->dp0_retimer_set.HdmiRegSetting[i].ucI2cRegVal;
-+ }
-+ info->dp0_ext_hdmi_6g_reg_num = info_v11->dp0_retimer_set.Hdmi6GRegNum;
-+ for (i = 0; i < info->dp0_ext_hdmi_6g_reg_num; i++) {
-+ info->dp0_ext_hdmi_6g_reg_settings[i].i2c_reg_index =
-+ info_v11->dp0_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegIndex;
-+ info->dp0_ext_hdmi_6g_reg_settings[i].i2c_reg_val =
-+ info_v11->dp0_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegVal;
-+ }
-+
-+ info->dp1_ext_hdmi_slv_addr = info_v11->dp1_retimer_set.HdmiSlvAddr;
-+ info->dp1_ext_hdmi_reg_num = info_v11->dp1_retimer_set.HdmiRegNum;
-+ for (i = 0; i < info->dp1_ext_hdmi_reg_num; i++) {
-+ info->dp1_ext_hdmi_reg_settings[i].i2c_reg_index =
-+ info_v11->dp1_retimer_set.HdmiRegSetting[i].ucI2cRegIndex;
-+ info->dp1_ext_hdmi_reg_settings[i].i2c_reg_val =
-+ info_v11->dp1_retimer_set.HdmiRegSetting[i].ucI2cRegVal;
-+ }
-+ info->dp1_ext_hdmi_6g_reg_num = info_v11->dp1_retimer_set.Hdmi6GRegNum;
-+ for (i = 0; i < info->dp1_ext_hdmi_6g_reg_num; i++) {
-+ info->dp1_ext_hdmi_6g_reg_settings[i].i2c_reg_index =
-+ info_v11->dp1_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegIndex;
-+ info->dp1_ext_hdmi_6g_reg_settings[i].i2c_reg_val =
-+ info_v11->dp1_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegVal;
-+ }
-+
-+ info->dp2_ext_hdmi_slv_addr = info_v11->dp2_retimer_set.HdmiSlvAddr;
-+ info->dp2_ext_hdmi_reg_num = info_v11->dp2_retimer_set.HdmiRegNum;
-+ for (i = 0; i < info->dp2_ext_hdmi_reg_num; i++) {
-+ info->dp2_ext_hdmi_reg_settings[i].i2c_reg_index =
-+ info_v11->dp2_retimer_set.HdmiRegSetting[i].ucI2cRegIndex;
-+ info->dp2_ext_hdmi_reg_settings[i].i2c_reg_val =
-+ info_v11->dp2_retimer_set.HdmiRegSetting[i].ucI2cRegVal;
-+ }
-+ info->dp2_ext_hdmi_6g_reg_num = info_v11->dp2_retimer_set.Hdmi6GRegNum;
-+ for (i = 0; i < info->dp2_ext_hdmi_6g_reg_num; i++) {
-+ info->dp2_ext_hdmi_6g_reg_settings[i].i2c_reg_index =
-+ info_v11->dp2_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegIndex;
-+ info->dp2_ext_hdmi_6g_reg_settings[i].i2c_reg_val =
-+ info_v11->dp2_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegVal;
-+ }
-+
-+ info->dp3_ext_hdmi_slv_addr = info_v11->dp3_retimer_set.HdmiSlvAddr;
-+ info->dp3_ext_hdmi_reg_num = info_v11->dp3_retimer_set.HdmiRegNum;
-+ for (i = 0; i < info->dp3_ext_hdmi_reg_num; i++) {
-+ info->dp3_ext_hdmi_reg_settings[i].i2c_reg_index =
-+ info_v11->dp3_retimer_set.HdmiRegSetting[i].ucI2cRegIndex;
-+ info->dp3_ext_hdmi_reg_settings[i].i2c_reg_val =
-+ info_v11->dp3_retimer_set.HdmiRegSetting[i].ucI2cRegVal;
-+ }
-+ info->dp3_ext_hdmi_6g_reg_num = info_v11->dp3_retimer_set.Hdmi6GRegNum;
-+ for (i = 0; i < info->dp3_ext_hdmi_6g_reg_num; i++) {
-+ info->dp3_ext_hdmi_6g_reg_settings[i].i2c_reg_index =
-+ info_v11->dp3_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegIndex;
-+ info->dp3_ext_hdmi_6g_reg_settings[i].i2c_reg_val =
-+ info_v11->dp3_retimer_set.Hdmi6GhzRegSetting[i].ucI2cRegVal;
-+ }
-+
-+
- /** TODO - review **/
- #if 0
- info->boot_up_engine_clock = le32_to_cpu(info_v11->ulBootUpEngineClock)
-diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
-index 1888bf4..d77f0de 100644
---- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
-+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
-@@ -1044,10 +1044,17 @@ static bool construct(
- &info.ext_disp_conn_info.path[i];
- if (path->device_connector_id.enum_id == link->link_id.enum_id
- && path->device_connector_id.id == link->link_id.id
-- && path->device_connector_id.type == link->link_id.type
-- && path->device_acpi_enum
-- == link->device_tag.acpi_device) {
-- link->ddi_channel_mapping = path->channel_mapping;
-+ && path->device_connector_id.type == link->link_id.type) {
-+
-+ if (link->device_tag.acpi_device != 0
-+ && path->device_acpi_enum == link->device_tag.acpi_device) {
-+ link->ddi_channel_mapping = path->channel_mapping;
-+ link->chip_caps = path->caps;
-+ } else if (path->device_tag ==
-+ link->device_tag.dev_id.raw_device_tag) {
-+ link->ddi_channel_mapping = path->channel_mapping;
-+ link->chip_caps = path->caps;
-+ }
- break;
- }
- }
-@@ -1263,11 +1270,416 @@ static enum dc_status enable_link_dp_mst(struct pipe_ctx *pipe_ctx)
- return enable_link_dp(pipe_ctx);
- }
-
-+static bool get_ext_hdmi_settings(struct pipe_ctx *pipe_ctx,
-+ enum engine_id eng_id,
-+ struct ext_hdmi_settings *settings)
-+{
-+ bool result = false;
-+ int i = 0;
-+ struct integrated_info *integrated_info =
-+ pipe_ctx->stream->ctx->dc_bios->integrated_info;
-+
-+ if (integrated_info == NULL)
-+ return false;
-+
-+ /*
-+ * Get retimer settings from sbios for passing SI eye test for DCE11
-+ * The setting values are varied based on board revision and port id
-+ * Therefore the setting values of each ports is passed by sbios.
-+ */
-+
-+ // Check if current bios contains ext Hdmi settings
-+ if (integrated_info->gpu_cap_info & 0x20) {
-+ switch (eng_id) {
-+ case ENGINE_ID_DIGA:
-+ settings->slv_addr = integrated_info->dp0_ext_hdmi_slv_addr;
-+ settings->reg_num = integrated_info->dp0_ext_hdmi_6g_reg_num;
-+ settings->reg_num_6g = integrated_info->dp0_ext_hdmi_6g_reg_num;
-+ memmove(settings->reg_settings,
-+ integrated_info->dp0_ext_hdmi_reg_settings,
-+ sizeof(integrated_info->dp0_ext_hdmi_reg_settings));
-+ memmove(settings->reg_settings_6g,
-+ integrated_info->dp0_ext_hdmi_6g_reg_settings,
-+ sizeof(integrated_info->dp0_ext_hdmi_6g_reg_settings));
-+ result = true;
-+ break;
-+ case ENGINE_ID_DIGB:
-+ settings->slv_addr = integrated_info->dp1_ext_hdmi_slv_addr;
-+ settings->reg_num = integrated_info->dp1_ext_hdmi_6g_reg_num;
-+ settings->reg_num_6g = integrated_info->dp1_ext_hdmi_6g_reg_num;
-+ memmove(settings->reg_settings,
-+ integrated_info->dp1_ext_hdmi_reg_settings,
-+ sizeof(integrated_info->dp1_ext_hdmi_reg_settings));
-+ memmove(settings->reg_settings_6g,
-+ integrated_info->dp1_ext_hdmi_6g_reg_settings,
-+ sizeof(integrated_info->dp1_ext_hdmi_6g_reg_settings));
-+ result = true;
-+ break;
-+ case ENGINE_ID_DIGC:
-+ settings->slv_addr = integrated_info->dp2_ext_hdmi_slv_addr;
-+ settings->reg_num = integrated_info->dp2_ext_hdmi_6g_reg_num;
-+ settings->reg_num_6g = integrated_info->dp2_ext_hdmi_6g_reg_num;
-+ memmove(settings->reg_settings,
-+ integrated_info->dp2_ext_hdmi_reg_settings,
-+ sizeof(integrated_info->dp2_ext_hdmi_reg_settings));
-+ memmove(settings->reg_settings_6g,
-+ integrated_info->dp2_ext_hdmi_6g_reg_settings,
-+ sizeof(integrated_info->dp2_ext_hdmi_6g_reg_settings));
-+ result = true;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ if (result == true) {
-+ // Validate settings from bios integrated info table
-+ if (settings->slv_addr == 0)
-+ return false;
-+ if (settings->reg_num > 9)
-+ return false;
-+ if (settings->reg_num_6g > 3)
-+ return false;
-+
-+ for (i = 0; i < settings->reg_num; i++) {
-+ if (settings->reg_settings[i].i2c_reg_index > 0x20)
-+ return false;
-+ }
-+
-+ for (i = 0; i < settings->reg_num_6g; i++) {
-+ if (settings->reg_settings_6g[i].i2c_reg_index > 0x20)
-+ return false;
-+ }
-+ }
-+ }
-+
-+ return result;
-+}
-+
-+static bool i2c_write(struct pipe_ctx *pipe_ctx,
-+ uint8_t address, uint8_t *buffer, uint32_t length)
-+{
-+ struct i2c_command cmd = {0};
-+ struct i2c_payload payload = {0};
-+
-+ memset(&payload, 0, sizeof(payload));
-+ memset(&cmd, 0, sizeof(cmd));
-+
-+ cmd.number_of_payloads = 1;
-+ cmd.engine = I2C_COMMAND_ENGINE_DEFAULT;
-+ cmd.speed = pipe_ctx->stream->ctx->dc->caps.i2c_speed_in_khz;
-+
-+ payload.address = address;
-+ payload.data = buffer;
-+ payload.length = length;
-+ payload.write = true;
-+ cmd.payloads = &payload;
-+
-+ if (dc_submit_i2c(pipe_ctx->stream->ctx->dc,
-+ pipe_ctx->stream->sink->link->link_index, &cmd))
-+ return true;
-+
-+ return false;
-+}
-+
-+static void write_i2c_retimer_setting(
-+ struct pipe_ctx *pipe_ctx,
-+ bool is_vga_mode,
-+ bool is_over_340mhz,
-+ struct ext_hdmi_settings *settings)
-+{
-+ uint8_t slave_address = (settings->slv_addr >> 1);
-+ uint8_t buffer[2];
-+ const uint8_t apply_rx_tx_change = 0x4;
-+ uint8_t offset = 0xA;
-+ uint8_t value = 0;
-+ int i = 0;
-+ bool i2c_success = false;
-+
-+ memset(&buffer, 0, sizeof(buffer));
-+
-+ /* Start Ext-Hdmi programming*/
-+
-+ for (i = 0; i < settings->reg_num; i++) {
-+ /* Apply 3G settings */
-+ if (settings->reg_settings[i].i2c_reg_index <= 0x20) {
-+
-+ buffer[0] = settings->reg_settings[i].i2c_reg_index;
-+ buffer[1] = settings->reg_settings[i].i2c_reg_val;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ /* Based on DP159 specs, APPLY_RX_TX_CHANGE bit in 0x0A
-+ * needs to be set to 1 on every 0xA-0xC write.
-+ */
-+ if (settings->reg_settings[i].i2c_reg_index == 0xA ||
-+ settings->reg_settings[i].i2c_reg_index == 0xB ||
-+ settings->reg_settings[i].i2c_reg_index == 0xC) {
-+
-+ /* Query current value from offset 0xA */
-+ if (settings->reg_settings[i].i2c_reg_index == 0xA)
-+ value = settings->reg_settings[i].i2c_reg_val;
-+ else {
-+ i2c_success =
-+ dal_ddc_service_query_ddc_data(
-+ pipe_ctx->stream->sink->link->ddc,
-+ slave_address, &offset, 1, &value, 1);
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+ }
-+
-+ buffer[0] = offset;
-+ /* Set APPLY_RX_TX_CHANGE bit to 1 */
-+ buffer[1] = value | apply_rx_tx_change;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+ }
-+ }
-+ }
-+
-+ /* Apply 3G settings */
-+ if (is_over_340mhz) {
-+ for (i = 0; i < settings->reg_num_6g; i++) {
-+ /* Apply 3G settings */
-+ if (settings->reg_settings[i].i2c_reg_index <= 0x20) {
-+
-+ buffer[0] = settings->reg_settings_6g[i].i2c_reg_index;
-+ buffer[1] = settings->reg_settings_6g[i].i2c_reg_val;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ /* Based on DP159 specs, APPLY_RX_TX_CHANGE bit in 0x0A
-+ * needs to be set to 1 on every 0xA-0xC write.
-+ */
-+ if (settings->reg_settings_6g[i].i2c_reg_index == 0xA ||
-+ settings->reg_settings_6g[i].i2c_reg_index == 0xB ||
-+ settings->reg_settings_6g[i].i2c_reg_index == 0xC) {
-+
-+ /* Query current value from offset 0xA */
-+ if (settings->reg_settings_6g[i].i2c_reg_index == 0xA)
-+ value = settings->reg_settings_6g[i].i2c_reg_val;
-+ else {
-+ i2c_success =
-+ dal_ddc_service_query_ddc_data(
-+ pipe_ctx->stream->sink->link->ddc,
-+ slave_address, &offset, 1, &value, 1);
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+ }
-+
-+ buffer[0] = offset;
-+ /* Set APPLY_RX_TX_CHANGE bit to 1 */
-+ buffer[1] = value | apply_rx_tx_change;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+ }
-+ }
-+ }
-+ }
-+
-+ if (is_vga_mode) {
-+ /* Program additional settings if using 640x480 resolution */
-+
-+ /* Write offset 0xFF to 0x01 */
-+ buffer[0] = 0xff;
-+ buffer[1] = 0x01;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ /* Write offset 0x00 to 0x23 */
-+ buffer[0] = 0x00;
-+ buffer[1] = 0x23;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ /* Write offset 0xff to 0x00 */
-+ buffer[0] = 0xff;
-+ buffer[1] = 0x00;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ }
-+}
-+
-+static void write_i2c_default_retimer_setting(
-+ struct pipe_ctx *pipe_ctx,
-+ bool is_vga_mode,
-+ bool is_over_340mhz)
-+{
-+ uint8_t slave_address = (0xBA >> 1);
-+ uint8_t buffer[2];
-+ bool i2c_success = false;
-+
-+ memset(&buffer, 0, sizeof(buffer));
-+
-+ /* Program Slave Address for tuning single integrity */
-+ /* Write offset 0x0A to 0x13 */
-+ buffer[0] = 0x0A;
-+ buffer[1] = 0x13;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ /* Write offset 0x0A to 0x17 */
-+ buffer[0] = 0x0A;
-+ buffer[1] = 0x17;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ /* Write offset 0x0B to 0xDA or 0xD8 */
-+ buffer[0] = 0x0B;
-+ buffer[1] = is_over_340mhz ? 0xDA : 0xD8;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ /* Write offset 0x0A to 0x17 */
-+ buffer[0] = 0x0A;
-+ buffer[1] = 0x17;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ /* Write offset 0x0C to 0x1D or 0x91 */
-+ buffer[0] = 0x0C;
-+ buffer[1] = is_over_340mhz ? 0x1D : 0x91;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ /* Write offset 0x0A to 0x17 */
-+ buffer[0] = 0x0A;
-+ buffer[1] = 0x17;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+
-+ if (is_vga_mode) {
-+ /* Program additional settings if using 640x480 resolution */
-+
-+ /* Write offset 0xFF to 0x01 */
-+ buffer[0] = 0xff;
-+ buffer[1] = 0x01;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ /* Write offset 0x00 to 0x23 */
-+ buffer[0] = 0x00;
-+ buffer[1] = 0x23;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+
-+ /* Write offset 0xff to 0x00 */
-+ buffer[0] = 0xff;
-+ buffer[1] = 0x00;
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+ }
-+}
-+
-+static void write_i2c_redriver_setting(
-+ struct pipe_ctx *pipe_ctx,
-+ bool is_over_340mhz)
-+{
-+ uint8_t slave_address = (0xF0 >> 1);
-+ uint8_t buffer[16];
-+ bool i2c_success = false;
-+
-+ memset(&buffer, 0, sizeof(buffer));
-+
-+ // Program Slave Address for tuning single integrity
-+ buffer[3] = 0x4E;
-+ buffer[4] = 0x4E;
-+ buffer[5] = 0x4E;
-+ buffer[6] = is_over_340mhz ? 0x4E : 0x4A;
-+
-+ i2c_success = i2c_write(pipe_ctx, slave_address,
-+ buffer, sizeof(buffer));
-+
-+ if (!i2c_success)
-+ /* Write failure */
-+ ASSERT(i2c_success);
-+}
-+
- static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
- {
- struct dc_stream_state *stream = pipe_ctx->stream;
- struct dc_link *link = stream->sink->link;
- enum dc_color_depth display_color_depth;
-+ enum engine_id eng_id;
-+ struct ext_hdmi_settings settings = {0};
-+ bool is_over_340mhz = false;
-+ bool is_vga_mode = (stream->timing.h_addressable == 640)
-+ && (stream->timing.v_addressable == 480);
-+
-+ if (stream->phy_pix_clk > 340000)
-+ is_over_340mhz = true;
-+
-+ if (dc_is_hdmi_signal(pipe_ctx->stream->signal)) {
-+ if ((pipe_ctx->stream->sink->link->chip_caps >> 2) == 0x2) {
-+ /* DP159, Retimer settings */
-+ eng_id = pipe_ctx->stream_res.stream_enc->id;
-+
-+ if (get_ext_hdmi_settings(pipe_ctx, eng_id, &settings)) {
-+ write_i2c_retimer_setting(pipe_ctx,
-+ is_vga_mode, is_over_340mhz, &settings);
-+ } else {
-+ write_i2c_default_retimer_setting(pipe_ctx,
-+ is_vga_mode, is_over_340mhz);
-+ }
-+ } else if ((pipe_ctx->stream->sink->link->chip_caps >> 2) == 0x1) {
-+ /* PI3EQX1204, Redriver settings */
-+ write_i2c_redriver_setting(pipe_ctx, is_over_340mhz);
-+ }
-+ }
-
- if (dc_is_hdmi_signal(pipe_ctx->stream->signal))
- dal_ddc_service_write_scdc_data(
-diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
-index 20caf30..8a27d52 100644
---- a/drivers/gpu/drm/amd/display/dc/dc.h
-+++ b/drivers/gpu/drm/amd/display/dc/dc.h
-@@ -831,6 +831,7 @@ struct dc_link {
- union ddi_channel_mapping ddi_channel_mapping;
- struct connector_device_tag_info device_tag;
- struct dpcd_caps dpcd_caps;
-+ unsigned short chip_caps;
- unsigned int dpcd_sink_count;
-
- enum edp_revision edp_revision;
-diff --git a/drivers/gpu/drm/amd/display/dc/dm_helpers.h b/drivers/gpu/drm/amd/display/dc/dm_helpers.h
-index 3901032..ab88f07 100644
---- a/drivers/gpu/drm/amd/display/dc/dm_helpers.h
-+++ b/drivers/gpu/drm/amd/display/dc/dm_helpers.h
-@@ -96,11 +96,6 @@ bool dm_helpers_submit_i2c(
- const struct dc_link *link,
- struct i2c_command *cmd);
-
--
--
--
--
--
- enum dc_edid_status dm_helpers_read_local_edid(
- struct dc_context *ctx,
- struct dc_link *link,
-diff --git a/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h b/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h
-index 6cdbf84..92fe00f 100644
---- a/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h
-+++ b/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h
-@@ -65,6 +65,7 @@ enum dal_device_type {
- struct device_id {
- enum dal_device_type device_type:16;
- uint32_t enum_id:16; /* 1 based enum */
-+ uint16_t raw_device_tag;
- };
-
- struct graphics_object_i2c_info {
-@@ -264,6 +265,20 @@ struct transmitter_configuration {
- #define NUMBER_OF_DISP_CLK_VOLTAGE 4
- #define NUMBER_OF_AVAILABLE_SCLK 5
-
-+struct i2c_reg_info {
-+ unsigned char i2c_reg_index;
-+ unsigned char i2c_reg_val;
-+};
-+
-+struct ext_hdmi_settings {
-+ unsigned char slv_addr;
-+ unsigned char reg_num;
-+ struct i2c_reg_info reg_settings[9];
-+ unsigned char reg_num_6g;
-+ struct i2c_reg_info reg_settings_6g[3];
-+};
-+
-+
- /* V6 */
- struct integrated_info {
- struct clock_voltage_caps {
-@@ -291,6 +306,8 @@ struct integrated_info {
- struct graphics_object_id ext_encoder_obj_id;
- /* XBAR mapping of the PHY channels */
- union ddi_channel_mapping channel_mapping;
-+
-+ unsigned short caps;
- } path[MAX_NUMBER_OF_EXT_DISPLAY_PATH];
-
- uint8_t gu_id[NUMBER_OF_UCHAR_FOR_GUID];
-@@ -357,6 +374,27 @@ struct integrated_info {
- uint32_t lvds_pwr_off_seq_blon_to_vary_bl_in_4ms;
- uint32_t lvds_reserved1;
- uint32_t lvds_bit_depth_control_val;
-+ //Start from V9
-+ unsigned char dp0_ext_hdmi_slv_addr;
-+ unsigned char dp0_ext_hdmi_reg_num;
-+ struct i2c_reg_info dp0_ext_hdmi_reg_settings[9];
-+ unsigned char dp0_ext_hdmi_6g_reg_num;
-+ struct i2c_reg_info dp0_ext_hdmi_6g_reg_settings[3];
-+ unsigned char dp1_ext_hdmi_slv_addr;
-+ unsigned char dp1_ext_hdmi_reg_num;
-+ struct i2c_reg_info dp1_ext_hdmi_reg_settings[9];
-+ unsigned char dp1_ext_hdmi_6g_reg_num;
-+ struct i2c_reg_info dp1_ext_hdmi_6g_reg_settings[3];
-+ unsigned char dp2_ext_hdmi_slv_addr;
-+ unsigned char dp2_ext_hdmi_reg_num;
-+ struct i2c_reg_info dp2_ext_hdmi_reg_settings[9];
-+ unsigned char dp2_ext_hdmi_6g_reg_num;
-+ struct i2c_reg_info dp2_ext_hdmi_6g_reg_settings[3];
-+ unsigned char dp3_ext_hdmi_slv_addr;
-+ unsigned char dp3_ext_hdmi_reg_num;
-+ struct i2c_reg_info dp3_ext_hdmi_reg_settings[9];
-+ unsigned char dp3_ext_hdmi_6g_reg_num;
-+ struct i2c_reg_info dp3_ext_hdmi_6g_reg_settings[3];
- };
-
- /**
---
-2.7.4
-