Re: [RFC 09/19] drm/edid: convert drm_edid_to_sad() to use cea db iter

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx>
> ---
>  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



[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux