[U-Boot] [PATCH v2 1/2] mtd/spi: Add JEDEC SFDP support in SPI framework

Jagan Teki jagan at openedev.com
Fri Nov 16 10:43:47 UTC 2018


On 16/11/18 3:50 PM, Vignesh R wrote:
> 
> 
> On 16/11/18 3:10 PM, Rajat Srivastava wrote:
>>> Hi Rajat,
>>>
>>> On 13/11/18 5:30 PM, Rajat Srivastava wrote:
>>>> Add support for JESD216 rev B standard JEDEC Serial Flash Discoverable
>>>> Parameters (SFDP) tables to dynamically initialize flash size, page
>>>> size and address width of the flash. More parameters can be added as
>>>> per requirement.
>>>> SFDP parsing is made default but already existing method for parsing
>>>> these parameters are not deprecated.
>>>> A flag is created to skip SFDP parsing for a particular flash, if
>>>> required.
>>>>
>>>> SFDP data lets us auto-detect the addressing mode supported by the
>>>> flash which helps us access the flash using 4-byte address.
>>>>
>>>> Add a new argument in spi_flash_addr() function to create commands
>>>> with 3-byte or 4-byte address depending on the SFDP data read. Add
>>>> pointer to struct spi_flash in struct spi_slave so that driver can
>>>> have access to SFDP data.
>>>>
>>>> Introduce new structures and functions to read and parse SFDP data.
>>>> This is loosely based on Linux SFDP framework.
>>>>
>>>> Signed-off-by: Rajat Srivastava <rajat.srivastava at nxp.com>
>>>> ---
>>>> Changes in v2:
>>>> - Make SFDP parsing the default method.
>>>> - Change SPI_FLASH_USE_SFDP flag to SPI_FLASH_USE_SFDP to provide an
>>>> option to skip SFDP parsing for a particular flash.
>>>> ---
>>>
>>> [...]
>>>> +static int spi_flash_parse_bfpt(struct spi_flash *flash,
>>>> +				const struct sfdp_parameter_header
>>> *bfpt_header) {
>>>> +	struct sfdp_bfpt bfpt;
>>>> +	size_t len;
>>>> +	int i, err;
>>>> +	u32 addr;
>>>> +
>>>> +	/* JESD216 Basic Flash Parameter Table length is at least 9 DWORDs.
>>> */
>>>> +	if (bfpt_header->length < BFPT_DWORD_MAX_JESD216)
>>>> +		return -EINVAL;
>>>> +
>>>> +	/* Read the Basic Flash Parameter Table. */
>>>> +	len = min_t(size_t, sizeof(bfpt),
>>>> +		    bfpt_header->length * sizeof(u32));
>>>> +	addr = SFDP_PARAM_HEADER_PTP(bfpt_header);
>>>> +	memset(&bfpt, 0, sizeof(bfpt));
>>>> +	err = spi_flash_read_sfdp(flash, addr, len, &bfpt);
>>>> +	if (err < 0)
>>>> +		return err;
>>>> +
>>>> +	/* Fix endianness of the BFPT DWORDs. */
>>>> +	for (i = 0; i < BFPT_DWORD_MAX; i++)
>>>> +		bfpt.dwords[i] = le32_to_cpu(bfpt.dwords[i]);
>>>> +
>>>> +	/* Number of address bytes. */
>>>> +	switch (bfpt.dwords[BFPT_DWORD(1)] &
>>> BFPT_DWORD1_ADDRESS_BYTES_MASK) {
>>>> +	case BFPT_DWORD1_ADDRESS_BYTES_3_ONLY:
>>>> +		flash->addr_width = 3;
>>>> +		break;
>>>> +
>>>> +	case BFPT_DWORD1_ADDRESS_BYTES_3_OR_4:
>>>> +		printf("SF: Flash defaults to 3-Byte mode; enters 4-Byte ");
>>>> +		printf("mode on command\n");
>>>> +		/*
>>>> +		 * By default, 4-byte addressing mode is set.
>>>> +		 * To enforce 3-byte addressing mode, set addrwd_3_in_use
>>> flag
>>>> +		 * in struct spi_flash for every command.
>>>> +		 */
>>>> +		flash->addr_width = 4;
>>>> +		break;
>>>> +
>>>> +	case BFPT_DWORD1_ADDRESS_BYTES_4_ONLY:
>>>> +		flash->addr_width = 4;
>>>> +		break;
>>>> +
>>>
>>> I see your are updating flash->addr_width to 4 bytes here. But I don't see
>>> any code in this patch that changes flash->read_cmd (and write/erase
>>> cmds) to use 4B addressing opcodes. Also, I dont see any code that bypasses
>>> BAR register configuration when CONFIG_SPI_FLASH_BAR is defined and
>>> SFDP is available.
>>
>> We don't have any flash that supports CONFIG_SPI_FLASH_BAR. What do you suggest, shall we skip SFDP parsing in case CONFIG_SPI_FLASH_BAR is defined?
>>
> 
> I suggest skipping BAR configuration completely if flash supports
> address width of 4 as per SFDP. BAR configuration is only needed if
> flash does not support 4 byte addressing and flash size is > 16MB

And also some controller do support > 16MB flash, but have in-capable to 
handle 4-byte addressing commands, so for those cases BAR would require.


More information about the U-Boot mailing list