summaryrefslogtreecommitdiff
path: root/lib_blackfin/string.c
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2008-08-07 15:30:49 -0400
committerMike Frysinger <vapier@gentoo.org>2009-01-28 13:26:10 -0500
commitd31eb38512bed377d5d4b3c696662e52120a2e4c (patch)
treee3ae2ac2a86abbe0411ccbe110d29b2d7600ad94 /lib_blackfin/string.c
parent81b799add709177e838466461f7b9989488b0fd5 (diff)
Blackfin: abort dma_memcpy() for L1 scratchpad
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'lib_blackfin/string.c')
-rw-r--r--lib_blackfin/string.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/lib_blackfin/string.c b/lib_blackfin/string.c
index 6887c93decd..ab71285bb63 100644
--- a/lib_blackfin/string.c
+++ b/lib_blackfin/string.c
@@ -1,7 +1,7 @@
/*
* U-boot - string.c Contains library routines.
*
- * Copyright (c) 2005-2007 Analog Devices Inc.
+ * Copyright (c) 2005-2008 Analog Devices Inc.
*
* (C) Copyright 2000-2004
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
@@ -130,8 +130,19 @@ int strncmp(const char *cs, const char *ct, size_t count)
# define bfin_write_MDMA_D0_IRQ_STATUS bfin_write_MDMA1_D0_IRQ_STATUS
# define bfin_read_MDMA_D0_IRQ_STATUS bfin_read_MDMA1_D0_IRQ_STATUS
#endif
+/* This version misbehaves for count values of 0 and 2^16+.
+ * Perhaps we should detect that ? Nowhere do we actually
+ * use dma memcpy for those types of lengths though ...
+ */
static void *dma_memcpy(void *dst, const void *src, size_t count)
{
+ /* Scratchpad cannot be a DMA source or destination */
+ if (((unsigned long)src >= L1_SRAM_SCRATCH &&
+ (unsigned long)src < L1_SRAM_SCRATCH_END) ||
+ ((unsigned long)dst >= L1_SRAM_SCRATCH &&
+ (unsigned long)dst < L1_SRAM_SCRATCH_END))
+ hang();
+
if (dcache_status())
blackfin_dcache_flush_range(src, src + count);