From: CMY Date: Thu, 11 Dec 2014 04:58:09 +0000 (+0800) Subject: rk: mem: protect memory region that specified by uboot on kernel booting X-Git-Tag: firefly_0821_release~4394 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=2ce890be5d6ce0447f062543e9504be0b295dc31;p=firefly-linux-kernel-4.4.55.git rk: mem: protect memory region that specified by uboot on kernel booting --- diff --git a/arch/arm/mach-rockchip/common.c b/arch/arm/mach-rockchip/common.c index 9ee976af9b7e..e2fa463f8c56 100755 --- a/arch/arm/mach-rockchip/common.c +++ b/arch/arm/mach-rockchip/common.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "cpu_axi.h" #include "loader.h" #include "sram.h" @@ -294,3 +295,62 @@ static int __init rockchip_jtag_enable(char *__unused) return 1; } __setup("rockchip_jtag", rockchip_jtag_enable); + +phys_addr_t uboot_logo_base=0; +phys_addr_t uboot_logo_size=0; +phys_addr_t uboot_logo_offset=0; + +void __init rockchip_uboot_mem_reserve(void) +{ + if (uboot_logo_size) { + if (!memblock_is_region_reserved(uboot_logo_base, uboot_logo_size) + && !memblock_reserve(uboot_logo_base, uboot_logo_size)){ + pr_info("%s: reserve %zx@%zx for uboot logo\n", __func__, + uboot_logo_size, uboot_logo_base); + } else { + pr_err("%s: reserve of %zx@%zx failed\n", __func__, + uboot_logo_size, uboot_logo_base); + } + } +} + +static int __init rockchip_uboot_logo_setup(char *p) +{ + char *endp; + + uboot_logo_size = memparse(p, &endp); + if (*endp == '@') { + uboot_logo_base = memparse(endp + 1, &endp); + if (*endp == ':') { + uboot_logo_offset = memparse(endp + 1, NULL); + } + } + + pr_info("%s: mem: %zx@%zx, offset:%zx\n", __func__, + uboot_logo_size, uboot_logo_base, uboot_logo_offset); + + return 0; +} +early_param("uboot_logo", rockchip_uboot_logo_setup); + +static int __init rockchip_uboot_mem_late_init(void) +{ + phys_addr_t addr = 0; + phys_addr_t end = 0; + + if (uboot_logo_size) { + addr = PAGE_ALIGN(uboot_logo_base); + end = (uboot_logo_base+uboot_logo_size)&PAGE_MASK; + + pr_info("%s: Freeing uboot logo memory: %zx@%zx\n", __func__, + uboot_logo_size, uboot_logo_base); + + memblock_free(uboot_logo_base, uboot_logo_size); + + for (; addr < end; addr += PAGE_SIZE) + free_reserved_page(pfn_to_page(addr >> PAGE_SHIFT)); + } + + return 0; +} +late_initcall(rockchip_uboot_mem_late_init); diff --git a/arch/arm/mach-rockchip/rk312x.c b/arch/arm/mach-rockchip/rk312x.c index 6ff7f52c9548..aaef664d42f9 100755 --- a/arch/arm/mach-rockchip/rk312x.c +++ b/arch/arm/mach-rockchip/rk312x.c @@ -353,6 +353,9 @@ static void __init rk312x_dt_init_timer(void) static void __init rk312x_reserve(void) { + /* reserve memory for uboot */ + rockchip_uboot_mem_reserve(); + /* reserve memory for ION */ rockchip_ion_reserve(); } diff --git a/arch/arm/mach-rockchip/rk3288.c b/arch/arm/mach-rockchip/rk3288.c index 100327c3129d..d44709321c62 100755 --- a/arch/arm/mach-rockchip/rk3288.c +++ b/arch/arm/mach-rockchip/rk3288.c @@ -435,6 +435,9 @@ static void __init rk3288_dt_init_timer(void) static void __init rk3288_reserve(void) { + /* reserve memory for uboot */ + rockchip_uboot_mem_reserve(); + /* reserve memory for ION */ rockchip_ion_reserve(); } diff --git a/include/linux/rockchip/common.h b/include/linux/rockchip/common.h index cf51a1ce95c1..282e25bdfbc0 100644 --- a/include/linux/rockchip/common.h +++ b/include/linux/rockchip/common.h @@ -58,6 +58,7 @@ void rockchip_restart_get_boot_mode(const char *cmd, u32 *flag, u32 *mode); void __init rockchip_efuse_init(void); void __init rockchip_suspend_init(void); void __init rockchip_ion_reserve(void); +void __init rockchip_uboot_mem_reserve(void); enum rockchip_pm_policy { ROCKCHIP_PM_POLICY_PERFORMANCE = 0,