[PATCH 1/2 V2] drm/amdgpu: properly handle vbios fake edid sizing
Thomas Weißschuh
linux at weissschuh.net
Wed Jul 24 05:56:19 UTC 2024
On 2024-07-23 16:51:20+0000, Alex Deucher wrote:
> The comment in the vbios structure says:
> // = 128 means EDID length is 128 bytes, otherwise the EDID length = ucFakeEDIDLength*128
>
> This fake edid struct has not been used in a long time, so I'm
> not sure if there were actually any boards out there with a non-128 byte
> EDID, but align the code with the comment.
>
> Reported-by: Thomas Weißschuh <linux at weissschuh.net>
> Link: https://lists.freedesktop.org/archives/amd-gfx/2024-June/109964.html
> Fixes: d38ceaf99ed0 ("drm/amdgpu: add core driver (v4)")
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
Reviewed-by: Thomas Weißschuh <linux at weissschuh.net>
> ---
>
> V2: Incorporate comments.
>
> .../gpu/drm/amd/amdgpu/atombios_encoders.c | 29 ++++++++++---------
> 1 file changed, 16 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
> index 25feab188dfe..ebf83fee43bb 100644
> --- a/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
> +++ b/drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
> @@ -2065,26 +2065,29 @@ amdgpu_atombios_encoder_get_lcd_info(struct amdgpu_encoder *encoder)
> fake_edid_record = (ATOM_FAKE_EDID_PATCH_RECORD *)record;
> if (fake_edid_record->ucFakeEDIDLength) {
> struct edid *edid;
> - int edid_size =
> - max((int)EDID_LENGTH, (int)fake_edid_record->ucFakeEDIDLength);
> - edid = kmalloc(edid_size, GFP_KERNEL);
> + int edid_size;
> +
> + if (fake_edid_record->ucFakeEDIDLength == 128)
> + edid_size = fake_edid_record->ucFakeEDIDLength;
> + else
> + edid_size = fake_edid_record->ucFakeEDIDLength * 128;
> + edid = kmemdup(&fake_edid_record->ucFakeEDIDString[0],
> + edid_size, GFP_KERNEL);
> if (edid) {
> - memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
> - fake_edid_record->ucFakeEDIDLength);
> -
> if (drm_edid_is_valid(edid)) {
> adev->mode_info.bios_hardcoded_edid = edid;
> adev->mode_info.bios_hardcoded_edid_size = edid_size;
> - } else
> + } else {
> kfree(edid);
> + }
> }
> + record += struct_size(fake_edid_record,
> + ucFakeEDIDString,
> + edid_size);
> + } else {
> + /* empty fake edid record must be 3 bytes long */
> + record += sizeof(ATOM_FAKE_EDID_PATCH_RECORD) + 1;
> }
> - record += fake_edid_record->ucFakeEDIDLength ?
> - struct_size(fake_edid_record,
> - ucFakeEDIDString,
> - fake_edid_record->ucFakeEDIDLength) :
> - /* empty fake edid record must be 3 bytes long */
> - sizeof(ATOM_FAKE_EDID_PATCH_RECORD) + 1;
> break;
> case LCD_PANEL_RESOLUTION_RECORD_TYPE:
> panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
> --
> 2.45.2
>
More information about the amd-gfx
mailing list