<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<p style="font-family:Calibri;font-size:10pt;color:#0000FF;margin:5pt;font-style:normal;font-weight:normal;text-decoration:none;" align="Left">
[AMD Official Use Only - AMD Internal Distribution Only]<br>
</p>
<br>
<div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Thanks Alex, I'll fix that and push.<br>
<br>
</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div id="Signature" class="elementToProof" style="color: inherit;">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
--</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Regards,</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Jay<br>
</div>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Hung, Alex <Alex.Hung@amd.com><br>
<b>Sent:</b> Monday, March 3, 2025 4:48 PM<br>
<b>To:</b> Pillai, Aurabindo <Aurabindo.Pillai@amd.com>; amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org><br>
<b>Cc:</b> Wentland, Harry <Harry.Wentland@amd.com>; Li, Sun peng (Leo) <Sunpeng.Li@amd.com>; Deucher, Alexander <Alexander.Deucher@amd.com><br>
<b>Subject:</b> Re: [PATCH 1/2] drm/amd/display: Add a temp w/a for a panel</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">This has conflicts to latest asdn and a minor spacing issue below.<br>
<br>
The others look good to me.<br>
<br>
Reviewed-by: Alex Hung <alex.hung@amd.com><br>
<br>
On 3/3/25 06:50, Aurabindo Pillai wrote:<br>
> Implement w/a for a panel which requires 10s delay after link detect.<br>
> <br>
> Signed-off-by: Aurabindo Pillai <aurabindo.pillai@amd.com><br>
> ---<br>
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 24 ++++++++++++++++++-<br>
> .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 10 ++++++--<br>
> drivers/gpu/drm/amd/display/dc/dc_types.h | 1 +<br>
> 3 files changed, 32 insertions(+), 3 deletions(-)<br>
> <br>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c<br>
> index 73c95c3c39f9..3a2843e3367e 100644<br>
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c<br>
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c<br>
> @@ -3327,6 +3327,21 @@ static void dm_gpureset_commit_state(struct dc_state *dc_state,<br>
> }<br>
> }<br>
> <br>
> +static void apply_delay_after_dpcd_poweroff(struct amdgpu_device *adev, struct dc_sink *sink) {<br>
> + struct dc_panel_patch *ppatch = NULL;<br>
> +<br>
> + if (!sink)<br>
> + return;<br>
> +<br>
> + ppatch = &sink->edid_caps.panel_patch;<br>
> + if (ppatch->wait_after_dpcd_poweroff_ms) {<br>
> + msleep(ppatch->wait_after_dpcd_poweroff_ms);<br>
> + drm_dbg_driver(adev_to_drm(adev), "%s: adding a %ds delay as w/a for panel\n",<br>
> + __func__,<br>
> + ppatch->wait_after_dpcd_poweroff_ms / 1000);<br>
This doesn't look aligned to me, and maybe the two line can fit into <br>
one. But this is just my opinions.<br>
<br>
> + }<br>
> +}<br>
> +<br>
> static int dm_resume(struct amdgpu_ip_block *ip_block)<br>
> {<br>
> struct amdgpu_device *adev = ip_block->adev;<br>
> @@ -3448,6 +3463,7 @@ static int dm_resume(struct amdgpu_ip_block *ip_block)<br>
> /* Do detection*/<br>
> drm_connector_list_iter_begin(ddev, &iter);<br>
> drm_for_each_connector_iter(connector, &iter) {<br>
> + bool ret;<br>
> <br>
> if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)<br>
> continue;<br>
> @@ -3473,7 +3489,11 @@ static int dm_resume(struct amdgpu_ip_block *ip_block)<br>
> } else {<br>
> guard(mutex)(&dm->dc_lock);<br>
> dc_exit_ips_for_hw_access(dm->dc);<br>
> - dc_link_detect(aconnector->dc_link, DETECT_REASON_RESUMEFROMS3S4);<br>
> + ret = dc_link_detect(aconnector->dc_link, DETECT_REASON_RESUMEFROMS3S4);<br>
> + if (ret) {<br>
> + /* w/a delay for certain panels */<br>
> + apply_delay_after_dpcd_poweroff(adev, aconnector->dc_sink);<br>
> + }<br>
> }<br>
> <br>
> if (aconnector->fake_enable && aconnector->dc_link->local_sink)<br>
> @@ -3834,6 +3854,8 @@ static void handle_hpd_irq_helper(struct amdgpu_dm_connector *aconnector)<br>
> ret = dc_link_detect(aconnector->dc_link, DETECT_REASON_HPD);<br>
> }<br>
> if (ret) {<br>
> + /* w/a delay for certain panels */<br>
> + apply_delay_after_dpcd_poweroff(adev, aconnector->dc_sink);<br>
> amdgpu_dm_update_connector_after_detect(aconnector);<br>
> <br>
> drm_modeset_lock_all(dev);<br>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c<br>
> index fbd80d8545a8..253aac93e3d8 100644<br>
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c<br>
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c<br>
> @@ -55,11 +55,16 @@ static u32 edid_extract_panel_id(struct edid *edid)<br>
> (u32)EDID_PRODUCT_ID(edid);<br>
> }<br>
> <br>
> -static void apply_edid_quirks(struct edid *edid, struct dc_edid_caps *edid_caps)<br>
> +static void apply_edid_quirks(struct drm_device *dev, struct edid *edid, struct dc_edid_caps *edid_caps)<br>
> {<br>
> uint32_t panel_id = edid_extract_panel_id(edid);<br>
> <br>
> switch (panel_id) {<br>
> + /* Workaround for monitors that need a delay after detecting the link */<br>
> + case drm_edid_encode_panel_id('G', 'B', 'T', 0x3215):<br>
> + drm_dbg_driver(dev, "Add 10s delay for link detection for panel id %X\n", panel_id);<br>
> + edid_caps->panel_patch.wait_after_dpcd_poweroff_ms = 10000;<br>
> + break;<br>
> /* Workaround for some monitors which does not work well with FAMS */<br>
> case drm_edid_encode_panel_id('S', 'A', 'M', 0x0E5E):<br>
> case drm_edid_encode_panel_id('S', 'A', 'M', 0x7053):<br>
> @@ -101,6 +106,7 @@ enum dc_edid_status dm_helpers_parse_edid_caps(<br>
> {<br>
> struct amdgpu_dm_connector *aconnector = link->priv;<br>
> struct drm_connector *connector = &aconnector->base;<br>
> + struct drm_device *dev = connector->dev;<br>
> struct edid *edid_buf = edid ? (struct edid *) edid->raw_edid : NULL;<br>
> struct cea_sad *sads;<br>
> int sad_count = -1;<br>
> @@ -130,7 +136,7 @@ enum dc_edid_status dm_helpers_parse_edid_caps(<br>
> <br>
> edid_caps->edid_hdmi = connector->display_info.is_hdmi;<br>
> <br>
> - apply_edid_quirks(edid_buf, edid_caps);<br>
> + apply_edid_quirks(dev, edid_buf, edid_caps);<br>
> <br>
> sad_count = drm_edid_to_sad((struct edid *) edid->raw_edid, &sads);<br>
> if (sad_count <= 0)<br>
> diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h b/drivers/gpu/drm/amd/display/dc/dc_types.h<br>
> index e60898c2df01..acd3b373a18e 100644<br>
> --- a/drivers/gpu/drm/amd/display/dc/dc_types.h<br>
> +++ b/drivers/gpu/drm/amd/display/dc/dc_types.h<br>
> @@ -181,6 +181,7 @@ struct dc_panel_patch {<br>
> uint8_t blankstream_before_otg_off;<br>
> bool oled_optimize_display_on;<br>
> unsigned int force_mst_blocked_discovery;<br>
> + unsigned int wait_after_dpcd_poweroff_ms;<br>
> };<br>
> <br>
> struct dc_edid_caps {<br>
<br>
</div>
</span></font></div>
</div>
</body>
</html>