mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 09:20:13 -04:00
drm/amd/display: Fix 8K Mode Not Parsed by EDID
[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 <sunpeng.li@amd.com> Signed-off-by: Fangzhi Zuo <Jerry.Zuo@amd.com> Signed-off-by: George Zhang <george.zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
b11706cb7d
commit
11a90eaf5c
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user