From: Stephen Warren <swar...@nvidia.com>

On systems with caches enabled, NAND I/O may need to flush/invalidate
the cache during read/write operations. For this to work correctly, all
buffers must be cache-aligned. Fix nand_verify*() to allocate aligned
buffers.

This prevents cache alignment warnings from being spewed when using
U-Boot to write an updated version of itself to flash on NVIDIA Tegra
Seaboard (after perturbation of stack/data layout in current
u-boot-dm/next branch).

I have validatd (executed) nand_verify(), but I don't think I've executed
nand_verify_page_oob(); testing of that would be useful.

Cc: Peter Tyser <pty...@xes-inc.com>
Cc: Heiko Schocher <h...@denx.de>
Cc: Scott Wood <scottw...@freescale.com>
Fixes: 59b5a2ad83df ("nand: Add verification functions")
Signed-off-by: Stephen Warren <swar...@nvidia.com>
---
 drivers/mtd/nand/nand_util.c | 15 +++------------
 1 file changed, 3 insertions(+), 12 deletions(-)

diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c
index 12dd26a33fac..4e40952bf363 100644
--- a/drivers/mtd/nand/nand_util.c
+++ b/drivers/mtd/nand/nand_util.c
@@ -480,13 +480,11 @@ int nand_verify_page_oob(nand_info_t *nand, struct 
mtd_oob_ops *ops, loff_t ofs)
        int rval;
        struct mtd_oob_ops vops;
        size_t verlen = nand->writesize + nand->oobsize;
+       ALLOC_CACHE_ALIGN_BUFFER(uint8_t, verbuf, verlen);
 
        memcpy(&vops, ops, sizeof(vops));
 
-       vops.datbuf = malloc(verlen);
-
-       if (!vops.datbuf)
-               return -ENOMEM;
+       vops.datbuf = verbuf;
 
        vops.oobbuf = vops.datbuf + nand->writesize;
 
@@ -496,8 +494,6 @@ int nand_verify_page_oob(nand_info_t *nand, struct 
mtd_oob_ops *ops, loff_t ofs)
        if (!rval)
                rval = memcmp(ops->oobbuf, vops.oobbuf, vops.ooblen);
 
-       free(vops.datbuf);
-
        return rval ? -EIO : 0;
 }
 
@@ -520,10 +516,7 @@ int nand_verify(nand_info_t *nand, loff_t ofs, size_t len, 
u_char *buf)
        int rval = 0;
        size_t verofs;
        size_t verlen = nand->writesize;
-       uint8_t *verbuf = malloc(verlen);
-
-       if (!verbuf)
-               return -ENOMEM;
+       ALLOC_CACHE_ALIGN_BUFFER(uint8_t, verbuf, verlen);
 
        /* Read the NAND back in page-size groups to limit malloc size */
        for (verofs = ofs; verofs < ofs + len;
@@ -537,8 +530,6 @@ int nand_verify(nand_info_t *nand, loff_t ofs, size_t len, 
u_char *buf)
                        break;
        }
 
-       free(verbuf);
-
        return rval ? -EIO : 0;
 }
 
-- 
1.9.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to