Message ID | 20240918213845.158293-8-mario.limonciello@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/amd/display: Use drm_edid for more code | expand |
Mario and Melissa, Another regression identified on this patch - DP Display is not listed as an audio device after this patch is applied. Cheers, Alex Hung On 9/18/24 15:38, Mario Limonciello wrote: > From: Melissa Wen <mwen@igalia.com> > > drm_edid_connector_update() updates display info, filling ELD with audio > info from Short-Audio Descriptors in the last step of > update_dislay_info(). Our goal is stopping using raw edid, so we can > extract SAD from drm_eld instead of access raw edid to get audio caps. > > Signed-off-by: Melissa Wen <mwen@igalia.com> > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > --- > .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 20 +++++++++---------- > 1 file changed, 10 insertions(+), 10 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 854e51c0b3fb..e0326127fd9a 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 > @@ -98,9 +98,7 @@ enum dc_edid_status dm_helpers_parse_edid_caps( > const struct drm_edid *drm_edid = aconnector->drm_edid; > struct drm_edid_product_id product_id; > struct edid *edid_buf = edid ? (struct edid *) edid->raw_edid : NULL; > - struct cea_sad *sads; > - int sad_count = -1; > - int sadb_count = -1; > + int sad_count, sadb_count; > int i = 0; > uint8_t *sadb = NULL; > > @@ -129,18 +127,21 @@ enum dc_edid_status dm_helpers_parse_edid_caps( > > apply_edid_quirks(&product_id, edid_caps); > > - sad_count = drm_edid_to_sad((struct edid *) edid->raw_edid, &sads); > + sad_count = drm_eld_sad_count(connector->eld); > if (sad_count <= 0) > return result; > > edid_caps->audio_mode_count = min(sad_count, DC_MAX_AUDIO_DESC_COUNT); > for (i = 0; i < edid_caps->audio_mode_count; ++i) { > - struct cea_sad *sad = &sads[i]; > + struct cea_sad sad; > > - edid_caps->audio_modes[i].format_code = sad->format; > - edid_caps->audio_modes[i].channel_count = sad->channels + 1; > - edid_caps->audio_modes[i].sample_rate = sad->freq; > - edid_caps->audio_modes[i].sample_size = sad->byte2; > + if (drm_eld_sad_get(connector->eld, i, &sad) < 0) > + continue; > + > + edid_caps->audio_modes[i].format_code = sad.format; > + edid_caps->audio_modes[i].channel_count = sad.channels + 1; > + edid_caps->audio_modes[i].sample_rate = sad.freq; > + edid_caps->audio_modes[i].sample_size = sad.byte2; > } > > sadb_count = drm_edid_to_speaker_allocation((struct edid *) edid->raw_edid, &sadb); > @@ -155,7 +156,6 @@ enum dc_edid_status dm_helpers_parse_edid_caps( > else > edid_caps->speaker_flags = DEFAULT_SPEAKER_LOCATION; > > - kfree(sads); > kfree(sadb); > > return result;
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 854e51c0b3fb..e0326127fd9a 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 @@ -98,9 +98,7 @@ enum dc_edid_status dm_helpers_parse_edid_caps( const struct drm_edid *drm_edid = aconnector->drm_edid; struct drm_edid_product_id product_id; struct edid *edid_buf = edid ? (struct edid *) edid->raw_edid : NULL; - struct cea_sad *sads; - int sad_count = -1; - int sadb_count = -1; + int sad_count, sadb_count; int i = 0; uint8_t *sadb = NULL; @@ -129,18 +127,21 @@ enum dc_edid_status dm_helpers_parse_edid_caps( apply_edid_quirks(&product_id, edid_caps); - sad_count = drm_edid_to_sad((struct edid *) edid->raw_edid, &sads); + sad_count = drm_eld_sad_count(connector->eld); if (sad_count <= 0) return result; edid_caps->audio_mode_count = min(sad_count, DC_MAX_AUDIO_DESC_COUNT); for (i = 0; i < edid_caps->audio_mode_count; ++i) { - struct cea_sad *sad = &sads[i]; + struct cea_sad sad; - edid_caps->audio_modes[i].format_code = sad->format; - edid_caps->audio_modes[i].channel_count = sad->channels + 1; - edid_caps->audio_modes[i].sample_rate = sad->freq; - edid_caps->audio_modes[i].sample_size = sad->byte2; + if (drm_eld_sad_get(connector->eld, i, &sad) < 0) + continue; + + edid_caps->audio_modes[i].format_code = sad.format; + edid_caps->audio_modes[i].channel_count = sad.channels + 1; + edid_caps->audio_modes[i].sample_rate = sad.freq; + edid_caps->audio_modes[i].sample_size = sad.byte2; } sadb_count = drm_edid_to_speaker_allocation((struct edid *) edid->raw_edid, &sadb); @@ -155,7 +156,6 @@ enum dc_edid_status dm_helpers_parse_edid_caps( else edid_caps->speaker_flags = DEFAULT_SPEAKER_LOCATION; - kfree(sads); kfree(sadb); return result;