[U-Boot] [PATCH 3/3] nds32: asm/io.h: add __iormb and __iowmb support
馬克泡
macpaul at gmail.com
Thu Oct 27 05:23:37 CEST 2011
Hi Graeme,
在 2011年10月26日下午1:55,Graeme Russ <graeme.russ at gmail.com> 寫道:
> Hi Macpaul
[snip]
>> I'm going to change writeb/readb series functions from macro into
>> inline functions.
>
> For all arches? Have you seen /arch/x86/include/asm/io.h?
Currently, I have take a looked into arm, mips, and blackfin.
Because the most probably common problem lead with the function
replacement might be
NS16550, so I check NS16550 at first.
According to your reminding, it seem there is no necessary for x86 to
replace the macro.
Is that correct?
However I have no idea is there any other architecture like x86.
>> Is this a necessary for this machine to access 8-bytes data?
>
> outb/inb access 8-bit data in a 16-bit address space and the ns16650 has
> (for the x86 architecture at least) byte aligned registers
>
Okay, so it's not actually an "ulong" casting.
>> Since inline functions are type sensitive,
>> I've suggest to replace the macro for other machines like writeb(x, (uint)y)
>> but Marek think this is not good enough.
>> Could you give some comments?
>
> Hmm, but eNET (well, all x86 really) would not use writeb/readb - outb/inb
> would be used instead so if you are only touching the writeb/readb, eNET
> would never see this. So I don't understand where your type conflicts are
> occuring
>
Because the the address passed into writeb and readb in ns16550.c will be
"unsigned char" if they defined CONFIG_SYS_NS16550_REG_SIZE as "1" or
"-4" and then
will lead compile warnings when the address of inline function of
writeb/readb is "unsigned int".
(Please refer to include/ns16550.c)
> Looking at the ulong cast, I was wondering why it was there, and the commit
> diff says I wrote it which is a bit of a worry :) x86 only has 65535
> ports accessible via outb and inb, so I would have thought the case should
> have been a ushort, not a ulong.
>
Okay, so we can double confirmed it is an ushort not an ulong.
> I'm sorry, but without a patch to see what you are actually doing, I'm
> having a bit of difficulty picturing what is happening and what could be
> going wrong...
>
Sorry not to add you at the beginning when the discussion begin.
Because when I sent this patch, I thought it is only related to NDS32
arch at first.
For examples, the origin implementation in macro is this.
#define __arch_getb(a) (*(unsigned char *)(a))
#define __arch_putb(v, a) (*(unsigned char *)(a) = (v))
#define dmb() __asm__ __volatile__ ("" : : : "memory")
#define __iormb() dmb()
#define __iowmb() dmb()
#define writeb(v, c) ({ u8 __v = v; __iowmb(); __arch_putb(__v, c); __v; })
#define readb(a) __arch_getb(a)
The new implementation in inline function will be like this.
static inline void writeb(unsigned char val, unsigned char *addr)
{
__iowmb();
__arch_putb(val, addr);
}
static inline unsigned char readb(unsigned char *addr)
{
u8 val;
val = __arch_getb(addr);
__iormb();
return val;
}
--
Best regards,
Macpaul Lin
More information about the U-Boot
mailing list