Re: [PATCH] omapdss: dispc: Preload more data in pipeline DMAs for OMAP4+ SoCs

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

 



On 2013-12-17 13:10, Archit Taneja wrote:
> DISPC pipeline DMAs preload some bytes of pixel data in the vertical blanking
> region before the start of each frame. The preload ensures the pipeline doesn't
> underflow when the active region of the display starts.
> 
> DISPC_GFX/VIDp_PRELOAD registers allow us to program how many bytes of data
> should be preloaded for each pipeline. Calculating a precise preload value
> would be a complex function of the pixel clock of the connected display, the
> vertical blanking duration and the interconnect traffic at that instance. If
> the register is left untouched, a default value is preloaded.
> 
> We observe underflows for OMAP4+ SoCs for certain bandwidth intensive use cases
> with many other initiators active, and in situations where memory access isn't
> very efficient(like accessing Tiler mapped buffers and EMIF configured in
> non-interleaved more). The cause of the underflow is because the default preload
> value isn't sufficient for the DMA to reach a steady state. We configure the
> PRELOAD register such that the pipelines preload data up to the high threshold
> of the FIFO.
> 
> Preloading lot of data for older SoCs can have a negative impact. Due to slower
> interconnects, it's possible that the DISPC DMA cannot preload up to the high
> threshold within the vertical blanking region of the panel. We leave the PRELOAD
> registers to their reset values since we haven't faced underflows with these
> SoCs because of low value of PRELOAD.
> 
> Signed-off-by: Archit Taneja <archit@xxxxxx>
> ---
>  drivers/video/omap2/dss/dispc.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
> index 6578540..ace179e 100644
> --- a/drivers/video/omap2/dss/dispc.c
> +++ b/drivers/video/omap2/dss/dispc.c
> @@ -90,6 +90,8 @@ struct dispc_features {
>  
>  	/* revert to the OMAP4 mechanism of DISPC Smart Standby operation */
>  	bool mstandby_workaround:1;
> +
> +	bool set_max_preload:1;
>  };
>  
>  #define DISPC_MAX_NR_FIFOS 5
> @@ -1200,6 +1202,15 @@ void dispc_ovl_set_fifo_threshold(enum omap_plane plane, u32 low, u32 high)
>  	dispc_write_reg(DISPC_OVL_FIFO_THRESHOLD(plane),
>  			FLD_VAL(high, hi_start, hi_end) |
>  			FLD_VAL(low, lo_start, lo_end));
> +
> +	/*
> +	 * configure the preload to the pipeline's high threhold, if HT it's too
> +	 * large for the preload field, set the threshold to the maximum value
> +	 * that can be held by the preload register
> +	 */
> +	if (dss_has_feature(FEAT_PRELOAD) && dispc.feat->set_max_preload &&
> +			plane != OMAP_DSS_WB)
> +		dispc_write_reg(DISPC_OVL_PRELOAD(plane), min(high, 0xfff));

This causes compile warning:

drivers/video/omap2/dss/dispc.c: In function ‘dispc_ovl_set_fifo_threshold’:
drivers/video/omap2/dss/dispc.c:1213:152: warning: comparison of
distinct pointer types lacks a cast

I fixed it by changing 0xfff to 0xfffu

Queued for 3.14.

 Tomi


Attachment: signature.asc
Description: OpenPGP digital signature


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux