Message ID | 20210702144110.250481-6-tudor.ambarus@microchip.com |
---|---|
State | Superseded |
Delegated to: | Ambarus Tudor |
Headers | show |
Series | mtd: spi-nor: Handle flash ID collisions | expand |
On 02/07/21 05:41PM, Tudor Ambarus wrote: > Some manufacturers completely ignore the manufacturer's identification code > standard (JEP106) and do not define the manufacturer ID continuation > scheme. This will result in manufacturer ID collisions. > > An an example, JEP106BA requires Boya that it's manufacturer ID to be > preceded by 8 continuation codes. Boya's identification code must be: > 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x68. But Boya ignores the > continuation scheme and its ID collides with the manufacturer defined in > bank one: Convex Computer. > > Introduce the manuf-id-collisions driver in order to address ID collisions > between manufacturers. flash_info entries will be added in a first come, So all manufacturers with an ID collision will be placed in this file, and won't get a separate file of their own. Ok. > first served manner. Differentiation between flashes will be done at > runtime if possible. Where runtime differentiation is not possible, new > compatibles will be introduced, but this will be done as a last resort. > Every new flash addition that define the SFDP tables, should dump its SFDP > tables in the patch's comment section below the --- line, so that we can > reference it in case of collisions. Can we have this rule documented somewhere? Anyone who doesn't closely follow the list won't know about this rule, and having to ask for it on every new patch would be tedious. I am not sure if we have a place to document this that has high visibility though. > > Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com> > --- > drivers/mtd/spi-nor/Makefile | 1 + > drivers/mtd/spi-nor/core.c | 1 + > drivers/mtd/spi-nor/core.h | 1 + > drivers/mtd/spi-nor/manuf-id-collisions.c | 17 +++++++++++++++++ > 4 files changed, 20 insertions(+) > create mode 100644 drivers/mtd/spi-nor/manuf-id-collisions.c > > diff --git a/drivers/mtd/spi-nor/Makefile b/drivers/mtd/spi-nor/Makefile > index 6b904e439372..48763d10daad 100644 > --- a/drivers/mtd/spi-nor/Makefile > +++ b/drivers/mtd/spi-nor/Makefile > @@ -1,6 +1,7 @@ > # SPDX-License-Identifier: GPL-2.0 > > spi-nor-objs := core.o sfdp.o swp.o otp.o sysfs.o > +spi-nor-objs += manuf-id-collisions.o > spi-nor-objs += atmel.o > spi-nor-objs += catalyst.o > spi-nor-objs += eon.o > diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c > index d528e28995c6..206a54c20fef 100644 > --- a/drivers/mtd/spi-nor/core.c > +++ b/drivers/mtd/spi-nor/core.c > @@ -1829,6 +1829,7 @@ int spi_nor_sr2_bit7_quad_enable(struct spi_nor *nor) > } > > static const struct spi_nor_manufacturer *manufacturers[] = { > + &spi_nor_manuf_id_collisions, > &spi_nor_atmel, > &spi_nor_catalyst, > &spi_nor_eon, > diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h > index 55fceb0ec894..e9896cd60695 100644 > --- a/drivers/mtd/spi-nor/core.h > +++ b/drivers/mtd/spi-nor/core.h > @@ -476,6 +476,7 @@ struct sfdp { > }; > > /* Manufacturer drivers. */ > +extern const struct spi_nor_manufacturer spi_nor_manuf_id_collisions; > extern const struct spi_nor_manufacturer spi_nor_atmel; > extern const struct spi_nor_manufacturer spi_nor_catalyst; > extern const struct spi_nor_manufacturer spi_nor_eon; > diff --git a/drivers/mtd/spi-nor/manuf-id-collisions.c b/drivers/mtd/spi-nor/manuf-id-collisions.c > new file mode 100644 > index 000000000000..9efcba9d18a0 > --- /dev/null > +++ b/drivers/mtd/spi-nor/manuf-id-collisions.c > @@ -0,0 +1,17 @@ > +// SPDX-License-Identifier: GPL-2.0 Please add a description for this file. Why it is needed, what should go in here, etc. Other than this, Acked-by: Pratyush Yadav <p.yadav@ti.com> > + > +#include <linux/mtd/spi-nor.h> > +#include "core.h" > + > +static const struct flash_info id_collision_parts[] = { > + /* Boya */ > + { "by25q128as", INFO(0x684018, 0, 64 * 1024, 256, SPI_NOR_SKIP_SFDP | > + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | > + SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) }, > +}; > + > +const struct spi_nor_manufacturer spi_nor_manuf_id_collisions = { > + .name = "manufacturer ID collisions", > + .parts = id_collision_parts, > + .nparts = ARRAY_SIZE(id_collision_parts), > +}; > -- > 2.25.1 >
On 7/6/21 9:34 AM, Pratyush Yadav wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > On 02/07/21 05:41PM, Tudor Ambarus wrote: >> Some manufacturers completely ignore the manufacturer's identification code >> standard (JEP106) and do not define the manufacturer ID continuation >> scheme. This will result in manufacturer ID collisions. >> >> An an example, JEP106BA requires Boya that it's manufacturer ID to be >> preceded by 8 continuation codes. Boya's identification code must be: >> 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x68. But Boya ignores the >> continuation scheme and its ID collides with the manufacturer defined in >> bank one: Convex Computer. >> >> Introduce the manuf-id-collisions driver in order to address ID collisions >> between manufacturers. flash_info entries will be added in a first come, > > So all manufacturers with an ID collision will be placed in this file, > and won't get a separate file of their own. Ok. manuf-id-collisions will be the place to add new flash additions where the manufacturer is ignorant enough to not implement the ID continuation scheme. Collisions between flashes of the same manufacturer can be handled in their own manufacturer driver, macronix being an example. > >> first served manner. Differentiation between flashes will be done at >> runtime if possible. Where runtime differentiation is not possible, new >> compatibles will be introduced, but this will be done as a last resort. >> Every new flash addition that define the SFDP tables, should dump its SFDP >> tables in the patch's comment section below the --- line, so that we can >> reference it in case of collisions. > > Can we have this rule documented somewhere? Anyone who doesn't closely > follow the list won't know about this rule, and having to ask for it on > every new patch would be tedious. I am not sure if we have a place to > document this that has high visibility though. Yes, I thought of adding some guidelines on how to propose a new flash addition. We can add them in Documentation/driver-api/mtd/spi-nor.rst
diff --git a/drivers/mtd/spi-nor/Makefile b/drivers/mtd/spi-nor/Makefile index 6b904e439372..48763d10daad 100644 --- a/drivers/mtd/spi-nor/Makefile +++ b/drivers/mtd/spi-nor/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 spi-nor-objs := core.o sfdp.o swp.o otp.o sysfs.o +spi-nor-objs += manuf-id-collisions.o spi-nor-objs += atmel.o spi-nor-objs += catalyst.o spi-nor-objs += eon.o diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c index d528e28995c6..206a54c20fef 100644 --- a/drivers/mtd/spi-nor/core.c +++ b/drivers/mtd/spi-nor/core.c @@ -1829,6 +1829,7 @@ int spi_nor_sr2_bit7_quad_enable(struct spi_nor *nor) } static const struct spi_nor_manufacturer *manufacturers[] = { + &spi_nor_manuf_id_collisions, &spi_nor_atmel, &spi_nor_catalyst, &spi_nor_eon, diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h index 55fceb0ec894..e9896cd60695 100644 --- a/drivers/mtd/spi-nor/core.h +++ b/drivers/mtd/spi-nor/core.h @@ -476,6 +476,7 @@ struct sfdp { }; /* Manufacturer drivers. */ +extern const struct spi_nor_manufacturer spi_nor_manuf_id_collisions; extern const struct spi_nor_manufacturer spi_nor_atmel; extern const struct spi_nor_manufacturer spi_nor_catalyst; extern const struct spi_nor_manufacturer spi_nor_eon; diff --git a/drivers/mtd/spi-nor/manuf-id-collisions.c b/drivers/mtd/spi-nor/manuf-id-collisions.c new file mode 100644 index 000000000000..9efcba9d18a0 --- /dev/null +++ b/drivers/mtd/spi-nor/manuf-id-collisions.c @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include <linux/mtd/spi-nor.h> +#include "core.h" + +static const struct flash_info id_collision_parts[] = { + /* Boya */ + { "by25q128as", INFO(0x684018, 0, 64 * 1024, 256, SPI_NOR_SKIP_SFDP | + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | + SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) }, +}; + +const struct spi_nor_manufacturer spi_nor_manuf_id_collisions = { + .name = "manufacturer ID collisions", + .parts = id_collision_parts, + .nparts = ARRAY_SIZE(id_collision_parts), +};
Some manufacturers completely ignore the manufacturer's identification code standard (JEP106) and do not define the manufacturer ID continuation scheme. This will result in manufacturer ID collisions. An an example, JEP106BA requires Boya that it's manufacturer ID to be preceded by 8 continuation codes. Boya's identification code must be: 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x68. But Boya ignores the continuation scheme and its ID collides with the manufacturer defined in bank one: Convex Computer. Introduce the manuf-id-collisions driver in order to address ID collisions between manufacturers. flash_info entries will be added in a first come, first served manner. Differentiation between flashes will be done at runtime if possible. Where runtime differentiation is not possible, new compatibles will be introduced, but this will be done as a last resort. Every new flash addition that define the SFDP tables, should dump its SFDP tables in the patch's comment section below the --- line, so that we can reference it in case of collisions. Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com> --- drivers/mtd/spi-nor/Makefile | 1 + drivers/mtd/spi-nor/core.c | 1 + drivers/mtd/spi-nor/core.h | 1 + drivers/mtd/spi-nor/manuf-id-collisions.c | 17 +++++++++++++++++ 4 files changed, 20 insertions(+) create mode 100644 drivers/mtd/spi-nor/manuf-id-collisions.c