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.nik...@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

Reply via email to