[PATCH v3 04/62] arm/acpi: Emulate io ports for arm

Arnd Bergmann arnd at arndb.de
Wed Nov 18 00:24:54 PST 2015


On Wednesday 18 November 2015 15:01:26 Shannon Zhao wrote:
> Hi Arnd,
> 
> On 2015/11/17 17:50, Arnd Bergmann wrote:
> > On Tuesday 17 November 2015 17:40:03 shannon.zhao at linaro.org wrote:
> >> +/*
> >> + * Emulate x86 io ports for arm.
> >> + */
> >> +#define __armio(addr) ( (void __iomem *)addr )
> >> +
> >> +#define inb(c) ( readb( __armio(c) ) )
> >> +#define inw(c) ( readw( __armio(c) ) )
> >> +#define inl(c) ( readl( __armio(c) ) )
> >> +
> >> +#define outb(v, c) ( writeb(v, __armio(c) ) )
> >> +#define outw(v, c) ( writew(v, __armio(c) ) )
> >> +#define outl(v, c) ( writel(v, __armio(c) ) )
> >> +
> > 
> > This is almost certainly wrong. There might be I/O port accesses, but they
> > won't be in the same place as normal pointers.
> > 
> Sorry, maybe I didn't get what you mean. Here it just wants emulate the
> in(b,w,l) and out(b,w,l) which exist on x86 while not on ARM. So it
> could introduce less change to the common ACPI codes, for example
> acpi_os_write_port().
> 
> I see there is the same thing in Linux arch/arm/include/asm/io.h

The problem is that your definition of __armio() is wrong. If you want to
do it right, you need to first find the PCI I/O port ranges and map them
into a virtual address, and then define __armio() in a way to add
the virtual address you have mapped them to.

Alternatively, define the functions so they don't try to access the
pointers but instead just print a warning.

	Arnd



More information about the linux-arm-kernel mailing list