All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tom Anderson <thomasanderson@google.com>
To: Ville Syrjala <ville.syrjala@linux.intel.com>
Cc: Hans Verkuil <hansverk@cisco.com>,
	Manasi Navare <manasi.d.navare@intel.com>,
	intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v4 1/4] drm/edid: Abstract away cea_edid_modes[]
Date: Fri, 13 Dec 2019 13:03:30 -0800	[thread overview]
Message-ID: <20191213210330.GA131138@google.com> (raw)
In-Reply-To: <20191213174348.27261-2-ville.syrjala@linux.intel.com>

Latest patch looks good to me, thanks for the changes!

Reviewed-by: Thomas Anderson <thomasanderson@google.com>

On Fri, Dec 13, 2019 at 07:43:45PM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> We're going to need two cea mode tables (one for VICs < 128,
> another one for VICs >= 193). To that end replace the direct
> edid_cea_modes[] lookups with a function call. And we'll rename
> the array to edid_cea_modes_0[] to indicate how it's to be
> indexed.
> 
> v2: Fix typos (Tom)
>     Drop the pointless NULL checks in the loops (Tom)
>     Assign when declaring (Tom)
>     Improve the comment for cea_modes_*[] to indicate
>     that one should always use cea_mode_for_vic() (Tom)
> 
> Cc: Tom Anderson <thomasanderson@google.com>
> Cc: Hans Verkuil <hansverk@cisco.com>
> Cc: Manasi Navare <manasi.d.navare@intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/drm_edid.c | 67 +++++++++++++++++++++++++-------------
>  1 file changed, 45 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 5b33b7cfd645..00a543b9daab 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -710,12 +710,11 @@ static const struct minimode extra_modes[] = {
>  };
>  
>  /*
> - * Probably taken from CEA-861 spec.
> - * This table is converted from xorg's hw/xfree86/modes/xf86EdidModes.c.
> + * From CEA/CTA-861 spec.
>   *
> - * Index using the VIC.
> + * Do not access directly, instead always use cea_mode_for_vic().
>   */
> -static const struct drm_display_mode edid_cea_modes[] = {
> +static const struct drm_display_mode edid_cea_modes_0[] = {
>  	/* 0 - dummy, VICs start at 1 */
>  	{ },
>  	/* 1 - 640x480@60Hz 4:3 */
> @@ -3071,6 +3070,25 @@ static u8 *drm_find_cea_extension(const struct edid *edid)
>  	return cea;
>  }
>  
> +static const struct drm_display_mode *cea_mode_for_vic(u8 vic)
> +{
> +	if (!vic)
> +		return NULL;
> +	if (vic < ARRAY_SIZE(edid_cea_modes_0))
> +		return &edid_cea_modes_0[vic];
> +	return NULL;
> +}
> +
> +static u8 cea_num_vics(void)
> +{
> +	return ARRAY_SIZE(edid_cea_modes_0);
> +}
> +
> +static u8 cea_next_vic(u8 vic)
> +{
> +	return vic + 1;
> +}
> +
>  /*
>   * Calculate the alternate clock for the CEA mode
>   * (60Hz vs. 59.94Hz etc.)
> @@ -3108,14 +3126,14 @@ cea_mode_alternate_timings(u8 vic, struct drm_display_mode *mode)
>  	 * get the other variants by simply increasing the
>  	 * vertical front porch length.
>  	 */
> -	BUILD_BUG_ON(edid_cea_modes[8].vtotal != 262 ||
> -		     edid_cea_modes[9].vtotal != 262 ||
> -		     edid_cea_modes[12].vtotal != 262 ||
> -		     edid_cea_modes[13].vtotal != 262 ||
> -		     edid_cea_modes[23].vtotal != 312 ||
> -		     edid_cea_modes[24].vtotal != 312 ||
> -		     edid_cea_modes[27].vtotal != 312 ||
> -		     edid_cea_modes[28].vtotal != 312);
> +	BUILD_BUG_ON(cea_mode_for_vic(8)->vtotal != 262 ||
> +		     cea_mode_for_vic(9)->vtotal != 262 ||
> +		     cea_mode_for_vic(12)->vtotal != 262 ||
> +		     cea_mode_for_vic(13)->vtotal != 262 ||
> +		     cea_mode_for_vic(23)->vtotal != 312 ||
> +		     cea_mode_for_vic(24)->vtotal != 312 ||
> +		     cea_mode_for_vic(27)->vtotal != 312 ||
> +		     cea_mode_for_vic(28)->vtotal != 312);
>  
>  	if (((vic == 8 || vic == 9 ||
>  	      vic == 12 || vic == 13) && mode->vtotal < 263) ||
> @@ -3143,8 +3161,8 @@ static u8 drm_match_cea_mode_clock_tolerance(const struct drm_display_mode *to_m
>  	if (to_match->picture_aspect_ratio)
>  		match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
>  
> -	for (vic = 1; vic < ARRAY_SIZE(edid_cea_modes); vic++) {
> -		struct drm_display_mode cea_mode = edid_cea_modes[vic];
> +	for (vic = 1; vic < cea_num_vics(); vic = cea_next_vic(vic)) {
> +		struct drm_display_mode cea_mode = *cea_mode_for_vic(vic);
>  		unsigned int clock1, clock2;
>  
>  		/* Check both 60Hz and 59.94Hz */
> @@ -3182,8 +3200,8 @@ u8 drm_match_cea_mode(const struct drm_display_mode *to_match)
>  	if (to_match->picture_aspect_ratio)
>  		match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
>  
> -	for (vic = 1; vic < ARRAY_SIZE(edid_cea_modes); vic++) {
> -		struct drm_display_mode cea_mode = edid_cea_modes[vic];
> +	for (vic = 1; vic < cea_num_vics(); vic = cea_next_vic(vic)) {
> +		struct drm_display_mode cea_mode = *cea_mode_for_vic(vic);
>  		unsigned int clock1, clock2;
>  
>  		/* Check both 60Hz and 59.94Hz */
> @@ -3206,12 +3224,17 @@ EXPORT_SYMBOL(drm_match_cea_mode);
>  
>  static bool drm_valid_cea_vic(u8 vic)
>  {
> -	return vic > 0 && vic < ARRAY_SIZE(edid_cea_modes);
> +	return cea_mode_for_vic(vic) != NULL;
>  }
>  
>  static enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code)
>  {
> -	return edid_cea_modes[video_code].picture_aspect_ratio;
> +	const struct drm_display_mode *mode = cea_mode_for_vic(video_code);
> +
> +	if (mode)
> +		return mode->picture_aspect_ratio;
> +
> +	return HDMI_PICTURE_ASPECT_NONE;
>  }
>  
>  static enum hdmi_picture_aspect drm_get_hdmi_aspect_ratio(const u8 video_code)
> @@ -3323,7 +3346,7 @@ add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid)
>  		unsigned int clock1, clock2;
>  
>  		if (drm_valid_cea_vic(vic)) {
> -			cea_mode = &edid_cea_modes[vic];
> +			cea_mode = cea_mode_for_vic(vic);
>  			clock2 = cea_mode_alternate_clock(cea_mode);
>  		} else {
>  			vic = drm_match_hdmi_mode(mode);
> @@ -3398,7 +3421,7 @@ drm_display_mode_from_vic_index(struct drm_connector *connector,
>  	if (!drm_valid_cea_vic(vic))
>  		return NULL;
>  
> -	newmode = drm_mode_duplicate(dev, &edid_cea_modes[vic]);
> +	newmode = drm_mode_duplicate(dev, cea_mode_for_vic(vic));
>  	if (!newmode)
>  		return NULL;
>  
> @@ -3432,7 +3455,7 @@ static int do_y420vdb_modes(struct drm_connector *connector,
>  		if (!drm_valid_cea_vic(vic))
>  			continue;
>  
> -		newmode = drm_mode_duplicate(dev, &edid_cea_modes[vic]);
> +		newmode = drm_mode_duplicate(dev, cea_mode_for_vic(vic));
>  		if (!newmode)
>  			break;
>  		bitmap_set(hdmi->y420_vdb_modes, vic, 1);
> @@ -4001,7 +4024,7 @@ static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode)
>  	vic = drm_match_cea_mode_clock_tolerance(mode, 5);
>  	if (drm_valid_cea_vic(vic)) {
>  		type = "CEA";
> -		cea_mode = &edid_cea_modes[vic];
> +		cea_mode = cea_mode_for_vic(vic);
>  		clock1 = cea_mode->clock;
>  		clock2 = cea_mode_alternate_clock(cea_mode);
>  	} else {
> -- 
> 2.23.0
> 
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

WARNING: multiple messages have this Message-ID (diff)
From: Tom Anderson <thomasanderson@google.com>
To: Ville Syrjala <ville.syrjala@linux.intel.com>
Cc: Hans Verkuil <hansverk@cisco.com>,
	intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH v4 1/4] drm/edid: Abstract away cea_edid_modes[]
Date: Fri, 13 Dec 2019 13:03:30 -0800	[thread overview]
Message-ID: <20191213210330.GA131138@google.com> (raw)
In-Reply-To: <20191213174348.27261-2-ville.syrjala@linux.intel.com>

Latest patch looks good to me, thanks for the changes!

Reviewed-by: Thomas Anderson <thomasanderson@google.com>

On Fri, Dec 13, 2019 at 07:43:45PM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> We're going to need two cea mode tables (one for VICs < 128,
> another one for VICs >= 193). To that end replace the direct
> edid_cea_modes[] lookups with a function call. And we'll rename
> the array to edid_cea_modes_0[] to indicate how it's to be
> indexed.
> 
> v2: Fix typos (Tom)
>     Drop the pointless NULL checks in the loops (Tom)
>     Assign when declaring (Tom)
>     Improve the comment for cea_modes_*[] to indicate
>     that one should always use cea_mode_for_vic() (Tom)
> 
> Cc: Tom Anderson <thomasanderson@google.com>
> Cc: Hans Verkuil <hansverk@cisco.com>
> Cc: Manasi Navare <manasi.d.navare@intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/drm_edid.c | 67 +++++++++++++++++++++++++-------------
>  1 file changed, 45 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 5b33b7cfd645..00a543b9daab 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -710,12 +710,11 @@ static const struct minimode extra_modes[] = {
>  };
>  
>  /*
> - * Probably taken from CEA-861 spec.
> - * This table is converted from xorg's hw/xfree86/modes/xf86EdidModes.c.
> + * From CEA/CTA-861 spec.
>   *
> - * Index using the VIC.
> + * Do not access directly, instead always use cea_mode_for_vic().
>   */
> -static const struct drm_display_mode edid_cea_modes[] = {
> +static const struct drm_display_mode edid_cea_modes_0[] = {
>  	/* 0 - dummy, VICs start at 1 */
>  	{ },
>  	/* 1 - 640x480@60Hz 4:3 */
> @@ -3071,6 +3070,25 @@ static u8 *drm_find_cea_extension(const struct edid *edid)
>  	return cea;
>  }
>  
> +static const struct drm_display_mode *cea_mode_for_vic(u8 vic)
> +{
> +	if (!vic)
> +		return NULL;
> +	if (vic < ARRAY_SIZE(edid_cea_modes_0))
> +		return &edid_cea_modes_0[vic];
> +	return NULL;
> +}
> +
> +static u8 cea_num_vics(void)
> +{
> +	return ARRAY_SIZE(edid_cea_modes_0);
> +}
> +
> +static u8 cea_next_vic(u8 vic)
> +{
> +	return vic + 1;
> +}
> +
>  /*
>   * Calculate the alternate clock for the CEA mode
>   * (60Hz vs. 59.94Hz etc.)
> @@ -3108,14 +3126,14 @@ cea_mode_alternate_timings(u8 vic, struct drm_display_mode *mode)
>  	 * get the other variants by simply increasing the
>  	 * vertical front porch length.
>  	 */
> -	BUILD_BUG_ON(edid_cea_modes[8].vtotal != 262 ||
> -		     edid_cea_modes[9].vtotal != 262 ||
> -		     edid_cea_modes[12].vtotal != 262 ||
> -		     edid_cea_modes[13].vtotal != 262 ||
> -		     edid_cea_modes[23].vtotal != 312 ||
> -		     edid_cea_modes[24].vtotal != 312 ||
> -		     edid_cea_modes[27].vtotal != 312 ||
> -		     edid_cea_modes[28].vtotal != 312);
> +	BUILD_BUG_ON(cea_mode_for_vic(8)->vtotal != 262 ||
> +		     cea_mode_for_vic(9)->vtotal != 262 ||
> +		     cea_mode_for_vic(12)->vtotal != 262 ||
> +		     cea_mode_for_vic(13)->vtotal != 262 ||
> +		     cea_mode_for_vic(23)->vtotal != 312 ||
> +		     cea_mode_for_vic(24)->vtotal != 312 ||
> +		     cea_mode_for_vic(27)->vtotal != 312 ||
> +		     cea_mode_for_vic(28)->vtotal != 312);
>  
>  	if (((vic == 8 || vic == 9 ||
>  	      vic == 12 || vic == 13) && mode->vtotal < 263) ||
> @@ -3143,8 +3161,8 @@ static u8 drm_match_cea_mode_clock_tolerance(const struct drm_display_mode *to_m
>  	if (to_match->picture_aspect_ratio)
>  		match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
>  
> -	for (vic = 1; vic < ARRAY_SIZE(edid_cea_modes); vic++) {
> -		struct drm_display_mode cea_mode = edid_cea_modes[vic];
> +	for (vic = 1; vic < cea_num_vics(); vic = cea_next_vic(vic)) {
> +		struct drm_display_mode cea_mode = *cea_mode_for_vic(vic);
>  		unsigned int clock1, clock2;
>  
>  		/* Check both 60Hz and 59.94Hz */
> @@ -3182,8 +3200,8 @@ u8 drm_match_cea_mode(const struct drm_display_mode *to_match)
>  	if (to_match->picture_aspect_ratio)
>  		match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
>  
> -	for (vic = 1; vic < ARRAY_SIZE(edid_cea_modes); vic++) {
> -		struct drm_display_mode cea_mode = edid_cea_modes[vic];
> +	for (vic = 1; vic < cea_num_vics(); vic = cea_next_vic(vic)) {
> +		struct drm_display_mode cea_mode = *cea_mode_for_vic(vic);
>  		unsigned int clock1, clock2;
>  
>  		/* Check both 60Hz and 59.94Hz */
> @@ -3206,12 +3224,17 @@ EXPORT_SYMBOL(drm_match_cea_mode);
>  
>  static bool drm_valid_cea_vic(u8 vic)
>  {
> -	return vic > 0 && vic < ARRAY_SIZE(edid_cea_modes);
> +	return cea_mode_for_vic(vic) != NULL;
>  }
>  
>  static enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code)
>  {
> -	return edid_cea_modes[video_code].picture_aspect_ratio;
> +	const struct drm_display_mode *mode = cea_mode_for_vic(video_code);
> +
> +	if (mode)
> +		return mode->picture_aspect_ratio;
> +
> +	return HDMI_PICTURE_ASPECT_NONE;
>  }
>  
>  static enum hdmi_picture_aspect drm_get_hdmi_aspect_ratio(const u8 video_code)
> @@ -3323,7 +3346,7 @@ add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid)
>  		unsigned int clock1, clock2;
>  
>  		if (drm_valid_cea_vic(vic)) {
> -			cea_mode = &edid_cea_modes[vic];
> +			cea_mode = cea_mode_for_vic(vic);
>  			clock2 = cea_mode_alternate_clock(cea_mode);
>  		} else {
>  			vic = drm_match_hdmi_mode(mode);
> @@ -3398,7 +3421,7 @@ drm_display_mode_from_vic_index(struct drm_connector *connector,
>  	if (!drm_valid_cea_vic(vic))
>  		return NULL;
>  
> -	newmode = drm_mode_duplicate(dev, &edid_cea_modes[vic]);
> +	newmode = drm_mode_duplicate(dev, cea_mode_for_vic(vic));
>  	if (!newmode)
>  		return NULL;
>  
> @@ -3432,7 +3455,7 @@ static int do_y420vdb_modes(struct drm_connector *connector,
>  		if (!drm_valid_cea_vic(vic))
>  			continue;
>  
> -		newmode = drm_mode_duplicate(dev, &edid_cea_modes[vic]);
> +		newmode = drm_mode_duplicate(dev, cea_mode_for_vic(vic));
>  		if (!newmode)
>  			break;
>  		bitmap_set(hdmi->y420_vdb_modes, vic, 1);
> @@ -4001,7 +4024,7 @@ static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode)
>  	vic = drm_match_cea_mode_clock_tolerance(mode, 5);
>  	if (drm_valid_cea_vic(vic)) {
>  		type = "CEA";
> -		cea_mode = &edid_cea_modes[vic];
> +		cea_mode = cea_mode_for_vic(vic);
>  		clock1 = cea_mode->clock;
>  		clock2 = cea_mode_alternate_clock(cea_mode);
>  	} else {
> -- 
> 2.23.0
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2019-12-14 14:44 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-13 17:43 [PATCH v4 0/4] drm/edid: Add new modes from CTA-861-G Ville Syrjala
2019-12-13 17:43 ` [Intel-gfx] " Ville Syrjala
2019-12-13 17:43 ` [PATCH v4 1/4] drm/edid: Abstract away cea_edid_modes[] Ville Syrjala
2019-12-13 17:43   ` [Intel-gfx] " Ville Syrjala
2019-12-13 21:03   ` Tom Anderson [this message]
2019-12-13 21:03     ` Tom Anderson
2019-12-16 15:23     ` Ville Syrjälä
2019-12-16 15:23       ` [Intel-gfx] " Ville Syrjälä
2019-12-13 17:43 ` [PATCH v4 2/4] drm/edid: Add CTA-861-G modes with VIC >= 193 Ville Syrjala
2019-12-13 17:43   ` [Intel-gfx] " Ville Syrjala
2019-12-13 17:43 ` [PATCH v4 3/4] drm/edid: Throw away the dummy VIC 0 cea mode Ville Syrjala
2019-12-13 17:43   ` [Intel-gfx] " Ville Syrjala
2019-12-13 21:05   ` Tom Anderson
2019-12-13 21:05     ` [Intel-gfx] " Tom Anderson
2019-12-13 17:43 ` [PATCH v4 4/4] drm/edid: Make sure the CEA mode arrays have the correct amount of modes Ville Syrjala
2019-12-13 17:43   ` [Intel-gfx] " Ville Syrjala
2019-12-14  0:29 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/edid: Add new modes from CTA-861-G (rev3) Patchwork
2019-12-14  1:04 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2019-12-15  0:13 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191213210330.GA131138@google.com \
    --to=thomasanderson@google.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hansverk@cisco.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=manasi.d.navare@intel.com \
    --cc=ville.syrjala@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.