memory reserve: Initial Code
authorkfx <kfx@rock-chips.com>
Mon, 6 Feb 2012 05:21:51 +0000 (13:21 +0800)
committerkfx <kfx@rock-chips.com>
Mon, 6 Feb 2012 05:21:51 +0000 (13:21 +0800)
arch/arm/mach-rk30/board-rk30-sdk.c
arch/arm/plat-rk/Makefile
arch/arm/plat-rk/include/plat/board.h
arch/arm/plat-rk/mem_reserve.c [new file with mode: 0644]

index 7d5bf2d660fb83431231e22fa4f9c7f3735592eb..4a68cf2db4c2a0112916d95b7e728d05cf73c26d 100644 (file)
 #include <mach/board.h>
 #include <mach/hardware.h>
 
+static void __init rk30_reserve(void)
+{
+    board_mem_reserved();
+}
 MACHINE_START(RK30, "RK30board")
        .boot_params    = PLAT_PHYS_OFFSET + 0x800,
        .fixup          = rk30_fixup,
        .map_io         = rk30_map_io,
        .init_irq       = rk30_init_irq,
        .timer          = &rk30_timer,
+    .reserve    = &rk30_reserve,
 MACHINE_END
index dbbac6279b61ff371cbddd0e14ab806d74619047..b7e7502ac913eab0311589df278f41afc2016e92 100644 (file)
@@ -1,3 +1,4 @@
 obj-$(CONFIG_RK29_LAST_LOG) += last_log.o
 obj-$(CONFIG_USB_GADGET) += usb_detect.o
 obj-$(CONFIG_RK29_VPU) += vpu_service.o
+obj-y += mem_reserve.o
index 21014f6ecaab8ae74e2f119a50103a193edcb2f9..8729fde11879c13aac41dda81bde1bd606a7fe6e 100644 (file)
@@ -1,5 +1,7 @@
 #ifndef __PLAT_BOARD_H
 #define __PLAT_BOARD_H
+#include <linux/types.h>
+#include <linux/init.h>
 
 #define BOOT_MODE_NORMAL               0
 #define BOOT_MODE_FACTORY2             1
@@ -21,4 +23,9 @@ static int inline board_usb_detect_init(unsigned gpio) { return 0; }
 /* for wakeup Android */
 void rk28_send_wakeup_key(void);
 
+/* for reserved memory 
+ * function: board_mem_reserve_add 
+ * return value: start address of reserved memory */
+phys_addr_t __init board_mem_reserve_add(char *name, size_t size);
+void __init board_mem_reserved(void);
 #endif
diff --git a/arch/arm/plat-rk/mem_reserve.c b/arch/arm/plat-rk/mem_reserve.c
new file mode 100644 (file)
index 0000000..c022ae6
--- /dev/null
@@ -0,0 +1,30 @@
+#include <plat/board.h>
+#include <linux/memblock.h>
+#include <asm/setup.h>
+
+static size_t reserved_size = 0;
+static phys_addr_t reserved_base_end = 0;
+
+phys_addr_t __init board_mem_reserve_add(char *name, size_t size)
+{
+    phys_addr_t base = 0;
+
+    if(reserved_base_end == 0)
+        reserved_base_end  = meminfo.bank[0].start + meminfo.bank[0].size;
+
+    reserved_size += size;
+    base  = reserved_base_end - reserved_size;
+    pr_info("memory reserve: Memory(base:0x%x size:%dM) reserved for <%s>\n", 
+                    base, size/SZ_1M, name);
+    return base;
+}
+
+void __init board_mem_reserved(void)
+{
+    phys_addr_t base = reserved_base_end - reserved_size;
+
+    if(reserved_size){
+        memblock_remove(base, reserved_size);
+           pr_info("memory reserve: Total reserved %dM\n", reserved_size/SZ_1M);
+    }
+}