NAND: environment offset in OOB (CONFIG_ENV_OFFSET_OOB)
authorBen Gardiner <bengardiner@nanometrics.ca>
Mon, 5 Jul 2010 17:27:07 +0000 (13:27 -0400)
committerScott Wood <scottwood@freescale.com>
Mon, 12 Jul 2010 18:56:46 +0000 (13:56 -0500)
commitc9f7351b5bb70d292f6b0baaf0e21366e0b0b163
tree19b4353d9a4c5428b486e19f803c1855107cd76f
parent67ceefa79b86d9d72b7487005a6a8a61cd6a1d66
NAND: environment offset in OOB (CONFIG_ENV_OFFSET_OOB)

This is a re-submission of the patch by Harald Welte
<laforge@openmoko.org> with minor modifications for rebase and changes
as suggested by Scott Wood <scottwood@freescale.com> [1] [2].

This patch enables the environment partition to have a run-time dynamic
location (offset) in the NAND flash.  The reason for this is simply that
all NAND flashes have factory-default bad blocks, and a fixed compile
time offset would mean that sometimes the environment partition would
live inside factory bad blocks. Since the number of factory default
blocks can be quite high (easily 1.3MBytes in current standard
components), it is not economic to keep that many spare blocks inside
the environment partition.

With this patch and CONFIG_ENV_OFFSET_OOB enabled, the location of the
environment partition is stored in the out-of-band (OOB) data of the
first block in flash. Since the first block is where most systems boot
from, the vendors guarantee that the first block is not a factory
default block.

This patch introduces the 'nand env.oob' command, which can be called
from the u-boot command line. 'nand env.oob get' reads the address of
the environment partition from the OOB data, 'nand env.oob set
{offset,partition-name}' allows the setting of the marker by specifying
a numeric offset or a partition name.

[1] http://article.gmane.org/gmane.comp.boot-loaders.u-boot/43916
[2] http://article.gmane.org/gmane.comp.boot-loaders.u-boot/79195

Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca>
Acked-by: Harald Welte <laforge@gnumonks.org>
common/cmd_nand.c
common/env_nand.c
include/environment.h
include/nand.h