[PATCH 10/18] stm32mp: stm32prog: adapt the MTD partitions

Patrice CHOTARD patrice.chotard at st.com
Tue Apr 14 15:07:15 CEST 2020


Hi

On 3/18/20 9:24 AM, Patrick Delaunay wrote:
> 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 at st.com>
> ---
>
>  .../mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c  | 17 +++++++++++++++++
>  arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c | 17 +++++++++++++++++
>  arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h |  2 ++
>  arch/arm/mach-stm32mp/include/mach/stm32prog.h  |  4 ++++
>  board/st/common/stm32mp_mtdparts.c              | 14 ++++++++++++--
>  5 files changed, 52 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> index 3e8b426444..581f97e0b5 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/cmd_stm32prog.c
> @@ -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;
> +}
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> index 93ee6a55a1..0140fd479d 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.c
> @@ -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;
> diff --git a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> index 8e635da3a4..7f06627ebc 100644
> --- a/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> +++ b/arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
> @@ -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;
> diff --git a/arch/arm/mach-stm32mp/include/mach/stm32prog.h b/arch/arm/mach-stm32mp/include/mach/stm32prog.h
> index c10bff09c8..c080b9cc42 100644
> --- a/arch/arm/mach-stm32mp/include/mach/stm32prog.h
> +++ b/arch/arm/mach-stm32mp/include/mach/stm32prog.h
> @@ -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);
> diff --git a/board/st/common/stm32mp_mtdparts.c b/board/st/common/stm32mp_mtdparts.c
> index 5028511077..9f5897f8c8 100644
> --- a/board/st/common/stm32mp_mtdparts.c
> +++ b/board/st/common/stm32mp_mtdparts.c
> @@ -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;
>  

Reviewed-by: Patrice Chotard <patrice.chotard at st.com>

Thanks

Patrice


More information about the U-Boot mailing list