On Thu, Sep 27, 2018 at 10:40:44AM -0500, Larry Finger wrote:
> On 9/27/18 8:50 AM, Stanislaw Gruszka wrote:
> --snip
> 
> > 
> > > +#define BIT_LEN_MASK_32(__bitlen) (0xFFFFFFFF >> (32 - (__bitlen)))
> > > +#define BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen)                    
> > >       \
> > > + (BIT_LEN_MASK_32(__bitlen) << (__bitoffset))
> > > +#define LE_P4BYTE_TO_HOST_4BYTE(__start) (le32_to_cpu(*((__le32 
> > > *)(__start))))
> > > +#define LE_BITS_CLEARED_TO_4BYTE(__start, __bitoffset, __bitlen)         
> > >       \
> > > + (LE_P4BYTE_TO_HOST_4BYTE(__start) &                                    \
> > > +  (~BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen)))
> > > +#define LE_BITS_TO_4BYTE(__start, __bitoffset, __bitlen)                 
> > >       \
> > > + ((LE_P4BYTE_TO_HOST_4BYTE(__start) >> (__bitoffset)) &                 \
> > > +  BIT_LEN_MASK_32(__bitlen))
> > > +#define SET_BITS_TO_LE_4BYTE(__start, __bitoffset, __bitlen, __value)    
> > >       \
> > > + do {                                                                   \
> > > +         *((__le32 *)(__start)) = \
> > > +         cpu_to_le32( \
> > > +         LE_BITS_CLEARED_TO_4BYTE(__start, __bitoffset, __bitlen) |     \
> > > +         ((((u32)__value) & BIT_LEN_MASK_32(__bitlen)) << (__bitoffset))\
> > > +         );                                                             \
> > > + } while (0)
> 
> Stanislaw,
> 
> I have never loved these macros, and it took a lot of time to get them to be
> endian correct. Could you point me to a method that would overwrite a
> portion of a 32-bit little-endian word that would be correct for both
> little- and big-endian machines? Keep in mind that Kalle hates the use of
> compile tests on __LITTLE_ENDIAN.

Maybe something like this (not tested)

#define SET_LE32(reg, off, len, val) \
        ((reg & cpu_to_le32(~GENMASK(off + len - 1, off))) | cpu_to_le32(val << 
off))

?

There are plenty of bitops and endian primitives in kernel, it's
very very unlikly you need custom macros for handle that.

Thanks
Stanislaw

Reply via email to