On Fri, Mar 6, 2020 at 11:40 AM John Garry <john.garry@xxxxxxxxxx> wrote: > On 06/03/2020 07:54, Arnd Bergmann wrote: > > On Fri, Mar 6, 2020 at 4:44 AM Sinan Kaya <okaya@xxxxxxxxxx> wrote: > -- a/lib/logic_pio.c > +++ b/lib/logic_pio.c > @@ -229,13 +229,21 @@ unsigned long > logic_pio_trans_cpuaddr(resource_size_t addr) > } > > #if defined(CONFIG_INDIRECT_PIO) && defined(PCI_IOBASE) > + > +#define logic_in_to_cpu_b(x) (x) > +#define logic_in_to_cpu_w(x) __le16_to_cpu(x) > +#define logic_in_to_cpu_l(x) __le32_to_cpu(x) > + > #define BUILD_LOGIC_IO(bw, type) \ > type logic_in##bw(unsigned long addr) \ > { \ > type ret = (type)~0; \ > \ > if (addr < MMIO_UPPER_LIMIT) { \ > - ret = read##bw(PCI_IOBASE + addr); \ > + void __iomem *_addr = PCI_IOBASE + addr; \ > + __io_pbr(); \ > + ret = logic_in_to_cpu_##bw(__raw_read##bw(_addr)); \ > + __io_par(ret); \ > } else if (addr >= MMIO_UPPER_LIMIT && addr < IO_SPACE_LIMIT) {\ > struct logic_pio_hwaddr *entry = find_io_rang > > We could prob combine the le_to_cpu and __raw_read into a single macro. What is the purpose of splitting out the byteswap rather than leaving the open-coded rather than __le16_to_cpu(__raw_readw(PCI_IOBASE + addr))? If this is needed to work across architectures, how about adding an intermediate __raw_inw() etc in asm-generic/io.h like #ifndef __raw_inw #define __raw_inw(a) __raw_readw(PCI_IOBASE + addr)); #endif #include <linux/logic_pio.h> #ifndef inw static inline u16 inw(unsigned long addr) { u16 val; __io_pbr(); val = __le16_to_cpu(__raw_inw(addr)); __io_par(val); return val; } #endif Arnd