[U-Boot] [PATCH 2/3] Data types defined for 64 bit physical address
Bansal Aneesh
aneesh.bansal at freescale.com
Fri Jul 31 20:32:22 CEST 2015
> > > > diff --git a/arch/powerpc/include/asm/io.h
> > > > b/arch/powerpc/include/asm/io.h index a5257e9..8c6f47e 100644
> > > > --- a/arch/powerpc/include/asm/io.h
> > > > +++ b/arch/powerpc/include/asm/io.h
> > > > @@ -246,6 +246,19 @@ extern inline void out_be32(volatile unsigned
> > > > __iomem *addr, u32 val)
> > > > __asm__ __volatile__("sync; stw%U0%X0 %1,%0" : "=m" (*addr) :
> > > > "r" (val)); }
> > > >
> > > > +extern inline u64 in_be64(const u64 *addr) {
> > > > + return ((u64)in_be32((u32 *)addr) << 32) |
> > > > + (in_be32((u32 *)addr + 1));
> > > > +}
> > > > +
> > > > +extern inline void out_be64(u64 *addr, u64 val) {
> > > > + out_be32((u32 *)addr, (u32)(val >> 32));
> > > > + out_be32((u32 *)addr + 1, (u32)val); }
> > >
> > > What do you need these for? I don't think it's a good idea to have
> > > I/O accessors that look atomic but aren't (same goes for arm32).
> > >
> > 64 bit read and writes are required for CAAM operations. That is why I
> > have added these in powerpc and arm.
>
> No, it's not required. You could just as well perform multiple out_be32() in the driver.
>
> -Scott
>
It is required to define I/O accessor for 64 bit access.
It is already defined in arm.
The driver will just call OUT_64 or IN_64.
Now that might be a be64 or le64 depending upon the endianness of IP block on that SoC.
Further the definition of be64 and le64 will be different for ARM and PowerPC.
We have a common CAAM driver which can't just have multiple out_be32() instead of OUT_64.
All PowerPC SOC's : Core is BE and CAAM is BE
LS1020 : Core is LE and CAAM is LE
The problem is with LS1043, where core in LE and CAAM is BE.
So in order, to have a unified CAAM driver we need accessors for 64 bit.
For ARM, these functions are directly defined in C as:
out_16 (*(volatile unsigned short *)(a) = (v))
out_32 (*(volatile unsigned int *)(a) = (v))
out_64 (*(volatile unsigned long long *)(a) = (v))
There is another macro defined which takes care of byte-swapping the value for BE or LE
But in PowerPC, for 16 and 32 bit these are defined in ASM.
I could not find asm instructions for 64 bit read/write. So, I defined these in C.
More information about the U-Boot
mailing list