public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
From: Michael Walle <mwalle@kernel.org>
To: Tudor Ambarus <tudor.ambarus@linaro.org>
Cc: Pratyush Yadav <pratyush@kernel.org>,
	Miquel Raynal <miquel.raynal@bootlin.com>,
	Richard Weinberger <richard@nod.at>,
	Vignesh Raghavendra <vigneshr@ti.com>,
	linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org
Subject: Re: [PATCH v2 13/41] mtd: spi-nor: move the .id and .id_len into an own structure
Date: Wed, 06 Sep 2023 09:13:14 +0200	[thread overview]
Message-ID: <bbf76bffaa699b2a8f4f9e33809dea06@kernel.org> (raw)
In-Reply-To: <4cbc9c03-7b47-48e9-8a91-f08c44284579@linaro.org>

Am 2023-09-06 08:12, schrieb Tudor Ambarus:
> On 8/22/23 08:09, Michael Walle wrote:
>> Create a new structure to hold a flash ID and its length. The goal is 
>> to
>> have a new macro SNOR_ID() which can have a flexible id length. This 
>> way
>> we can get rid of all the individual INFOx() macros.
>> 
>> Signed-off-by: Michael Walle <mwalle@kernel.org>
>> ---
>>  drivers/mtd/spi-nor/core.c      |  6 +++---
>>  drivers/mtd/spi-nor/core.h      | 33 
>> ++++++++++++++++++++++++---------
>>  drivers/mtd/spi-nor/micron-st.c |  4 ++--
>>  drivers/mtd/spi-nor/spansion.c  |  4 ++--
>>  drivers/mtd/spi-nor/sysfs.c     |  6 +++---
>>  drivers/mtd/spi-nor/winbond.c   |  1 -
>>  6 files changed, 34 insertions(+), 20 deletions(-)
>> 
>> diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c
>> index 4ba1778eda4b..80c340c7863a 100644
>> --- a/drivers/mtd/spi-nor/core.c
>> +++ b/drivers/mtd/spi-nor/core.c
>> @@ -2028,8 +2028,8 @@ static const struct flash_info 
>> *spi_nor_match_id(struct spi_nor *nor,
>>  	for (i = 0; i < ARRAY_SIZE(manufacturers); i++) {
>>  		for (j = 0; j < manufacturers[i]->nparts; j++) {
>>  			part = &manufacturers[i]->parts[j];
>> -			if (part->id_len &&
>> -			    !memcmp(part->id, id, part->id_len)) {
>> +			if (part->id &&
>> +			    !memcmp(part->id->bytes, id, part->id->len)) {
>>  				nor->manufacturer = manufacturers[i];
>>  				return part;
>>  			}
>> @@ -3370,7 +3370,7 @@ static const struct flash_info 
>> *spi_nor_get_flash_info(struct spi_nor *nor,
>>  	 * If caller has specified name of flash model that can normally be
>>  	 * detected using JEDEC, let's verify it.
>>  	 */
>> -	if (name && info->id_len) {
>> +	if (name && info->id) {
>>  		const struct flash_info *jinfo;
>> 
>>  		jinfo = spi_nor_detect(nor);
>> diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h
>> index c42b65623da7..81535f31907f 100644
>> --- a/drivers/mtd/spi-nor/core.h
>> +++ b/drivers/mtd/spi-nor/core.h
>> @@ -446,12 +446,22 @@ struct spi_nor_fixups {
>>  	int (*late_init)(struct spi_nor *nor);
>>  };
>> 
>> +/**
>> + * struct spi_nor_id - SPI NOR flash ID.
>> + *
>> + * @bytes: the flash's ID bytes. The first three bytes are the JEDIC 
>> ID.
> 
> typo, JEDIC. But are there 3 bytes of ID specified by JEDEC? I remeber
> there's only the MFR ID specified, the rest are flash specific, which
> are not mentioned by JEDEC.

I just moved the description from flash_info :p

As far as I know, this isn't really specified at all, is it? I couldn't
even find that the "read jedec id" command 9F is specified anywhere. Do
you know more?

Also the first three bytes is also wrong. It might be more or less. I'd
treat it as opaque - the SNOR_ID() can now have an arbitrary length -
but I would mention that this *typically* has the form of
<1 byte mfr id> <2 byte flash part id>

I.e.
@bytes: the bytes returned by the flash when issuing command 9F.
         Typically, the first byte is the manufacturer ID code (see
         JEP106) and the next two bytes are a flash part specific ID.

>> + * @len:   the number of bytes of ID.
>> + */
>> +struct spi_nor_id {
>> +	const u8 *bytes;
>> +	u8 len;
>> +};
>> +
>>  /**
>>   * struct flash_info - SPI NOR flash_info entry.
>> + * @id:   pointer to struct spi_nor_id or NULL, which means "no ID" 
>> (mostly
>> + *        older chips).
>>   * @name: the name of the flash.
>> - * @id:             the flash's ID bytes. The first three bytes are 
>> the
>> - *                  JEDIC ID. JEDEC ID zero means "no ID" (mostly 
>> older chips).
>> - * @id_len:         the number of bytes of ID.
>>   * @size:           the size of the flash in bytes.
>>   * @sector_size:    (optional) the size listed here is what works 
>> with
>>   *                  SPINOR_OP_SE, which isn't necessarily called a 
>> "sector" by
>> @@ -510,8 +520,7 @@ struct spi_nor_fixups {
>>   */
>>  struct flash_info {
>>  	char *name;
>> -	u8 id[SPI_NOR_MAX_ID_LEN];
>> -	u8 id_len;
>> +	const struct spi_nor_id *id;
>>  	size_t size;
>>  	unsigned sector_size;
>>  	u16 page_size;
>> @@ -554,12 +563,18 @@ struct flash_info {
>>  #define SPI_NOR_ID_3ITEMS(_id) ((_id) >> 16) & 0xff, 
>> SPI_NOR_ID_2ITEMS(_id)
>> 
>>  #define SPI_NOR_ID(_jedec_id, _ext_id)					\
>> -	.id = { SPI_NOR_ID_3ITEMS(_jedec_id), SPI_NOR_ID_2ITEMS(_ext_id) }, 
>> \
>> -	.id_len = !(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0))
>> +	.id = &(const struct spi_nor_id){				\
>> +		.bytes = (const u8[]){ SPI_NOR_ID_3ITEMS(_jedec_id),	\
>> +				       SPI_NOR_ID_2ITEMS(_ext_id) },	\
>> +		.len = !(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0)),	\
>> +	}
>> 
>>  #define SPI_NOR_ID6(_jedec_id, _ext_id)					\
>> -	.id = { SPI_NOR_ID_3ITEMS(_jedec_id), SPI_NOR_ID_3ITEMS(_ext_id) }, 
>> \
>> -	.id_len = 6
>> +	.id = &(const struct spi_nor_id){				\
>> +		.bytes = (const u8[]){ SPI_NOR_ID_3ITEMS(_jedec_id),	\
>> +				       SPI_NOR_ID_3ITEMS(_ext_id) },	\
>> +		.len = 6,						\
>> +	}
>> 
>>  #define SPI_NOR_GEOMETRY(_sector_size, _n_sectors, _n_banks)		\
>>  	.size = (_sector_size) * (_n_sectors),				\
>> diff --git a/drivers/mtd/spi-nor/micron-st.c 
>> b/drivers/mtd/spi-nor/micron-st.c
>> index 5406a3af2ce0..229c951efcce 100644
>> --- a/drivers/mtd/spi-nor/micron-st.c
>> +++ b/drivers/mtd/spi-nor/micron-st.c
>> @@ -78,7 +78,7 @@ static int micron_st_nor_octal_dtr_en(struct spi_nor 
>> *nor)
>>  		return ret;
>>  	}
>> 
>> -	if (memcmp(buf, nor->info->id, nor->info->id_len))
>> +	if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
>>  		return -EINVAL;
>> 
>>  	return 0;
>> @@ -114,7 +114,7 @@ static int micron_st_nor_octal_dtr_dis(struct 
>> spi_nor *nor)
>>  		return ret;
>>  	}
>> 
>> -	if (memcmp(buf, nor->info->id, nor->info->id_len))
>> +	if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
>>  		return -EINVAL;
>> 
>>  	return 0;
>> diff --git a/drivers/mtd/spi-nor/spansion.c 
>> b/drivers/mtd/spi-nor/spansion.c
>> index e6468569f178..d7012ab3de2c 100644
>> --- a/drivers/mtd/spi-nor/spansion.c
>> +++ b/drivers/mtd/spi-nor/spansion.c
>> @@ -228,7 +228,7 @@ static int cypress_nor_octal_dtr_en(struct spi_nor 
>> *nor)
>>  		return ret;
>>  	}
>> 
>> -	if (memcmp(buf, nor->info->id, nor->info->id_len))
>> +	if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
>>  		return -EINVAL;
>> 
>>  	return 0;
>> @@ -272,7 +272,7 @@ static int cypress_nor_octal_dtr_dis(struct 
>> spi_nor *nor)
>>  		return ret;
>>  	}
>> 
>> -	if (memcmp(buf, nor->info->id, nor->info->id_len))
>> +	if (memcmp(buf, nor->info->id->bytes, nor->info->id->len))
>>  		return -EINVAL;
>> 
>>  	return 0;
>> diff --git a/drivers/mtd/spi-nor/sysfs.c b/drivers/mtd/spi-nor/sysfs.c
>> index c09bb832b3b9..2dfdc555a69f 100644
>> --- a/drivers/mtd/spi-nor/sysfs.c
>> +++ b/drivers/mtd/spi-nor/sysfs.c
>> @@ -35,8 +35,8 @@ static ssize_t jedec_id_show(struct device *dev,
>>  	struct spi_device *spi = to_spi_device(dev);
>>  	struct spi_mem *spimem = spi_get_drvdata(spi);
>>  	struct spi_nor *nor = spi_mem_get_drvdata(spimem);
>> -	const u8 *id = nor->info->id_len ? nor->info->id : nor->id;
>> -	u8 id_len = nor->info->id_len ?: SPI_NOR_MAX_ID_LEN;
>> +	const u8 *id = nor->info->id ? nor->info->id->bytes : nor->id;
>> +	u8 id_len = nor->info->id ? nor->info->id->len : SPI_NOR_MAX_ID_LEN;
>> 
>>  	return sysfs_emit(buf, "%*phN\n", id_len, id);
>>  }
>> @@ -78,7 +78,7 @@ static umode_t spi_nor_sysfs_is_visible(struct 
>> kobject *kobj,
>> 
>>  	if (attr == &dev_attr_manufacturer.attr && !nor->manufacturer)
>>  		return 0;
>> -	if (attr == &dev_attr_jedec_id.attr && !nor->info->id_len && 
>> !nor->id)
>> +	if (attr == &dev_attr_jedec_id.attr && !nor->info->id && !nor->id)
>>  		return 0;
>> 
>>  	return 0444;
>> diff --git a/drivers/mtd/spi-nor/winbond.c 
>> b/drivers/mtd/spi-nor/winbond.c
>> index c21fed842762..7873cc394f07 100644
>> --- a/drivers/mtd/spi-nor/winbond.c
>> +++ b/drivers/mtd/spi-nor/winbond.c
>> @@ -121,7 +121,6 @@ static const struct flash_info winbond_nor_parts[] 
>> = {
>>  	{ "w25q80bl", INFO(0xef4014, 0, 64 * 1024,  16)
>>  		NO_SFDP_FLAGS(SECT_4K) },
>>  	{ "w25q128", INFO(0xef4018, 0, 0, 0)
>> -		PARSE_SFDP
> 
> this is a leftover that should be squashed in a previous commit.

oops :) good catch.

-michael

> 
> I'm fine with the overal idea, but please fix the comment about the 3
> bytes of jedec id.
> 
>>  		FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) },
>>  	{ "w25q256", INFO(0xef4019, 0, 64 * 1024, 512)
>>  		NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
>> 

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

  reply	other threads:[~2023-09-06  7:13 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-22  7:09 [PATCH v2 00/41] mtd: spi-nor: clean the flash_info database up Michael Walle
2023-08-22  7:09 ` [PATCH v2 01/41] mtd: spi-nor: remove catalyst 'flashes' Michael Walle
2023-08-24  7:55   ` Tudor Ambarus
2023-08-24  8:33   ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 02/41] mtd: spi-nor: remove Fujitsu MB85RS1MT support Michael Walle
2023-08-24  7:56   ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 03/41] mtd: spi-nor: xilinx: use SPI_NOR_ID() in S3AN_INFO() Michael Walle
2023-08-24  7:59   ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 04/41] mtd: spi-nor: xilinx: remove addr_nbytes from S3AN_INFO() Michael Walle
2023-08-24  8:13   ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 05/41] mtd: spi-nor: convert .n_sectors to .size Michael Walle
2023-08-24  8:25   ` Tudor Ambarus
2023-09-01 11:00     ` Michael Walle
2023-08-22  7:09 ` [PATCH v2 06/41] mtd: spi-nor: default page_size to 256 bytes Michael Walle
2023-08-24  8:36   ` Tudor Ambarus
2023-09-01 11:03     ` Michael Walle
2023-08-22  7:09 ` [PATCH v2 07/41] mtd: spi-nor: store .n_banks in struct spi_nor_flash_parameter Michael Walle
2023-08-24  8:41   ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 08/41] mtd: spi-nor: default .n_banks to 1 Michael Walle
2023-08-24  8:42   ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 09/41] mtd: spi-nor: push 4k SE handling into spi_nor_select_uniform_erase() Michael Walle
2023-09-05 14:59   ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 10/41] mtd: spi-nor: make sector_size optional Michael Walle
2023-09-06  5:44   ` Tudor Ambarus
2023-09-06  6:52     ` Michael Walle
2023-08-22  7:09 ` [PATCH v2 11/41] mtd: spi-nor: drop .parse_sfdp Michael Walle
2023-09-06  6:01   ` Tudor Ambarus
2023-09-06  6:55     ` Michael Walle
2023-09-06 14:55   ` Tudor Ambarus
2023-09-07  6:55     ` Michael Walle
2023-08-22  7:09 ` [PATCH v2 12/41] mtd: spi-nor: introduce (temporary) INFO0() Michael Walle
2023-09-06  6:04   ` Tudor Ambarus
2023-09-06  7:04     ` Michael Walle
2023-08-22  7:09 ` [PATCH v2 13/41] mtd: spi-nor: move the .id and .id_len into an own structure Michael Walle
2023-09-06  6:12   ` Tudor Ambarus
2023-09-06  7:13     ` Michael Walle [this message]
2023-09-06  7:15       ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 14/41] mtd: spi-nor: rename .otp_org to .otp and make it a pointer Michael Walle
2023-09-06  7:25   ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 15/41] mtd: spi-nor: add SNOR_ID() and SNOR_OTP() Michael Walle
2023-09-06  7:28   ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 16/41] mtd: spi-nor: remove or move flash_info comments Michael Walle
2023-09-06  7:28   ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 17/41] mtd: spi-nor: atmel: convert flash_info to new format Michael Walle
2023-09-06  7:35   ` Tudor Ambarus
2023-09-06  7:38     ` Michael Walle
2023-09-07  8:13     ` Michael Walle
2023-09-07  9:45       ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 18/41] mtd: spi-nor: eon: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 19/41] mtd: spi-nor: esmt: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 20/41] mtd: spi-nor: everspin: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 21/41] mtd: spi-nor: gigadevice: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 22/41] mtd: spi-nor: intel: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 23/41] mtd: spi-nor: issi: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 24/41] mtd: spi-nor: macronix: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 25/41] mtd: spi-nor: micron-st: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 26/41] mtd: spi-nor: spansion: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 27/41] mtd: spi-nor: sst: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 28/41] mtd: spi-nor: winbond: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 29/41] mtd: spi-nor: xilinx: use new macros in S3AN_INFO() Michael Walle
2023-08-22  7:09 ` [PATCH v2 30/41] mtd: spi-nor: xmc: convert flash_info to new format Michael Walle
2023-08-22  7:09 ` [PATCH v2 31/41] mtd: spi-nor: atmel: sort flash_info database Michael Walle
2023-08-22  7:09 ` [PATCH v2 32/41] mtd: spi-nor: eon: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 33/41] mtd: spi-nor: gigadevice: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 34/41] mtd: spi-nor: issi: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 35/41] mtd: spi-nor: macronix: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 36/41] mtd: spi-nor: micron-st: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 37/41] mtd: spi-nor: spansion: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 38/41] mtd: spi-nor: sst: " Michael Walle
2023-08-22  7:09 ` [PATCH v2 39/41] mtd: spi-nor: winbond: sort flash_info entries Michael Walle
2023-09-06  7:36   ` Tudor Ambarus
2023-09-07  8:14     ` Michael Walle
2023-09-07  9:42       ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 40/41] mtd: spi-nor: atmel: drop duplicate entry Michael Walle
2023-09-06  7:39   ` Tudor Ambarus
2023-08-22  7:09 ` [PATCH v2 41/41] mtd: spi-nor: core: get rid of the INFOx() macros Michael Walle
2023-09-06  7:40   ` Tudor Ambarus
2023-09-06  7:43 ` [PATCH v2 00/41] mtd: spi-nor: clean the flash_info database up Tudor Ambarus

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=bbf76bffaa699b2a8f4f9e33809dea06@kernel.org \
    --to=mwalle@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=miquel.raynal@bootlin.com \
    --cc=pratyush@kernel.org \
    --cc=richard@nod.at \
    --cc=tudor.ambarus@linaro.org \
    --cc=vigneshr@ti.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox