Re: [PATCH v4 1/6] nova-core: bitfield: Move bitfield-specific code from register! into new macro

Greg KH
2025-09-29T19:37:46Z

On Mon, Sep 29, 2025 at 03:26:57PM -0400, Joel Fernandes wrote:
> On 9/24/2025 12:40 PM, Greg KH wrote:
> > On Tue, Sep 23, 2025 at 06:24:34PM -0400, Joel Fernandes wrote:
> [..]
> >
> >> For the separate issue of enforcing endianness with respect to (across)
> >> multiple fields, I agree with you that if the user's backend (the consumer of
> >> the data) is not doing such conversion, say via regmap, then that becomes a
> >> problem. But that problem is orthogonal/different and cannot be solved here.
> >
> > But that is exactly what these macros are being defined here for, so to
> > ignore that is going to cause problems :)
> >
>
> If needed, happy to add endianness support as needed by providing additional
> options to the macro. Based on this thread, it sounds like we want see if that
> is really needed here or can be solved elsewhere (?). The mental model I kind of
> have is this macro should only be dealing with CPU native endianness, much like
> bitfields in C deal with CPU endianness. Hmm.

Just don't go down the old path like drivers/net/fddi/skfp/h/supern_2.h
does with it's definition of:

union tx_descr {
struct {
#ifdef LITTLE_ENDIAN
unsigned int tx_length:16 ; /* frame length lower/upper byte */
unsigned int tx_res :8 ; /* reserved (bit 16..23) */
unsigned int tx_xmtabt:1 ; /* transmit abort */
unsigned int tx_nfcs :1 ; /* no frame check sequence */
unsigned int tx_xdone :1 ; /* give up token */
unsigned int tx_rpxm :2 ; /* byte offset */
unsigned int tx_pat1 :2 ; /* must be TXP1 */
unsigned int tx_more :1 ; /* more frame in chain */
#else
unsigned int tx_more :1 ; /* more frame in chain */
unsigned int tx_pat1 :2 ; /* must be TXP1 */
unsigned int tx_rpxm :2 ; /* byte offset */
unsigned int tx_xdone :1 ; /* give up token */
unsigned int tx_nfcs :1 ; /* no frame check sequence */
unsigned int tx_xmtabt:1 ; /* transmit abort */
unsigned int tx_res :8 ; /* reserved (bit 16..23) */
unsigned int tx_length:16 ; /* frame length lower/upper byte */
#endif
} t ;
long i ;
} ;

CPU endinness, hah, as if...