[U-Boot] [PATCH] Enable port-mapped access to 16550 UART

Graeme Russ graeme.russ at gmail.com
Wed Oct 28 22:18:27 CET 2009


Detlev,

Thanks for havnig a look at this

On Thu, Oct 29, 2009 at 3:13 AM, Detlev Zundel <dzu at denx.de> wrote:
> Hello Graeme,
>
>> This patch does two things:
>>   - Changes default behaviour to use proper memory accessors
>>   - Allows port-mapped access (using inb/outb) for the x86 architecture
>>
>> Signed-off-by: Graeme Russ <graeme.russ at gmail.com>
>> ---
>>  drivers/serial/ns16550.c |   69 ++++++++++++++++++++++++++--------------------
>>  1 files changed, 39 insertions(+), 30 deletions(-)
>>
>> diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
>> index 2fcc8c3..c41ca0d 100644
>> --- a/drivers/serial/ns16550.c
>> +++ b/drivers/serial/ns16550.c
>> @@ -6,6 +6,8 @@
>>
>>  #include <config.h>
>>  #include <ns16550.h>
>> +#include <linux/types.h>
>> +#include <asm/io.h>
>>
>>  #define UART_LCRVAL UART_LCR_8N1             /* 8 data, 1 stop, no parity */
>>  #define UART_MCRVAL (UART_MCR_DTR | \
>> @@ -13,28 +15,35 @@
>>  #define UART_FCRVAL (UART_FCR_FIFO_EN |      \
>>                    UART_FCR_RXSR |    \
>>                    UART_FCR_TXSR)             /* Clear & enable FIFOs */
>> +#ifdef CONFIG_X86
>> +#define uart_writeb(x,y)     outb(x,(ulong)y)
>> +#define uart_readb(y)                inb((ulong)y)
>> +#else
>> +#define uart_writeb(x,y) writeb(x,y)
>> +#define uart_readb(y) readb(y)
>> +#endif
>
> Why do you need a specific variant for X86 instead of implementing
> writeb and readb correctly in the first place?

For x86 readb and writeb provide volatile accessors to memory - These are
used for memory-mapped devices (i.e. devices which are attached directly
to the memory bus such as PCI devices etc). inb and outb provide access to
I/O Ports. For example:

writeb(0x12, 0x00001000) will generate something like:
    movb $0x12, al
    movl $0x00001000, ebx
    movb al, ebx

outb(0x12, 0x00001000) will generate something like:
    movb $0x12, al
    movl $0x00001000, ebx
    outb al, ebx

Looking at include/asm/asm-ppc/io.h it seems to me that, for PPC, there is
no differentiation between readb/writeb and inb/outb other than that the
user may define an optional IOBASE for inb/outb which shifts where in
memory inb/outb accesses, but they are still memory accesses. So, for PPC,
if IOBASE is 0, the above two examples will compile to identical code.

(Having a look at the other arches, it appears that x86 is very unique in
that inb/outb do not access memory)

>
> If this was in place, all the accessors should only switch to using
> readb/writeb and from looking at it, this should not brak e.g. PowerPC
> boards with weird register layouts.

This patch should not change the behaviour for non x86 boards other than
to use proper I/O accessors which prevents any risk that gcc will
optimise them into some other order (or completely out)

For x86, this patch causes the driver to use I/O rather than memory which
is how PC UARTS (and interrupt controllers and nearly anything else which
is not 'memory') have always been accessed

>
> When you post a patch with only these changes, I'll test it on a few of
> the usual suspects on PowerPC.

The only other option is my even uglier first patch:

http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/70250

>
> Cheers
>  Detlev
>

Regards,

Graeme


More information about the U-Boot mailing list