Message ID | 20170627230204.16410-2-logang@deltatee.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Herbert Xu |
Headers | show |
On Wed, Jun 28, 2017 at 1:02 AM, Logan Gunthorpe <logang@deltatee.com> wrote: > This patch adds io{read|write}64[be] macros to point to the readq/writeq > in use. > > This is because new drivers are encouraged to use ioreadXX, et al instead > of readX[1], et al -- and mixing ioreadXX with readq is pretty ugly. > > [1] ldd3: section 9.4.2 > > Signed-off-by: Logan Gunthorpe <logang@deltatee.com> > cc: Christoph Hellwig <hch@lst.de> > cc: Arnd Bergmann <arnd@arndb.de> > cc: Alan Cox <gnomes@lxorguk.ukuu.org.uk> > cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > --- > include/linux/io-64-nonatomic-hi-lo.h | 16 ++++++++++++++++ > include/linux/io-64-nonatomic-lo-hi.h | 16 ++++++++++++++++ > 2 files changed, 32 insertions(+) > > diff --git a/include/linux/io-64-nonatomic-hi-lo.h b/include/linux/io-64-nonatomic-hi-lo.h > index defcc4644ce3..07a75831244f 100644 > --- a/include/linux/io-64-nonatomic-hi-lo.h > +++ b/include/linux/io-64-nonatomic-hi-lo.h > @@ -54,4 +54,20 @@ static inline void hi_lo_writeq_relaxed(__u64 val, volatile void __iomem *addr) > #define writeq_relaxed hi_lo_writeq_relaxed > #endif > > +#ifndef ioread64 > +#define ioread64 readq > +#endif This is wrong since ioread* is not the same read* on x86 and other architectures that have native PCI PIO accessors, or that require additional barriers for those. You have to copy hi_lo_readq() here, and call ioread32 twice instead of calling readl() twice. Same for iowrite64. > +#ifndef ioread64be > +#define ioread64be(p) be64_to_cpu(ioread64(p)) > +#endif This has another problem: ioread64() is defined to access little-endian registers, just like readq(). This means that instead of be64_to_cpu() you need swab64() and always perform the byte swap, otherwise this would be broken on big-endian architectures. Arnd
On 28/06/17 04:11 AM, Arnd Bergmann wrote: > This is wrong since ioread* is not the same read* on x86 and other > architectures that have native PCI PIO accessors, or that require > additional barriers for those. > > You have to copy hi_lo_readq() here, and call ioread32 twice instead > of calling readl() twice. Same for iowrite64. > >> +#ifndef ioread64be >> +#define ioread64be(p) be64_to_cpu(ioread64(p)) >> +#endif > > This has another problem: ioread64() is defined to access little-endian > registers, just like readq(). This means that instead of be64_to_cpu() > you need swab64() and always perform the byte swap, otherwise this > would be broken on big-endian architectures. Ah, ok, understood. I'll see if I can fix both these issues. Thanks, Logan
diff --git a/include/linux/io-64-nonatomic-hi-lo.h b/include/linux/io-64-nonatomic-hi-lo.h index defcc4644ce3..07a75831244f 100644 --- a/include/linux/io-64-nonatomic-hi-lo.h +++ b/include/linux/io-64-nonatomic-hi-lo.h @@ -54,4 +54,20 @@ static inline void hi_lo_writeq_relaxed(__u64 val, volatile void __iomem *addr) #define writeq_relaxed hi_lo_writeq_relaxed #endif +#ifndef ioread64 +#define ioread64 readq +#endif + +#ifndef iowrite64 +#define iowrite64 writeq +#endif + +#ifndef ioread64be +#define ioread64be(p) be64_to_cpu(ioread64(p)) +#endif + +#ifndef iowrite64be +#define iowrite64be(v, p) iowrite64(cpu_to_be64(v), (p)) +#endif + #endif /* _LINUX_IO_64_NONATOMIC_HI_LO_H_ */ diff --git a/include/linux/io-64-nonatomic-lo-hi.h b/include/linux/io-64-nonatomic-lo-hi.h index 084461a4e5ab..3d0565e67175 100644 --- a/include/linux/io-64-nonatomic-lo-hi.h +++ b/include/linux/io-64-nonatomic-lo-hi.h @@ -54,4 +54,20 @@ static inline void lo_hi_writeq_relaxed(__u64 val, volatile void __iomem *addr) #define writeq_relaxed lo_hi_writeq_relaxed #endif +#ifndef ioread64 +#define ioread64 readq +#endif + +#ifndef iowrite64 +#define iowrite64 writeq +#endif + +#ifndef ioread64be +#define ioread64be(p) be64_to_cpu(ioread64(p)) +#endif + +#ifndef iowrite64be +#define iowrite64be(v, p) iowrite64(cpu_to_be64(v), (p)) +#endif + #endif /* _LINUX_IO_64_NONATOMIC_LO_HI_H_ */
This patch adds io{read|write}64[be] macros to point to the readq/writeq in use. This is because new drivers are encouraged to use ioreadXX, et al instead of readX[1], et al -- and mixing ioreadXX with readq is pretty ugly. [1] ldd3: section 9.4.2 Signed-off-by: Logan Gunthorpe <logang@deltatee.com> cc: Christoph Hellwig <hch@lst.de> cc: Arnd Bergmann <arnd@arndb.de> cc: Alan Cox <gnomes@lxorguk.ukuu.org.uk> cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- include/linux/io-64-nonatomic-hi-lo.h | 16 ++++++++++++++++ include/linux/io-64-nonatomic-lo-hi.h | 16 ++++++++++++++++ 2 files changed, 32 insertions(+)