All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] MPC5200: workaround data corruption for unaligned local bus accesses
@ 2010-06-21 20:29 Wolfgang Denk
  2010-06-22 23:10 ` [U-Boot] [PATCH v2] " Wolfgang Denk
  2010-06-23  0:12 ` [U-Boot] [PATCH v3] " Wolfgang Denk
  0 siblings, 2 replies; 23+ messages in thread
From: Wolfgang Denk @ 2010-06-21 20:29 UTC (permalink / raw)
  To: u-boot

The MPC5200 has a nasty problem that will cause silent data corruption
when performing unaligned 16 or 32 byte accesses when reading from the
local bus - typically this affects reading from flash. The problem can
be easily shown:

=> md fc0c0000 10
fc0c0000: 323e4337 01626f6f 74636d64 3d72756e    2>C7.bootcmd=run
fc0c0010: 206e6574 5f6e6673 00626f6f 7464656c     net_nfs.bootdel
fc0c0020: 61793d35 00626175 64726174 653d3131    ay=5.baudrate=11
fc0c0030: 35323030 00707265 626f6f74 3d656368    5200.preboot=ech
=> md fc0c0001 10
fc0c0001: 65636801 00000074 0000003d 00000020    ech....t...=...
fc0c0011: 0000005f 00000000 00000074 00000061    ..._.......t...a
fc0c0021: 00000000 00000064 00000065 00000035    .......d...e...5
fc0c0031: 00000000 00000062 0000003d 0000006f    .......b...=...o
=> md.w fc0c0001 10
fc0c0001: 0000 3701 0000 6f74 0000 643d 0000 6e20    ..7...ot..d=..n
fc0c0011: 0000 745f 0000 7300 0000 6f74 0000 6c61    ..t_..s...ot..la

This commit implements a workaround at least for the most blatant
problem: using memcpy() from NOR flash. We rename the assembler
routine into __memcpy() and provide a wrapper, which will use a
byte-wise copy loop for source addresses in NOR flash, and branch to
the optimized __memcpy() otherwise.

Signed-off-by: Wolfgang Denk <wd@denx.de>
---
 arch/powerpc/cpu/mpc5xxx/Makefile         |    5 ++
 arch/powerpc/cpu/mpc5xxx/memcpy_mpc5200.c |   62 +++++++++++++++++++++++++++++
 arch/powerpc/lib/Makefile                 |    5 ++
 3 files changed, 72 insertions(+), 0 deletions(-)
 create mode 100644 arch/powerpc/cpu/mpc5xxx/memcpy_mpc5200.c

diff --git a/arch/powerpc/cpu/mpc5xxx/Makefile b/arch/powerpc/cpu/mpc5xxx/Makefile
index 0ee0611..4ab2b7b 100644
--- a/arch/powerpc/cpu/mpc5xxx/Makefile
+++ b/arch/powerpc/cpu/mpc5xxx/Makefile
@@ -30,6 +30,11 @@ SOBJS	= io.o firmware_sc_task_bestcomm.impl.o
 COBJS	= i2c.o traps.o cpu.o cpu_init.o ide.o interrupts.o \
 	  loadtask.o pci_mpc5200.o serial.o speed.o usb_ohci.o usb.o
 
+# Workaround for local bus unaligned access problem on MPC5200
+#ifdef CONFIG_MPC5200
+COBJS	+= memcpy_mpc5200.o
+#endif
+
 SRCS	:= $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS))
 START	:= $(addprefix $(obj),$(START))
diff --git a/arch/powerpc/cpu/mpc5xxx/memcpy_mpc5200.c b/arch/powerpc/cpu/mpc5xxx/memcpy_mpc5200.c
new file mode 100644
index 0000000..5c2e64f
--- /dev/null
+++ b/arch/powerpc/cpu/mpc5xxx/memcpy_mpc5200.c
@@ -0,0 +1,62 @@
+/*
+ * (C) Copyright 2010
+ * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/*
+ * This is a workaround for issues on the MPC5200, where unaligned
+ * 32-bit-accesses to the local bus will deliver corrupted data. This
+ * happens for example when trying to use memcpy() from an odd NOR
+ * flash address; the behaviour can be also seen when using "md" on an
+ * odd NOR flash address (but there it is not a bug in U-Boot, which
+ * only shows the behaviour of this processor).
+ *
+ * For memcpy(), we test if the source address is in NOR flash, and
+ * perform byte-wise (slow) copy then; otherwise we use the optimized
+ * (fast) real __memcpy().
+ */
+
+#include <common.h>
+#include <flash.h>
+#include <linux/types.h>
+
+void *memcpy(void *trg, const void *src, size_t len)
+{
+	extern void* __memcpy(void *, const void *, size_t);
+	char *s = (char *)src;
+	char *t = (char *)trg;
+	void *dest = src;
+
+	/*
+	 * Check is source address is in flash:
+	 * If not, we use the fast assembler code
+	 */
+	if (addr2info((ulong)src) == NULL)
+		return __memcpy(trg, src, len);
+
+	/*
+	 * Copying from flash, perform byte by byte copy.
+	 */
+	while (len-- > 0)
+		*t++ = *s++;
+
+	return dest;
+}
diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile
index 5f85502..4ba51b3 100644
--- a/arch/powerpc/lib/Makefile
+++ b/arch/powerpc/lib/Makefile
@@ -43,6 +43,11 @@ COBJS-y	+= time.o
 SRCS	:= $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
 OBJS	:= $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
 
+# Workaround for local bus unaligned access problem on MPC5200
+#ifdef CONFIG_MPC5200
+$(obj)ppcstring.o: AFLAGS += -Dmemcpy=__memcpy
+#endif
+
 $(LIB):	$(obj).depend $(OBJS)
 	@if ! $(CROSS_COMPILE)readelf -S $(OBJS) | grep -q '\.fixup.*PROGBITS';\
 	then \
-- 
1.7.0.1

^ permalink raw reply related	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2010-06-29 21:47 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-21 20:29 [U-Boot] [PATCH] MPC5200: workaround data corruption for unaligned local bus accesses Wolfgang Denk
2010-06-22 23:10 ` [U-Boot] [PATCH v2] " Wolfgang Denk
2010-06-23  0:12 ` [U-Boot] [PATCH v3] " Wolfgang Denk
2010-06-25  8:35   ` Detlev Zundel
2010-06-29  9:48   ` [U-Boot] [PATCH] MPC512x: " Wolfgang Denk
2010-06-29 11:49     ` Detlev Zundel
2010-06-29 12:09       ` Wolfgang Denk
2010-06-29 12:41         ` Detlev Zundel
2010-06-29 12:42         ` Joakim Tjernlund
2010-06-29 12:55           ` Wolfgang Denk
2010-06-29 13:06             ` Joakim Tjernlund
2010-06-29 14:21               ` Joakim Tjernlund
2010-06-29 16:19             ` [U-Boot] [PATCH] MPC512x: workaround data corruption forunaligned " Steve Deiters
2010-06-29 19:24               ` Wolfgang Denk
2010-06-29 21:47                 ` Joakim Tjernlund
2010-06-29 12:23       ` [U-Boot] [PATCH] MPC512x: workaround data corruption for unaligned " Anatolij Gustschin
2010-06-29 12:47         ` Wolfgang Denk
2010-06-29 13:34           ` Anatolij Gustschin
2010-06-29 12:45     ` [U-Boot] [PATCH] Use memcpy in print_buffer to fix unaligned dumps Anatolij Gustschin
2010-06-29 12:53       ` Wolfgang Denk
2010-06-29 12:57         ` Wolfgang Denk
2010-06-29 19:42         ` Mike Frysinger
2010-06-29 19:29     ` [U-Boot] [PATCH] MPC512x: workaround data corruption for unaligned local bus accesses Wolfgang Denk

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.