From: Fangzhi Zuo <[email protected]>

[why]
The 8K120/8K240 timings live in DisplayID extension blocks 2 and 3
of this EDID. The EDID is a 4-block (512-byte) HDMI 2.1 EDID
that uses HF-EEODB.
drm core reads and parses this correctly, but amdgpu rebuilds its own copy.
Only 2 of 4 blocks were copied into sink->dc_edid, that leads to
drm_edid_connector_add_modes() never sees blocks 2 and 3.

[how]
Directly populate edid_blob_ptr with a blob whose length is the full,
and HF-EEODB-aware size.

Reviewed-by: Sun peng (Leo) Li <[email protected]>
Signed-off-by: Fangzhi Zuo <[email protected]>
Signed-off-by: George Zhang <[email protected]>
---
 .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 20 ++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

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
index d177489a2684..c59da4f447fc 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
@@ -1256,11 +1256,25 @@ enum dc_edid_status dm_helpers_read_local_edid(
                        continue;

                edid = drm_edid_raw(drm_edid); // FIXME: Get rid of 
drm_edid_raw()
-               if (!edid ||
-                   edid->extensions >= sizeof(sink->dc_edid.raw_edid) / 
EDID_LENGTH)
+               /*
+                * Use the length of the EDID property blob populated by
+                * drm_edid_connector_update() above. It reflects the true 
number
+                * of EDID blocks, including any HDMI Forum EDID Extension 
Override
+                * Data Block (HF-EEODB) count, which the raw byte 0x7e 
extension
+                * count can hide (e.g. HDMI 8K sinks).
+                */
+               if (!edid || !connector->edid_blob_ptr ||
+                   connector->edid_blob_ptr->length > 
sizeof(sink->dc_edid.raw_edid))
                        return EDID_BAD_INPUT;

-               sink->dc_edid.length = EDID_LENGTH * (edid->extensions + 1);
+               /*
+                * FIXME: amdgpu_dm today does not consider the HF-EEODB, which
+                * may contain additional mode info for sinks. This is a
+                * workaround until dc_edid is refactored out from DC into
+                * amdgpu_dm's ownership, allowing amdgpu_dm to use drm_edid
+                * directly
+                */
+               sink->dc_edid.length = connector->edid_blob_ptr->length;
                memmove(sink->dc_edid.raw_edid, (uint8_t *)edid, 
sink->dc_edid.length);

                /* We don't need the original edid anymore */
--
2.55.0

Reply via email to