1 /* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
3 * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
9 /* - phase defines ------------------------------------------------*/
10 #define PHASE_FLASHLAYOUT 0x00
11 #define PHASE_FIRST_USER 0x10
12 #define PHASE_LAST_USER 0xF0
13 #define PHASE_CMD 0xF1
14 #define PHASE_END 0xFE
15 #define PHASE_RESET 0xFF
16 #define PHASE_DO_RESET 0x1FF
18 #define DEFAULT_ADDRESS 0xFFFFFFFF
20 enum stm32prog_target {
28 enum stm32prog_link_t {
33 struct image_header_s {
41 u32 image_signature[64 / 4];
45 u32 image_entry_point;
52 u32 ecdsa_public_key[64 / 4];
57 #define BL_HEADER_SIZE sizeof(struct raw_header_s)
59 /* partition type in flashlayout file */
60 enum stm32prog_part_type {
67 /* device information */
68 struct stm32prog_dev_t {
69 enum stm32prog_target target;
74 /* list of partition for this device / ordered in offset */
75 struct list_head part_list;
79 /* partition information build from FlashLayout and device */
80 struct stm32prog_part_t {
81 /* FlashLayout information */
84 enum stm32prog_part_type part_type;
85 enum stm32prog_target target;
89 * (16 char in gpt, + 1 for null terminated string
94 enum stm32prog_part_type bin_nb; /* SSBL repeatition */
96 /* information on associated device */
97 struct stm32prog_dev_t *dev; /* pointer to device */
98 s16 part_id; /* partition id in device */
99 int alt_id; /* alt id in usb/dfu */
101 struct list_head list;
104 #define STM32PROG_MAX_DEV 5
105 struct stm32prog_data {
106 /* Layout information */
107 int dev_nb; /* device number*/
108 struct stm32prog_dev_t dev[STM32PROG_MAX_DEV]; /* array of device */
109 int part_nb; /* nb of partition */
110 struct stm32prog_part_t *part_array; /* array of partition */
112 bool fsbl_nor_detected;
114 /* command internal information */
118 struct stm32prog_part_t *cur_part;
120 /* STM32 header information */
121 struct raw_header_s *header_data;
122 struct image_header_s header;
125 extern struct stm32prog_data *stm32prog_data;
128 u8 stm32prog_header_check(struct raw_header_s *raw_header,
129 struct image_header_s *header);
130 int stm32prog_dfu_init(struct stm32prog_data *data);
131 void stm32prog_next_phase(struct stm32prog_data *data);
132 void stm32prog_do_reset(struct stm32prog_data *data);
134 char *stm32prog_get_error(struct stm32prog_data *data);
136 #define stm32prog_err(args...) {\
137 if (data->phase != PHASE_RESET) { \
138 sprintf(data->error, args); \
139 data->phase = PHASE_RESET; \
140 pr_err("Error: %s\n", data->error); } \
144 int stm32prog_init(struct stm32prog_data *data, ulong addr, ulong size);
145 bool stm32prog_usb_loop(struct stm32prog_data *data, int dev);
146 void stm32prog_clean(struct stm32prog_data *data);