On 30/07/17 10:03 AM, Andy Shevchenko wrote: > On Thu, Jul 27, 2017 at 2:19 AM, Logan Gunthorpe <logang@xxxxxxxxxxxx> wrote: >> In order to provide non-atomic functions for io{read|write}64 that will >> use readq and writeq when appropriate. We define a number of variants >> of these functions in the generic iomap that will do non-atomic >> operations on pio but atomic operations on mmio. >> >> These functions are only defined if readq and writeq are defined. If >> they are not, then the wrappers that always use non-atomic operations >> from include/linux/io-64-nonatomic*.h will be used. > > Don't you see here a slight problem? > > In some cases we want to substitute atomic in favour of non-atomic > when both are defined. > So, please don't do this "smartly". I'm not sure what you mean here. The driver should use ioread64 and include an io-64-nonatomic header. Then there are three cases: 1) The arch has no atomic 64 bit io operations defined. In this case it uses the non-atomic inline function in the io-64-nonatomic header. 2) The arch uses CONFIG_GENERIC_IOMAP and has readq defined, but not ioread64 defined (likely because pio can't do atomic 64 bit operations but mmio can). In this case we need to use the ioread64_xx functions defined in iomap.c which do atomic mmio and non-atomic pio. 3) The arch has ioread64 defined so the atomic operation is used. >> +u64 ioread64_lo_hi(void __iomem *addr) >> +{ >> + IO_COND(addr, return pio_read64_lo_hi(port), return readq(addr)); >> + return 0xffffffffffffffffLL; >> +} > > U missed u. I'll fix this in the next revision. Thanks, Logan