diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-01-13 10:00:51 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-01-13 10:02:35 -0500 |
commit | 716a3dc20084da9b3ab17bd125005a5345e23e3b (patch) | |
tree | f7ba487050d33fc2913fdee81b384f5578ccb105 /arch/arm/mach-omap2 | |
parent | 4de3a8e101150feaefa1139611a50ff37467f33e (diff) |
ARM: Add arm_memblock_steal() to allocate memory away from the kernel
Several platforms are now using the memblock_alloc+memblock_free+
memblock_remove trick to obtain memory which won't be mapped in the
kernel's page tables. Most platforms do this (correctly) in the
->reserve callback. However, OMAP has started to call these functions
outside of this callback, and this is extremely unsafe - memory will
not be unmapped, and could well be given out after memblock is no
longer responsible for its management.
So, provide arm_memblock_steal() to perform this function, and ensure
that it panic()s if it is used inappropriately. Convert everyone
over, including OMAP.
As a result, OMAP with OMAP4_ERRATA_I688 enabled will panic on boot
with this change. Mark this option as BROKEN and make it depend on
BROKEN. OMAP needs to be fixed, or 137d105d50 (ARM: OMAP4: Fix
errata i688 with MPU interconnect barriers.) reverted until such
time it can be fixed correctly.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r-- | arch/arm/mach-omap2/Kconfig | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap-secure.c | 13 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap4-common.c | 10 |
3 files changed, 7 insertions, 20 deletions
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 904bd1dfcd2e..a8ba7b96dcd1 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -366,8 +366,8 @@ config OMAP3_SDRC_AC_TIMING | |||
366 | going on could result in system crashes; | 366 | going on could result in system crashes; |
367 | 367 | ||
368 | config OMAP4_ERRATA_I688 | 368 | config OMAP4_ERRATA_I688 |
369 | bool "OMAP4 errata: Async Bridge Corruption" | 369 | bool "OMAP4 errata: Async Bridge Corruption (BROKEN)" |
370 | depends on ARCH_OMAP4 | 370 | depends on ARCH_OMAP4 && BROKEN |
371 | select ARCH_HAS_BARRIERS | 371 | select ARCH_HAS_BARRIERS |
372 | help | 372 | help |
373 | If a data is stalled inside asynchronous bridge because of back | 373 | If a data is stalled inside asynchronous bridge because of back |
diff --git a/arch/arm/mach-omap2/omap-secure.c b/arch/arm/mach-omap2/omap-secure.c index 69f3c72d959b..d8f8ef40290f 100644 --- a/arch/arm/mach-omap2/omap-secure.c +++ b/arch/arm/mach-omap2/omap-secure.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/memblock.h> | 16 | #include <linux/memblock.h> |
17 | 17 | ||
18 | #include <asm/cacheflush.h> | 18 | #include <asm/cacheflush.h> |
19 | #include <asm/memblock.h> | ||
19 | 20 | ||
20 | #include <mach/omap-secure.h> | 21 | #include <mach/omap-secure.h> |
21 | 22 | ||
@@ -57,20 +58,10 @@ u32 omap_secure_dispatcher(u32 idx, u32 flag, u32 nargs, u32 arg1, u32 arg2, | |||
57 | /* Allocate the memory to save secure ram */ | 58 | /* Allocate the memory to save secure ram */ |
58 | int __init omap_secure_ram_reserve_memblock(void) | 59 | int __init omap_secure_ram_reserve_memblock(void) |
59 | { | 60 | { |
60 | phys_addr_t paddr; | ||
61 | u32 size = OMAP_SECURE_RAM_STORAGE; | 61 | u32 size = OMAP_SECURE_RAM_STORAGE; |
62 | 62 | ||
63 | size = ALIGN(size, SZ_1M); | 63 | size = ALIGN(size, SZ_1M); |
64 | paddr = memblock_alloc(size, SZ_1M); | 64 | omap_secure_memblock_base = arm_memblock_steal(size, SZ_1M); |
65 | if (!paddr) { | ||
66 | pr_err("%s: failed to reserve %x bytes\n", | ||
67 | __func__, size); | ||
68 | return -ENOMEM; | ||
69 | } | ||
70 | memblock_free(paddr, size); | ||
71 | memblock_remove(paddr, size); | ||
72 | |||
73 | omap_secure_memblock_base = paddr; | ||
74 | 65 | ||
75 | return 0; | 66 | return 0; |
76 | } | 67 | } |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index bc16c818c6b7..40a8fbc07e4b 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/hardware/gic.h> | 20 | #include <asm/hardware/gic.h> |
21 | #include <asm/hardware/cache-l2x0.h> | 21 | #include <asm/hardware/cache-l2x0.h> |
22 | #include <asm/mach/map.h> | 22 | #include <asm/mach/map.h> |
23 | #include <asm/memblock.h> | ||
23 | 24 | ||
24 | #include <plat/irqs.h> | 25 | #include <plat/irqs.h> |
25 | #include <plat/sram.h> | 26 | #include <plat/sram.h> |
@@ -61,13 +62,8 @@ static int __init omap_barriers_init(void) | |||
61 | return -ENODEV; | 62 | return -ENODEV; |
62 | 63 | ||
63 | size = ALIGN(PAGE_SIZE, SZ_1M); | 64 | size = ALIGN(PAGE_SIZE, SZ_1M); |
64 | paddr = memblock_alloc(size, SZ_1M); | 65 | paddr = arm_memblock_steal(size, SZ_1M); |
65 | if (!paddr) { | 66 | |
66 | pr_err("%s: failed to reserve 4 Kbytes\n", __func__); | ||
67 | return -ENOMEM; | ||
68 | } | ||
69 | memblock_free(paddr, size); | ||
70 | memblock_remove(paddr, size); | ||
71 | dram_io_desc[0].virtual = OMAP4_DRAM_BARRIER_VA; | 67 | dram_io_desc[0].virtual = OMAP4_DRAM_BARRIER_VA; |
72 | dram_io_desc[0].pfn = __phys_to_pfn(paddr); | 68 | dram_io_desc[0].pfn = __phys_to_pfn(paddr); |
73 | dram_io_desc[0].length = size; | 69 | dram_io_desc[0].length = size; |