On 9/30/20 9:57 PM, Pratyush Yadav wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the > content is safe > > From: Tudor Ambarus <tudor.amba...@microchip.com> > > Parse just the 22nd dword and look for the 'DTR Octal Mode Enable > Volatile bit'. > > SPI_NOR_IO_MODE_EN_VOLATILE should be set just for the flashes > that don't define the optional SFDP SCCR Map. For the others, > let the SFDP do its job and fill the SNOR_F_IO_MODE_EN_VOLATILE > flag. We avoid this way polluting the flash flags when declaring > one. > > Signed-off-by: Tudor Ambarus <tudor.amba...@microchip.com> > Signed-off-by: Pratyush Yadav <p.ya...@ti.com> > --- > drivers/mtd/spi-nor/sfdp.c | 52 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 52 insertions(+) > > diff --git a/drivers/mtd/spi-nor/sfdp.c b/drivers/mtd/spi-nor/sfdp.c > index ebc1188f7533..0b5b9ea44cfc 100644 > --- a/drivers/mtd/spi-nor/sfdp.c > +++ b/drivers/mtd/spi-nor/sfdp.c > @@ -21,6 +21,10 @@ > #define SFDP_SECTOR_MAP_ID 0xff81 /* Sector Map Table */ > #define SFDP_4BAIT_ID 0xff84 /* 4-byte Address Instruction Table */ > #define SFDP_PROFILE1_ID 0xff05 /* xSPI Profile 1.0 table. */ > +#define SFDP_SCCR_MAP_ID 0xff87 /* > + * Status, Control and Configuration > + * Register Map. > + */ > > #define SFDP_SIGNATURE 0x50444653U > > @@ -1195,6 +1199,50 @@ static int spi_nor_parse_profile1(struct spi_nor *nor, > return ret; > } > > +#define SCCR_DWORD22_OCTAL_DTR_EN_VOLATILE BIT(31) > + > +/** > + * spi_nor_parse_sccr() - Parse the Status, Control and Configuration > Register > + * Map. > + * @nor: pointer to a 'struct spi_nor' > + * @sccr_header: pointer to the 'struct sfdp_parameter_header' > describing > + * the SCCR Map table length and version. > + * @params: pointer to the 'struct spi_nor_flash_parameter' to be. > + * > + * Return: 0 on success, -errno otherwise. > + */ > +static int spi_nor_parse_sccr(struct spi_nor *nor, > + const struct sfdp_parameter_header *sccr_header, > + struct spi_nor_flash_parameter *params) > +{ > + u32 *dwords, addr; > + size_t len; > + int ret; > + u8 io_mode_en_volatile;
would a bool work here? > + > + len = sccr_header->length * sizeof(*dwords); > + dwords = kmalloc(len, GFP_KERNEL); > + if (!dwords) > + return -ENOMEM; > + > + addr = SFDP_PARAM_HEADER_PTP(sccr_header); > + ret = spi_nor_read_sfdp(nor, addr, len, dwords); > + if (ret) > + goto out; > + > + le32_to_cpu_array(dwords, sccr_header->length); > + > + io_mode_en_volatile = FIELD_GET(SCCR_DWORD22_OCTAL_DTR_EN_VOLATILE, > + dwords[22]); > + > + if (io_mode_en_volatile) > + nor->flags |= SNOR_F_IO_MODE_EN_VOLATILE; > + > +out: > + kfree(dwords); > + return ret; > +} > + > /** > * spi_nor_parse_sfdp() - parse the Serial Flash Discoverable Parameters. > * @nor: pointer to a 'struct spi_nor' > @@ -1300,6 +1348,10 @@ int spi_nor_parse_sfdp(struct spi_nor *nor, > err = spi_nor_parse_profile1(nor, param_header, > params); > break; > > + case SFDP_SCCR_MAP_ID: > + err = spi_nor_parse_sccr(nor, param_header, params); > + break; > + > default: > break; > } > -- > 2.28.0 >