From: Stefan Roese <sr@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] Reg. CFI flash_init and hardware write protected devices
Date: Tue, 31 May 2011 15:10:03 +0200 [thread overview]
Message-ID: <201105311510.04012.sr@denx.de> (raw)
In-Reply-To: <BANLkTinUbHgHmXkMfNOVJofr9nJB3B2Phw@mail.gmail.com>
Hi Frank,
On Tuesday 31 May 2011 10:35:17 Frank Svendsb?e wrote:
> We have a board that feature NOR flash and hardware write protection
> is handled by controlling the write enable pin. When write protection
> is enabled, the nWE pin is forced high by external logic. The memory
> controller and/or CFI logic is unaware of this, and since CFI uses
> write enable as part of the CFI command set, a CFI probing will fail
> when write protection is enabled.
>
> The rationale for controlling nWE and not WP (write protection) is
> that WP only protects the first sector of the device. In our case this
> is less than the size of the bootloader (U-boot), since that occupies
> two sectors. Due to this the built-in NOR write protection is rather
> useless.
Understood. But why don't you disable write-protection when you first call
flash_init()? And enable the write-protection after the chip is correctly
detected?
> Our current solution based on controlling nWE is to hardcode flash
> geometry in board code when flash protection is enabled. In order to
> use CFI as intended when write protection is disabled, we call the
> generic flash_init function as defined in
> drivers/mtd/cfi_flash.c.
How is write-protection enabled/disabled on your board?
> When protection is enabled we hardcode the
> geometry info in board code. In order separate our flash_init and the
> generic flash_init, and be able to call both, we've introduced a new
> ifdef to cfi_flash.c called CONFIG_CFI_FLASH_OVERRIDE_INIT. Like
> this:
>
> ----
>
> diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c
> index 6039e1f..772096e 100644
> --- a/drivers/mtd/cfi_flash.c
> +++ b/drivers/mtd/cfi_flash.c
> @@ -176,6 +176,10 @@ u64 flash_read64(void *addr)__attribute__((weak,
> alias("__flash_read64")));
> #define flash_read64 __flash_read64
> #endif
>
> +#ifdef CONFIG_CFI_FLASH_OVERRIDE_INIT
> +#define flash_init __flash_init
> +#endif
> +
> /*-----------------------------------------------------------------------
> */
> #if defined(CONFIG_ENV_IS_IN_FLASH) ||
> defined(CONFIG_ENV_ADDR_REDUND) || (CONFIG_SYS_MONITOR_BASE >=
>
> ----
>
> Now, in board code our redefined flash_init will be called. But if
> write protection is off, we call the original function,
> eg. __flash_init.
>
> Using the preprocessor is often considered bad design. However, the
> alternatives here such as adding a weak attribute to flash_init will
> not make us able to call the generic/original function. Therefore we
> consider adding an ifdef as better design than making the function
> weak, and it'll reduce the amount of redundant code in board code.
Why don't you think that you can't access the original function if it's
defined as a weak default? This should work just fine, see for example
ft_board_setup() in arch/powerpc/cpu/ppc4xx/fdt.c:
void __ft_board_setup(void *blob, bd_t *bd)
{
...
}
void ft_board_setup(void *blob, bd_t *bd) __attribute__((weak,
alias("__ft_board_setup")));
And then this weak default is overridden and still referenced in
board/amcc/canyonlands/canyonlands.c:
void ft_board_setup(void *blob, bd_t *bd)
{
__ft_board_setup(blob, bd);
...
So no need for this ifdef in the common CFI driver. Or am I missing something
here?
Best regards,
Stefan
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-0 Fax: (+49)-8142-66989-80 Email: office at denx.de
next prev parent reply other threads:[~2011-05-31 13:10 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-31 8:35 [U-Boot] Reg. CFI flash_init and hardware write protected devices Frank Svendsbøe
2011-05-31 12:49 ` Mike Frysinger
2011-05-31 13:25 ` Frank Svendsbøe
2011-05-31 14:01 ` Mike Frysinger
2011-05-31 13:10 ` Stefan Roese [this message]
2011-05-31 13:55 ` Frank Svendsbøe
2011-05-31 14:37 ` Stefan Roese
2011-06-01 14:33 ` Frank Svendsbøe
2011-06-01 15:34 ` Stefan Roese
2011-06-01 16:59 ` Frank Svendsbøe
2011-06-23 13:50 ` Frank Svendsbøe
2011-06-23 15:21 ` Wolfgang Denk
2011-06-23 16:15 ` Frank Svendsbøe
2011-06-23 17:55 ` Wolfgang Denk
2011-06-23 19:05 ` Frank Svendsbøe
2011-06-24 13:59 ` Frank Svendsbøe
2011-06-24 14:26 ` Wolfgang Denk
2011-06-24 19:58 ` Frank Svendsbøe
2011-06-24 20:26 ` Wolfgang Denk
2011-06-24 21:12 ` Frank Svendsbøe
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=201105311510.04012.sr@denx.de \
--to=sr@denx.de \
--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.