LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH] drm/stm: ltdc: add mode_valid()
@ 2018-04-17 11:40 Philippe Cornu
  2018-04-25  7:12 ` Yannick FERTRE
  0 siblings, 1 reply; 3+ messages in thread
From: Philippe Cornu @ 2018-04-17 11:40 UTC (permalink / raw)
  To: Yannick Fertre, Philippe Cornu, Benjamin Gaignard,
	Vincent Abriou, David Airlie, dri-devel, linux-kernel
  Cc: Alexandre Torgue

Add mode_valid() function to filter modes according to available
pll clock values and "preferred" modes. It is particularly
useful for hdmi modes that require precise pixel clocks.

Note that "preferred" modes are always accepted:
- this is important for panels because panel clock tolerances are
  bigger than hdmi ones and there is no reason to not accept them
  (the fps may vary a little but it is not a problem).
- the hdmi preferred mode will be accepted too, but userland will
  be able to use others hdmi "valid" modes if necessary.

Signed-off-by: Philippe Cornu <philippe.cornu@st.com>
---
 drivers/gpu/drm/stm/ltdc.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c
index 014cef8cef37..616191fe98ae 100644
--- a/drivers/gpu/drm/stm/ltdc.c
+++ b/drivers/gpu/drm/stm/ltdc.c
@@ -445,6 +445,43 @@ static void ltdc_crtc_atomic_disable(struct drm_crtc *crtc,
 	reg_set(ldev->regs, LTDC_SRCR, SRCR_IMR);
 }
 
+#define CLK_TOLERANCE_HZ 50
+
+static enum drm_mode_status
+ltdc_crtc_mode_valid(struct drm_crtc *crtc,
+		     const struct drm_display_mode *mode)
+{
+	struct ltdc_device *ldev = crtc_to_ltdc(crtc);
+	int target = mode->clock * 1000;
+	int target_min = target - CLK_TOLERANCE_HZ;
+	int target_max = target + CLK_TOLERANCE_HZ;
+	int result;
+
+	/*
+	 * Accept all "preferred" modes:
+	 * - this is important for panels because panel clock tolerances are
+	 *   bigger than hdmi ones and there is no reason to not accept them
+	 *   (the fps may vary a little but it is not a problem).
+	 * - the hdmi preferred mode will be accepted too, but userland will
+	 *   be able to use others hdmi "valid" modes if necessary.
+	 */
+	if (mode->type & DRM_MODE_TYPE_PREFERRED)
+		return MODE_OK;
+
+	result = clk_round_rate(ldev->pixel_clk, target);
+
+	DRM_DEBUG_DRIVER("clk rate target %d, available %d\n", target, result);
+
+	/*
+	 * Filter modes according to the clock value, particularly useful for
+	 * hdmi modes that require precise pixel clocks.
+	 */
+	if (result < target_min || result > target_max)
+		return MODE_CLOCK_RANGE;
+
+	return MODE_OK;
+}
+
 static bool ltdc_crtc_mode_fixup(struct drm_crtc *crtc,
 				 const struct drm_display_mode *mode,
 				 struct drm_display_mode *adjusted_mode)
@@ -559,6 +596,7 @@ static void ltdc_crtc_atomic_flush(struct drm_crtc *crtc,
 }
 
 static const struct drm_crtc_helper_funcs ltdc_crtc_helper_funcs = {
+	.mode_valid = ltdc_crtc_mode_valid,
 	.mode_fixup = ltdc_crtc_mode_fixup,
 	.mode_set_nofb = ltdc_crtc_mode_set_nofb,
 	.atomic_flush = ltdc_crtc_atomic_flush,
-- 
2.15.1

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] drm/stm: ltdc: add mode_valid()
  2018-04-17 11:40 [PATCH] drm/stm: ltdc: add mode_valid() Philippe Cornu
@ 2018-04-25  7:12 ` Yannick FERTRE
  2018-04-27 12:59   ` Philippe CORNU
  0 siblings, 1 reply; 3+ messages in thread
From: Yannick FERTRE @ 2018-04-25  7:12 UTC (permalink / raw)
  To: Philippe CORNU, Benjamin Gaignard, Vincent ABRIOU, David Airlie,
	dri-devel, linux-kernel
  Cc: Alexandre TORGUE

Hi Philippe,

Reviewed-by: Yannick Fertré <yannick.fertre@st.com>

On 04/17/2018 01:40 PM, Philippe Cornu wrote:
> Add mode_valid() function to filter modes according to available
> pll clock values and "preferred" modes. It is particularly
> useful for hdmi modes that require precise pixel clocks.
> 
> Note that "preferred" modes are always accepted:
> - this is important for panels because panel clock tolerances are
>    bigger than hdmi ones and there is no reason to not accept them
>    (the fps may vary a little but it is not a problem).
> - the hdmi preferred mode will be accepted too, but userland will
>    be able to use others hdmi "valid" modes if necessary.
> 
> Signed-off-by: Philippe Cornu <philippe.cornu@st.com>
> ---
>   drivers/gpu/drm/stm/ltdc.c | 38 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 38 insertions(+)
> 
> diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c
> index 014cef8cef37..616191fe98ae 100644
> --- a/drivers/gpu/drm/stm/ltdc.c
> +++ b/drivers/gpu/drm/stm/ltdc.c
> @@ -445,6 +445,43 @@ static void ltdc_crtc_atomic_disable(struct drm_crtc *crtc,
>   	reg_set(ldev->regs, LTDC_SRCR, SRCR_IMR);
>   }
>   
> +#define CLK_TOLERANCE_HZ 50
> +
> +static enum drm_mode_status
> +ltdc_crtc_mode_valid(struct drm_crtc *crtc,
> +		     const struct drm_display_mode *mode)
> +{
> +	struct ltdc_device *ldev = crtc_to_ltdc(crtc);
> +	int target = mode->clock * 1000;
> +	int target_min = target - CLK_TOLERANCE_HZ;
> +	int target_max = target + CLK_TOLERANCE_HZ;
> +	int result;
> +
> +	/*
> +	 * Accept all "preferred" modes:
> +	 * - this is important for panels because panel clock tolerances are
> +	 *   bigger than hdmi ones and there is no reason to not accept them
> +	 *   (the fps may vary a little but it is not a problem).
> +	 * - the hdmi preferred mode will be accepted too, but userland will
> +	 *   be able to use others hdmi "valid" modes if necessary.
> +	 */
> +	if (mode->type & DRM_MODE_TYPE_PREFERRED)
> +		return MODE_OK;
> +
> +	result = clk_round_rate(ldev->pixel_clk, target);
> +
> +	DRM_DEBUG_DRIVER("clk rate target %d, available %d\n", target, result);
> +
> +	/*
> +	 * Filter modes according to the clock value, particularly useful for
> +	 * hdmi modes that require precise pixel clocks.
> +	 */
> +	if (result < target_min || result > target_max)
> +		return MODE_CLOCK_RANGE;
> +
> +	return MODE_OK;
> +}
> +
>   static bool ltdc_crtc_mode_fixup(struct drm_crtc *crtc,
>   				 const struct drm_display_mode *mode,
>   				 struct drm_display_mode *adjusted_mode)
> @@ -559,6 +596,7 @@ static void ltdc_crtc_atomic_flush(struct drm_crtc *crtc,
>   }
>   
>   static const struct drm_crtc_helper_funcs ltdc_crtc_helper_funcs = {
> +	.mode_valid = ltdc_crtc_mode_valid,
>   	.mode_fixup = ltdc_crtc_mode_fixup,
>   	.mode_set_nofb = ltdc_crtc_mode_set_nofb,
>   	.atomic_flush = ltdc_crtc_atomic_flush,
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] drm/stm: ltdc: add mode_valid()
  2018-04-25  7:12 ` Yannick FERTRE
@ 2018-04-27 12:59   ` Philippe CORNU
  0 siblings, 0 replies; 3+ messages in thread
From: Philippe CORNU @ 2018-04-27 12:59 UTC (permalink / raw)
  To: Yannick FERTRE, Benjamin Gaignard, Vincent ABRIOU, David Airlie,
	dri-devel, linux-kernel
  Cc: Alexandre TORGUE



On 04/25/2018 09:12 AM, Yannick FERTRE wrote:
> Hi Philippe,
> 
> Reviewed-by: Yannick Fertré <yannick.fertre@st.com>
> 

Applied on drm-misc-next.
Many thanks,
Philippe :-)

> On 04/17/2018 01:40 PM, Philippe Cornu wrote:
>> Add mode_valid() function to filter modes according to available
>> pll clock values and "preferred" modes. It is particularly
>> useful for hdmi modes that require precise pixel clocks.
>>
>> Note that "preferred" modes are always accepted:
>> - this is important for panels because panel clock tolerances are
>>     bigger than hdmi ones and there is no reason to not accept them
>>     (the fps may vary a little but it is not a problem).
>> - the hdmi preferred mode will be accepted too, but userland will
>>     be able to use others hdmi "valid" modes if necessary.
>>
>> Signed-off-by: Philippe Cornu <philippe.cornu@st.com>
>> ---
>>    drivers/gpu/drm/stm/ltdc.c | 38 ++++++++++++++++++++++++++++++++++++++
>>    1 file changed, 38 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c
>> index 014cef8cef37..616191fe98ae 100644
>> --- a/drivers/gpu/drm/stm/ltdc.c
>> +++ b/drivers/gpu/drm/stm/ltdc.c
>> @@ -445,6 +445,43 @@ static void ltdc_crtc_atomic_disable(struct drm_crtc *crtc,
>>    	reg_set(ldev->regs, LTDC_SRCR, SRCR_IMR);
>>    }
>>    
>> +#define CLK_TOLERANCE_HZ 50
>> +
>> +static enum drm_mode_status
>> +ltdc_crtc_mode_valid(struct drm_crtc *crtc,
>> +		     const struct drm_display_mode *mode)
>> +{
>> +	struct ltdc_device *ldev = crtc_to_ltdc(crtc);
>> +	int target = mode->clock * 1000;
>> +	int target_min = target - CLK_TOLERANCE_HZ;
>> +	int target_max = target + CLK_TOLERANCE_HZ;
>> +	int result;
>> +
>> +	/*
>> +	 * Accept all "preferred" modes:
>> +	 * - this is important for panels because panel clock tolerances are
>> +	 *   bigger than hdmi ones and there is no reason to not accept them
>> +	 *   (the fps may vary a little but it is not a problem).
>> +	 * - the hdmi preferred mode will be accepted too, but userland will
>> +	 *   be able to use others hdmi "valid" modes if necessary.
>> +	 */
>> +	if (mode->type & DRM_MODE_TYPE_PREFERRED)
>> +		return MODE_OK;
>> +
>> +	result = clk_round_rate(ldev->pixel_clk, target);
>> +
>> +	DRM_DEBUG_DRIVER("clk rate target %d, available %d\n", target, result);
>> +
>> +	/*
>> +	 * Filter modes according to the clock value, particularly useful for
>> +	 * hdmi modes that require precise pixel clocks.
>> +	 */
>> +	if (result < target_min || result > target_max)
>> +		return MODE_CLOCK_RANGE;
>> +
>> +	return MODE_OK;
>> +}
>> +
>>    static bool ltdc_crtc_mode_fixup(struct drm_crtc *crtc,
>>    				 const struct drm_display_mode *mode,
>>    				 struct drm_display_mode *adjusted_mode)
>> @@ -559,6 +596,7 @@ static void ltdc_crtc_atomic_flush(struct drm_crtc *crtc,
>>    }
>>    
>>    static const struct drm_crtc_helper_funcs ltdc_crtc_helper_funcs = {
>> +	.mode_valid = ltdc_crtc_mode_valid,
>>    	.mode_fixup = ltdc_crtc_mode_fixup,
>>    	.mode_set_nofb = ltdc_crtc_mode_set_nofb,
>>    	.atomic_flush = ltdc_crtc_atomic_flush,

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-04-27 13:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-17 11:40 [PATCH] drm/stm: ltdc: add mode_valid() Philippe Cornu
2018-04-25  7:12 ` Yannick FERTRE
2018-04-27 12:59   ` Philippe CORNU

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).