video: rk_fb: align uboot logo address
authorMark Yao <mark.yao@rock-chips.com>
Fri, 8 Jan 2016 04:51:44 +0000 (12:51 +0800)
committerHuang Jiachai <hjc@rock-chips.com>
Thu, 14 Jan 2016 05:59:48 +0000 (13:59 +0800)
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 <mark.yao@rock-chips.com>
Reported-by: Wen Dingxian <shawn.wen@rock-chips.com>
drivers/video/rockchip/rk_fb.c

index bc1a178160f777f2fc888fcf0738443de794598b..b1e075fb6377e11946fae30f423fbcd827be8a3b 100644 (file)
@@ -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);