[U-Boot] [PATCH v2 1/14] nand: sunxi: Fix modulo by zero error
Boris Brezillon
boris.brezillon at free-electrons.com
Tue Nov 22 13:43:20 CET 2016
On Tue, 22 Nov 2016 13:38:31 +0100
Maxime Ripard <maxime.ripard at free-electrons.com> wrote:
> 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 at free-electrons.com>
Acked-by: Boris Brezillon <boris.brezillon at free-electrons.com>
> ---
> 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) |
More information about the U-Boot
mailing list