[U-Boot] [PATCH] POST: Added ECC memory test for mpc83xx.

Michael Zaidman michael.zaidman at gmail.com
Tue Apr 20 22:22:58 CEST 2010


On Sat, Apr 17, 2010 at 12:20 PM, Joakim Tjernlund
<joakim.tjernlund at transmode.se> wrote:
>>
>> Michael Zaidman <michael.zaidman at gmail.com> wrote on 2010/04/16 18:44:12:
>> >
>> > On Fri, Apr 16, 2010 at 1:25 AM, Kim Phillips
>> > <kim.phillips at freescale.com> wrote:
>> > > On Thu, 8 Apr 2010 10:37:08 +0200
>> > > Joakim Tjernlund <joakim.tjernlund at transmode.se> wrote:
>> > >
>> > >> Kim Phillips <kim.phillips at freescale.com> wrote on 2010-04-08 10:27:03:
>> >
>> > I also agree with Joakim regarding the routine call overhead and
>> > replacing it by inline macro. Please review this code.
>> >
>> > From 5a64a5c4f480dcea89bc8f13f8464b96b888b73c Mon Sep 17 00:00:00 2001
>> > From: Michael Zaidman <michael.zaidman at gmail.com>
>> > Date: Fri, 16 Apr 2010 18:50:43 +0300
>> > Subject: [U-Boot][PATCH] asm-ppc/io.h - added 64bits I/O accessors for ppc32.
>> >
>> > Suggested-by: Joakim Tjernlund <joakim.tjernlund at transmode.se>
>> > Signed-off-by: Michael Zaidman <michael.zaidman at gmail.com>
>> > ---
>> >  include/asm-ppc/io.h |   49 +++++++++++++++++++++++++++++++++++++++++++++++++
>> >  1 files changed, 49 insertions(+), 0 deletions(-)
>> >
>> > diff --git a/include/asm-ppc/io.h b/include/asm-ppc/io.h
>> > index 4ddad26..0d5e125 100644
>> > --- a/include/asm-ppc/io.h
>> > +++ b/include/asm-ppc/io.h
>> > @@ -231,6 +231,31 @@ extern inline unsigned in_be32(const volatile
>> > unsigned __iomem *addr)
>> >     return ret;
>> >  }
>> >
>> > +/* 64 bits I/O read accessor for ppc32 */
>> > +extern inline void in_be64(volatile unsigned __iomem *addr, volatile
>> > unsigned __iomem *ret)
>> > +{
>> > +/* FIXME: Add other CPUs without FPU here... */
>> > +#if defined(CONFIG_MPC832x)
>> > +   __asm__ __volatile__(
>> > +         "sync\n"
>> > +         "lwz%U0%X0 0,%0\n"
>> > +         "stw%U1%X1 0,%1\n"
>> > +         "lwz%U0%X0 0,4+%0\n"
>> > +         "stw%U1%X1 0,4+%1\n"
>> > +         "isync"
>> > +         :"=m" (*ret)
>> > +         :"m"  (*addr), "r" (addr), "r" (ret));
>>
>> To emulate FP better you should do 2 loads first and then 2 stores.
>> It is also faster.
>
> Forgot, you can add the MPC8xx CPU's too. These are also without FPU.
>
>
Ok, thanks, the code below does this. I did not succeed however to
force the compiler to assign register for temporary storage and used
r5 explicitly.

/* 64 bits I/O read accessor for ppc32 */
extern inline void in_be64(volatile unsigned __iomem *addr, volatile
unsigned __iomem *ret)
{
/* FIXME: Add other CPUs without FPU here... */
#if defined(CONFIG_MPC832x) || defined(CONFIG_MPC8xx)
       __asm__ __volatile__(
				"sync\n"
				"lwz%U0%X0 0,%0\n"
				"lwz%U0%X0 5,4+%0\n"
				"sync\n"
				"stw%U1%X1 0,%1\n"
				"stw%U1%X1 5,4+%1\n"
				"isync"
				:"=m" (*ret)
				:"m"  (*addr), "r" (addr), "r" (ret)
				:"r0", "r5"
				);
#else
       __asm__ __volatile__(
				"sync\n"
				"lfd%U0%X0  1,%0\n"
				"stfd%U1%X1 1,%1\n"
				"isync"
				:"=m" (*ret)
				:"m"  (*addr), "r" (addr), "r" (ret));
#endif
}

/* 64 bits I/O write accessor for ppc32 */
extern inline void out_be64(volatile unsigned __iomem *addr, volatile
unsigned __iomem *val)
{
/* FIXME: Add other CPUs without FPU here... */
#if defined(CONFIG_MPC832x) || defined(CONFIG_MPC8xx)
       __asm__ __volatile__(
				"sync\n"
				"lwz%U0%X0 0,%0\n"
				"lwz%U0%X0 5,4+%0\n"
				"sync\n"
				"stw%U1%X1 0,%1\n"
				"stw%U1%X1 5,4+%1\n"
				:"=m" (*addr)
				:"m"  (*val), "r" (addr), "r" (val)
				:"r0", "r5"
				);
#else
       __asm__ __volatile__(
				"sync\n"
				"lfd%U1%X1  1,%1\n"
				"stfd%U0%X0 1,%0"
				:"=m" (*addr)
				:"m"  (*val), "r" (addr), "r" (val));
#endif
}

-michael


More information about the U-Boot mailing list