From 38c4c22a5bcb8e6d90acb1fac66165f148c8f830 Mon Sep 17 00:00:00 2001 From: Mark Yao Date: Fri, 8 Jan 2016 12:51:44 +0800 Subject: [PATCH] video: rk_fb: align uboot logo address Uboot logo address start point may be not align PAGE_SIZE, it would align to wrong point by pages vmap, and cause uboot logo error display. So before pages vmap, align the uboot logo address. Change-Id: I93f030e1b7ee13a4dc19d1421f520478868318ef Signed-off-by: Mark Yao Reported-by: Wen Dingxian --- drivers/video/rockchip/rk_fb.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index bc1a178160f7..b1e075fb6377 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -4204,12 +4204,12 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv, return 0; } else if (dev_drv->uboot_logo && uboot_logo_base) { u32 start = uboot_logo_base; - u32 start_base = start; int logo_len, i=0; int y_mirror = 0; unsigned int nr_pages; struct page **pages; char *vaddr; + int align = 0; dev_drv->ops->get_dspbuf_info(dev_drv, &xact, &yact, &format, @@ -4224,7 +4224,9 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv, if (y_mirror) start -= logo_len; - nr_pages = uboot_logo_size >> PAGE_SHIFT; + align = start % PAGE_SIZE; + start -= align; + nr_pages = PAGE_ALIGN(logo_len + align) >> PAGE_SHIFT; pages = kzalloc(sizeof(struct page) * nr_pages, GFP_KERNEL); while (i < nr_pages) { @@ -4236,11 +4238,11 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv, pgprot_writecombine(PAGE_KERNEL)); if (!vaddr) { pr_err("failed to vmap phy addr 0x%x\n", - start_base); + start); return -1; } - memcpy(main_fbi->screen_base, vaddr, logo_len); + memcpy(main_fbi->screen_base, vaddr + align, logo_len); kfree(pages); vunmap(vaddr); -- 2.34.1