#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
#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
/* 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
--- /dev/null
+#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);
+ }
+}