[PATCH v2] drm/tilcdc: Precalculate total frametime in tilcdc_crtc_set_mode()

Tomi Valkeinen tomi.valkeinen at ti.com
Fri Oct 13 11:04:09 UTC 2017



Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

On 13/10/17 12:35, Jyri Sarha wrote:
> We need the total frame refresh time to check if we are too close to
> vertical sync when updating the two framebuffer DMA registers and risk
> a collision. This new method is more accurate that the previous that
> based on mode's vrefresh value, which itself is inaccurate or may not
> even be initialized.
> 
> Reported-by: Kevin Hao <kexin.hao at windriver.com>
> Fixes: 11abbc9f39e0 ("drm/tilcdc: Set framebuffer DMA address to HW only if CRTC is enabled")
> Cc: <stable at vger.kernel.org> # v4.11+
> Signed-off-by: Jyri Sarha <jsarha at ti.com>
> ---
> Since first version:
> 
> Change frametime* variable names to hvtotal and use 64-bit division
> instead of dynamcally scaled 32-bit division as suggested by Tomi
> Valkeinen.
> 
>  drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
> index 704db24..a8b22aa 100644
> --- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
> +++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
> @@ -24,6 +24,7 @@
>  #include <linux/completion.h>
>  #include <linux/dma-mapping.h>
>  #include <linux/of_graph.h>
> +#include <linux/math64.h>
>  
>  #include "tilcdc_drv.h"
>  #include "tilcdc_regs.h"
> @@ -48,6 +49,7 @@ struct tilcdc_crtc {
>  	unsigned int lcd_fck_rate;
>  
>  	ktime_t last_vblank;
> +	unsigned int hvtotal_us;
>  
>  	struct drm_framebuffer *curr_fb;
>  	struct drm_framebuffer *next_fb;
> @@ -292,6 +294,16 @@ static void tilcdc_crtc_set_clk(struct drm_crtc *crtc)
>  				LCDC_V2_CORE_CLK_EN);
>  }
>  
> +uint tilcdc_mode_hvtotal(const struct drm_display_mode *mode)
> +{
> +	uint ret;
> +
> +	ret = (uint) div_u64(1000llu * mode->htotal * mode->vtotal,
> +			     mode->clock);
> +
> +	return ret;
> +}

I don't think "uint" is recommended. Just use u32. And drop the ret
variable, just one-line return statement should be enough.

Otherwise:

Reviewed-by: Tomi Valkeinen <tomi.valkeinen at ti.com>

 Tomi



More information about the dri-devel mailing list