[U-Boot] [PATCH] video: sunxi: Enable cache for the framebuffer

Ian Campbell ijc at hellion.org.uk
Sat Jan 31 11:34:36 CET 2015


On Sat, 2015-01-31 at 03:21 +0200, Siarhei Siamashka wrote:
> Because the framebuffer resides in a hidden chopped off part of DRAM,
> caching is not enabled for this area automatically when the MMU is
> configured. So it needs to be set explicitly.
> 
> Additionally, the cfb console has a function to check whether the
> framebuffer resides in DRAM or not. And the hidden sunxi framebuffer
> needs special treatment again.

I wonder if this (essentially the need to make cfb_fb_is_in_dram __weak)
suggests that we are not correctly doing this hiding? Or at least not
doing it the same as other platforms which steal DRAM for use as video
ram.

We seem to set pGD->frameAdrs (==VIDEO_FB_ADRS in cfb_console)
correctly, which is one half of cfb_fb_is_in_dram's input. So is the
real issue that we omit the fb from bd->bi_dram instead of including it
there and marking it reserved in another way?

I have a look around some of the other drivers for other platforms and I
must confess I couldn't figure out how this all fits together for
them...

In terms of the kernel interface I'd expect we want to use an FDT
memeserve for the region, i.e. call fdt_add_reservemap_entry at some
suitable place.

Anatolij, how are we supposed to be doing this?

> 
> This fix resolves the sluggish scrolling problem.
> 
> Signed-off-by: Siarhei Siamashka <siarhei.siamashka at gmail.com>
> ---
>  drivers/video/cfb_console.c   |  2 +-
>  drivers/video/sunxi_display.c | 10 ++++++++++
>  2 files changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c
> index a81affa..23b50df 100644
> --- a/drivers/video/cfb_console.c
> +++ b/drivers/video/cfb_console.c
> @@ -2090,7 +2090,7 @@ static void *video_logo(void)
>  }
>  #endif
>  
> -static int cfb_fb_is_in_dram(void)
> +__weak int cfb_fb_is_in_dram(void)
>  {
>  	bd_t *bd = gd->bd;
>  #if defined(CONFIG_ARM) || defined(CONFIG_AVR32) || defined(COFNIG_NDS32) || \
> diff --git a/drivers/video/sunxi_display.c b/drivers/video/sunxi_display.c
> index f5f24fc..22a1319 100644
> --- a/drivers/video/sunxi_display.c
> +++ b/drivers/video/sunxi_display.c
> @@ -1060,6 +1060,12 @@ static const char *sunxi_get_mon_desc(enum sunxi_monitor monitor)
>  	return NULL; /* never reached */
>  }
>  
> +/* The framebuffer is in DRAM, even though it is in the hidden part of it */
> +int cfb_fb_is_in_dram(void)
> +{
> +	return 1;
> +}
> +
>  void *video_hw_init(void)
>  {
>  	static GraphicDevice *graphic_device = &sunxi_display.graphic_device;
> @@ -1079,6 +1085,10 @@ void *video_hw_init(void)
>  	       CONFIG_SUNXI_FB_SIZE >> 10);
>  	gd->fb_base = gd->ram_top;
>  
> +	mmu_set_region_dcache_behaviour(gd->fb_base,
> +					CONFIG_SUNXI_FB_SIZE,
> +					DCACHE_WRITEBACK);
> +
>  	video_get_ctfb_res_modes(RES_MODE_1024x768, 24, &mode,
>  				 &sunxi_display.depth, &options);
>  #ifdef CONFIG_VIDEO_HDMI




More information about the U-Boot mailing list