On 10/18/2012 07:09:19 AM, Simon Glass wrote:
Hi,
On Wed, Oct 17, 2012 at 6:47 PM, Dennis Lan (dlan)
<[email protected]> wrote:
> HI ALL:
> Is it just conventional to access IO register with wriltel,
readl?
> or is there any specific reason here.
> what's the difference with direct access? writel has few arch
releated
> operation to guarantee hardware access?
Yes it is a convention. For CPUs which need to introduce
compiler/memory barriers or other operations, this is supposed to be
done automatically in the access functions rather than in the code.
Volatile tells the compiler that the value can change, and not to
optimise accesses to it, but this is just the compiler and does not
necessarily do everything required for I/O access on the platform.
Linux has a README on this topic (search for
Documentation/volatile-considered-harmful.txt) but I'm not sure that
the locking / multi-threading discussion has much relevance to U-Boot.
(Oddly, I did notice at one point that on ARM some of the access
functions don't actually have any barriers. It might have been
clrsetbits.)
It looks like ARM is missing barriers on out_le32 etc. At one point
ARM was missing barriers on all accessors, and commit
3c0659b535b075be124c3d2a0714e55e65c46737 only bothered with the
writel/readb/etc. accessors.
People tend to use writel() rather than __raw_writel(). In U-Boot with
a flat address mapping I'm not sure there is much difference in
practice, but it is nice to keep code consistent.
writel() is a little endian access with memory barriers if needed by
the architecture. __raw_writel() is native-endian and does not provide
barriers. Unfortunately there doesn't seem to be an accessor that is
native-endian with barriers or specified-endian without barriers.
At least, that's what happens on powerpc, and I don't see anything
obviously contradicting that from scanning some other arches.
-Scott
_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot