From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B66C2C433F5 for ; Sat, 23 Apr 2022 08:12:31 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id B048683DFB; Sat, 23 Apr 2022 10:12:16 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b="Q9AY6Lnk"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 680EF83DA7; Sat, 23 Apr 2022 10:12:08 +0200 (CEST) Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id C61D983DC8 for ; Sat, 23 Apr 2022 10:12:02 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=michael@amarulasolutions.com Received: by mail-wr1-x436.google.com with SMTP id e2so7724694wrh.7 for ; Sat, 23 Apr 2022 01:12:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4yKurBwyKSabU16KqqPqY80La9tSnx1yKsPoiQb84Qg=; b=Q9AY6LnkG5UJUmL1fZAApXvLCyZN3o2o9K2erNyedldHmaMXgPU6qlE9KcPy4mnCJX A5nKnjgT3fUo8or7rHSeRhs7FKmXEeu6zTzt7Ue5pQ8+JU++bmfuYamblb6jKNW92O58 nW2/OtZpiACjJKMlDOlDBZpJiU4JBVxnD6k8Q= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4yKurBwyKSabU16KqqPqY80La9tSnx1yKsPoiQb84Qg=; b=dZ/ildDwlLQLxSU2j7rYGm4rnss/vZr+dUk1FWSoAGpw5hQ9IWllr+x9R+2fKbJDir YkJg05b0hP+sgAOOEdEQRB03awe0UkPX5U/ol/P2ItsZge+H23jiUObSn8DGehOOtSlH 8/lmtRS2l7YMS5zJz/jroGq57xERO4ZH0LvouNx7IFOEvv/7Yg0/m6sfMNZyYBanKcUX qkRPdC8C47M7J6Wr1FskXacRXrS2xW/N9EfKzrXh9fpDMDJC0TP7KUSTHcK4BkN6uFZ5 FBj2uXES69v09CTl88HAKsLq/Hvoz0XkrEhMdObynXsLV9DCAP4fIHeNd/znpFCDc0Yl ZMJQ== X-Gm-Message-State: AOAM533JdrOtWoC17Ra8XBpT4sET4TI3eWkH9j2xG+UQua0h5ssapHuU MSK+PB+CMHVXJ3/JWctU+RHP9w== X-Google-Smtp-Source: ABdhPJwYb29NEB2qd0Ri5Tdz1bpKmvmrsOG501OmfC/VhDJaXoPs7EALyEEo79auwN/S9pkG79cz7g== X-Received: by 2002:a05:6000:1f88:b0:20a:d39b:2729 with SMTP id bw8-20020a0560001f8800b0020ad39b2729mr1018982wrb.145.1650701521972; Sat, 23 Apr 2022 01:12:01 -0700 (PDT) Received: from localhost.localdomain ([5.171.215.34]) by smtp.gmail.com with ESMTPSA id m7-20020adfe0c7000000b002060e7bbe49sm4181319wri.45.2022.04.23.01.12.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Apr 2022 01:12:01 -0700 (PDT) From: Michael Trimarchi To: Ye Li Cc: Miquel Raynal , u-boot@lists.denx.de, Fabio Estevam , Dario Binacchi , Sean Anderson Subject: [PATCH 2/2] mtd: nand: mxs_nand_spl: Fix bad block skipping Date: Sat, 23 Apr 2022 10:11:55 +0200 Message-Id: <20220423081155.27687-3-michael@amarulasolutions.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220423081155.27687-1-michael@amarulasolutions.com> References: <20220423081155.27687-1-michael@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.5 at phobos.denx.de X-Virus-Status: Clean The file was fill of problems and bugs. The bad block are marked beginning of erase block. The first erase block was never checked and the specific function to skip bad block in fit image was never implemented. The imx8mn bootrom seems that not handle the bad block as expected so this needed later to switch from boot rom loader to uboot spl one Signed-off-by: Michael Trimarchi --- drivers/mtd/nand/raw/mxs_nand_spl.c | 90 ++++++++++++++++------------- 1 file changed, 49 insertions(+), 41 deletions(-) diff --git a/drivers/mtd/nand/raw/mxs_nand_spl.c b/drivers/mtd/nand/raw/mxs_nand_spl.c index 59a67ee414..c1a833d6c8 100644 --- a/drivers/mtd/nand/raw/mxs_nand_spl.c +++ b/drivers/mtd/nand/raw/mxs_nand_spl.c @@ -218,14 +218,14 @@ void nand_init(void) mxs_nand_setup_ecc(mtd); } -int nand_spl_load_image(uint32_t offs, unsigned int size, void *buf) +int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst) { - struct nand_chip *chip; - unsigned int page; + unsigned int sz; + unsigned int block, lastblock; + unsigned int page, page_offset; unsigned int nand_page_per_block; - unsigned int sz = 0; + struct nand_chip *chip; u8 *page_buf = NULL; - u32 page_off; chip = mtd_to_nand(mtd); if (!chip->numchips) @@ -235,47 +235,42 @@ int nand_spl_load_image(uint32_t offs, unsigned int size, void *buf) if (!page_buf) return -ENOMEM; - page = offs >> chip->page_shift; - page_off = offs & (mtd->writesize - 1); + /* offs has to be aligned to a page address! */ + block = offs / mtd->erasesize; + lastblock = (offs + size - 1) / mtd->erasesize; + page = (offs % mtd->erasesize) / mtd->writesize; + page_offset = offs % mtd->writesize; nand_page_per_block = mtd->erasesize / mtd->writesize; - debug("%s offset:0x%08x len:%d page:%x\n", __func__, offs, size, page); - - while (size) { - if (mxs_read_page_ecc(mtd, page_buf, page) < 0) - return -1; - - if (size > (mtd->writesize - page_off)) - sz = (mtd->writesize - page_off); - else - sz = size; - - memcpy(buf, page_buf + page_off, sz); - - offs += mtd->writesize; - page++; - buf += (mtd->writesize - page_off); - page_off = 0; - size -= sz; - - /* - * Check if we have crossed a block boundary, and if so - * check for bad block. - */ - if (!(page % nand_page_per_block)) { - /* - * Yes, new block. See if this block is good. If not, - * loop until we find a good block. - */ - while (is_badblock(mtd, offs, 1)) { - page = page + nand_page_per_block; - /* Check i we've reached the end of flash. */ - if (page >= mtd->size >> chip->page_shift) { + while (block <= lastblock && size >= 0) { + if (!is_badblock(mtd, mtd->erasesize * block, 1)) { + /* Skip bad blocks */ + while (page < nand_page_per_block) { + int curr_page = nand_page_per_block * block + page; + + if (mxs_read_page_ecc(mtd, page_buf, curr_page) < 0) { free(page_buf); - return -ENOMEM; + return -EIO; } + + if (size > (mtd->writesize - page_offset)) + sz = (mtd->writesize - page_offset); + else + sz = size; + + memcpy(dst, page_buf + page_offset, sz); + dst += sz; + size -= sz; + page_offset = 0; + page++; } + + page = 0; + } else { + lastblock++; } + + block++; } free(page_buf); @@ -294,6 +289,19 @@ void nand_deselect(void) u32 nand_spl_adjust_offset(u32 sector, u32 offs) { - /* Handle the offset adjust in nand_spl_load_image,*/ + unsigned int block, lastblock; + + block = sector / mtd->erasesize; + lastblock = (sector + offs) / mtd->erasesize; + + while (block <= lastblock) { + if (is_badblock(mtd, block * mtd->erasesize, 1)) { + offs += mtd->erasesize; + lastblock++; + } + + block++; + } + return offs; } -- 2.25.1