summaryrefslogtreecommitdiffstats
path: root/lib_blackfin/string.c
diff options
context:
space:
mode:
authorRobin Getz <robin.getz@analog.com>2009-12-21 16:35:48 -0500
committerMike Frysinger <vapier@gentoo.org>2010-01-17 20:36:09 -0500
commitf19fd87e9387282b5abbfdafe46ac272320643d8 (patch)
tree853df8844855d7025a271f01abb45eb4d1c24fa1 /lib_blackfin/string.c
parent3869453f659c22396fecb7c8ed7af909e89f461c (diff)
downloadblackbird-obmc-uboot-f19fd87e9387282b5abbfdafe46ac272320643d8.tar.gz
blackbird-obmc-uboot-f19fd87e9387282b5abbfdafe46ac272320643d8.zip
Blackfin: add support for kgdb
Signed-off-by: Robin Getz <robin.getz@analog.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'lib_blackfin/string.c')
-rw-r--r--lib_blackfin/string.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/lib_blackfin/string.c b/lib_blackfin/string.c
index 12b6d24058..e344d3b94b 100644
--- a/lib_blackfin/string.c
+++ b/lib_blackfin/string.c
@@ -230,15 +230,45 @@ void *memcpy(void *dst, const void *src, size_t count)
if (!count)
return dst;
- if (addr_bfin_on_chip_mem(dst)) {
- /* L1 is the destination */
- return dma_memcpy(dst, src, count);
+#ifdef CONFIG_CMD_KGDB
+ if (src >= (void *)SYSMMR_BASE) {
+ if (count == 2 && (unsigned long)src % 2 == 0) {
+ u16 mmr = bfin_read16(src);
+ memcpy(dst, &mmr, sizeof(mmr));
+ return dst;
+ }
+ if (count == 4 && (unsigned long)src % 4 == 0) {
+ u32 mmr = bfin_read32(src);
+ memcpy(dst, &mmr, sizeof(mmr));
+ return dst;
+ }
+ /* Failed for some reason */
+ memset(dst, 0xad, count);
+ return dst;
+ }
+ if (dst >= (void *)SYSMMR_BASE) {
+ if (count == 2 && (unsigned long)dst % 2 == 0) {
+ u16 mmr;
+ memcpy(&mmr, src, sizeof(mmr));
+ bfin_write16(dst, mmr);
+ return dst;
+ }
+ if (count == 4 && (unsigned long)dst % 4 == 0) {
+ u32 mmr;
+ memcpy(&mmr, src, sizeof(mmr));
+ bfin_write32(dst, mmr);
+ return dst;
+ }
+ /* Failed for some reason */
+ memset(dst, 0xad, count);
+ return dst;
+ }
+#endif
- } else if (addr_bfin_on_chip_mem(src)) {
- /* L1 is the source */
+ /* if L1 is the source or dst, use DMA */
+ if (addr_bfin_on_chip_mem(dst) || addr_bfin_on_chip_mem(src))
return dma_memcpy(dst, src, count);
-
- } else
+ else
/* No L1 is involved, so just call regular memcpy */
return memcpy_ASM(dst, src, count);
}
OpenPOWER on IntegriCloud