On Fri, Mar 6, 2020 at 5:18 PM John Garry <john.garry@xxxxxxxxxx> wrote: > On 06/03/2020 15:16, Arnd Bergmann wrote: > > 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) \ > > Note: The "bw" argument name could be improved to "bwl", since this > macro is used for building inl() also. > > >> 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))? > > I'm just copying what is in asm-generic io.h, which uses the 16b and 32b > byteswaps in the w and l variants, respectively. Sure, but I don't think that needs another macro. > > The idea is good, but it would be nice if we just somehow use a common > asm-generic io.h definition directly in logic_pio.c, like: > > asm-generic io.h: > > #ifndef __raw_inw // name? > #define __raw_inw __raw_inw > static inline u16 __raw_inw(unsigned long addr) > { > u16 val; > > __io_pbr(); > val = __le16_to_cpu(__raw_readw(addr)); > __io_par(val); > return val; > } > #endif > > #include <linux/logic_pio.h> > > #ifndef inw > #define inw __raw_inw > #endif Yes, makes sense. Maybe __arch_inw() then? Not great either, but I think that's better than __raw_inw() because __raw_* would sound like it mirrors __raw_readl() that lacks the barriers and byteswaps. Arnd