All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Laight <david.laight.linux@gmail.com>
To: Yury Norov <yury.norov@gmail.com>
Cc: Mika Westerberg <mika.westerberg@linux.intel.com>,
	Rasmus Villemoes <linux@rasmusvillemoes.dk>,
	linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org,
	Geert Uytterhoeven <geert+renesas@glider.be>,
	Alexandre Belloni <alexandre.belloni@bootlin.com>,
	Jonathan Cameron <Jonathan.Cameron@huawei.com>,
	Crt Mori <cmo@melexis.com>,
	Richard Genoud <richard.genoud@bootlin.com>,
	Andy Shevchenko <andriy.shevchenko@intel.com>,
	Luo Jie <quic_luoj@quicinc.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Jakub Kicinski <kuba@kernel.org>,
	netdev@vger.kernel.org, "David S . Miller" <davem@davemloft.net>,
	Simon Horman <simon.horman@netronome.com>,
	Andreas Noever <andreas.noever@gmail.com>,
	Yehezkel Bernat <YehezkelShB@gmail.com>,
	Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Subject: Re: [PATCH 2/9] thunderblot: Don't pass a bitfield to FIELD_GET
Date: Wed, 10 Dec 2025 20:23:46 +0000	[thread overview]
Message-ID: <20251210202346.669c8c33@pumpkin> (raw)
In-Reply-To: <aTm4Y-avX8qoLLoe@yury>

On Wed, 10 Dec 2025 13:13:55 -0500
Yury Norov <yury.norov@gmail.com> wrote:

> On Wed, Dec 10, 2025 at 10:18:42AM +0000, David Laight wrote:
> > On Wed, 10 Dec 2025 10:41:02 +0100
> > Mika Westerberg <mika.westerberg@linux.intel.com> wrote:
> >   
> > > On Wed, Dec 10, 2025 at 09:34:03AM +0000, David Laight wrote:  
> > > > On Wed, 10 Dec 2025 06:56:17 +0100
> > > > Mika Westerberg <mika.westerberg@linux.intel.com> wrote:
> > > >     
> > > > > $subject has typo: thunderblot -> thunderbolt ;-)
> > > > > 
> > > > > On Tue, Dec 09, 2025 at 10:03:06AM +0000, david.laight.linux@gmail.com wrote:    
> > > > > > From: David Laight <david.laight.linux@gmail.com>
> > > > > > 
> > > > > > FIELD_GET needs to use __auto_type to get the value of the 'reg'
> > > > > > parameter, this can't be used with bifields.
> > > > > > 
> > > > > > FIELD_GET also want to verify the size of 'reg' so can't add zero
> > > > > > to force the type to int.
> > > > > > 
> > > > > > So add a zero here.
> > > > > > 
> > > > > > Signed-off-by: David Laight <david.laight.linux@gmail.com>
> > > > > > ---
> > > > > >  drivers/thunderbolt/tb.h | 2 +-
> > > > > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > > > > 
> > > > > > diff --git a/drivers/thunderbolt/tb.h b/drivers/thunderbolt/tb.h
> > > > > > index e96474f17067..7ca2b5a0f01e 100644
> > > > > > --- a/drivers/thunderbolt/tb.h
> > > > > > +++ b/drivers/thunderbolt/tb.h
> > > > > > @@ -1307,7 +1307,7 @@ static inline struct tb_retimer *tb_to_retimer(struct device *dev)
> > > > > >   */
> > > > > >  static inline unsigned int usb4_switch_version(const struct tb_switch *sw)
> > > > > >  {
> > > > > > -	return FIELD_GET(USB4_VERSION_MAJOR_MASK, sw->config.thunderbolt_version);
> > > > > > +	return FIELD_GET(USB4_VERSION_MAJOR_MASK, sw->config.thunderbolt_version + 0);      
> > > > > 
> > > > > Can't this use a cast instead? If not then can you also add a comment here
> > > > > because next someone will send a patch "fixing" the unnecessary addition.    
> > > > 
> > > > A cast can do other (possibly incorrect) conversions, adding zero is never going
> > > > to so any 'damage' - even if it looks a bit odd.
> > > > 
> > > > Actually, I suspect the best thing here is to delete USB4_VERSION_MAJOR_MASK and
> > > > just do:
> > > > 	/* The major version is in the top 3 bits */
> > > > 	return sw->config.thunderbolt_version > 5;    
> > > 
> > > You mean 
> > > 
> > > 	return sw->config.thunderbolt_version >> 5;
> > > 
> > > ?
> > > 
> > > Yes that works but I prefer then:
> > > 
> > > 	return sw->config.thunderbolt_version >> USB4_VERSION_MAJOR_SHIFT;  
> > 
> > I've put that in for the next version (without the comment line).  
> 
> FIELD_GET() is here exactly to let people to not opencode this
> error-prone bit manipulation. So, let's continue using it.
> 
> David, can you explain in details why this code needs to be fixed? Why
> and when typecast wouldn't work so that you have to use an ugly '+0'
> hack, or even drop the FIELD_GET().
> 
> My current understanding is that the existing FIELD_GET()
> implementation works well with any data types, including bitfields,
> and what you suggested in this series - does not.

The underlying issue is that FIELD_GET() does a check that the supplied 'reg'
field is large enough for the mask.
In this case the 'reg' is a bitfield and you can't use sizeof(), typeof() or
__auto_type on a bitfield.

I don't want to (for example) add zero inside FIELD_GET() (as is done
for 'val') because that would promote u8/u16 to 32 bits - making the
size check less useful.

Ok, the current version relies on how the compiler happens to treat:
	_Generic(foo->bitfield, ...)
clang seems to treat a bitfield as 'int' (so sizeof() the result is 4)
regardless of the width.
OTOH gcc treats 'u32 bits:8' as 'unsigned char', but bits:7 selects
the 'default' and then __unsigned_scaler_typeof() fails.

I don't know what the standard says - but at least one of the compilers
is buggy.

So the current code doesn't really work with bitfields at all.

An alternate change would be to make the 4 fields in DWORD (sic) 4
just u8 instead of u32 xxx:8.
This would be similar to the two u16 at the top.

Perhaps that is the best fix.

	David

> 
> If it's correct, I don't think that switching to your version is
> well-justified.
> 
> Thanks,
> Yury


  reply	other threads:[~2025-12-10 20:23 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-09 10:03 [PATCH 0/9] bitfield: tidy up bitfield.h david.laight.linux
2025-12-09 10:03 ` [PATCH 1/9] nfp: Call FIELD_PREP() in NFP_ETH_SET_BIT_CONFIG() wrapper david.laight.linux
2025-12-10  9:29   ` Jakub Kicinski
2025-12-10 10:04     ` David Laight
2025-12-09 10:03 ` [PATCH 2/9] thunderblot: Don't pass a bitfield to FIELD_GET david.laight.linux
2025-12-10  5:56   ` Mika Westerberg
2025-12-10  9:34     ` David Laight
2025-12-10  9:41       ` Mika Westerberg
2025-12-10 10:18         ` David Laight
2025-12-10 18:13           ` Yury Norov
2025-12-10 20:23             ` David Laight [this message]
2025-12-09 10:03 ` [PATCH 3/9] bitmap: Use FIELD_PREP() in expansion of FIELD_PREP_WM16() david.laight.linux
2025-12-09 15:46   ` Andy Shevchenko
2025-12-09 18:54     ` David Laight
2025-12-10 19:18   ` Nicolas Frattaroli
2025-12-10 20:59     ` David Laight
2025-12-11 12:50       ` Nicolas Frattaroli
2025-12-11 17:52         ` David Laight
2025-12-09 10:03 ` [PATCH 4/9] bitfield: Copy #define parameters to locals david.laight.linux
2025-12-09 15:51   ` Andy Shevchenko
2025-12-09 19:11     ` David Laight
2025-12-09 21:54       ` Andy Shevchenko
2025-12-10 18:45     ` Yury Norov
2025-12-09 10:03 ` [PATCH 5/9] bitfield: FIELD_MODIFY: Only do a single read/write on the target david.laight.linux
2025-12-09 10:03 ` [PATCH 6/9] bitfield: Update sanity checks david.laight.linux
2025-12-09 10:03 ` [PATCH 7/9] bitfield: Reduce indentation david.laight.linux
2025-12-09 10:03 ` [PATCH 8/9] bitfield: Add comment block for the host/fixed endian functions david.laight.linux
2025-12-09 15:53   ` Andy Shevchenko
2025-12-10  9:23   ` Jakub Kicinski
2025-12-10 10:08     ` David Laight
2025-12-11  5:26       ` Jakub Kicinski
2025-12-09 10:03 ` [PATCH 9/9] bitfield: Update comments for le/be functions david.laight.linux
2025-12-10 18:20 ` [PATCH 0/9] bitfield: tidy up bitfield.h Yury Norov
2025-12-10 22:40   ` David Laight
2025-12-11 10:51   ` David Laight
  -- strict thread matches above, loose matches on Subject: below --
2025-12-08 22:42 david.laight.linux
2025-12-08 22:42 ` [PATCH 2/9] thunderblot: Don't pass a bitfield to FIELD_GET david.laight.linux
2025-12-08 22:56   ` Greg KH
2025-12-09 10:36     ` David Laight

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251210202346.669c8c33@pumpkin \
    --to=david.laight.linux@gmail.com \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=YehezkelShB@gmail.com \
    --cc=alexandre.belloni@bootlin.com \
    --cc=andreas.noever@gmail.com \
    --cc=andriy.shevchenko@intel.com \
    --cc=cmo@melexis.com \
    --cc=davem@davemloft.net \
    --cc=geert+renesas@glider.be \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=linux@rasmusvillemoes.dk \
    --cc=mika.westerberg@linux.intel.com \
    --cc=netdev@vger.kernel.org \
    --cc=nicolas.frattaroli@collabora.com \
    --cc=peterz@infradead.org \
    --cc=quic_luoj@quicinc.com \
    --cc=richard.genoud@bootlin.com \
    --cc=simon.horman@netronome.com \
    --cc=yury.norov@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.