[Intel-gfx] [RFC 09/19] drm/edid: convert drm_edid_to_sad() to use cea db iter
Ville Syrjälä
ville.syrjala at linux.intel.com
Wed Mar 23 16:18:40 UTC 2022
On Tue, Mar 22, 2022 at 11:40:38PM +0200, Jani Nikula wrote:
> Use the cea db iterator for short audio descriptors. We'll still stop at
> the first audio data block, but not at the first CEA extension if that
> doesn't have the info.
This stuff should probably be converted over to the drm_edid_to_eld()
approach which looks up all the SADs from the whole EDID. But that's
something for amdgpu/radeon folks to think about since they're the only
user.
>
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
> ---
> drivers/gpu/drm/drm_edid.c | 34 +++++++++-------------------------
> 1 file changed, 9 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 992b3578a73f..e341790521d6 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -4854,40 +4854,21 @@ static void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
> */
> int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads)
> {
> + const struct cea_db *db;
> + struct cea_db_iter iter;
> int count = 0;
> - int i, start, end, dbl;
> - const u8 *cea;
> -
> - cea = drm_find_cea_extension(edid);
> - if (!cea) {
> - DRM_DEBUG_KMS("SAD: no CEA Extension found\n");
> - return 0;
> - }
> -
> - if (cea_revision(cea) < 3) {
> - DRM_DEBUG_KMS("SAD: wrong CEA revision\n");
> - return 0;
> - }
> -
> - if (cea_db_offsets(cea, &start, &end)) {
> - DRM_DEBUG_KMS("SAD: invalid data block offsets\n");
> - return -EPROTO;
> - }
> -
> - for_each_cea_db(cea, i, start, end) {
> - const u8 *db = &cea[i];
>
> + cea_db_iter_edid_begin(edid, &iter);
> + cea_db_iter_for_each(db, &iter) {
> if (cea_db_tag(db) == CEA_DB_AUDIO) {
> int j;
>
> - dbl = cea_db_payload_len(db);
> -
> - count = dbl / 3; /* SAD is 3B */
> + count = cea_db_payload_len(db) / 3; /* SAD is 3B */
> *sads = kcalloc(count, sizeof(**sads), GFP_KERNEL);
> if (!*sads)
> return -ENOMEM;
> for (j = 0; j < count; j++) {
> - const u8 *sad = &db[1 + j * 3];
> + const u8 *sad = &db->data[j * 3];
>
> (*sads)[j].format = (sad[0] & 0x78) >> 3;
> (*sads)[j].channels = sad[0] & 0x7;
> @@ -4897,6 +4878,9 @@ int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads)
> break;
> }
> }
> + cea_db_iter_end(&iter);
> +
> + DRM_DEBUG_KMS("Found %d Short Audio Descriptors\n", count);
>
> return count;
> }
> --
> 2.30.2
--
Ville Syrjälä
Intel
More information about the Intel-gfx
mailing list