Re: [U-Boot] [U-Boot, v4, 1/16] nand: sunxi: Fix modulo by zero error

Hello Maxime, Jagan,
[as I was not subscribed to the u-boot mailing list from this email address yet, I could not properly reply, nor do I have my git-send-patch setup yet.]
I tried the patch series and reproduced the sunxi-spl-with-ecc.bin flow on an A13 Olinuxino board with NAND.
I think the fix for the modulo by 0 must also be applied to the nand_read_buffer() function as follows:
diff --git a/drivers/mtd/nand/sunxi_nand_spl.c b/drivers/mtd/nand/sunxi_nand_spl.c index 24c5dcc..f7d31bc 100644 --- a/drivers/mtd/nand/sunxi_nand_spl.c +++ b/drivers/mtd/nand/sunxi_nand_spl.c @@ -486,17 +486,24 @@ static int nand_detect_config(struct nfc_config *conf, u32 offs, void *dest) static int nand_read_buffer(struct nfc_config *conf, uint32_t offs, unsigned int size, void *dest) { - int first_seed, page, ret; + int first_seed = 0, page, ret;
size = ALIGN(size, conf->page_size); page = offs / conf->page_size; - first_seed = page % conf->nseeds; + if (conf->randomize) + first_seed = page % conf->nseeds;
With that fix, I could boot U-Boot through the U-Boot SPL, fully from NAND on an A13-Olinuxino-WiFi board with 8192/640.
Regards,
Leon.
From patchwork Mon Jan 23 13:46:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [U-Boot,v4,1/16] nand: sunxi: Fix modulo by zero error From: Maxime Ripard maxime.ripard@free-electrons.com X-Patchwork-Id: 718570 X-Patchwork-Delegate: jagannadh.teki@gmail.com Message-Id: 57745204e0a659bdcce05f77a5681fa0ab60690b.1485179128.git-series.maxime.ripard@free-electrons.com To: Jagan Teki jagan@openedev.com, Scott Wood oss@buserror.net Cc: Thomas Petazzoni thomas.petazzoni@free-electrons.com, Alexander Kaplan alex@nextthing.co, Maxime Ripard maxime.ripard@free-electrons.com, u-boot@lists.denx.de Date: Mon, 23 Jan 2017 14:46:43 +0100
When trying to autodetect the ECC and randomization configurations, the driver starts with a randomization disabled and no seeds.
In this case, the number of seeds is obviously 0, and the randomize boolean is set to false.
However, the logic that retrieves the seed for a given page offset will blindly use the number of seeds, without testing if the randomization is enabled, basically doing a modulo by 0.
As it turns out, the libgcc in the common toolchain returns 0 here, which was our expected value in such a case, and why we would not detect it. However, U-Boot's libgcc will for some reason return from the function instead, resulting in an error to load the U-Boot binary in the SPL.
Signed-off-by: Maxime Ripard maxime.ripard@free-electrons.com Acked-by: Boris Brezillon boris.brezillon@free-electrons.com Acked-by: Scott Wood oss@buserror.net
drivers/mtd/nand/sunxi_nand_spl.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/nand/sunxi_nand_spl.c b/drivers/mtd/nand/sunxi_nand_spl.c index 1ef7366d4c42..eed4472bdc34 100644 --- a/drivers/mtd/nand/sunxi_nand_spl.c +++ b/drivers/mtd/nand/sunxi_nand_spl.c @@ -245,7 +245,7 @@ static int nand_read_page(const struct nfc_config *conf, u32 offs, { dma_addr_t dst = (dma_addr_t)dest; int nsectors = len / conf->ecc_size;
- u16 rand_seed;
- u16 rand_seed = 0; u32 val; int page;
@@ -258,8 +258,9 @@ static int nand_read_page(const struct nfc_config *conf, u32 offs, /* clear ecc status */ writel(0, SUNXI_NFC_BASE + NFC_ECC_ST);
- /* Choose correct seed */
- rand_seed = random_seed[page % conf->nseeds];
/* Choose correct seed if randomized */
if (conf->randomize)
rand_seed = random_seed[page % conf->nseeds];
writel((rand_seed << 16) | (conf->ecc_strength << 12) | (conf->randomize ? NFC_ECC_RANDOM_EN : 0) |
participants (1)
-
Leon Woestenberg