kwbimage nandblocksize field is in 64 kB unit, but NAND_BLKSZ command
expects it in bytes. So do required unit conversion.

Also zero value in nandblocksize field has special meaning. When this field
is set to zero, the default block size is used. This default size is
defined by the NAND flash page size (16 KB for a 512B page or small page
NAND and 64 KB for a large page NAND flash).

Fixes: 1a8e6b63e24f ("tools: kwbimage: Dump kwbimage config file on '-p -1' 
option")
Signed-off-by: Pali Rohár <p...@kernel.org>
---
 tools/kwbimage.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/tools/kwbimage.c b/tools/kwbimage.c
index 4e9ba5ddfae2..b6deb978f611 100644
--- a/tools/kwbimage.c
+++ b/tools/kwbimage.c
@@ -2184,8 +2184,14 @@ static int kwbimage_generate_config(void *ptr, struct 
image_tool_params *params)
        if (mhdr->blockid == IBR_HDR_NAND_ID)
                fprintf(f, "NAND_PAGE_SIZE 0x%x\n", 
(unsigned)le16_to_cpu(mhdr->nandpagesize));
 
-       if (version != 0 && mhdr->blockid == IBR_HDR_NAND_ID)
-               fprintf(f, "NAND_BLKSZ 0x%x\n", (unsigned)mhdr->nandblocksize);
+       if (version != 0 && mhdr->blockid == IBR_HDR_NAND_ID) {
+               if (mhdr->nandblocksize != 0) /* block size explicitly set in 
64 kB unit */
+                       fprintf(f, "NAND_BLKSZ 0x%x\n", 
(unsigned)mhdr->nandblocksize * 64*1024);
+               else if (le16_to_cpu(mhdr->nandpagesize) > 512)
+                       fprintf(f, "NAND_BLKSZ 0x10000\n"); /* large page NAND 
flash = 64 kB block size */
+               else
+                       fprintf(f, "NAND_BLKSZ 0x4000\n"); /* small page NAND 
flash = 16 kB block size */
+       }
 
        if (mhdr->blockid == IBR_HDR_NAND_ID && (version != 0 || is_v0_ext))
                fprintf(f, "NAND_BADBLK_LOCATION 0x%x\n", 
(unsigned)mhdr->nandbadblklocation);
-- 
2.20.1

Reply via email to