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@xxxxxxxxxxxxxx> > 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@xxxxxxx> Reviewed-by: Thomas Weißschuh <linux@xxxxxxxxxxxxxx> > --- > > 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 >