From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jagan Teki Date: Wed, 22 Apr 2015 13:36:29 +0530 Subject: [U-Boot] [PATCH v3 1/9] sf: Update SST flash params In-Reply-To: References: <1418215892-17617-1-git-send-email-bmeng.cn@gmail.com> <1418215892-17617-2-git-send-email-bmeng.cn@gmail.com> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Bin, On 22 April 2015 at 12:44, Bin Meng wrote: > Hi Jagan, > > On Wed, Apr 22, 2015 at 3:03 PM, Jagan Teki wrote: >> Hi Bin, >> >> On 22 April 2015 at 12:14, Bin Meng wrote: >>> Hi Jagan, >>> >>> On Tue, Apr 21, 2015 at 8:47 PM, Jagan Teki wrote: >>>> Hi Bin, >>>> >>>> On 20 April 2015 at 15:02, Bin Meng wrote: >>>>> Hi Jagan, >>>>> >>>>> On Fri, Apr 17, 2015 at 4:48 PM, Jagan Teki wrote: >>>>>> Hi Bin, >>>>>> >>>>>> On 17 April 2015 at 07:14, Bin Meng wrote: >>>>>>> Hi Jagan, >>>>>>> >>>>>>> On Fri, Apr 17, 2015 at 2:09 AM, Jagan Teki wrote: >>>>>>>> Hi Bin, >>>>>>>> >>>>>>>> I think you have a different interpretation of sector size here- >>>>>>>> >>>>>>>> /* The size listed here is what works with SPINOR_OP_SE, which isn't >>>>>>>> * necessarily called a "sector" by the vendor. >>>>>>>> */ >>>>>>>> Say for example SST25VF040B has 8 sectors of which each sector size is >>>>>>>> 64 * 1024 out of this we can use 4K sector erase or 32K sector erase or >>>>>>>> 64K sector erase through flags. >>>>>>>> >>>>>>>> Linux does follow the same- >>>>>>>> /* SST -- large erase sizes are "overlays", "sectors" are 4K */ >>>>>>>> { "sst25vf040b", INFO(0xbf258d, 0, 64 * 1024, 8, SECT_4K | >>>>>>>> SST_WRITE) }, >>>>>>>> { "sst25vf080b", INFO(0xbf258e, 0, 64 * 1024, 16, SECT_4K | >>>>>>>> SST_WRITE) }, >>>>>>>> { "sst25vf016b", INFO(0xbf2541, 0, 64 * 1024, 32, SECT_4K | >>>>>>>> SST_WRITE) }, >>>>>>>> { "sst25vf032b", INFO(0xbf254a, 0, 64 * 1024, 64, SECT_4K | >>>>>>>> SST_WRITE) }, >>>>>>>> >>>>>>>> Please check it. >>>>>>> >>>>>>> >>>>>>> Yes, I know this pretty well. And I want to change this behavior, as >>>>>>> my cover letter says. >>>>>>> >>>>>>> Currently the 'sf erase' command operates on a 64KB granularity, while >>>>>>> the actual erase command is 4KB granularity, which is inconsistent and >>>>>>> causes confusion. >>>>>> >>>>>> It never related to 'sf erase' instead based on the 'params->flags' >>>>>> sf_probe will decide which erase_cmd with erase_size will use. >>>>> >>>>> No, it is related. See cmd_sf.c: >>>> >>>> I'm not getting your point- how could it erase use 64K sector size >>>> instead of 4K. >>> >>> It indeed erases 64K sector size. You need check the logic in >>> spi_flash_validate_params(). >> >> We're assigning erase_size to sector_size only when SECT_4K and SECT_32K >> and for these erase_size becomes direct values, please check this. > > You previous email already said: the 'sf erase' command depends on > *flash->sector_size* > >> /* Compute erase sector and command */ >> if (params->flags & SECT_4K) { >> flash->erase_cmd = CMD_ERASE_4K; >> flash->erase_size = 4096; >> } else if (params->flags & SECT_32K) { >> flash->erase_cmd = CMD_ERASE_32K; >> flash->erase_size = 32768; >> } else { >> flash->erase_cmd = CMD_ERASE_64K; >> flash->erase_size = flash->sector_size; >> } > > Here the codes says: *flash->erase_size* > > So when I give a 'sf erase 0 100' it erase 64KB even if you have SECT_4K. Example: "SST25WF080", 0xbf2505, 0x0, 64 * 1024, 16, RD_NORM, SECT_4K | SST_WR}, sf probe gives sector_size = 64 * 1024 and erase_size = 4096 sf erase 0 100 sf_parse_len_arg len returns 100 and spi_flash_cmd_erase_ops returns "SF: Erase offset/length not multiple of erase size" Example: "SST25WF080", 0xbf2505, 0x0, 64 * 1024, 16, RD_NORM, SST_WR}, sf probe gives sector_size = 64 * 1024 and erase_size = 64 * 1024 sf erase 0 100 sf_parse_len_arg len returns 100 and spi_flash_cmd_erase_ops returns "SF: Erase offset/length not multiple of erase size" Still have any concerns, please come to IRC for more discussion > >>> >>>> Suppose the sector size is 4K >>>> >>>> flash->sector_size = 0x1000 >>>> 1. erase 4K len flash (it's total erase length) >>>> >>>> # sf erase 0x0 0x1000 >>>> >>>> len_arg = simple_strtoul(arg, &ep, 16); >>>> gives - 0x1000 >>>> >>>> *len becomes 0x1000 >>>> >>>> 2. erase 4K+1 len flash >>>> >>>> # sf erase 0x0 +0x1001 >>>> >>>> len_arg = simple_strtoul(arg, &ep, 16); >>>> gives - 0x1001 >>>> >>>> *len becomes 0x2000 >>>> >>>> All the way when it goes to sf_ops.c erase will take by means of >>>> erase_size which is assigned in sf_probe.c based on flags like 4K >>>> 32K or 64K. thanks! -- Jagan.