From patchwork Wed May 27 11:56:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 246674 List-Id: U-Boot discussion From: dariobin at libero.it (Dario Binacchi) Date: Wed, 27 May 2020 13:56:18 +0200 Subject: [PATCH v3 1/4] spl: fix format of function documentation In-Reply-To: <20200527115621.1062-1-dariobin@libero.it> References: <20200527115621.1062-1-dariobin@libero.it> Message-ID: <20200527115621.1062-2-dariobin@libero.it> U-Boot adopted the kernel-doc annotation style. cc: Michael Trimarchi Signed-off-by: Dario Binacchi Reviewed-by: Simon Glass --- Changes in v3: None Changes in v2: None include/spl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/spl.h b/include/spl.h index b31c9bb4ab..580e4e024f 100644 --- a/include/spl.h +++ b/include/spl.h @@ -155,7 +155,7 @@ struct spl_image_info { #endif }; -/* +/** * Information required to load data from a device * * @dev: Pointer to the device, e.g. struct mmc * From patchwork Wed May 27 11:56:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 246675 List-Id: U-Boot discussion From: dariobin at libero.it (Dario Binacchi) Date: Wed, 27 May 2020 13:56:19 +0200 Subject: [PATCH v3 2/4] spl: fit: fail fit loading in case of FDT appending error In-Reply-To: <20200527115621.1062-1-dariobin@libero.it> References: <20200527115621.1062-1-dariobin@libero.it> Message-ID: <20200527115621.1062-3-dariobin@libero.it> If uboot does not embed its device tree and the FIT loading function returns error in case of failure in the FDT append, the redundant itb image could be loaded. cc: Michael Trimarchi Signed-off-by: Dario Binacchi Reviewed-by: Michael Trimarchi Reviewed-by: Simon Glass --- Changes in v3: None Changes in v2: - Replace CONFIG_IS_ENABLED(OF_EMBED) with IS_ENABLED(CONFIG_OF_EMBED)) common/spl/spl_fit.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index f581a22421..365104fe02 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -619,9 +619,12 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, * Booting a next-stage U-Boot may require us to append the FDT. * We allow this to fail, as the U-Boot image might embed its FDT. */ - if (spl_image->os == IH_OS_U_BOOT) - spl_fit_append_fdt(spl_image, info, sector, fit, - images, base_offset); + if (spl_image->os == IH_OS_U_BOOT) { + ret = spl_fit_append_fdt(spl_image, info, sector, fit, + images, base_offset); + if (!IS_ENABLED(CONFIG_OF_EMBED) && ret < 0) + return ret; + } firmware_node = node; /* Now check if there are more images for us to load */ From patchwork Wed May 27 11:56:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 246676 List-Id: U-Boot discussion From: dariobin at libero.it (Dario Binacchi) Date: Wed, 27 May 2020 13:56:20 +0200 Subject: [PATCH v3 3/4] spl: fit: nand: fix fit loading in case of bad blocks In-Reply-To: <20200527115621.1062-1-dariobin@libero.it> References: <20200527115621.1062-1-dariobin@libero.it> Message-ID: <20200527115621.1062-4-dariobin@libero.it> The offset at which the image to be loaded from NAND is located is retrieved from the itb header. The presence of bad blocks in the area of the NAND where the itb image is located could invalidate the offset which must therefore be adjusted taking into account the state of the sectors concerned. cc: Michael Trimarchi Signed-off-by: Dario Binacchi --- Changes in v3: The previous versions were buggy for devices others than NAND. This because the 'adjust_offset' helper was properly set only for the NAND case but called even for devices like MMC, RAM, and so on, crashing the boot up by that devices. Continuing to use the adjust_offset helper would mean checking the helper before calling it and patching too many files to set it properly before calling the spl_load_simple_fit routine. For this reason, the adjust_offset helper has been removed from the spl_image_info structure and the offset fixed inside the read helper for the NAND device only. This solution fixes the problem for the NAND device without side effects for other types of devices. Changes in v2: None common/spl/spl_nand.c | 5 ++++- drivers/mtd/nand/raw/nand_spl_loaders.c | 28 +++++++++++++++++++++++++ include/nand.h | 1 + 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c index 48c97549eb..1e6f2dce56 100644 --- a/common/spl/spl_nand.c +++ b/common/spl/spl_nand.c @@ -42,8 +42,11 @@ static int spl_nand_load_image(struct spl_image_info *spl_image, static ulong spl_nand_fit_read(struct spl_load_info *load, ulong offs, ulong size, void *dst) { + ulong sector; int ret; + sector = *(int *)load->priv; + offs = sector + nand_spl_adjust_offset(sector, offs - sector); ret = nand_spl_load_image(offs, size, dst); if (!ret) return size; @@ -66,7 +69,7 @@ static int spl_nand_load_element(struct spl_image_info *spl_image, debug("Found FIT\n"); load.dev = NULL; - load.priv = NULL; + load.priv = &offset; load.filename = NULL; load.bl_len = 1; load.read = spl_nand_fit_read; diff --git a/drivers/mtd/nand/raw/nand_spl_loaders.c b/drivers/mtd/nand/raw/nand_spl_loaders.c index 177c12b581..4befc75c04 100644 --- a/drivers/mtd/nand/raw/nand_spl_loaders.c +++ b/drivers/mtd/nand/raw/nand_spl_loaders.c @@ -41,6 +41,34 @@ int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst) return 0; } +/** + * nand_spl_adjust_offset - Adjust offset from a starting sector + * @sector: Address of the sector + * @offs: Offset starting from @sector + * + * If one or more bad blocks are in the address space between @sector + * and @sector + @offs, @offs is increased by the NAND block size for + * each bad block found. + */ +u32 nand_spl_adjust_offset(u32 sector, u32 offs) +{ + unsigned int block, lastblock; + + block = sector / CONFIG_SYS_NAND_BLOCK_SIZE; + lastblock = (sector + offs) / CONFIG_SYS_NAND_BLOCK_SIZE; + + while (block <= lastblock) { + if (nand_is_bad_block(block)) { + offs += CONFIG_SYS_NAND_BLOCK_SIZE; + lastblock++; + } + + block++; + } + + return offs; +} + #ifdef CONFIG_SPL_UBI /* * Temporary storage for non NAND page aligned and non NAND page sized diff --git a/include/nand.h b/include/nand.h index 93cbe1e25d..80dd6469bc 100644 --- a/include/nand.h +++ b/include/nand.h @@ -120,6 +120,7 @@ int nand_unlock(struct mtd_info *mtd, loff_t start, size_t length, int allexcept); int nand_get_lock_status(struct mtd_info *mtd, loff_t offset); +u32 nand_spl_adjust_offset(u32 sector, u32 offs); int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst); int nand_spl_read_block(int block, int offset, int len, void *dst); void nand_deselect(void); From patchwork Wed May 27 11:56:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 246677 List-Id: U-Boot discussion From: dariobin at libero.it (Dario Binacchi) Date: Wed, 27 May 2020 13:56:21 +0200 Subject: [PATCH v3 4/4] spl: fit: improve spl_nand_fit_read(...) readability In-Reply-To: <20200527115621.1062-1-dariobin@libero.it> References: <20200527115621.1062-1-dariobin@libero.it> Message-ID: <20200527115621.1062-5-dariobin@libero.it> Replacing the ret variable with err and handling first the error condition about the value returned by the spl_nand_fit_read routine, improves the code readability. Furthermore, the 'else' int the 'else return ret' instruction was useless. cc: Michael Trimarchi Signed-off-by: Dario Binacchi --- Changes in v3: None Changes in v2: None common/spl/spl_nand.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c index 1e6f2dce56..d13a524597 100644 --- a/common/spl/spl_nand.c +++ b/common/spl/spl_nand.c @@ -43,15 +43,15 @@ static ulong spl_nand_fit_read(struct spl_load_info *load, ulong offs, ulong size, void *dst) { ulong sector; - int ret; + int err; sector = *(int *)load->priv; offs = sector + nand_spl_adjust_offset(sector, offs - sector); - ret = nand_spl_load_image(offs, size, dst); - if (!ret) - return size; - else + err = nand_spl_load_image(offs, size, dst); + if (err) return 0; + + return size; } static int spl_nand_load_element(struct spl_image_info *spl_image,