]> Git Repo - u-boot.git/blob - arch/arm/mach-stm32mp/cmd_stm32prog/stm32prog.h
Merge branch 'master' of https://source.denx.de/u-boot/custodians/u-boot-sh
[u-boot.git] / arch / arm / mach-stm32mp / cmd_stm32prog / stm32prog.h
1 /* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
2 /*
3  * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
4  */
5
6 #ifndef _STM32PROG_H_
7 #define _STM32PROG_H_
8
9 #include <linux/printk.h>
10
11 /* - phase defines ------------------------------------------------*/
12 #define PHASE_FLASHLAYOUT       0x00
13 #define PHASE_FIRST_USER        0x10
14 #define PHASE_LAST_USER         0xF0
15 #define PHASE_CMD               0xF1
16 #define PHASE_OTP               0xF2
17 #define PHASE_PMIC              0xF4
18 #define PHASE_END               0xFE
19 #define PHASE_RESET             0xFF
20 #define PHASE_DO_RESET          0x1FF
21
22 #define DEFAULT_ADDRESS         0xFFFFFFFF
23
24 #define CMD_SIZE                512
25 /* SMC is only supported in SPMIN for STM32MP15x */
26 #ifdef CONFIG_STM32MP15X
27 #define OTP_SIZE_SMC            1024
28 #else
29 #define OTP_SIZE_SMC            0
30 #endif
31 /* size of the OTP struct in NVMEM PTA */
32 #define _OTP_SIZE_TA(otp)       (((otp) * 2 + 2) * 4)
33 #if defined(CONFIG_STM32MP13X) || defined(CONFIG_STM32MP15X)
34 /* STM32MP1 with BSEC2 */
35 #define OTP_SIZE_TA             _OTP_SIZE_TA(96)
36 #else
37 /* STM32MP2 with BSEC3 */
38 #define OTP_SIZE_TA             _OTP_SIZE_TA(368)
39 #endif
40 #define PMIC_SIZE               8
41
42 enum stm32prog_target {
43         STM32PROG_NONE,
44         STM32PROG_MMC,
45         STM32PROG_NAND,
46         STM32PROG_NOR,
47         STM32PROG_SPI_NAND,
48         STM32PROG_RAM
49 };
50
51 enum stm32prog_link_t {
52         LINK_SERIAL,
53         LINK_USB,
54         LINK_UNDEFINED,
55 };
56
57 enum stm32prog_header_t {
58         HEADER_NONE,
59         HEADER_STM32IMAGE,
60         HEADER_STM32IMAGE_V2,
61         HEADER_FIP,
62 };
63
64 struct image_header_s {
65         enum stm32prog_header_t type;
66         u32     image_checksum;
67         u32     image_length;
68         u32     length;
69 };
70
71 struct stm32_header_v1 {
72         u32 magic_number;
73         u8 image_signature[64];
74         u32 image_checksum;
75         u32 header_version;
76         u32 image_length;
77         u32 image_entry_point;
78         u32 reserved1;
79         u32 load_address;
80         u32 reserved2;
81         u32 version_number;
82         u32 option_flags;
83         u32 ecdsa_algorithm;
84         u8 ecdsa_public_key[64];
85         u8 padding[83];
86         u8 binary_type;
87 };
88
89 struct stm32_header_v2 {
90         u32 magic_number;
91         u8 image_signature[64];
92         u32 image_checksum;
93         u32 header_version;
94         u32 image_length;
95         u32 image_entry_point;
96         u32 reserved1;
97         u32 load_address;
98         u32 reserved2;
99         u32 version_number;
100         u32 extension_flags;
101         u32 extension_headers_length;
102         u32 binary_type;
103         u8 padding[16];
104         u32 extension_header_type;
105         u32 extension_header_length;
106         u8 extension_padding[376];
107 };
108
109 /*
110  * partition type in flashlayout file
111  * SYSTEM = linux partition, bootable
112  * FILESYSTEM = linux partition
113  * ESP = EFI system partition
114  */
115 enum stm32prog_part_type {
116         PART_BINARY,
117         PART_FIP,
118         PART_FWU_MDATA,
119         PART_ENV,
120         PART_SYSTEM,
121         PART_FILESYSTEM,
122         PART_ESP,
123         RAW_IMAGE,
124 };
125
126 /* device information */
127 struct stm32prog_dev_t {
128         enum stm32prog_target   target;
129         char                    dev_id;
130         u32                     erase_size;
131         struct mmc              *mmc;
132         struct mtd_info         *mtd;
133         /* list of partition for this device / ordered in offset */
134         struct list_head        part_list;
135         bool                    full_update;
136 };
137
138 /* partition information build from FlashLayout and device */
139 struct stm32prog_part_t {
140         /* FlashLayout information */
141         int                     option;
142         int                     id;
143         enum stm32prog_part_type part_type;
144         enum stm32prog_target   target;
145         char                    dev_id;
146
147         /* partition name
148          * (16 char in gpt, + 1 for null terminated string
149          */
150         char                    name[16 + 1];
151         u64                     addr;
152         u64                     size;
153         enum stm32prog_part_type bin_nb;        /* SSBL repeatition */
154
155         /* information on associated device */
156         struct stm32prog_dev_t  *dev;           /* pointer to device */
157         s16                     part_id;        /* partition id in device */
158         int                     alt_id;         /* alt id in usb/dfu */
159
160         struct list_head        list;
161 };
162
163 #define STM32PROG_MAX_DEV 5
164 struct stm32prog_data {
165         /* Layout information */
166         int                     dev_nb;         /* device number*/
167         struct stm32prog_dev_t  dev[STM32PROG_MAX_DEV]; /* array of device */
168         int                     part_nb;        /* nb of partition */
169         struct stm32prog_part_t *part_array;    /* array of partition */
170         bool                    fsbl_nor_detected;
171
172         /* command internal information */
173         unsigned int            phase;
174         u32                     offset;
175         char                    error[255];
176         struct stm32prog_part_t *cur_part;
177         void                    *otp_part;
178         u8                      pmic_part[PMIC_SIZE];
179
180         /* SERIAL information */
181         u32     cursor;
182         u32     packet_number;
183         u8      *buffer; /* size = USART_RAM_BUFFER_SIZE*/
184         int     dfu_seq;
185         u8      read_phase;
186
187         /* bootm information */
188         uintptr_t       uimage;
189         uintptr_t       dtb;
190         uintptr_t       initrd;
191         size_t          initrd_size;
192
193         uintptr_t       script;
194
195         /* OPTEE PTA NVMEM */
196         struct udevice *tee;
197         u32 tee_session;
198 };
199
200 extern struct stm32prog_data *stm32prog_data;
201
202 /* OTP access */
203 int stm32prog_otp_write(struct stm32prog_data *data, u32 offset,
204                         u8 *buffer, long *size);
205 int stm32prog_otp_read(struct stm32prog_data *data, u32 offset,
206                        u8 *buffer, long *size);
207 int stm32prog_otp_start(struct stm32prog_data *data);
208
209 /* PMIC access */
210 int stm32prog_pmic_write(struct stm32prog_data *data, u32 offset,
211                          u8 *buffer, long *size);
212 int stm32prog_pmic_read(struct stm32prog_data *data, u32 offset,
213                         u8 *buffer, long *size);
214 int stm32prog_pmic_start(struct stm32prog_data *data);
215
216 /* generic part*/
217 void stm32prog_header_check(uintptr_t raw_header, struct image_header_s *header);
218 int stm32prog_dfu_init(struct stm32prog_data *data);
219 void stm32prog_next_phase(struct stm32prog_data *data);
220 void stm32prog_do_reset(struct stm32prog_data *data);
221
222 char *stm32prog_get_error(struct stm32prog_data *data);
223
224 #define stm32prog_err(args...) {\
225         if (data->phase != PHASE_RESET) { \
226                 sprintf(data->error, args); \
227                 data->phase = PHASE_RESET; \
228                 log_err("Error: %s\n", data->error); } \
229         }
230
231 /* Main function */
232 int stm32prog_init(struct stm32prog_data *data, uintptr_t addr, ulong size);
233 void stm32prog_clean(struct stm32prog_data *data);
234
235 #ifdef CONFIG_CMD_STM32PROG_SERIAL
236 int stm32prog_serial_init(struct stm32prog_data *data, int link_dev);
237 bool stm32prog_serial_loop(struct stm32prog_data *data);
238 #else
239 static inline int stm32prog_serial_init(struct stm32prog_data *data, int link_dev)
240 {
241         return -ENOSYS;
242 }
243
244 static inline bool stm32prog_serial_loop(struct stm32prog_data *data)
245 {
246         return false;
247 }
248 #endif
249
250 #ifdef CONFIG_CMD_STM32PROG_USB
251 bool stm32prog_usb_loop(struct stm32prog_data *data, int dev);
252 #else
253 static inline bool stm32prog_usb_loop(struct stm32prog_data *data, int dev)
254 {
255         return false;
256 }
257 #endif
258
259 #endif
This page took 0.067006 seconds and 4 git commands to generate.