ARM: rockchip: rk3188 add pie init
author黄涛 <huangtao@rock-chips.com>
Mon, 13 Jan 2014 02:51:01 +0000 (10:51 +0800)
committer黄涛 <huangtao@rock-chips.com>
Mon, 13 Jan 2014 02:51:01 +0000 (10:51 +0800)
arch/arm/boot/dts/rk3188.dtsi
arch/arm/configs/rockchip_defconfig
arch/arm/mach-rockchip/common.c
arch/arm/mach-rockchip/rk3188.c
arch/arm/mach-rockchip/sram.h [new file with mode: 0644]

index e811e255d42115b45c4bb4817d31ec728ffe6d58..df2c7066fd0162515f0053b0839fd3edfc38bff7 100755 (executable)
@@ -6,6 +6,7 @@
 / {
        compatible = "rockchip,rk3188";
        interrupt-parent = <&gic>;
+       rockchip,sram = <&sram>;
 
        aliases {
                serial0 = &uart0;
                reg = <0x10080000 0x20>; /* 32 bytes */
        };
 
-       sram@10080020 {
+       sram: sram@10080020 {
                compatible = "mmio-sram";
                reg = <0x10080020 (0x8000 - 0x20)>; /* 32k - 32 */
                map-exec;
index 83a1e3ed628f8ec4e901e6d8505b8e51283495e4..bbb5d9790b474882164a9cad68b4ecbbc0577a87 100644 (file)
@@ -196,6 +196,7 @@ CONFIG_RFKILL=y
 CONFIG_CMA=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_UID_STAT=y
+CONFIG_SRAM=y
 CONFIG_SCSI=y
 CONFIG_SCSI_TGT=y
 CONFIG_BLK_DEV_SD=y
index c84f655431982ae413519b9084016d729a556ef9..93adf5dadcf0e3a117b43c71ba583a6f32b317a3 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include <linux/clk-provider.h>
+#include <linux/genalloc.h>
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/kernel.h>
@@ -20,6 +21,7 @@
 #include <linux/of_platform.h>
 #include <asm/hardware/cache-l2x0.h>
 #include "cpu_axi.h"
+#include "sram.h"
 
 static int __init rockchip_cpu_axi_init(void)
 {
@@ -104,3 +106,27 @@ static int __init rockchip_pl330_l2_cache_init(void)
        return 0;
 }
 early_initcall(rockchip_pl330_l2_cache_init);
+
+struct gen_pool *rockchip_sram_pool = NULL;
+struct pie_chunk *rockchip_pie_chunk = NULL;
+void *rockchip_sram_virt = NULL;
+size_t rockchip_sram_size = 0;
+char *rockchip_sram_stack = NULL;
+
+int __init rockchip_pie_init(void)
+{
+       struct device_node *np;
+
+       np = of_find_node_by_path("/");
+       if (!np)
+               return -ENODEV;
+
+       rockchip_sram_pool = of_get_named_gen_pool(np, "rockchip,sram", 0);
+       if (!rockchip_sram_pool) {
+               pr_err("%s: failed to get sram pool\n", __func__);
+               return -ENODEV;
+       }
+       rockchip_sram_size = gen_pool_size(rockchip_sram_pool);
+
+       return 0;
+}
index 46b0a2198566dc31ea0077875e6156e04a0dacc3..30ede5ab86ab35b6981fdad0f1f606d636f62991 100644 (file)
@@ -28,6 +28,7 @@
 #include "cpu_axi.h"
 #include "grf.h"
 #include "iomap.h"
+#include "sram.h"
 
 #define RK3188_DEVICE(name) \
        { \
@@ -116,3 +117,33 @@ DT_MACHINE_START(RK3188_DT, "Rockchip RK3188 (Flattened Device Tree)")
        .init_time      = rk3188_dt_init_timer,
        .dt_compat      = rk3188_dt_compat,
 MACHINE_END
+
+#define CPU 3188
+char PIE_DATA(sram_stack)[1024];
+EXPORT_PIE_SYMBOL(DATA(sram_stack));
+
+static int __init rk3188_pie_init(void)
+{
+       int err;
+
+       if (!cpu_is_rk3188())
+               return 0;
+
+       err = rockchip_pie_init();
+       if (err)
+               return err;
+
+       rockchip_pie_chunk = pie_load_sections(rockchip_sram_pool, rk3188);
+       if (IS_ERR(rockchip_pie_chunk)) {
+               err = PTR_ERR(rockchip_pie_chunk);
+               pr_err("%s: failed to load section %d\n", __func__, err);
+               rockchip_pie_chunk = NULL;
+               return err;
+       }
+
+       rockchip_sram_virt = kern_to_pie(rockchip_pie_chunk, &__pie_common_start[0]);
+       rockchip_sram_stack = kern_to_pie(rockchip_pie_chunk, (char *) DATA(sram_stack) + sizeof(DATA(sram_stack)));
+
+       return 0;
+}
+arch_initcall(rk3188_pie_init);
diff --git a/arch/arm/mach-rockchip/sram.h b/arch/arm/mach-rockchip/sram.h
new file mode 100644 (file)
index 0000000..d4c7d74
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef __MACH_ROCKCHIP_SRAM_H
+#define __MACH_ROCKCHIP_SRAM_H
+
+#include <linux/pie.h>
+#include <asm/pie.h>
+
+extern char __pie_common_start[];
+extern char __pie_common_end[];
+extern char __pie_overlay_start[];
+
+extern struct gen_pool *rockchip_sram_pool;
+extern struct pie_chunk *rockchip_pie_chunk;
+extern void *rockchip_sram_virt;
+extern size_t rockchip_sram_size;
+extern char *rockchip_sram_stack;
+extern char __pie_data(rk3188) __pie_rk3188_sram_stack[1024];
+
+#define RK_PIE_DATA3(x) __pie_data(rk##x)
+#define RK_PIE_DATA2(x) RK_PIE_DATA3(x)
+#define RK_PIE_DATA RK_PIE_DATA2(CPU)
+
+#define DATA3(x, y) __pie_rk##y##_##x
+#define DATA2(x, y) DATA3(x, y)
+#define DATA(x) DATA2(x, CPU)
+
+#define RK_PIE3(x) __pie(rk##x)
+#define RK_PIE2(x) RK_PIE3(x)
+#define RK_PIE RK_PIE2(CPU)
+
+#define FUNC3(x, y) __pie_rk##y##_##x
+#define FUNC2(x, y) FUNC3(x, y)
+#define FUNC(x) FUNC2(x, CPU)
+
+#define PIE_FUNC(x) RK_PIE FUNC(x)
+#define PIE_DATA(x) RK_PIE_DATA DATA(x)
+
+#define DEFINE_PIE_DATA(x) PIE_DATA(x); EXPORT_PIE_SYMBOL(DATA(x));
+
+/* Tag variables with this */
+#define __sramdata RK_PIE_DATA
+/* Tag functions inside SRAM called from outside SRAM with this */
+#define __sramfunc RK_PIE noinline
+/* Tag function inside SRAM called from inside SRAM  with this */
+#define __sramlocalfunc RK_PIE
+
+extern void call_with_stack(void (*fn)(void *), void *arg, void *sp);
+extern int __init rockchip_pie_init(void);
+
+#endif