@@ -41,6 +41,7 @@
#include <plat/omap-pm.h>
#include <plat/powerdomain.h>
#include "powerdomains.h"
+#include "pm.h"
#include <plat/clockdomain.h>
#include "clockdomains.h"
@@ -230,6 +231,13 @@ static struct map_desc omap44xx_io_desc[] __initdata = {
};
#endif
+static void __init _omap_pm_reserve_sdram_memblock(void)
+{
+ if (cpu_is_omap34xx())
+ omap3_pm_reserve_sdram_memblock();
+
+}
+
static void __init _omap2_map_common_io(void)
{
/* Normally devicemaps_init() would flush caches and tlb after
@@ -241,6 +249,9 @@ static void __init _omap2_map_common_io(void)
omap2_check_revision();
omap_sram_init();
+
+ /* Allocate the secure SRAM storage after sram init and cpu detect */
+ _omap_pm_reserve_sdram_memblock();
}
#ifdef CONFIG_ARCH_OMAP2420
@@ -114,11 +114,13 @@ struct omap3_secure_copy_data {
#if defined(CONFIG_PM)
extern int __init omap3_secure_copy_data_set(struct omap3_secure_copy_data *d);
+extern void __init omap3_pm_reserve_sdram_memblock(void);
#else
static inline int omap3_secure_copy_data_set(struct omap3_secure_copy_data *d)
{
return -EINVAL;
}
+static inline void omap3_pm_reserve_sdram_memblock(void) { }
#endif
#endif
@@ -28,6 +28,7 @@
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/slab.h>
+#include <linux/memblock.h>
#include <plat/sram.h>
#include <plat/clockdomain.h>
@@ -60,6 +61,8 @@ static struct omap3_secure_copy_data secure_copy_data = {
.save_every_cycle = false, /* explicit for readability */
};
+#define OMAP3_SECURE_MAX_ALLOCATE_ADDRESS 0x8fffffff
+
struct power_state {
struct powerdomain *pwrdm;
u32 next_state;
@@ -198,7 +201,7 @@ static void omap3_save_secure_ram_context(u32 target_mpu_state)
*/
pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
secure_ram_save_status = _omap_save_secure_sram((u32 *)
- __pa(omap3_secure_ram_storage));
+ (omap3_secure_ram_storage));
pwrdm_set_next_pwrst(mpu_pwrdm, target_mpu_state);
if (!secure_copy_data.save_every_cycle)
secure_ram_saved = 1;
@@ -1065,14 +1068,6 @@ static int __init omap3_pm_init(void)
omap3_idle_init();
clkdm_add_wkdep(neon_clkdm, mpu_clkdm);
- if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
- omap3_secure_ram_storage =
- kmalloc(secure_copy_data.size, GFP_KERNEL);
- if (!omap3_secure_ram_storage)
- printk(KERN_ERR "Memory allocation failed when"
- "allocating for secure sram context\n");
-
- }
omap3_save_scratchpad_contents();
err1:
@@ -1087,3 +1082,29 @@ err2:
}
late_initcall(omap3_pm_init);
+
+void __init omap3_pm_reserve_sdram_memblock(void)
+{
+ phys_addr_t size = secure_copy_data.size;
+ phys_addr_t paddr;
+ phys_addr_t max_addr = OMAP3_SECURE_MAX_ALLOCATE_ADDRESS;
+
+ if (!size || !cpu_is_omap34xx() || omap_type() == OMAP2_DEVICE_TYPE_GP)
+ return;
+
+ /*
+ * On OMAP3 Silicon, due to ROM Code limitation, we should
+ * not have the allocation beyond the first 256MB area.
+ * This limitation is true for both OMAP3430 and 3630 and
+ * all versions of the same.
+ */
+ paddr = memblock_alloc_base(size, SZ_1M, max_addr);
+
+ if (!paddr) {
+ pr_err("%s: failed to reserve %x bytes\n",
+ __func__, size);
+ return;
+ }
+
+ omap3_secure_ram_storage = (void *)paddr;
+}