diff mbox series

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

Message ID fb35ac3c561f6ff98374ebeb2fb3a4fb8a22974e.1647985054.git.jani.nikula@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/edid: overhaul CEA data block iteration | expand

Commit Message

Jani Nikula March 22, 2022, 9:40 p.m. UTC
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.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 34 +++++++++-------------------------
 1 file changed, 9 insertions(+), 25 deletions(-)

Comments

Ville Syrjälä March 23, 2022, 4:18 p.m. UTC | #1
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@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
diff mbox series

Patch

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;
 }