[U-Boot] [PATCH 11/17] lcd: Add CONFIG_ALIGN_LCD_TO_SECTION to align lcd for MMU

Simon Glass sjg at chromium.org
Sun Jan 15 01:47:23 CET 2012


We want to make the display section-aligned on ARM so that we can easily
turn off data caching for this.

Is this useful for other architectures? We could perhaps generalise it by
adding the ability to specify the alignment size, but at least for ARM
it is easier to have it be an architecture feature set by the MMU's
system.h header.

Signed-off-by: Simon Glass <sjg at chromium.org>
---
 README        |   10 ++++++++++
 common/lcd.c  |   25 ++++++++++++++++++++-----
 include/lcd.h |    3 +++
 3 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/README b/README
index 7adf7c7..d0b891f 100644
--- a/README
+++ b/README
@@ -1380,6 +1380,16 @@ The following options need to be configured:
 		Normally display is black on white background; define
 		CONFIG_SYS_WHITE_ON_BLACK to get it inverted.
 
+
+		CONFIG_ALIGN_LCD_TO_SECTION
+
+		Normally the LCD is page-aligned (tyically 4KB). If this is
+		defined then the LCD will be aligned to MMU_SECTION_SIZE
+		instead. This is useful for architectures where it is cheaper
+		to change data cache settings on a per-section basis (such as
+		ARM). Only enabled on ARM at present.
+
+
 - Splash Screen Support: CONFIG_SPLASH_SCREEN
 
 		If this option is set, the environment is checked for
diff --git a/common/lcd.c b/common/lcd.c
index bf1a6a9..be69d0d 100644
--- a/common/lcd.c
+++ b/common/lcd.c
@@ -35,6 +35,9 @@
 #include <stdarg.h>
 #include <linux/types.h>
 #include <stdio_dev.h>
+#ifdef CONFIG_ARM
+#include <asm/system.h>
+#endif
 #if defined(CONFIG_POST)
 #include <post.h>
 #endif
@@ -330,6 +333,12 @@ static void test_pattern (void)
 /* ** GENERIC Initialization Routines					*/
 /************************************************************************/
 
+int lcd_get_size(int *line_length)
+{
+	*line_length = (panel_info.vl_col * NBITS(panel_info.vl_bpix)) / 8;
+	return *line_length * panel_info.vl_row;
+}
+
 int drv_lcd_init (void)
 {
 	struct stdio_dev lcddev;
@@ -337,7 +346,7 @@ int drv_lcd_init (void)
 
 	lcd_base = (void *)(gd->fb_base);
 
-	lcd_line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8;
+	lcd_get_size(&lcd_line_length);
 
 	lcd_init (lcd_base);		/* LCD initialization */
 
@@ -449,15 +458,21 @@ static int lcd_init (void *lcdbase)
 ulong lcd_setmem (ulong addr)
 {
 	ulong size;
-	int line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8;
+	int line_length;
 
 	debug ("LCD panel info: %d x %d, %d bit/pix\n",
 		panel_info.vl_col, panel_info.vl_row, NBITS (panel_info.vl_bpix) );
 
-	size = line_length * panel_info.vl_row;
+	size = lcd_get_size(&line_length);
 
-	/* Round up to nearest full page */
-	size = (size + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
+	/* Round up to nearest full page, or MMU section if defined */
+#ifdef CONFIG_ALIGN_LCD_TO_SECTION
+	size = ALIGN(size, MMU_SECTION_SIZE);
+	addr = ALIGN(addr - MMU_SECTION_SIZE + 1, MMU_SECTION_SIZE);
+#else
+	size = ALIGN(size, PAGE_SIZE);
+	addr = ALIGN(addr - PAGE_SIZE + 1, PAGE_SIZE);
+#endif
 
 	/* Allocate pages for the frame buffer. */
 	addr -= size;
diff --git a/include/lcd.h b/include/lcd.h
index d95feeb..148bb54 100644
--- a/include/lcd.h
+++ b/include/lcd.h
@@ -217,6 +217,9 @@ int	lcd_display_bitmap(ulong bmp_image, int x, int y);
 /* Allow boards to customize the information displayed */
 void lcd_show_board_info(void);
 
+/* Return the size of the LCD frame buffer, and the line length */
+int lcd_get_size(int *line_length);
+
 /************************************************************************/
 /* ** BITMAP DISPLAY SUPPORT						*/
 /************************************************************************/
-- 
1.7.7.3



More information about the U-Boot mailing list