From fc16df9fdd596d1a3f5c3be897dc0cf69c84c469 Mon Sep 17 00:00:00 2001 From: Tony Ambardar Date: Sat, 11 Nov 2023 04:46:14 -0800 Subject: [PATCH] image: improve UBI image sizing on NAND devices Many NAND devices use a build recipe with "append-ubi | check-size" to ensure factory images don't exceed the target flash partition size. However, UBI reserves space for bad block handling and other operational overhead, and thus 'check-size' can overestimate the space available by several MB. In practice, this means a failed check is definitely a failure, while a passing check is only probably a pass. Improve the situation by teaching 'Build/append-ubi' to check image sizes while accounting for UBI reserved blocks. Add new device variable NAND_SIZE and use with existing IMAGE_SIZE to derate the available space. Each UBI device reserves 20 PEBs per 1024 PEBs of the entire NAND device for bad blocks, plus an additional 4 PEBs overhead. Many devices can transparently enable this check by setting NAND_SIZE based on their flash storage, and may then remove any unneeded 'check-size'. Link: http://www.linux-mtd.infradead.org/doc/ubi.html#L_overhead Suggested-by: Shiji Yang Suggested-by: Robert Marko Signed-off-by: Tony Ambardar --- include/image-commands.mk | 4 ++++ include/image.mk | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/image-commands.mk b/include/image-commands.mk index 7d9f93fed7..41a5e1198a 100644 --- a/include/image-commands.mk +++ b/include/image-commands.mk @@ -133,6 +133,8 @@ define Build/append-md5sum-ascii-salted rm $@.salted endef +UBI_NAND_SIZE_LIMIT = $(IMAGE_SIZE) - ($(NAND_SIZE)*20/1024 + 4*$(BLOCKSIZE)) + define Build/append-ubi sh $(TOPDIR)/scripts/ubinize-image.sh \ $(if $(UBOOTENV_IN_UBI),--uboot-env) \ @@ -146,6 +148,8 @@ define Build/append-ubi $(UBINIZE_OPTS) cat $@.tmp >> $@ rm $@.tmp + $(if $(and $(IMAGE_SIZE),$(NAND_SIZE)),\ + $(call Build/check-size,$(UBI_NAND_SIZE_LIMIT))) endef define Build/ubinize-kernel diff --git a/include/image.mk b/include/image.mk index ef52337dee..096ccb5f18 100644 --- a/include/image.mk +++ b/include/image.mk @@ -397,6 +397,7 @@ define Device/Init DEVICE_IMG_NAME = $$(DEVICE_IMG_PREFIX)-$$(1)-$$(2) FACTORY_IMG_NAME := IMAGE_SIZE := + NAND_SIZE := KERNEL_PREFIX = $$(DEVICE_IMG_PREFIX) KERNEL_SUFFIX := -kernel.bin KERNEL_INITRAMFS_SUFFIX = $$(KERNEL_SUFFIX) @@ -457,7 +458,7 @@ DEFAULT_DEVICE_VARS := \ DEVICE_DTS_DIR DEVICE_DTS_OVERLAY DEVICE_DTS_LOADADDR \ DEVICE_FDT_NUM DEVICE_IMG_PREFIX SOC BOARD_NAME UIMAGE_MAGIC UIMAGE_NAME \ UIMAGE_TIME SUPPORTED_DEVICES IMAGE_METADATA KERNEL_ENTRY KERNEL_LOADADDR \ - UBOOT_PATH IMAGE_SIZE \ + UBOOT_PATH IMAGE_SIZE NAND_SIZE \ FACTORY_IMG_NAME FACTORY_SIZE \ DEVICE_PACKAGES DEVICE_COMPAT_VERSION DEVICE_COMPAT_MESSAGE \ DEVICE_VENDOR DEVICE_MODEL DEVICE_VARIANT \ -- 2.30.2