Thread (1 message) 1 message, 1 author, 2003-07-25

Re: IO, ANSI vs GCC structs

From: Bret Indrelee <hidden>
Date: 2003-07-25 19:59:23

On Fri, 25 Jul 2003, Eugene Surovegin wrote:
At 12:22 PM 7/25/2003, Wolfgang Denk wrote:
quoted
quoted
accessed through a structure?  Is it acceptable to do:

  #define MYHW  (MY_MBAR+42)

  ...

  out_be32(MYHW, 0xco1df00d);
...I would not accept such code.

There is one fundamental difference: a field in a struct has a  type,
i.  e.  the  compiler "knows" how big it is (8, 16, 32, ... bits), if
special attributes apply (volatile), etc.
Although functions like out_be32 also *know* the size :).

IMHO, it's not a good idea to access IO remmaped registers simply through C
struct, it's better and safe to use out_* and in_*.
Wouldn't best practices also include using a base address rather than
a constant, so that when a new board places the hardware in a different
location all you have to do is find it?

out_be32(my_bar + offsetof(myregs_t, sna_reg), 0xdeadbeef);
There are issues that C struct cannot deal with - load/store reodering (of
course you can insert wmb() and friends if you know what you are doing :).

I think the best practice is to use C struct (for readability) and
out_*/in_* on structure members for actual access.
I've always written low level I/O routines for everything in a driver
because it is easier to adapt when someone changes how they want to do
access to the device. The code all calls the low level IO routines.

-Bret

--
Bret Indrelee                 QLogic Corporation
Bret.Indrelee@qlogic.com      6321 Bury Drive, St 13, Eden Prairie, MN 55346


** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help