[PATCH] drm/amd: Sanity check the ACPI EDID
Harry Wentland
harry.wentland at amd.com
Thu Nov 28 16:19:06 UTC 2024
On 2024-11-27 22:25, Mario Limonciello wrote:
> From: Mario Limonciello <mario.limonciello at amd.com>
>
> An HP Pavilion Aero Laptop 13-be0xxx/8916 has an ACPI EDID, but using
> it is causing corruption. It's got illogical values of not specifying
> a digital interface. Sanity check the ACPI EDID to avoid tripping such
> problems.
>
> Suggested-by: Tobias Jakobi <tjakobi at math.uni-bielefeld.de>
> Reported-and-tested-by: Chris Bainbridge <chris.bainbridge at gmail.com>
> Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3782
> Fixes: c6a837088bed ("drm/amd/display: Fetch the EDID from _DDC if available for eDP")
> Signed-off-by: Mario Limonciello <mario.limonciello at amd.com>
Reviewed-by: Harry Wentland <harry.wentland at amd.com>
Harry
> ---
> .../drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 13 ++++++++++---
> 1 file changed, 10 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 b0fea0856866d..6cbbb71d752be 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
> @@ -907,14 +907,14 @@ 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;
> - void *edid;
> + struct edid *edid;
> int r;
>
> if (!acpidev)
> return -ENODEV;
>
> /* fetch the entire edid from BIOS */
> - r = acpi_video_get_edid(acpidev, ACPI_VIDEO_DISPLAY_LCD, -1, &edid);
> + r = acpi_video_get_edid(acpidev, ACPI_VIDEO_DISPLAY_LCD, -1, (void *)&edid);
> if (r < 0) {
> drm_dbg(connector->dev, "Failed to get EDID from ACPI: %d\n", r);
> return r;
> @@ -924,7 +924,14 @@ dm_helpers_probe_acpi_edid(void *data, u8 *buf, unsigned int block, size_t len)
> goto cleanup;
> }
>
> - memcpy(buf, edid + start, len);
> + /* sanity check */
> + if (edid->revision < 4 || !(edid->input & DRM_EDID_INPUT_DIGITAL) ||
> + (edid->input & DRM_EDID_DIGITAL_TYPE_MASK) == DRM_EDID_DIGITAL_TYPE_UNDEF) {
> + r = -EINVAL;
> + goto cleanup;
> + }
> +
> + memcpy(buf, (void *)edid + start, len);
> r = 0;
>
> cleanup:
More information about the amd-gfx
mailing list