stm32mp: stm32prog: adapt the MTD partitions
authorPatrick Delaunay <patrick.delaunay@st.com>
Wed, 18 Mar 2020 08:24:55 +0000 (09:24 +0100)
committerPatrick Delaunay <patrick.delaunay@st.com>
Thu, 14 May 2020 07:02:12 +0000 (09:02 +0200)
Dynamically adapt the MTD partitions in NOR/NAND/SPI-NAND when stm32prog
command detects in the parsed flash layout files:
- a fsbl partition in NOR.
- a tee partition in NOR/NAND/SPI-NAND

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
Reviewed-by: Patrice Chotard <patrice.chotard@st.com>
arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
arch/arm/mach-stm32mp/include/mach/stm32prog.h
board/st/common/stm32mp_mtdparts.c

index 3e8b426444df484fa85c55eaf9edbb23ad651717..581f97e0b50b3992d97d5d550218ac667c280ed5 100644 (file)
@@ -6,6 +6,7 @@
 #include <common.h>
 #include <command.h>
 #include <dfu.h>
+#include <asm/arch/stm32prog.h>
 #include "stm32prog.h"
 
 struct stm32prog_data *stm32prog_data;
@@ -94,3 +95,19 @@ U_BOOT_CMD(stm32prog, 5, 0, do_stm32prog,
           "<addr> = address of flashlayout\n"
           "<size> = size of flashlayout\n"
 );
+
+bool stm32prog_get_tee_partitions(void)
+{
+       if (stm32prog_data)
+               return stm32prog_data->tee_detected;
+
+       return false;
+}
+
+bool stm32prog_get_fsbl_nor(void)
+{
+       if (stm32prog_data)
+               return stm32prog_data->fsbl_nor_detected;
+
+       return false;
+}
index 93ee6a55a1b1e63e080a720b48792e9c593ac97b..0140fd479dd3a64f6ddc79c6a8662e0fb2866abe 100644 (file)
@@ -762,6 +762,8 @@ static int treat_partition_list(struct stm32prog_data *data)
                INIT_LIST_HEAD(&data->dev[j].part_list);
        }
 
+       data->tee_detected = false;
+       data->fsbl_nor_detected = false;
        for (i = 0; i < data->part_nb; i++) {
                part = &data->part_array[i];
                part->alt_id = -1;
@@ -806,6 +808,21 @@ static int treat_partition_list(struct stm32prog_data *data)
                        stm32prog_err("Layout: too many device");
                        return -EINVAL;
                }
+               switch (part->target)  {
+               case STM32PROG_NOR:
+                       if (!data->fsbl_nor_detected &&
+                           !strncmp(part->name, "fsbl", 4))
+                               data->fsbl_nor_detected = true;
+                       /* fallthrough */
+               case STM32PROG_NAND:
+               case STM32PROG_SPI_NAND:
+                       if (!data->tee_detected &&
+                           !strncmp(part->name, "tee", 3))
+                               data->tee_detected = true;
+                       break;
+               default:
+                       break;
+               }
                part->dev = &data->dev[j];
                if (!IS_SELECT(part))
                        part->dev->full_update = false;
index 8e635da3a4979a5045c1aa393347f54bdf0099ca..7f06627ebc8068fdb5d4970a2fcbc478b7732c91 100644 (file)
@@ -107,6 +107,8 @@ struct stm32prog_data {
        struct stm32prog_dev_t  dev[STM32PROG_MAX_DEV]; /* array of device */
        int                     part_nb;        /* nb of partition */
        struct stm32prog_part_t *part_array;    /* array of partition */
+       bool                    tee_detected;
+       bool                    fsbl_nor_detected;
 
        /* command internal information */
        unsigned int            phase;
index c10bff09c84a193f9bada0bb0a4a3b09144066c3..c080b9cc42ad4ea4fed821a49516cf685ab703d6 100644 (file)
@@ -10,3 +10,7 @@ int stm32prog_write_medium_virt(struct dfu_entity *dfu, u64 offset,
 int stm32prog_read_medium_virt(struct dfu_entity *dfu, u64 offset,
                               void *buf, long *len);
 int stm32prog_get_medium_size_virt(struct dfu_entity *dfu, u64 *size);
+
+bool stm32prog_get_tee_partitions(void);
+
+bool stm32prog_get_fsbl_nor(void);
index 50285110770de3bedf5e576767a2c4c8c38acebc..9f5897f8c860640e72b24a9a28ddaa849e6e9522 100644 (file)
@@ -4,12 +4,14 @@
  */
 
 #include <common.h>
+#include <dfu.h>
 #include <dm.h>
 #include <env.h>
 #include <env_internal.h>
 #include <mtd.h>
 #include <mtd_node.h>
 #include <tee.h>
+#include <asm/arch/stm32prog.h>
 #include <asm/arch/sys_proto.h>
 
 #define MTDPARTS_LEN           256
@@ -66,7 +68,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, nor, nand, spinand;
+       bool tee, nor, nand, spinand, serial;
 
        if (mtd_initialized) {
                *mtdids = ids;
@@ -78,10 +80,18 @@ void board_mtdparts_default(const char **mtdids, const char **mtdparts)
        nor = false;
        nand = false;
        spinand = false;
+       serial = false;
 
        switch (get_bootmode() & TAMP_BOOT_DEVICE_MASK) {
        case BOOT_SERIAL_UART:
        case BOOT_SERIAL_USB:
+               serial = true;
+               if (CONFIG_IS_ENABLED(CMD_STM32PROG)) {
+                       tee = stm32prog_get_tee_partitions();
+                       nor = stm32prog_get_fsbl_nor();
+               }
+               nand = true;
+               spinand = true;
                break;
        case BOOT_FLASH_NAND:
                nand = true;
@@ -96,7 +106,7 @@ void board_mtdparts_default(const char **mtdids, const char **mtdparts)
                break;
        }
 
-       if (CONFIG_IS_ENABLED(OPTEE) &&
+       if (!serial && CONFIG_IS_ENABLED(OPTEE) &&
            tee_find_device(NULL, NULL, NULL, NULL))
                tee = true;