Hi Tudor, On 01/10/19 2:29 PM, tudor.amba...@microchip.com wrote: > From: Tudor Ambarus <tudor.amba...@microchip.com> > > JESD216 allow vendors to define their own SFDP tables. > > Add Microchip SFDP parser. The vendor table is allocated using > resource-managed kmalloc - the table will be freed on driver detach. > It will be accessible by getting the UCLASS_SPI_FLASH's private data. > > The Michrochip's SFDP table is particularly of interest because contains > pre-programmed globally unique EUI-48 and EUI-64 identifiers. > > Signed-off-by: Tudor Ambarus <tudor.amba...@microchip.com> > --- > drivers/mtd/spi/spi-nor-core.c | 35 +++++++++++++++++++++++++++++++++++ > include/linux/mtd/spi-nor.h | 2 ++ > 2 files changed, 37 insertions(+) > > diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c > index 1acff745d1a2..bade7d8a9f79 100644 > --- a/drivers/mtd/spi/spi-nor-core.c > +++ b/drivers/mtd/spi/spi-nor-core.c > @@ -1417,6 +1417,7 @@ struct sfdp_parameter_header { > > #define SFDP_BFPT_ID 0xff00 /* Basic Flash Parameter Table */ > #define SFDP_SECTOR_MAP_ID 0xff81 /* Sector Map Table */ > +#define SFDP_MICROCHIP_ID 0x01bf /* Manufacturer specific Table */ >
Is this ID unique enough such that no other vendor will use the same? I recall that MSB byte should be assigned to Vendor and 0x01 does not seem to be Microchip specific? Or did I miss something? Regards Vignesh > #define SFDP_SIGNATURE 0x50444653U > #define SFDP_JESD216_MAJOR 1 > @@ -1797,6 +1798,34 @@ static int spi_nor_parse_bfpt(struct spi_nor *nor, > } > > /** > + * spi_nor_parse_microchip_sfdp() - parse the Microchip manufacturer specific > + * SFDP table. > + * @nor: pointer to a 'struct spi_nor'. > + * @param_header: pointer to the SFDP parameter header. > + * > + * Return: 0 on success, -errno otherwise. > + */ > +static int > +spi_nor_parse_microchip_sfdp(struct spi_nor *nor, > + const struct sfdp_parameter_header *param_header) > +{ > + size_t size; > + u32 addr; > + int ret; > + > + size = param_header->length * sizeof(u32); > + addr = SFDP_PARAM_HEADER_PTP(param_header); > + > + nor->manufacturer_sfdp = devm_kmalloc(nor->dev, size, GFP_KERNEL); > + if (!nor->manufacturer_sfdp) > + return -ENOMEM; > + > + ret = spi_nor_read_sfdp(nor, addr, size, nor->manufacturer_sfdp); > + > + return ret; > +} > + > +/** > * spi_nor_parse_sfdp() - parse the Serial Flash Discoverable Parameters. > * @nor: pointer to a 'struct spi_nor' > * @params: pointer to the 'struct spi_nor_flash_parameter' to be > @@ -1892,6 +1921,12 @@ static int spi_nor_parse_sfdp(struct spi_nor *nor, > dev_info(dev, "non-uniform erase sector maps are not > supported yet.\n"); > break; > > + case SFDP_MICROCHIP_ID: > + err = spi_nor_parse_microchip_sfdp(nor, param_header); > + if (err) > + goto exit; > + break; > + > default: > break; > } > diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h > index 88e80af57941..836a50178925 100644 > --- a/include/linux/mtd/spi-nor.h > +++ b/include/linux/mtd/spi-nor.h > @@ -251,6 +251,7 @@ struct flash_info; > * @lock: the lock for the read/write/erase/lock/unlock operations > * @dev: point to a spi device, or a spi nor controller device. > * @info: spi-nor part JDEC MFR id and other info > + * @manufacturer_sfdp: manufacturer specific SFDP table > * @page_size: the page size of the SPI NOR > * @addr_width: number of address bytes > * @erase_opcode: the opcode for erasing a sector > @@ -289,6 +290,7 @@ struct spi_nor { > struct udevice *dev; > struct spi_slave *spi; > const struct flash_info *info; > + u8 *manufacturer_sfdp; > u32 page_size; > u8 addr_width; > u8 erase_opcode; > -- Regards Vignesh _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot