From: Aaron Williams <Aaron.Williams@caviumnetworks.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] CFI flash broken for 8-bit bus
Date: Fri, 18 Mar 2011 00:48:51 -0700 [thread overview]
Message-ID: <4D830E63.5040506@caviumnetworks.com> (raw)
In-Reply-To: <4D8305D6.5060302@dawes.za.net>
I don't think that will work. Multiplying the offsets by two won't
always work (i.e. offset 2AA * 2 != 555). I think this will require a
more substantial fix. I started working on something but it may take me
a few days, though I have both an 8-bit and a 16-bit board to play with
(though no 8-bit chip on a 16-bit bus).
-Aaron
On 03/18/2011 12:12 AM, Rogan Dawes wrote:
> On 2011/03/18 6:02 AM, Aaron Williams wrote:
>> Hi,
>>
>> I am running into issues in that the CFI code is broken for flash with an 8-
>> bit bus. The problem is that the CFI code uses the wrong addresses for 8-bits
>> vs 16-bits.
>>
>> The CFI function flash_map incorrectly calculates the byte offset with
>> Spansion flash.
>>
>> In our case, we have an 8-bit Spansion S29GL-N MirrorBit flash chip on an 8-
>> bit bus.
>>
>> According to the data sheet, in 8-bit mode the first unlock address is 0xAAA
>> and the second is 0x555. Basically all of the addresses are approximately
>> double what they are in 16-bit mode.
>>
>> Most of the addresses in the CFI code are wrong for 8-bit mode.
>>
>> They should be as follows:
>> unlock1: 0xAAA
>> unlock2: 0x555
>> CFI Query: 0xAA
>>
>> Offset Device ID: 0x02, 0x1c, 0x1e
>> Offset Silicon Sector Factory Protect: 0x6
>> Sector protect verify (sector address) + 4
>>
>> The problem is that the dectection code detects (incorrectly) that we're an 8-
>> bit device on a 16-bit bus when in fact it's an 8-bit bus.
>>
>> For 16-bits, it's:
>>
>> unlock1: 0x555
>> unlock2: 0x2aa
>> CFI Query: 0x55
>> Offset Device ID: 0x1, 0x0e, 0x0f
>>
>> Now, in 16-bit mode these addresses should be effectively doubled so they
>> should look to be the same to software as I understand it.
>>
>> This is all taken from the datasheet.
>>
>> Note that the CFI code works fine with the flash hooked up as 16-bit on a 16-
>> bit bus.
>>
>> If it's an 8-bit flash on a 16-bit bus then the addresses should be doubled.
>>
>> -Aaron
> Hi Aaron,
>
> Does this patch (originally by Stefan Roese) work for you? I also need
> it for the DNS323 port. FWIW, mine is also a Spansion flash
> (S29GL064M90TFIR4), although I am not 100% sure of the layout and
> connectivity.
>
> Rogan
>
> ---
> drivers/mtd/cfi_flash.c | 22 +++++++++++++++++++++-
> 1 files changed, 21 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c
> index dd394a8..74e9ade 100644
> --- a/drivers/mtd/cfi_flash.c
> +++ b/drivers/mtd/cfi_flash.c
> @@ -291,6 +291,9 @@ static inline uchar flash_read_uchar (flash_info_t *
> info, uint offset)
> uchar *cp;
> uchar retval;
>
> +#if 1 // test-only
> + offset = offset * 2;
> +#endif
> cp = flash_map (info, 0, offset);
> #if defined(__LITTLE_ENDIAN) || defined(CONFIG_SYS_WRITE_SWAPPED_DATA)
> retval = flash_read8(cp);
> @@ -308,6 +311,9 @@ static inline ushort flash_read_word (flash_info_t *
> info, uint offset)
> {
> ushort *addr, retval;
>
> +#if 1 // test-only
> + offset = offset * 2;
> +#endif
> addr = flash_map (info, 0, offset);
> retval = flash_read16 (addr);
> flash_unmap (info, 0, offset, addr);
> @@ -328,6 +334,9 @@ static ulong flash_read_long (flash_info_t * info,
> flash_sect_t sect,
> #ifdef DEBUG
> int x;
> #endif
> +#if 1 // test-only
> + offset = offset * 2;
> +#endif
> addr = flash_map (info, sect, offset);
>
> #ifdef DEBUG
> @@ -363,6 +372,9 @@ void flash_write_cmd (flash_info_t * info,
> flash_sect_t sect,
> void *addr;
> cfiword_t cword;
>
> +#if 1 // test-only
> + offset = offset * 2;
> +#endif
> addr = flash_map (info, sect, offset);
> flash_make_cmd (info, cmd, &cword);
> switch (info->portwidth) {
> @@ -420,6 +432,9 @@ static int flash_isequal (flash_info_t * info,
> flash_sect_t sect,
> cfiword_t cword;
> int retval;
>
> +#if 1 // test-only
> + offset = offset * 2;
> +#endif
> addr = flash_map (info, sect, offset);
> flash_make_cmd (info, cmd, &cword);
>
> @@ -1762,6 +1777,7 @@ static int __flash_detect_cfi (flash_info_t *
> info, struct cfi_qry *qry)
> info->addr_unlock1 = 0x555;
> info->addr_unlock2 = 0x2aa;
>
> +#if 0 // test-only
> /*
> * modify the unlock address if we are
> * in compatibility mode
> @@ -1776,6 +1792,7 @@ static int __flash_detect_cfi (flash_info_t *
> info, struct cfi_qry *qry)
> info->addr_unlock1 = 0xaaa;
> info->addr_unlock2 = 0x555;
> }
> +#endif
>
> info->name = "CFI conformant";
> return 1;
> @@ -1942,11 +1959,13 @@ ulong flash_get_size (phys_addr_t base, int banknum)
> debug ("cfi version is 0x%04x\n", info->cfi_version);
>
> size_ratio = info->portwidth / info->chipwidth;
> +#if 0 // test-only
> /* if the chip is x8/x16 reduce the ratio by half */
> if ((info->interface == FLASH_CFI_X8X16)
> && (info->chipwidth == FLASH_CFI_BY8)) {
> size_ratio >>= 1;
> }
> +#endif
> debug ("size_ratio %d port %d bits chip %d bits\n",
> size_ratio, info->portwidth << CFI_FLASH_SHIFT_WIDTH,
> info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
> @@ -2034,12 +2053,13 @@ ulong flash_get_size (phys_addr_t base, int banknum)
> /* round up when converting to ms */
> info->write_tout = (tmp + 999) / 1000;
> info->flash_id = FLASH_MAN_CFI;
> +#if 0
> if ((info->interface == FLASH_CFI_X8X16) &&
> (info->chipwidth == FLASH_CFI_BY8)) {
> /* XXX - Need to test on x8/x16 in parallel. */
> info->portwidth >>= 1;
> }
> -
> +#endif
> flash_write_cmd (info, 0, 0, info->cmd_reset);
> }
>
next prev parent reply other threads:[~2011-03-18 7:48 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-18 4:02 [U-Boot] CFI flash broken for 8-bit bus Aaron Williams
2011-03-18 7:12 ` Rogan Dawes
2011-03-18 7:48 ` Aaron Williams [this message]
2011-03-24 3:07 ` Aaron Williams
2011-03-24 5:20 ` Stefan Roese
2011-03-24 16:59 ` Rogan Dawes
2011-03-26 6:32 ` Aaron Williams
2011-03-30 8:01 ` Rogan Dawes
2011-03-30 11:14 ` Albert ARIBAUD
2011-04-02 6:27 ` Aaron Williams
-- strict thread matches above, loose matches on Subject: below --
2018-04-19 15:17 Radovan Prodanovic
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D830E63.5040506@caviumnetworks.com \
--to=aaron.williams@caviumnetworks.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.