All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel
@ 2025-06-03  8:51 Christian Marangi
  2025-06-03  8:51 ` [PATCH 2/2] mtd: spinand: winbond: add Winbond W25N04KV flash support Christian Marangi
  2025-06-03 15:08 ` [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel Quentin Schulz
  0 siblings, 2 replies; 6+ messages in thread
From: Christian Marangi @ 2025-06-03  8:51 UTC (permalink / raw)
  To: Dario Binacchi, Michael Trimarchi, Frieder Schrempf, Tom Rini,
	Christian Marangi, u-boot

Import FIELD_PREP_CONST macro from Linux Kernel to permit usage of
FIELD_PREP with scenario where a constant value is needed.

Refer to commit e2192de59e45 ("bitfield: add FIELD_PREP_CONST()") in
Linux kernel for extensive explaination of why this is useful.

This is also to better align with the Linux Kernel for easier porting of
driver.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
 include/linux/bitfield.h | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/include/linux/bitfield.h b/include/linux/bitfield.h
index 7ad02f8cbb9..1b73ba6f9fa 100644
--- a/include/linux/bitfield.h
+++ b/include/linux/bitfield.h
@@ -90,6 +90,32 @@
 		((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask);	\
 	})
 
+#define __BF_CHECK_POW2(n)	BUILD_BUG_ON_ZERO(((n) & ((n) - 1)) != 0)
+
+/**
+ * FIELD_PREP_CONST() - prepare a constant bitfield element
+ * @_mask: shifted mask defining the field's length and position
+ * @_val:  value to put in the field
+ *
+ * FIELD_PREP_CONST() masks and shifts up the value.  The result should
+ * be combined with other fields of the bitfield using logical OR.
+ *
+ * Unlike FIELD_PREP() this is a constant expression and can therefore
+ * be used in initializers. Error checking is less comfortable for this
+ * version, and non-constant masks cannot be used.
+ */
+#define FIELD_PREP_CONST(_mask, _val)					\
+	(								\
+		/* mask must be non-zero */				\
+		BUILD_BUG_ON_ZERO((_mask) == 0) +			\
+		/* check if value fits */				\
+		BUILD_BUG_ON_ZERO(~((_mask) >> __bf_shf(_mask)) & (_val)) + \
+		/* check if mask is contiguous */			\
+		__BF_CHECK_POW2((_mask) + (1ULL << __bf_shf(_mask))) +	\
+		/* and create the value */				\
+		(((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask))	\
+	)
+
 /**
  * FIELD_GET() - extract a bitfield element
  * @_mask: shifted mask defining the field's length and position
-- 
2.48.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] mtd: spinand: winbond: add Winbond W25N04KV flash support
  2025-06-03  8:51 [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel Christian Marangi
@ 2025-06-03  8:51 ` Christian Marangi
  2025-06-03 15:08 ` [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel Quentin Schulz
  1 sibling, 0 replies; 6+ messages in thread
From: Christian Marangi @ 2025-06-03  8:51 UTC (permalink / raw)
  To: Dario Binacchi, Michael Trimarchi, Frieder Schrempf, Tom Rini,
	Christian Marangi, u-boot

Add Winbond W25N04KV flash support that use a different value to detect
ECC bitflip.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
 drivers/mtd/nand/spi/winbond.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/mtd/nand/spi/winbond.c b/drivers/mtd/nand/spi/winbond.c
index dd4ed257a83..16abf89dbbf 100644
--- a/drivers/mtd/nand/spi/winbond.c
+++ b/drivers/mtd/nand/spi/winbond.c
@@ -11,6 +11,7 @@
 #include <linux/device.h>
 #include <linux/kernel.h>
 #endif
+#include <linux/bitfield.h>
 #include <linux/bug.h>
 #include <linux/mtd/spinand.h>
 
@@ -18,6 +19,8 @@
 
 #define WINBOND_CFG_BUF_READ		BIT(3)
 
+#define W25N04KV_STATUS_ECC_5_8_BITFLIPS FIELD_PREP_CONST(STATUS_ECC_MASK, 0x3)
+
 static SPINAND_OP_VARIANTS(read_cache_variants,
 		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
 		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
@@ -121,6 +124,7 @@ static int w25n02kv_ecc_get_status(struct spinand_device *spinand,
 		return -EBADMSG;
 
 	case STATUS_ECC_HAS_BITFLIPS:
+	case W25N04KV_STATUS_ECC_5_8_BITFLIPS:
 		/*
 		 * Let's try to retrieve the real maximum number of bitflips
 		 * in order to avoid forcing the wear-leveling layer to move
@@ -172,6 +176,15 @@ static const struct spinand_info winbond_spinand_table[] = {
 					      &update_cache_variants),
 		     0,
 		     SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
+	SPINAND_INFO("W25N04KV",
+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xaa, 0x23),
+		     NAND_MEMORG(1, 2048, 128, 64, 4096, 40, 2, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     0,
+		     SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
 };
 
 static int winbond_spinand_init(struct spinand_device *spinand)
-- 
2.48.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel
  2025-06-03  8:51 [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel Christian Marangi
  2025-06-03  8:51 ` [PATCH 2/2] mtd: spinand: winbond: add Winbond W25N04KV flash support Christian Marangi
@ 2025-06-03 15:08 ` Quentin Schulz
  2025-06-03 20:37   ` Christian Marangi
  1 sibling, 1 reply; 6+ messages in thread
From: Quentin Schulz @ 2025-06-03 15:08 UTC (permalink / raw)
  To: Christian Marangi, Dario Binacchi, Michael Trimarchi,
	Frieder Schrempf, Tom Rini, u-boot

Hi Christian,

On 6/3/25 10:51 AM, Christian Marangi wrote:
> Import FIELD_PREP_CONST macro from Linux Kernel to permit usage of
> FIELD_PREP with scenario where a constant value is needed.
> 
> Refer to commit e2192de59e45 ("bitfield: add FIELD_PREP_CONST()") in
> Linux kernel for extensive explaination of why this is useful.
> 
> This is also to better align with the Linux Kernel for easier porting of
> driver.
> 

Do you know it it'd be possible to simply copy Linux kernel's bitfield.h 
instead of "cherry-picking" individual commit(s)?

Cheers,
Quentin

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel
  2025-06-03 15:08 ` [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel Quentin Schulz
@ 2025-06-03 20:37   ` Christian Marangi
  2025-06-03 23:50     ` Tom Rini
  2025-06-04  8:55     ` Quentin Schulz
  0 siblings, 2 replies; 6+ messages in thread
From: Christian Marangi @ 2025-06-03 20:37 UTC (permalink / raw)
  To: Quentin Schulz
  Cc: Dario Binacchi, Michael Trimarchi, Frieder Schrempf, Tom Rini,
	u-boot

On Tue, Jun 03, 2025 at 05:08:13PM +0200, Quentin Schulz wrote:
> Hi Christian,
> 
> On 6/3/25 10:51 AM, Christian Marangi wrote:
> > Import FIELD_PREP_CONST macro from Linux Kernel to permit usage of
> > FIELD_PREP with scenario where a constant value is needed.
> > 
> > Refer to commit e2192de59e45 ("bitfield: add FIELD_PREP_CONST()") in
> > Linux kernel for extensive explaination of why this is useful.
> > 
> > This is also to better align with the Linux Kernel for easier porting of
> > driver.
> > 
> 
> Do you know it it'd be possible to simply copy Linux kernel's bitfield.h
> instead of "cherry-picking" individual commit(s)?
> 

Mhhh what do you mean? You mean syncing the full header with latest
version?

Isn't that more risky??

-- 
	Ansuel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel
  2025-06-03 20:37   ` Christian Marangi
@ 2025-06-03 23:50     ` Tom Rini
  2025-06-04  8:55     ` Quentin Schulz
  1 sibling, 0 replies; 6+ messages in thread
From: Tom Rini @ 2025-06-03 23:50 UTC (permalink / raw)
  To: Christian Marangi
  Cc: Quentin Schulz, Dario Binacchi, Michael Trimarchi,
	Frieder Schrempf, u-boot

[-- Attachment #1: Type: text/plain, Size: 1206 bytes --]

On Tue, Jun 03, 2025 at 10:37:22PM +0200, Christian Marangi wrote:
> On Tue, Jun 03, 2025 at 05:08:13PM +0200, Quentin Schulz wrote:
> > Hi Christian,
> > 
> > On 6/3/25 10:51 AM, Christian Marangi wrote:
> > > Import FIELD_PREP_CONST macro from Linux Kernel to permit usage of
> > > FIELD_PREP with scenario where a constant value is needed.
> > > 
> > > Refer to commit e2192de59e45 ("bitfield: add FIELD_PREP_CONST()") in
> > > Linux kernel for extensive explaination of why this is useful.
> > > 
> > > This is also to better align with the Linux Kernel for easier porting of
> > > driver.
> > > 
> > 
> > Do you know it it'd be possible to simply copy Linux kernel's bitfield.h
> > instead of "cherry-picking" individual commit(s)?
> > 
> 
> Mhhh what do you mean? You mean syncing the full header with latest
> version?
> 
> Isn't that more risky??

It would be helpful and shouldn't be too risky. At a quick glance, the
first minor issue is to just keep using <linux/bug.h> as
include/linux/bug*h also need to be resynced. This kind of change would
need to be run through CI as well as documented at
https://docs.u-boot.org/en/latest/develop/ci_testing.html

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel
  2025-06-03 20:37   ` Christian Marangi
  2025-06-03 23:50     ` Tom Rini
@ 2025-06-04  8:55     ` Quentin Schulz
  1 sibling, 0 replies; 6+ messages in thread
From: Quentin Schulz @ 2025-06-04  8:55 UTC (permalink / raw)
  To: Christian Marangi
  Cc: Dario Binacchi, Michael Trimarchi, Frieder Schrempf, Tom Rini,
	u-boot

Hi Christian,

On 6/3/25 10:37 PM, Christian Marangi wrote:
> On Tue, Jun 03, 2025 at 05:08:13PM +0200, Quentin Schulz wrote:
>> Hi Christian,
>>
>> On 6/3/25 10:51 AM, Christian Marangi wrote:
>>> Import FIELD_PREP_CONST macro from Linux Kernel to permit usage of
>>> FIELD_PREP with scenario where a constant value is needed.
>>>
>>> Refer to commit e2192de59e45 ("bitfield: add FIELD_PREP_CONST()") in
>>> Linux kernel for extensive explaination of why this is useful.
>>>
>>> This is also to better align with the Linux Kernel for easier porting of
>>> driver.
>>>
>>
>> Do you know it it'd be possible to simply copy Linux kernel's bitfield.h
>> instead of "cherry-picking" individual commit(s)?
>>
> 
> Mhhh what do you mean? You mean syncing the full header with latest
> version?
> 
> Isn't that more risky??
> 

Not necessarily, it means it's easier for us to simply sync with newer 
Linux kernel versions or make sure that we're actually importing the 
same macros/constants/etc. And also the review is extremely simple. 
Checkout master U-Boot, checkout the Linux kernel at whatever version 
you're saying you're copying the file from, copy it, check the diff, 
matches patch? Reviewed-by given since it already went through proper 
review in the kernel :)

Also would make it easier to port drivers from the kernel to U-Boot as 
the kernel community encourages more and more uses of macros from that 
header but if we only do cherry-picks (or even partial cherry-picks) 
then things get unnecessarily harder.

The kernel typically gets more eyes on and fixes than U-Boot (or such is 
my gut feeling), so being able to easily know if we need to backport 
something to U-Boot by simply reading the kernel mailing list/scouring 
the git history of the kernel is pretty useful.

Cheers,
Quentin

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-06-04  8:56 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-03  8:51 [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel Christian Marangi
2025-06-03  8:51 ` [PATCH 2/2] mtd: spinand: winbond: add Winbond W25N04KV flash support Christian Marangi
2025-06-03 15:08 ` [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from Linux Kernel Quentin Schulz
2025-06-03 20:37   ` Christian Marangi
2025-06-03 23:50     ` Tom Rini
2025-06-04  8:55     ` Quentin Schulz

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.