* [PATCH v2 0/3] mtd: nand: omap: fix ecc-layout
@ 2014-02-14 17:01 ` Pekon Gupta
0 siblings, 0 replies; 10+ messages in thread
From: Pekon Gupta @ 2014-02-14 17:01 UTC (permalink / raw)
To: Brian Norris, Artem Bityutskiy
Cc: Felipe Balbi, u-boot, Enric Balletbo Serra, linux-mtd,
Pekon Gupta, Stefan Roese
*changes v1 -> v2*
[PATCH 1/3] fix oobfree->offset calculation + adjust for reserved-marker of last sector
[PATCH 2/3] <new patch>
[PATCH 3/3] refactor code as suggested by Brian Norris <computersforpeace@gmail.com>
*original v1*
[PATCH 1/2] http://lists.infradead.org/pipermail/linux-mtd/2013-December/050946.html
[PATCH 2/2] http://lists.infradead.org/pipermail/linux-mtd/2013-December/050945.html
This patch-set is tested on AM335x-EVM using following end-to-end boot sequence
with appropriate u-boot configs [1]
(BCH8_HW) (BCH8_SW) (BCH8_SW) (BCH8_SW) (UBIFS)
ROM ---------> SPL ---------> U-Boot ---------> Kernel ---------> File-System
(BCH8_HW) (BCH8_HW) (BCH8_HW) (BCH8_HW) (UBIFS)
ROM ---------> SPL ---------> U-Boot ---------> Kernel ---------> File-System
Test1: flash ubi image from u-boot and boot the kernel
u-boot> mw 0x82000000 0xff <u-boot.img size aligned to NAND block boundary>
u-boot> fatload mmc 0 0x82000000 u-boot.img
u-boot> nand erase <u-boot_offset> <u-boot.img size>
u-boot> nand write 0x82000000 <u-boot_offset> <u-boot.img size>
u-boot> setenv bootargs 'console=ttyO0,115200n8 noinitrd mem=256M \
root=ubi0 rw rootfstype=ubifs ubi.mtd=<mtdpart-of-rootfs>,\
<page-size> ip=off init=/init'
u-boot> bootm <kernel_offset>
Test2: update u-boot.img from kernel and re-boot
kernel> flash_erase /dev/<mtdpart-of-u-boot> 0 0
kernel> nandwrite -s 0 /dev/<mtdpart-of-u-boot> u-boot.img
kernel> reboot
[1] u-boot configurations to match above ecc-layout are documented at
https://processors.wiki.ti.com/index.php/Linux_Core_NAND_User%27s_Guide
Pekon Gupta (3):
mtd: nand: omap: fix ecclayout->oobfree->offset
mtd: nand: omap: fix ecclayout->oobfree->length
mtd: nand: omap: fix ecclayout to be in sync with u-boot NAND driver
drivers/mtd/nand/omap2.c | 61 +++++++++++++++++++++++++++++++-----------------
1 file changed, 40 insertions(+), 21 deletions(-)
--
1.8.5.1.163.gd7aced9
^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH v2 0/3] mtd: nand: omap: fix ecc-layout
@ 2014-02-14 17:01 ` Pekon Gupta
0 siblings, 0 replies; 10+ messages in thread
From: Pekon Gupta @ 2014-02-14 17:01 UTC (permalink / raw)
To: u-boot
*changes v1 -> v2*
[PATCH 1/3] fix oobfree->offset calculation + adjust for reserved-marker of last sector
[PATCH 2/3] <new patch>
[PATCH 3/3] refactor code as suggested by Brian Norris <computersforpeace@gmail.com>
*original v1*
[PATCH 1/2] http://lists.infradead.org/pipermail/linux-mtd/2013-December/050946.html
[PATCH 2/2] http://lists.infradead.org/pipermail/linux-mtd/2013-December/050945.html
This patch-set is tested on AM335x-EVM using following end-to-end boot sequence
with appropriate u-boot configs [1]
(BCH8_HW) (BCH8_SW) (BCH8_SW) (BCH8_SW) (UBIFS)
ROM ---------> SPL ---------> U-Boot ---------> Kernel ---------> File-System
(BCH8_HW) (BCH8_HW) (BCH8_HW) (BCH8_HW) (UBIFS)
ROM ---------> SPL ---------> U-Boot ---------> Kernel ---------> File-System
Test1: flash ubi image from u-boot and boot the kernel
u-boot> mw 0x82000000 0xff <u-boot.img size aligned to NAND block boundary>
u-boot> fatload mmc 0 0x82000000 u-boot.img
u-boot> nand erase <u-boot_offset> <u-boot.img size>
u-boot> nand write 0x82000000 <u-boot_offset> <u-boot.img size>
u-boot> setenv bootargs 'console=ttyO0,115200n8 noinitrd mem=256M \
root=ubi0 rw rootfstype=ubifs ubi.mtd=<mtdpart-of-rootfs>,\
<page-size> ip=off init=/init'
u-boot> bootm <kernel_offset>
Test2: update u-boot.img from kernel and re-boot
kernel> flash_erase /dev/<mtdpart-of-u-boot> 0 0
kernel> nandwrite -s 0 /dev/<mtdpart-of-u-boot> u-boot.img
kernel> reboot
[1] u-boot configurations to match above ecc-layout are documented at
https://processors.wiki.ti.com/index.php/Linux_Core_NAND_User%27s_Guide
Pekon Gupta (3):
mtd: nand: omap: fix ecclayout->oobfree->offset
mtd: nand: omap: fix ecclayout->oobfree->length
mtd: nand: omap: fix ecclayout to be in sync with u-boot NAND driver
drivers/mtd/nand/omap2.c | 61 +++++++++++++++++++++++++++++++-----------------
1 file changed, 40 insertions(+), 21 deletions(-)
--
1.8.5.1.163.gd7aced9
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 1/3] mtd: nand: omap: fix ecclayout->oobfree->offset
2014-02-14 17:01 ` [U-Boot] " Pekon Gupta
@ 2014-02-14 17:01 ` Pekon Gupta
-1 siblings, 0 replies; 10+ messages in thread
From: Pekon Gupta @ 2014-02-14 17:01 UTC (permalink / raw)
To: Brian Norris, Artem Bityutskiy
Cc: Felipe Balbi, u-boot, Enric Balletbo Serra, linux-mtd,
Pekon Gupta, Stefan Roese
1) In current implementation, ecclayout->oobfree->offset is calculated with
respect to ecclayout->eccpos[0] which is incorrect because ECC bytes may not
be stored contiguously in OOB.
So, this patch calculates ecclayout->oobfree->offset with respect to last
ECC byte-position 'eccpos[ecclayout->eccbytes-1]'.
2) ECC layout of some ecc-schemes expects reserved-markers at specific eccpos[]
which should not be over-written by any file-system metadata.
So this patch aligns oobfree->offset taking into account of such markers.
Tested-by: Enric Balletbo i Serra <eballetbo@gmail.com>
Tested-by: Stefan Roese <sr@denx.de>
Signed-off-by: Pekon Gupta <pekon@ti.com>
---
drivers/mtd/nand/omap2.c | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index ef4190a..874fd9d 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -1829,8 +1829,9 @@ static int omap_nand_probe(struct platform_device *pdev)
ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
else
ecclayout->eccpos[0] = 1;
- ecclayout->oobfree->offset = ecclayout->eccpos[0] +
- ecclayout->eccbytes;
+ /* no reserved-marker in ecclayout for this ecc-scheme */
+ ecclayout->oobfree->offset =
+ ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
break;
case OMAP_ECC_BCH4_CODE_HW_DETECTION_SW:
@@ -1848,8 +1849,9 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
- ecclayout->oobfree->offset = ecclayout->eccpos[0] +
- ecclayout->eccbytes;
+ /* include reserved-marker in ecclayout->oobfree calculation */
+ ecclayout->oobfree->offset = 1 +
+ ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
/* software bch library is used for locating errors */
nand_chip->ecc.priv = nand_bch_init(mtd,
nand_chip->ecc.size,
@@ -1884,8 +1886,9 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
- ecclayout->oobfree->offset = ecclayout->eccpos[0] +
- ecclayout->eccbytes;
+ /* reserved marker already included in ecclayout->eccbytes */
+ ecclayout->oobfree->offset =
+ ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
/* This ECC scheme requires ELM H/W block */
if (is_elm_present(info, pdata->elm_of_node, BCH4_ECC) < 0) {
pr_err("nand: error: could not initialize ELM\n");
@@ -1914,8 +1917,9 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
- ecclayout->oobfree->offset = ecclayout->eccpos[0] +
- ecclayout->eccbytes;
+ /* include reserved-marker in ecclayout->oobfree calculation */
+ ecclayout->oobfree->offset = 1 +
+ ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
/* software bch library is used for locating errors */
nand_chip->ecc.priv = nand_bch_init(mtd,
nand_chip->ecc.size,
@@ -1957,8 +1961,9 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
- ecclayout->oobfree->offset = ecclayout->eccpos[0] +
- ecclayout->eccbytes;
+ /* reserved marker already included in ecclayout->eccbytes */
+ ecclayout->oobfree->offset =
+ ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
break;
#else
pr_err("nand: error: CONFIG_MTD_NAND_OMAP_BCH not enabled\n");
--
1.8.5.1.163.gd7aced9
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH v2 1/3] mtd: nand: omap: fix ecclayout->oobfree->offset
@ 2014-02-14 17:01 ` Pekon Gupta
0 siblings, 0 replies; 10+ messages in thread
From: Pekon Gupta @ 2014-02-14 17:01 UTC (permalink / raw)
To: u-boot
1) In current implementation, ecclayout->oobfree->offset is calculated with
respect to ecclayout->eccpos[0] which is incorrect because ECC bytes may not
be stored contiguously in OOB.
So, this patch calculates ecclayout->oobfree->offset with respect to last
ECC byte-position 'eccpos[ecclayout->eccbytes-1]'.
2) ECC layout of some ecc-schemes expects reserved-markers at specific eccpos[]
which should not be over-written by any file-system metadata.
So this patch aligns oobfree->offset taking into account of such markers.
Tested-by: Enric Balletbo i Serra <eballetbo@gmail.com>
Tested-by: Stefan Roese <sr@denx.de>
Signed-off-by: Pekon Gupta <pekon@ti.com>
---
drivers/mtd/nand/omap2.c | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index ef4190a..874fd9d 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -1829,8 +1829,9 @@ static int omap_nand_probe(struct platform_device *pdev)
ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
else
ecclayout->eccpos[0] = 1;
- ecclayout->oobfree->offset = ecclayout->eccpos[0] +
- ecclayout->eccbytes;
+ /* no reserved-marker in ecclayout for this ecc-scheme */
+ ecclayout->oobfree->offset =
+ ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
break;
case OMAP_ECC_BCH4_CODE_HW_DETECTION_SW:
@@ -1848,8 +1849,9 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
- ecclayout->oobfree->offset = ecclayout->eccpos[0] +
- ecclayout->eccbytes;
+ /* include reserved-marker in ecclayout->oobfree calculation */
+ ecclayout->oobfree->offset = 1 +
+ ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
/* software bch library is used for locating errors */
nand_chip->ecc.priv = nand_bch_init(mtd,
nand_chip->ecc.size,
@@ -1884,8 +1886,9 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
- ecclayout->oobfree->offset = ecclayout->eccpos[0] +
- ecclayout->eccbytes;
+ /* reserved marker already included in ecclayout->eccbytes */
+ ecclayout->oobfree->offset =
+ ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
/* This ECC scheme requires ELM H/W block */
if (is_elm_present(info, pdata->elm_of_node, BCH4_ECC) < 0) {
pr_err("nand: error: could not initialize ELM\n");
@@ -1914,8 +1917,9 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
- ecclayout->oobfree->offset = ecclayout->eccpos[0] +
- ecclayout->eccbytes;
+ /* include reserved-marker in ecclayout->oobfree calculation */
+ ecclayout->oobfree->offset = 1 +
+ ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
/* software bch library is used for locating errors */
nand_chip->ecc.priv = nand_bch_init(mtd,
nand_chip->ecc.size,
@@ -1957,8 +1961,9 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
- ecclayout->oobfree->offset = ecclayout->eccpos[0] +
- ecclayout->eccbytes;
+ /* reserved marker already included in ecclayout->eccbytes */
+ ecclayout->oobfree->offset =
+ ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
break;
#else
pr_err("nand: error: CONFIG_MTD_NAND_OMAP_BCH not enabled\n");
--
1.8.5.1.163.gd7aced9
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 2/3] mtd: nand: omap: fix ecclayout->oobfree->length
2014-02-14 17:01 ` [U-Boot] " Pekon Gupta
@ 2014-02-14 17:01 ` Pekon Gupta
-1 siblings, 0 replies; 10+ messages in thread
From: Pekon Gupta @ 2014-02-14 17:01 UTC (permalink / raw)
To: Brian Norris, Artem Bityutskiy
Cc: Felipe Balbi, u-boot, Enric Balletbo Serra, linux-mtd,
Pekon Gupta, Stefan Roese
ECC layout of some ecc-schemes expect a 'reserve-marker' as specific
byte-position in OOB. But current calculation of oobfree->length does not
consider that for all ecc-schemes.
But in general, for all ecc-schems, OOB bytes from oobfree->offset till end of
OOB region are unused. So this patch fixes oobfree->length calculation.
Signed-off-by: Pekon Gupta <pekon@ti.com>
---
drivers/mtd/nand/omap2.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index 874fd9d..433e58a 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -1977,9 +1977,8 @@ static int omap_nand_probe(struct platform_device *pdev)
goto return_error;
}
- /* populate remaining ECC layout data */
- ecclayout->oobfree->length = mtd->oobsize - (BADBLOCK_MARKER_LENGTH +
- ecclayout->eccbytes);
+ /* all OOB bytes from oobfree->offset till end off OOB are free */
+ ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset;
for (i = 1; i < ecclayout->eccbytes; i++)
ecclayout->eccpos[i] = ecclayout->eccpos[0] + i;
/* check if NAND device's OOB is enough to store ECC signatures */
--
1.8.5.1.163.gd7aced9
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH v2 2/3] mtd: nand: omap: fix ecclayout->oobfree->length
@ 2014-02-14 17:01 ` Pekon Gupta
0 siblings, 0 replies; 10+ messages in thread
From: Pekon Gupta @ 2014-02-14 17:01 UTC (permalink / raw)
To: u-boot
ECC layout of some ecc-schemes expect a 'reserve-marker' as specific
byte-position in OOB. But current calculation of oobfree->length does not
consider that for all ecc-schemes.
But in general, for all ecc-schems, OOB bytes from oobfree->offset till end of
OOB region are unused. So this patch fixes oobfree->length calculation.
Signed-off-by: Pekon Gupta <pekon@ti.com>
---
drivers/mtd/nand/omap2.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index 874fd9d..433e58a 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -1977,9 +1977,8 @@ static int omap_nand_probe(struct platform_device *pdev)
goto return_error;
}
- /* populate remaining ECC layout data */
- ecclayout->oobfree->length = mtd->oobsize - (BADBLOCK_MARKER_LENGTH +
- ecclayout->eccbytes);
+ /* all OOB bytes from oobfree->offset till end off OOB are free */
+ ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset;
for (i = 1; i < ecclayout->eccbytes; i++)
ecclayout->eccpos[i] = ecclayout->eccpos[0] + i;
/* check if NAND device's OOB is enough to store ECC signatures */
--
1.8.5.1.163.gd7aced9
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 3/3] mtd: nand: omap: fix ecclayout to be in sync with u-boot NAND driver
2014-02-14 17:01 ` [U-Boot] " Pekon Gupta
@ 2014-02-14 17:01 ` Pekon Gupta
-1 siblings, 0 replies; 10+ messages in thread
From: Pekon Gupta @ 2014-02-14 17:01 UTC (permalink / raw)
To: Brian Norris, Artem Bityutskiy
Cc: Felipe Balbi, u-boot, Enric Balletbo Serra, linux-mtd,
Pekon Gupta, Stefan Roese
Fixes: commit a919e51161b58ed7e6e663daba99ab7d558808f3
mtd: nand: omap2: clean-up BCHx_HW and BCHx_SW ECC configurations in device_probe
Fixes ecclayout mismatch introduced in above commit for following ecc-schemes:
- OMAP_ECC_BCH4_CODE_HW_DETECTION_SW
- OMAP_ECC_BCH8_CODE_HW_DETECTION_SW
However, this patch also touches other ecc-schemes as the fix required
refactoring common code, into ecc-scheme specific code.
This patch aligns ecc-layout for below ecc-schemes as per reference [1],[2],[3]
+---+------------+-------------++-------------+-------------+
|OOB|BCH8_CODE_HW|BCH8_CODE_HW_||HAM1_CODE_HW |HAM1_CODE_HW |
|pos| | DETECTION_SW||(x8 device) |(x16 device) |
+---+------------+-------------++-------------+-------------+
| 0 |BADBLK_MARK | BADBLK_MARK || BADBLK_MARK | BADBLK_MARK |
| 1 |BADBLK_MARK | BADBLK_MARK || eccpos[0] | BADBLK_MARK |
| 2 | eccpos[0] | eccpos[0] || eccpos[1] | eccpos[0] |
| 3 | eccpos[1] | eccpos[1] || eccpos[2] | eccpos[1] |
| 4 | eccpos[2] | eccpos[2] || eccpos[3] | eccpos[2] |
| 5 | eccpos[3] | eccpos[3] || eccpos[4] | eccpos[3] |
| 6 | eccpos[4] | eccpos[4] || eccpos[5] | eccpos[4] |
| 7 | eccpos[5] | eccpos[5] || eccpos[6] | eccpos[5] |
| 8 | eccpos[6] | eccpos[6] || eccpos[7] | eccpos[6] |
| 9 | eccpos[7] | eccpos[7] || eccpos[8] | eccpos[7] |
|10 | eccpos[8] | eccpos[8] || eccpos[9] | eccpos[8] |
|11 | eccpos[9] | eccpos[9] || eccpos[10] | eccpos[9] |
|12 | eccpos[10] | eccpos[10] || eccpos[11] | eccpos[10] |
|13 | eccpos[11] | eccpos[11] || oobfree[0] | eccpos[11] |
|14 | eccpos[12] | eccpos[12] || oobfree[1] | oobfree[0] |
|15 | eccpos[13] | <reserved> || oobfree[2] | oobfree[1] |
+---+------------+-------------++-------------+-------------+
|16 | eccpos[14] | eccpos[13] || oobfree[3] | oobfree[2] |
|...| [...] | [...] || [...] | [...] |
|56 | eccpos[54] | eccpos[51] || oobfree[43] | oobfree[42] |
|57 | eccpos[55] | <reserved> || oobfree[44] | oobfree[43] |
+===+============+=============+==============+=============+
|58 | oobfree[0] | oobfree[0] || oobfree[45] | oobfree[44] |
|59 | oobfree[1] | oobfree[1] || oobfree[46] | oobfree[45] |
|60 | oobfree[2] | oobfree[2] || oobfree[47] | oobfree[46] |
|61 | oobfree[3] | oobfree[3] || oobfree[48] | oobfree[47] |
|62 | oobfree[4] | oobfree[4] || oobfree[49] | oobfree[48] |
|63 | oobfree[5] | oobfree[5] || oobfree[50] | oobfree[49] |
+---+------------+-------------+--------------+-------------+
[1] ecc-layout expected by ROM code, as specified in SoC TRM under:
Chapter="Initialization"
Section="Device Initialization by ROM code"
Sub-Section="Memory Booting"
Heading="NAND"
Figure="ECC Locations in NAND Spare Areas"
[2] ecc-layout updates in u-boot
http://lists.denx.de/pipermail/u-boot/2013-November/167551.html
[3] u-boot configurations to match above ecc-layout are documented at
https://processors.wiki.ti.com/index.php/Linux_Core_NAND_User%27s_Guide
Reported-by: Enric Balletbo Serra <eballetbo@iseebcn.com>
Tested-by: Enric Balletbo i Serra <eballetbo@gmail.com>
Tested-by: Stefan Roese <sr@denx.de>
Signed-off-by: Pekon Gupta <pekon@ti.com>
---
drivers/mtd/nand/omap2.c | 31 +++++++++++++++++++++++--------
1 file changed, 23 insertions(+), 8 deletions(-)
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index 433e58a..bf642ce 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -1633,6 +1633,7 @@ static int omap_nand_probe(struct platform_device *pdev)
int i;
dma_cap_mask_t mask;
unsigned sig;
+ unsigned oob_index;
struct resource *res;
struct mtd_part_parser_data ppdata = {};
@@ -1826,9 +1827,11 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
if (nand_chip->options & NAND_BUSWIDTH_16)
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
else
- ecclayout->eccpos[0] = 1;
+ oob_index = 1;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++)
+ ecclayout->eccpos[i] = oob_index;
/* no reserved-marker in ecclayout for this ecc-scheme */
ecclayout->oobfree->offset =
ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
@@ -1848,7 +1851,12 @@ static int omap_nand_probe(struct platform_device *pdev)
ecclayout->eccbytes = nand_chip->ecc.bytes *
(mtd->writesize /
nand_chip->ecc.size);
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++) {
+ ecclayout->eccpos[i] = oob_index;
+ if (((i + 1) % nand_chip->ecc.bytes) == 0)
+ oob_index++;
+ }
/* include reserved-marker in ecclayout->oobfree calculation */
ecclayout->oobfree->offset = 1 +
ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
@@ -1885,7 +1893,9 @@ static int omap_nand_probe(struct platform_device *pdev)
ecclayout->eccbytes = nand_chip->ecc.bytes *
(mtd->writesize /
nand_chip->ecc.size);
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++)
+ ecclayout->eccpos[i] = oob_index;
/* reserved marker already included in ecclayout->eccbytes */
ecclayout->oobfree->offset =
ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
@@ -1916,7 +1926,12 @@ static int omap_nand_probe(struct platform_device *pdev)
ecclayout->eccbytes = nand_chip->ecc.bytes *
(mtd->writesize /
nand_chip->ecc.size);
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++) {
+ ecclayout->eccpos[i] = oob_index;
+ if (((i + 1) % nand_chip->ecc.bytes) == 0)
+ oob_index++;
+ }
/* include reserved-marker in ecclayout->oobfree calculation */
ecclayout->oobfree->offset = 1 +
ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
@@ -1960,7 +1975,9 @@ static int omap_nand_probe(struct platform_device *pdev)
ecclayout->eccbytes = nand_chip->ecc.bytes *
(mtd->writesize /
nand_chip->ecc.size);
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++)
+ ecclayout->eccpos[i] = oob_index;
/* reserved marker already included in ecclayout->eccbytes */
ecclayout->oobfree->offset =
ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
@@ -1979,8 +1996,6 @@ static int omap_nand_probe(struct platform_device *pdev)
/* all OOB bytes from oobfree->offset till end off OOB are free */
ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset;
- for (i = 1; i < ecclayout->eccbytes; i++)
- ecclayout->eccpos[i] = ecclayout->eccpos[0] + i;
/* check if NAND device's OOB is enough to store ECC signatures */
if (mtd->oobsize < (ecclayout->eccbytes + BADBLOCK_MARKER_LENGTH)) {
pr_err("not enough OOB bytes required = %d, available=%d\n",
--
1.8.5.1.163.gd7aced9
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH v2 3/3] mtd: nand: omap: fix ecclayout to be in sync with u-boot NAND driver
@ 2014-02-14 17:01 ` Pekon Gupta
0 siblings, 0 replies; 10+ messages in thread
From: Pekon Gupta @ 2014-02-14 17:01 UTC (permalink / raw)
To: u-boot
Fixes: commit a919e51161b58ed7e6e663daba99ab7d558808f3
mtd: nand: omap2: clean-up BCHx_HW and BCHx_SW ECC configurations in device_probe
Fixes ecclayout mismatch introduced in above commit for following ecc-schemes:
- OMAP_ECC_BCH4_CODE_HW_DETECTION_SW
- OMAP_ECC_BCH8_CODE_HW_DETECTION_SW
However, this patch also touches other ecc-schemes as the fix required
refactoring common code, into ecc-scheme specific code.
This patch aligns ecc-layout for below ecc-schemes as per reference [1],[2],[3]
+---+------------+-------------++-------------+-------------+
|OOB|BCH8_CODE_HW|BCH8_CODE_HW_||HAM1_CODE_HW |HAM1_CODE_HW |
|pos| | DETECTION_SW||(x8 device) |(x16 device) |
+---+------------+-------------++-------------+-------------+
| 0 |BADBLK_MARK | BADBLK_MARK || BADBLK_MARK | BADBLK_MARK |
| 1 |BADBLK_MARK | BADBLK_MARK || eccpos[0] | BADBLK_MARK |
| 2 | eccpos[0] | eccpos[0] || eccpos[1] | eccpos[0] |
| 3 | eccpos[1] | eccpos[1] || eccpos[2] | eccpos[1] |
| 4 | eccpos[2] | eccpos[2] || eccpos[3] | eccpos[2] |
| 5 | eccpos[3] | eccpos[3] || eccpos[4] | eccpos[3] |
| 6 | eccpos[4] | eccpos[4] || eccpos[5] | eccpos[4] |
| 7 | eccpos[5] | eccpos[5] || eccpos[6] | eccpos[5] |
| 8 | eccpos[6] | eccpos[6] || eccpos[7] | eccpos[6] |
| 9 | eccpos[7] | eccpos[7] || eccpos[8] | eccpos[7] |
|10 | eccpos[8] | eccpos[8] || eccpos[9] | eccpos[8] |
|11 | eccpos[9] | eccpos[9] || eccpos[10] | eccpos[9] |
|12 | eccpos[10] | eccpos[10] || eccpos[11] | eccpos[10] |
|13 | eccpos[11] | eccpos[11] || oobfree[0] | eccpos[11] |
|14 | eccpos[12] | eccpos[12] || oobfree[1] | oobfree[0] |
|15 | eccpos[13] | <reserved> || oobfree[2] | oobfree[1] |
+---+------------+-------------++-------------+-------------+
|16 | eccpos[14] | eccpos[13] || oobfree[3] | oobfree[2] |
|...| [...] | [...] || [...] | [...] |
|56 | eccpos[54] | eccpos[51] || oobfree[43] | oobfree[42] |
|57 | eccpos[55] | <reserved> || oobfree[44] | oobfree[43] |
+===+============+=============+==============+=============+
|58 | oobfree[0] | oobfree[0] || oobfree[45] | oobfree[44] |
|59 | oobfree[1] | oobfree[1] || oobfree[46] | oobfree[45] |
|60 | oobfree[2] | oobfree[2] || oobfree[47] | oobfree[46] |
|61 | oobfree[3] | oobfree[3] || oobfree[48] | oobfree[47] |
|62 | oobfree[4] | oobfree[4] || oobfree[49] | oobfree[48] |
|63 | oobfree[5] | oobfree[5] || oobfree[50] | oobfree[49] |
+---+------------+-------------+--------------+-------------+
[1] ecc-layout expected by ROM code, as specified in SoC TRM under:
Chapter="Initialization"
Section="Device Initialization by ROM code"
Sub-Section="Memory Booting"
Heading="NAND"
Figure="ECC Locations in NAND Spare Areas"
[2] ecc-layout updates in u-boot
http://lists.denx.de/pipermail/u-boot/2013-November/167551.html
[3] u-boot configurations to match above ecc-layout are documented at
https://processors.wiki.ti.com/index.php/Linux_Core_NAND_User%27s_Guide
Reported-by: Enric Balletbo Serra <eballetbo@iseebcn.com>
Tested-by: Enric Balletbo i Serra <eballetbo@gmail.com>
Tested-by: Stefan Roese <sr@denx.de>
Signed-off-by: Pekon Gupta <pekon@ti.com>
---
drivers/mtd/nand/omap2.c | 31 +++++++++++++++++++++++--------
1 file changed, 23 insertions(+), 8 deletions(-)
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index 433e58a..bf642ce 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -1633,6 +1633,7 @@ static int omap_nand_probe(struct platform_device *pdev)
int i;
dma_cap_mask_t mask;
unsigned sig;
+ unsigned oob_index;
struct resource *res;
struct mtd_part_parser_data ppdata = {};
@@ -1826,9 +1827,11 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
if (nand_chip->options & NAND_BUSWIDTH_16)
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
else
- ecclayout->eccpos[0] = 1;
+ oob_index = 1;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++)
+ ecclayout->eccpos[i] = oob_index;
/* no reserved-marker in ecclayout for this ecc-scheme */
ecclayout->oobfree->offset =
ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
@@ -1848,7 +1851,12 @@ static int omap_nand_probe(struct platform_device *pdev)
ecclayout->eccbytes = nand_chip->ecc.bytes *
(mtd->writesize /
nand_chip->ecc.size);
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++) {
+ ecclayout->eccpos[i] = oob_index;
+ if (((i + 1) % nand_chip->ecc.bytes) == 0)
+ oob_index++;
+ }
/* include reserved-marker in ecclayout->oobfree calculation */
ecclayout->oobfree->offset = 1 +
ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
@@ -1885,7 +1893,9 @@ static int omap_nand_probe(struct platform_device *pdev)
ecclayout->eccbytes = nand_chip->ecc.bytes *
(mtd->writesize /
nand_chip->ecc.size);
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++)
+ ecclayout->eccpos[i] = oob_index;
/* reserved marker already included in ecclayout->eccbytes */
ecclayout->oobfree->offset =
ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
@@ -1916,7 +1926,12 @@ static int omap_nand_probe(struct platform_device *pdev)
ecclayout->eccbytes = nand_chip->ecc.bytes *
(mtd->writesize /
nand_chip->ecc.size);
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++) {
+ ecclayout->eccpos[i] = oob_index;
+ if (((i + 1) % nand_chip->ecc.bytes) == 0)
+ oob_index++;
+ }
/* include reserved-marker in ecclayout->oobfree calculation */
ecclayout->oobfree->offset = 1 +
ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
@@ -1960,7 +1975,9 @@ static int omap_nand_probe(struct platform_device *pdev)
ecclayout->eccbytes = nand_chip->ecc.bytes *
(mtd->writesize /
nand_chip->ecc.size);
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++)
+ ecclayout->eccpos[i] = oob_index;
/* reserved marker already included in ecclayout->eccbytes */
ecclayout->oobfree->offset =
ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
@@ -1979,8 +1996,6 @@ static int omap_nand_probe(struct platform_device *pdev)
/* all OOB bytes from oobfree->offset till end off OOB are free */
ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset;
- for (i = 1; i < ecclayout->eccbytes; i++)
- ecclayout->eccpos[i] = ecclayout->eccpos[0] + i;
/* check if NAND device's OOB is enough to store ECC signatures */
if (mtd->oobsize < (ecclayout->eccbytes + BADBLOCK_MARKER_LENGTH)) {
pr_err("not enough OOB bytes required = %d, available=%d\n",
--
1.8.5.1.163.gd7aced9
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/3] mtd: nand: omap: fix ecclayout->oobfree->offset
2014-02-14 17:01 ` [U-Boot] " Pekon Gupta
@ 2014-02-14 18:59 ` Brian Norris
-1 siblings, 0 replies; 10+ messages in thread
From: Brian Norris @ 2014-02-14 18:59 UTC (permalink / raw)
To: Pekon Gupta
Cc: Artem Bityutskiy, Felipe Balbi, u-boot, Enric Balletbo Serra,
linux-mtd, Stefan Roese
Hi Pekon,
On Fri, Feb 14, 2014 at 10:31:46PM +0530, Pekon Gupta wrote:
> 1) In current implementation, ecclayout->oobfree->offset is calculated with
> respect to ecclayout->eccpos[0] which is incorrect because ECC bytes may not
> be stored contiguously in OOB.
> So, this patch calculates ecclayout->oobfree->offset with respect to last
> ECC byte-position 'eccpos[ecclayout->eccbytes-1]'.
>
> 2) ECC layout of some ecc-schemes expects reserved-markers at specific eccpos[]
> which should not be over-written by any file-system metadata.
> So this patch aligns oobfree->offset taking into account of such markers.
This is a much better description, and this series is looking a lot more
straightforward now. Thanks. A quick comment below, and I'll spend some
more time looking later.
(BTW, can you mark these for -stable, version 3.13+ if/when you resend?
Or else I'll mark it myself, I think.)
> Tested-by: Enric Balletbo i Serra <eballetbo@gmail.com>
> Tested-by: Stefan Roese <sr@denx.de>
> Signed-off-by: Pekon Gupta <pekon@ti.com>
> ---
> drivers/mtd/nand/omap2.c | 25 +++++++++++++++----------
> 1 file changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
> index ef4190a..874fd9d 100644
> --- a/drivers/mtd/nand/omap2.c
> +++ b/drivers/mtd/nand/omap2.c
> @@ -1829,8 +1829,9 @@ static int omap_nand_probe(struct platform_device *pdev)
> ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
> else
> ecclayout->eccpos[0] = 1;
> - ecclayout->oobfree->offset = ecclayout->eccpos[0] +
> - ecclayout->eccbytes;
> + /* no reserved-marker in ecclayout for this ecc-scheme */
> + ecclayout->oobfree->offset =
> + ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
Thanks for adjusting for 'eccbytes - 1'. This diff *would* be correct,
except that you're only initializing eccpos[1 .. eccbytes-1] in a for
loop after the switch-case block. It seems like this first patch
actually depends on patch 3, where you move the initialization of the
entire eccpos[] array into each 'case' block. e.g.:
@@ -1826,9 +1827,11 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
if (nand_chip->options & NAND_BUSWIDTH_16)
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
else
- ecclayout->eccpos[0] = 1;
+ oob_index = 1;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++)
+ ecclayout->eccpos[i] = oob_index;
So, can you rearrange this series so patch 3 comes first?
> @@ -1848,8 +1849,9 @@ static int omap_nand_probe(struct platform_device *pdev)
> (mtd->writesize /
> nand_chip->ecc.size);
> ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
> - ecclayout->oobfree->offset = ecclayout->eccpos[0] +
> - ecclayout->eccbytes;
> + /* include reserved-marker in ecclayout->oobfree calculation */
> + ecclayout->oobfree->offset = 1 +
> + ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
> /* software bch library is used for locating errors */
> nand_chip->ecc.priv = nand_bch_init(mtd,
> nand_chip->ecc.size,
> @@ -1884,8 +1886,9 @@ static int omap_nand_probe(struct platform_device *pdev)
> (mtd->writesize /
> nand_chip->ecc.size);
> ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
> - ecclayout->oobfree->offset = ecclayout->eccpos[0] +
> - ecclayout->eccbytes;
> + /* reserved marker already included in ecclayout->eccbytes */
> + ecclayout->oobfree->offset =
> + ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
> /* This ECC scheme requires ELM H/W block */
> if (is_elm_present(info, pdata->elm_of_node, BCH4_ECC) < 0) {
> pr_err("nand: error: could not initialize ELM\n");
> @@ -1914,8 +1917,9 @@ static int omap_nand_probe(struct platform_device *pdev)
> (mtd->writesize /
> nand_chip->ecc.size);
> ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
> - ecclayout->oobfree->offset = ecclayout->eccpos[0] +
> - ecclayout->eccbytes;
> + /* include reserved-marker in ecclayout->oobfree calculation */
> + ecclayout->oobfree->offset = 1 +
> + ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
> /* software bch library is used for locating errors */
> nand_chip->ecc.priv = nand_bch_init(mtd,
> nand_chip->ecc.size,
> @@ -1957,8 +1961,9 @@ static int omap_nand_probe(struct platform_device *pdev)
> (mtd->writesize /
> nand_chip->ecc.size);
> ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
> - ecclayout->oobfree->offset = ecclayout->eccpos[0] +
> - ecclayout->eccbytes;
> + /* reserved marker already included in ecclayout->eccbytes */
> + ecclayout->oobfree->offset =
> + ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
> break;
> #else
> pr_err("nand: error: CONFIG_MTD_NAND_OMAP_BCH not enabled\n");
Brian
^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH v2 1/3] mtd: nand: omap: fix ecclayout->oobfree->offset
@ 2014-02-14 18:59 ` Brian Norris
0 siblings, 0 replies; 10+ messages in thread
From: Brian Norris @ 2014-02-14 18:59 UTC (permalink / raw)
To: u-boot
Hi Pekon,
On Fri, Feb 14, 2014 at 10:31:46PM +0530, Pekon Gupta wrote:
> 1) In current implementation, ecclayout->oobfree->offset is calculated with
> respect to ecclayout->eccpos[0] which is incorrect because ECC bytes may not
> be stored contiguously in OOB.
> So, this patch calculates ecclayout->oobfree->offset with respect to last
> ECC byte-position 'eccpos[ecclayout->eccbytes-1]'.
>
> 2) ECC layout of some ecc-schemes expects reserved-markers at specific eccpos[]
> which should not be over-written by any file-system metadata.
> So this patch aligns oobfree->offset taking into account of such markers.
This is a much better description, and this series is looking a lot more
straightforward now. Thanks. A quick comment below, and I'll spend some
more time looking later.
(BTW, can you mark these for -stable, version 3.13+ if/when you resend?
Or else I'll mark it myself, I think.)
> Tested-by: Enric Balletbo i Serra <eballetbo@gmail.com>
> Tested-by: Stefan Roese <sr@denx.de>
> Signed-off-by: Pekon Gupta <pekon@ti.com>
> ---
> drivers/mtd/nand/omap2.c | 25 +++++++++++++++----------
> 1 file changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
> index ef4190a..874fd9d 100644
> --- a/drivers/mtd/nand/omap2.c
> +++ b/drivers/mtd/nand/omap2.c
> @@ -1829,8 +1829,9 @@ static int omap_nand_probe(struct platform_device *pdev)
> ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
> else
> ecclayout->eccpos[0] = 1;
> - ecclayout->oobfree->offset = ecclayout->eccpos[0] +
> - ecclayout->eccbytes;
> + /* no reserved-marker in ecclayout for this ecc-scheme */
> + ecclayout->oobfree->offset =
> + ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
Thanks for adjusting for 'eccbytes - 1'. This diff *would* be correct,
except that you're only initializing eccpos[1 .. eccbytes-1] in a for
loop after the switch-case block. It seems like this first patch
actually depends on patch 3, where you move the initialization of the
entire eccpos[] array into each 'case' block. e.g.:
@@ -1826,9 +1827,11 @@ static int omap_nand_probe(struct platform_device *pdev)
(mtd->writesize /
nand_chip->ecc.size);
if (nand_chip->options & NAND_BUSWIDTH_16)
- ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
+ oob_index = BADBLOCK_MARKER_LENGTH;
else
- ecclayout->eccpos[0] = 1;
+ oob_index = 1;
+ for (i = 0; i < ecclayout->eccbytes; i++, oob_index++)
+ ecclayout->eccpos[i] = oob_index;
So, can you rearrange this series so patch 3 comes first?
> @@ -1848,8 +1849,9 @@ static int omap_nand_probe(struct platform_device *pdev)
> (mtd->writesize /
> nand_chip->ecc.size);
> ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
> - ecclayout->oobfree->offset = ecclayout->eccpos[0] +
> - ecclayout->eccbytes;
> + /* include reserved-marker in ecclayout->oobfree calculation */
> + ecclayout->oobfree->offset = 1 +
> + ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
> /* software bch library is used for locating errors */
> nand_chip->ecc.priv = nand_bch_init(mtd,
> nand_chip->ecc.size,
> @@ -1884,8 +1886,9 @@ static int omap_nand_probe(struct platform_device *pdev)
> (mtd->writesize /
> nand_chip->ecc.size);
> ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
> - ecclayout->oobfree->offset = ecclayout->eccpos[0] +
> - ecclayout->eccbytes;
> + /* reserved marker already included in ecclayout->eccbytes */
> + ecclayout->oobfree->offset =
> + ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
> /* This ECC scheme requires ELM H/W block */
> if (is_elm_present(info, pdata->elm_of_node, BCH4_ECC) < 0) {
> pr_err("nand: error: could not initialize ELM\n");
> @@ -1914,8 +1917,9 @@ static int omap_nand_probe(struct platform_device *pdev)
> (mtd->writesize /
> nand_chip->ecc.size);
> ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
> - ecclayout->oobfree->offset = ecclayout->eccpos[0] +
> - ecclayout->eccbytes;
> + /* include reserved-marker in ecclayout->oobfree calculation */
> + ecclayout->oobfree->offset = 1 +
> + ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
> /* software bch library is used for locating errors */
> nand_chip->ecc.priv = nand_bch_init(mtd,
> nand_chip->ecc.size,
> @@ -1957,8 +1961,9 @@ static int omap_nand_probe(struct platform_device *pdev)
> (mtd->writesize /
> nand_chip->ecc.size);
> ecclayout->eccpos[0] = BADBLOCK_MARKER_LENGTH;
> - ecclayout->oobfree->offset = ecclayout->eccpos[0] +
> - ecclayout->eccbytes;
> + /* reserved marker already included in ecclayout->eccbytes */
> + ecclayout->oobfree->offset =
> + ecclayout->eccpos[ecclayout->eccbytes - 1] + 1;
> break;
> #else
> pr_err("nand: error: CONFIG_MTD_NAND_OMAP_BCH not enabled\n");
Brian
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2014-02-14 18:59 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-14 17:01 [PATCH v2 0/3] mtd: nand: omap: fix ecc-layout Pekon Gupta
2014-02-14 17:01 ` [U-Boot] " Pekon Gupta
2014-02-14 17:01 ` [PATCH v2 1/3] mtd: nand: omap: fix ecclayout->oobfree->offset Pekon Gupta
2014-02-14 17:01 ` [U-Boot] " Pekon Gupta
2014-02-14 18:59 ` Brian Norris
2014-02-14 18:59 ` [U-Boot] " Brian Norris
2014-02-14 17:01 ` [PATCH v2 2/3] mtd: nand: omap: fix ecclayout->oobfree->length Pekon Gupta
2014-02-14 17:01 ` [U-Boot] " Pekon Gupta
2014-02-14 17:01 ` [PATCH v2 3/3] mtd: nand: omap: fix ecclayout to be in sync with u-boot NAND driver Pekon Gupta
2014-02-14 17:01 ` [U-Boot] " Pekon Gupta
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.