From mboxrd@z Thu Jan 1 00:00:00 1970 From: Simon Glass Date: Wed, 13 Jun 2012 09:19:49 -0700 Subject: [U-Boot] [PATCH v2 13/19] lcd: Add CONFIG_LCD_ALIGNMENT to select frame buffer alignment In-Reply-To: <1339604395-6621-1-git-send-email-sjg@chromium.org> References: <1339604395-6621-1-git-send-email-sjg@chromium.org> Message-ID: <1339604395-6621-14-git-send-email-sjg@chromium.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de The normal alignment is PAGE_SIZE, but if this is defined, we can support other alignments. The motivation for this change is to make the display section-aligned on ARM so that we can easily turn off data caching for the frame buffer region without resorting to level 2 page tables. Signed-off-by: Simon Glass --- Changes in v2: - Use a more generic config CONFIG_LCD_ALIGNMENT for lcd alignment README | 10 ++++++++++ common/lcd.c | 24 +++++++++++++++++++----- include/lcd.h | 3 +++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/README b/README index 67dc444..ccdddbf 100644 --- a/README +++ b/README @@ -1398,6 +1398,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_LCD_ALIGNMENT + + Normally the LCD is page-aligned (tyically 4KB). If this is + defined then the LCD will be aligned to this value instead. + For ARM it is sometimes useful to use MMU_SECTION_SIZE + here, since it is cheaper to change data cache settings on + a per-section basis. + + - 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..c915a49 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -35,6 +35,9 @@ #include #include #include +#ifdef CONFIG_ARM +#include +#endif #if defined(CONFIG_POST) #include #endif @@ -72,6 +75,10 @@ # endif #endif +#ifndef CONFIG_LCD_ALIGNMENT +#define CONFIG_LCD_ALIGNMENT PAGE_SIZE +#endif + DECLARE_GLOBAL_DATA_PTR; ulong lcd_setmem (ulong addr); @@ -330,6 +337,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 +350,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 +462,16 @@ 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 */ + size = ALIGN(size, CONFIG_LCD_ALIGNMENT); + addr = ALIGN(addr - CONFIG_LCD_ALIGNMENT + 1, CONFIG_LCD_ALIGNMENT); /* Allocate pages for the frame buffer. */ addr -= size; diff --git a/include/lcd.h b/include/lcd.h index 3d9ef16..5016d6b 100644 --- a/include/lcd.h +++ b/include/lcd.h @@ -281,6 +281,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