[U-Boot] [PATCHv2 5/8] drivers: mtd: spi: Modify read/write command for sfl256s flash.

Jagan Teki jagannadh.teki at gmail.com
Mon Oct 7 14:21:15 CEST 2013


On Wed, Aug 7, 2013 at 8:46 PM, Sourav Poddar <sourav.poddar at ti.com> wrote:
>
> On Wednesday 07 August 2013 08:35 PM, Jagan Teki wrote:
>>
>> On Wed, Aug 7, 2013 at 5:34 PM, Sourav Poddar<sourav.poddar at ti.com>
>> wrote:
>>>
>>> Hi Jagan,
>>>
>>> On Wednesday 07 August 2013 05:21 PM, Jagan Teki wrote:
>>>>
>>>> Hi,
>>>>
>>>> On Wed, Aug 7, 2013 at 11:27 AM, Sourav Poddar<sourav.poddar at ti.com>
>>>> wrote:
>>>>>
>>>>> Hi Jagan,
>>>>>
>>>>> On Wednesday 31 July 2013 12:23 PM, Sourav Poddar wrote:
>>>>>>
>>>>>> Hi Jagan,
>>>>>> On Tuesday 23 July 2013 07:53 PM, Sourav Poddar wrote:
>>>>>>>
>>>>>>> + jagan,
>>>>>>>
>>>>>>> On Tuesday 23 July 2013 02:29 PM, Sourav Poddar wrote:
>>>>>>>>
>>>>>>>> Reading using the already supported read command is causing
>>>>>>>> regression
>>>>>>>> after 4k bytes, as a result doing a page by page read. Its
>>>>>>>> happening,
>>>>>>>> because
>>>>>>>> ti qpsi controller CS will get de asserted after 4096 bytes.
>>>>>>>>
>>>>>>>> Signed-off-by: Sourav Poddar<sourav.poddar at ti.com>
>>>>>>>> ---
>>>>>>>>     drivers/mtd/spi/spi_flash.c |   32
>>>>>>>> +++++++++++++++++++++++++++++++-
>>>>>>>>     1 files changed, 31 insertions(+), 1 deletions(-)
>>>>>>>>
>>>>>>>> diff --git a/drivers/mtd/spi/spi_flash.c
>>>>>>>> b/drivers/mtd/spi/spi_flash.c
>>>>>>>> index 6a6fe37..5f8db7b 100644
>>>>>>>> --- a/drivers/mtd/spi/spi_flash.c
>>>>>>>> +++ b/drivers/mtd/spi/spi_flash.c
>>>>>>>> @@ -303,6 +303,36 @@ int spi_flash_cmd_read_fast(struct spi_flash
>>>>>>>> *flash, u32 offset,
>>>>>>>>             else
>>>>>>>>                 read_len = remain_len;
>>>>>>>>
>>>>>>>> +#ifdef CONFIG_TI_QSPI
>>>>>>>> +        unsigned long page_addr, byte_addr, page_size;
>>>>>>>> +        size_t chunk_len, actual;
>>>>>>>> +        int ret = 0;
>>>>>>>> +
>>>>>>>> +        page_size = flash->page_size;
>>>>>>>> +        page_addr = offset / page_size;
>>>>>>>> +        byte_addr = offset % page_size;
>>>>>>>> +
>>>>>>>> +        for (actual = 0; actual<    read_len; actual += chunk_len)
>>>>>>>> {
>>>>>>>> +            chunk_len = min(read_len - actual, page_size -
>>>>>>>> byte_addr);
>>>>>>>> +
>>>>>>>> +            cmd[1] = page_addr>>    8;
>>>>>>>> +            cmd[2] = page_addr;
>>>>>>>> +            cmd[3] = byte_addr;
>>>>>>>> +
>>>>>>>> +            ret = spi_flash_read_common(flash, cmd, sizeof(cmd),
>>>>>>>> +                    data + actual, chunk_len);
>>>>>>>> +            if (ret<    0) {
>>>>>>>> +                debug("SF: read failed");
>>>>>>>> +                break;
>>>>>>>> +            }
>>>>>>>> +
>>>>>>>> +            byte_addr += chunk_len;
>>>>>>>> +            if (byte_addr == page_size) {
>>>>>>>> +                page_addr++;
>>>>>>>> +                byte_addr = 0;
>>>>>>>> +            }
>>>>>>>> +        }
>>>>>>>> +#else
>>>>>>>>             spi_flash_addr(offset, cmd);
>>>>>>>>
>>>>>>>>             ret = spi_flash_read_common(flash, cmd, sizeof(cmd),
>>>>>>>> @@ -311,7 +341,7 @@ int spi_flash_cmd_read_fast(struct spi_flash
>>>>>>>> *flash,
>>>>>>>> u32 offset,
>>>>>>>>                 debug("SF: read failed\n");
>>>>>>>>                 break;
>>>>>>>>             }
>>>>>>>> -
>>>>>>>> +#endif
>>>>>>>>             offset += read_len;
>>>>>>>>             len -= read_len;
>>>>>>>>             data += read_len;
>>>>>>>
>>>>>>> Elaborating a bit more on this,
>>>>>>> There is a constrain on our hardware, which goes like this..
>>>>>>>
>>>>>>> As soon as the words transfered is 4096 bytes, the CS gets deasserted
>>>>>>> automatically.
>>>>>>> As a result of this bottleneck, I am not able to use the current use
>>>>>>> read
>>>>>>> api in mtd framework.
>>>>>>> This requires me to send the read command every time in range upto
>>>>>>> 4096
>>>>>>> bytes only.
>>>>>>>
>>>>>>> To overcome this, I have updated the mtd read based on TI_QSPI config
>>>>>>> as
>>>>>>> done above.
>>>>>>>
>>>>>>> [Jagan]:
>>>>>>> Do you have any suggestion of dealing this in a better way?
>>>>>>> I don't see a way to get around this apart from updating mtd read
>>>>>>> depending on TI_QSPI config.
>>>>>>>
>>>>>> Any inputs on this?
>>>>>>
>>>>> Any suggestions on the patch?
>>>>>
>>>>> _______________________________________________
>>>>> U-Boot mailing list
>>>>> U-Boot at lists.denx.de
>>>>> http://lists.denx.de/mailman/listinfo/u-boot
>>>>
>>>> Yes, this part is pretty much working as with other s25fl.
>>>> Can you point me the respective controller driver for this.
>>>>
>>> Thanks for the response.
>>>
>>> This is the link to uboot patches which I submitted to uboot mailing
>>> list.
>>>
>>> http://patchwork.ozlabs.org/patch/260989/
>>> http://patchwork.ozlabs.org/patch/260990/
>>> http://patchwork.ozlabs.org/patch/260991/
>>> http://patchwork.ozlabs.org/patch/260992/
>>> http://patchwork.ozlabs.org/patch/260994/
>>> http://patchwork.ozlabs.org/patch/260993/
>>> http://patchwork.ozlabs.org/patch/260996/
>>> http://patchwork.ozlabs.org/patch/260995/
>>>
>>> Above are the links to uboot patches containing all def configs and uboot
>>> ti
>>> qspi driver.
>>>
>>> As communicated earlier, there is a limitation in our qspi controller
>>> driver, wherein after every
>>> 4096 bytes CS gets de asserted. So, I had to modify the above read
>>> framework
>>> to do a page read.
>>> Need better way to handle this limitation, so that the above patch series
>>> can get upstreamed.
>>>
>>>> Does linux support this ti_qspi, please point the defconfig if you have.
>>>>
>>> Patches for linux is under review and still not mainlined.
>>> https://patchwork.kernel.org/patch/2838342/
>>
>> Thanks, please give me some time I will look at these and let u know
>> early next week.
>>
> Thanks!!

You still see this issue.

-- 
Thanks,
Jagan.
--------
Jagannadha Sutradharudu Teki,
E: jagannadh.teki at gmail.com, P: +91-9676773388
Engineer - System Software Hacker
U-boot - SPI Custodian and Zynq APSOC
Ln: http://www.linkedin.com/in/jaganteki


More information about the U-Boot mailing list