> > > +#ifndef writeq > > +#define writeq writeq > > +static inline void writeq(u64 val, void __iomem *reg) > > +{ > > + writel(val & 0xffffffff, reg); > > + writel(val >> 32, reg + 0x4UL); > > +} > > +#endif > > Please use the appropriate generic header file to achieve this, do not > reimplement it. > > See include/linux/io-64-nonatomic*.h and think very carefully about > which one is appropriate. > > Specifically, if a register read has side effects but only if you read > the lower or upper half you want to make sure that you use the > implementation that reads the half the doesn't trigger the side > effects first. This way the whole 64-bit value can be sampled before > status bits clear, or whatever. > > Likewise for which half of a register, when written, commits the > results. > > If both halfs trigger the side effect or the commit of the write, you > cannot enable your driver on 32-bit architectures. > > So this is not such a simple fix where you just hack the build to pass, > you have to really think hard about what the code does, how the hardware > works, and if this can even work properly on 32-bit platforms. > > Thank you.
Thanks for pointing out the generic implementation. In our drivers we only use The 64b macros for a single purpose - writing the rdma CQ doorbells. It will not be used in any other register access. In this case the "lower and then upper" is the correct behavior for us. I will send a v3 using the generic implementation. Thanks, Ariel