diff mbox series

[10/11] board: stm32mp1: adapt MTD partition for BOOT from NOR or NAND

Message ID 20200318082254.7522-8-patrick.delaunay@st.com
State Accepted
Commit 23229d030998f8c2425cc8bbf8c26360facc9300
Headers show
Series stm32mp1: migrate MTD and DFU configuration in Kconfig | expand

Commit Message

Patrick Delaunay March 18, 2020, 8:22 a.m. UTC
Dynamically adapt the MTD partitions in NAND and SPI-NAND when boot from
NOR or NAND/SPI-NAND is detected.

This patch avoids to define the save MTD partition name for NOR and NAND
devices and issue with latest kernel: only the needed MTD partitions
are defined.

For boot from NOR
1/ bootloader (TF-A, U-Boot and OP-TE) in NOR
2/ one large UBI partition in NAND

For boot from NAND
1/ bootloader (TF-A, U-Boot and OP-TE) in MTD raw partition
2/ one large UBI partition

Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>

# Conflicts:
#	board/st/common/stm32mp_mtdparts.c
---

 board/st/common/stm32mp_mtdparts.c | 81 ++++++++++++++++++++++--------
 1 file changed, 60 insertions(+), 21 deletions(-)
diff mbox series

Patch

diff --git a/board/st/common/stm32mp_mtdparts.c b/board/st/common/stm32mp_mtdparts.c
index 2b6413be16..5028511077 100644
--- a/board/st/common/stm32mp_mtdparts.c
+++ b/board/st/common/stm32mp_mtdparts.c
@@ -10,6 +10,7 @@ 
 #include <mtd.h>
 #include <mtd_node.h>
 #include <tee.h>
+#include <asm/arch/sys_proto.h>
 
 #define MTDPARTS_LEN		256
 #define MTDIDS_LEN		128
@@ -22,7 +23,7 @@  DECLARE_GLOBAL_DATA_PTR;
 /**
  * update the variables "mtdids" and "mtdparts" with boot, tee and user strings
  */
-static void board_get_mtdparts(const char *dev,
+static void board_set_mtdparts(const char *dev,
 			       char *mtdids,
 			       char *mtdparts,
 			       const char *boot,
@@ -65,7 +66,7 @@  void board_mtdparts_default(const char **mtdids, const char **mtdparts)
 	static char parts[3 * MTDPARTS_LEN + 1];
 	static char ids[MTDIDS_LEN + 1];
 	static bool mtd_initialized;
-	bool tee = false;
+	bool tee, nor, nand, spinand;
 
 	if (mtd_initialized) {
 		*mtdids = ids;
@@ -73,6 +74,28 @@  void board_mtdparts_default(const char **mtdids, const char **mtdparts)
 		return;
 	}
 
+	tee = false;
+	nor = false;
+	nand = false;
+	spinand = false;
+
+	switch (get_bootmode() & TAMP_BOOT_DEVICE_MASK) {
+	case BOOT_SERIAL_UART:
+	case BOOT_SERIAL_USB:
+		break;
+	case BOOT_FLASH_NAND:
+		nand = true;
+		break;
+	case BOOT_FLASH_SPINAND:
+		spinand = true;
+		break;
+	case BOOT_FLASH_NOR:
+		nor = true;
+		break;
+	default:
+		break;
+	}
+
 	if (CONFIG_IS_ENABLED(OPTEE) &&
 	    tee_find_device(NULL, NULL, NULL, NULL))
 		tee = true;
@@ -87,29 +110,45 @@  void board_mtdparts_default(const char **mtdids, const char **mtdparts)
 		pr_debug("mtd device = %s\n", dev->name);
 	}
 
-	mtd = get_mtd_device_nm("nand0");
-	if (!IS_ERR_OR_NULL(mtd)) {
-		board_get_mtdparts("nand0", ids, parts,
-				   CONFIG_MTDPARTS_NAND0_BOOT,
-				   tee ? CONFIG_MTDPARTS_NAND0_TEE : NULL,
-				   "-(UBI)");
-		put_mtd_device(mtd);
+	if (nor || nand) {
+		mtd = get_mtd_device_nm("nand0");
+		if (!IS_ERR_OR_NULL(mtd)) {
+			const char *mtd_boot = CONFIG_MTDPARTS_NAND0_BOOT;
+			const char *mtd_tee = CONFIG_MTDPARTS_NAND0_TEE;
+
+			board_set_mtdparts("nand0", ids, parts,
+					   !nor ? mtd_boot : NULL,
+					   !nor && tee ? mtd_tee : NULL,
+					   "-(UBI)");
+			put_mtd_device(mtd);
+		}
 	}
 
-	mtd = get_mtd_device_nm("spi-nand0");
-	if (!IS_ERR_OR_NULL(mtd)) {
-		board_get_mtdparts("spi-nand0", ids, parts,
-				   CONFIG_MTDPARTS_SPINAND0_BOOT,
-				   tee ? CONFIG_MTDPARTS_SPINAND0_TEE : NULL,
-				   "-(UBI)");
-		put_mtd_device(mtd);
+	if (nor || spinand) {
+		mtd = get_mtd_device_nm("spi-nand0");
+		if (!IS_ERR_OR_NULL(mtd)) {
+			const char *mtd_boot = CONFIG_MTDPARTS_SPINAND0_BOOT;
+			const char *mtd_tee = CONFIG_MTDPARTS_SPINAND0_TEE;
+
+			board_set_mtdparts("spi-nand0", ids, parts,
+					   !nor ? mtd_boot : NULL,
+					   !nor && tee ? mtd_tee : NULL,
+					   "-(UBI)");
+			put_mtd_device(mtd);
+		}
 	}
 
-	if (!uclass_get_device(UCLASS_SPI_FLASH, 0, &dev))
-		board_get_mtdparts("nor0", ids, parts,
-				   CONFIG_MTDPARTS_NOR0_BOOT,
-				   tee ? CONFIG_MTDPARTS_NOR0_TEE : NULL,
-				   "-(nor_user)");
+	if (nor) {
+		if (!uclass_get_device(UCLASS_SPI_FLASH, 0, &dev)) {
+			const char *mtd_boot = CONFIG_MTDPARTS_NOR0_BOOT;
+			const char *mtd_tee = CONFIG_MTDPARTS_NOR0_TEE;
+
+			board_set_mtdparts("nor0", ids, parts,
+					   mtd_boot,
+					   tee ? mtd_tee : NULL,
+					   "-(nor_user)");
+		}
+	}
 
 	mtd_initialized = true;
 	*mtdids = ids;