aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandre Courbot <acourbot@nvidia.com>2013-11-24 01:30:50 -0500
committerStephen Warren <swarren@nvidia.com>2013-12-13 14:50:31 -0500
commitad14ecee4d868a54556e40cdc3df7fe78e3ab9d0 (patch)
tree342dea3429305aa415b96d6254e025f3f44ca0da
parent1a5de3aeb015e495b7ffe03186cc598f17d8ad88 (diff)
ARM: tegra: split setting of CPU reset handler
Not all Tegra devices can set the CPU reset handler in the same way. In particular, devices using a TrustZone secure monitor cannot set it up directly and need to ask the firmware to do it. This patch separates the act of setting the reset handler from its preparation, so the former can be implemented in a different way. Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Reviewed-by: Tomasz Figa <t.figa@samsung.com> Reviewed-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Stephen Warren <swarren@nvidia.com>
-rw-r--r--arch/arm/mach-tegra/reset.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/arch/arm/mach-tegra/reset.c b/arch/arm/mach-tegra/reset.c
index 568f5bbf979d..17c4b6d6b498 100644
--- a/arch/arm/mach-tegra/reset.c
+++ b/arch/arm/mach-tegra/reset.c
@@ -33,26 +33,18 @@
33 33
34static bool is_enabled; 34static bool is_enabled;
35 35
36static void __init tegra_cpu_reset_handler_enable(void) 36static void __init tegra_cpu_reset_handler_set(const u32 reset_address)
37{ 37{
38 void __iomem *iram_base = IO_ADDRESS(TEGRA_IRAM_RESET_BASE);
39 void __iomem *evp_cpu_reset = 38 void __iomem *evp_cpu_reset =
40 IO_ADDRESS(TEGRA_EXCEPTION_VECTORS_BASE + 0x100); 39 IO_ADDRESS(TEGRA_EXCEPTION_VECTORS_BASE + 0x100);
41 void __iomem *sb_ctrl = IO_ADDRESS(TEGRA_SB_BASE); 40 void __iomem *sb_ctrl = IO_ADDRESS(TEGRA_SB_BASE);
42 u32 reg; 41 u32 reg;
43 42
44 BUG_ON(is_enabled);
45 BUG_ON(tegra_cpu_reset_handler_size > TEGRA_IRAM_RESET_HANDLER_SIZE);
46
47 memcpy(iram_base, (void *)__tegra_cpu_reset_handler_start,
48 tegra_cpu_reset_handler_size);
49
50 /* 43 /*
51 * NOTE: This must be the one and only write to the EVP CPU reset 44 * NOTE: This must be the one and only write to the EVP CPU reset
52 * vector in the entire system. 45 * vector in the entire system.
53 */ 46 */
54 writel(TEGRA_IRAM_RESET_BASE + tegra_cpu_reset_handler_offset, 47 writel(reset_address, evp_cpu_reset);
55 evp_cpu_reset);
56 wmb(); 48 wmb();
57 reg = readl(evp_cpu_reset); 49 reg = readl(evp_cpu_reset);
58 50
@@ -66,6 +58,21 @@ static void __init tegra_cpu_reset_handler_enable(void)
66 writel(reg, sb_ctrl); 58 writel(reg, sb_ctrl);
67 wmb(); 59 wmb();
68 } 60 }
61}
62
63static void __init tegra_cpu_reset_handler_enable(void)
64{
65 void __iomem *iram_base = IO_ADDRESS(TEGRA_IRAM_RESET_BASE);
66 const u32 reset_address = TEGRA_IRAM_RESET_BASE +
67 tegra_cpu_reset_handler_offset;
68
69 BUG_ON(is_enabled);
70 BUG_ON(tegra_cpu_reset_handler_size > TEGRA_IRAM_RESET_HANDLER_SIZE);
71
72 memcpy(iram_base, (void *)__tegra_cpu_reset_handler_start,
73 tegra_cpu_reset_handler_size);
74
75 tegra_cpu_reset_handler_set(reset_address);
69 76
70 is_enabled = true; 77 is_enabled = true;
71} 78}