drm/amd/display: Fix ACPI edid parsing on some Lenovo systems
authorMario Limonciello <mario.limonciello@amd.com>
Fri, 4 Apr 2025 14:34:52 +0000 (09:34 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 22 Apr 2025 12:51:44 +0000 (08:51 -0400)
[Why]
The ACPI EDID in the BIOS of a Lenovo laptop includes 3 blocks, but
dm_helpers_probe_acpi_edid() has a start that is 'char'.  The 3rd
block index starts after 255, so it can't be indexed properly.
This leads to problems with the display when the EDID is parsed.

[How]
Change the variable type to 'short' so that larger values can be indexed.

Cc: Renjith Pananchikkal <renjith.pananchikkal@amd.com>
Reported-by: Mark Pearson <mpearson@lenovo.com>
Suggested-by: David Ober <dober@lenovo.com>
Fixes: c6a837088bed ("drm/amd/display: Fetch the EDID from _DDC if available for eDP")
Reviewed-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Zaeem Mohamed <zaeem.mohamed@amd.com>
Tested-by: Mark Broadworth <mark.broadworth@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c

index 62954b351ebdaa07d5ab8be375678852275f20e6..d4395b92fb85645d083dc124bd542fe9f76616ac 100644 (file)
@@ -931,7 +931,7 @@ dm_helpers_probe_acpi_edid(void *data, u8 *buf, unsigned int block, size_t len)
 {
        struct drm_connector *connector = data;
        struct acpi_device *acpidev = ACPI_COMPANION(connector->dev->dev);
-       unsigned char start = block * EDID_LENGTH;
+       unsigned short start = block * EDID_LENGTH;
        struct edid *edid;
        int r;