summaryrefslogtreecommitdiff
path: root/arch/arm/lib
diff options
context:
space:
mode:
authorTom Rini <trini@ti.com>2015-01-01 15:10:39 -0500
committerTom Rini <trini@ti.com>2015-01-01 15:10:39 -0500
commita74a4a86a53726ba17de8ab863bec1cd60cf545e (patch)
tree2dcb09a706850fa6cb1377b00815be6b8f71f606 /arch/arm/lib
parentb7b3b8c6a0bfc87047cb18a7abfa06fb6e9d0331 (diff)
parentcc0856cd149acc7069ae97ebe10b92090a65f575 (diff)
downloadu-boot-imx-a74a4a86a53726ba17de8ab863bec1cd60cf545e.zip
u-boot-imx-a74a4a86a53726ba17de8ab863bec1cd60cf545e.tar.gz
u-boot-imx-a74a4a86a53726ba17de8ab863bec1cd60cf545e.tar.bz2
Merge branch 'master' of git://git.denx.de/u-boot-tegra
Diffstat (limited to 'arch/arm/lib')
-rw-r--r--arch/arm/lib/cache.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/arch/arm/lib/cache.c b/arch/arm/lib/cache.c
index f1c0792..9cedeac 100644
--- a/arch/arm/lib/cache.c
+++ b/arch/arm/lib/cache.c
@@ -8,6 +8,7 @@
/* for now: just dummy functions to satisfy the linker */
#include <common.h>
+#include <malloc.h>
__weak void flush_cache(unsigned long start, unsigned long size)
{
@@ -49,3 +50,46 @@ __weak void enable_caches(void)
{
puts("WARNING: Caches not enabled\n");
}
+
+#ifdef CONFIG_SYS_NONCACHED_MEMORY
+/*
+ * Reserve one MMU section worth of address space below the malloc() area that
+ * will be mapped uncached.
+ */
+static unsigned long noncached_start;
+static unsigned long noncached_end;
+static unsigned long noncached_next;
+
+void noncached_init(void)
+{
+ phys_addr_t start, end;
+ size_t size;
+
+ end = ALIGN(mem_malloc_start, MMU_SECTION_SIZE) - MMU_SECTION_SIZE;
+ size = ALIGN(CONFIG_SYS_NONCACHED_MEMORY, MMU_SECTION_SIZE);
+ start = end - size;
+
+ debug("mapping memory %pa-%pa non-cached\n", &start, &end);
+
+ noncached_start = start;
+ noncached_end = end;
+ noncached_next = start;
+
+#ifndef CONFIG_SYS_DCACHE_OFF
+ mmu_set_region_dcache_behaviour(noncached_start, size, DCACHE_OFF);
+#endif
+}
+
+phys_addr_t noncached_alloc(size_t size, size_t align)
+{
+ phys_addr_t next = ALIGN(noncached_next, align);
+
+ if (next >= noncached_end || (noncached_end - next) < size)
+ return 0;
+
+ debug("allocated %zu bytes of uncached memory @%pa\n", size, &next);
+ noncached_next = next + size;
+
+ return next;
+}
+#endif /* CONFIG_SYS_NONCACHED_MEMORY */