
Hi,
On Sun, Apr 29, 2012 at 7:25 PM, Marek Vasut marex@denx.de wrote:
Dear Anatolij Gustschin,
Data cache flushing is required for frame buffer in RAM to fix the distorted console text output. Currently this text distortion is observed with cfb on beageboard and N900 when running with data cache enabled.
beagleboard ;-)
Regarding this patch, can I suggest also looking at this possibly more generic patch that I originally did for Tegra? The series is here:
http://patchwork.ozlabs.org/user/bundle/2869/
and in particular these patches from the series:
arm: Add control over cachability of memory regions lcd: Add CONFIG_ALIGN_LCD_TO_SECTION to align lcd for MMU lcd: Add support for flushing LCD fb from dcache after update tegra: Align LCD frame buffer to section boundary tegra: Support control of cache settings for LCD tegra: fdt: Add LCD definitions for Seaboard lcd: Add CONSOLE_SCROLL_LINES option to speed console
Regards, Simon
Reported-by: Pali Rohár pali.rohar@gmail.com Signed-off-by: Anatolij Gustschin agust@denx.de
drivers/video/cfb_console.c | 35 +++++++++++++++++++++++++++++++++++ 1 files changed, 35 insertions(+), 0 deletions(-)
diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c index 904caf7..dd7ccb7 100644 --- a/drivers/video/cfb_console.c +++ b/drivers/video/cfb_console.c @@ -360,6 +360,8 @@ void console_cursor(int state); extern void video_get_info_str(int line_number, char *info); #endif
+DECLARE_GLOBAL_DATA_PTR;
/* Locals */ static GraphicDevice *pGD; /* Pointer to Graphic array */
@@ -377,6 +379,8 @@ static int console_row; /* cursor row */
static u32 eorx, fgx, bgx; /* color pats */
+static int cfb_do_flush_cache;
static const int video_font_draw_table8[] = { 0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff, 0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff, @@ -553,6 +557,8 @@ static void video_drawchars(int xx, int yy, unsigned char *s, int count) SWAP32((video_font_draw_table32 [bits & 15][3] & eorx) ^
bgx);
}
if (cfb_do_flush_cache)
flush_cache((ulong)dest0, 32);
flush_dcache_range() ?
dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; s++; }
@@ -621,6 +627,8 @@ static void video_invertchar(int xx, int yy) for (x = firstx; x < lastx; x++) { u8 *dest = (u8 *)(video_fb_address) + x + y; *dest = ~*dest;
if (cfb_do_flush_cache)
flush_cache((ulong)dest, 4);
DTTO
} }
} @@ -717,6 +725,8 @@ static void console_scrollup(void) #else memsetl(CONSOLE_ROW_LAST, CONSOLE_ROW_SIZE >> 2, CONSOLE_BG_COL); #endif
if (cfb_do_flush_cache)
flush_cache((ulong)CONSOLE_ROW_FIRST, CONSOLE_SIZE);
}
static void console_back(void) @@ -1651,6 +1661,29 @@ static void *video_logo(void) } #endif
+static int cfb_fb_is_in_dram(void) +{
bd_t *bd = gd->bd;
ulong start, end;
int i;
for (i = 0; i < CONFIG_NR_DRAM_BANKS; ++i) {
+#if defined(CONFIG_ARM) || defined(CONFIG_AVR32) ||
defined(COFNIG_NDS32)
|| \ +defined(CONFIG_SANDBOX) || defined(CONFIG_X86)
start = bd->bi_dram[i].start;
end = bd->bi_dram[i].start + bd->bi_dram[i].size - 1;
+#else
start = bd->bi_memstart;
end = bd->bi_memsize;
+#endif
if ((ulong)video_fb_address >= start &&
(ulong)video_fb_address < end)
return 1;
}
return 0;
+}
Can't you have SRAM cached too? ;-)
static int video_init(void) { unsigned char color8; @@ -1664,6 +1697,8 @@ static int video_init(void) video_init_hw_cursor(VIDEO_FONT_WIDTH, VIDEO_FONT_HEIGHT); #endif
cfb_do_flush_cache = cfb_fb_is_in_dram() && dcache_status();
/* Init drawing pats */ switch (VIDEO_DATA_FORMAT) { case GDF__8BIT_INDEX:
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot