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
42enum stm32prog_target {
43	STM32PROG_NONE,
44	STM32PROG_MMC,
45	STM32PROG_NAND,
46	STM32PROG_NOR,
47	STM32PROG_SPI_NAND,
48	STM32PROG_RAM
49};
50
51enum stm32prog_link_t {
52	LINK_SERIAL,
53	LINK_USB,
54	LINK_UNDEFINED,
55};
56
57enum stm32prog_header_t {
58	HEADER_NONE,
59	HEADER_STM32IMAGE,
60	HEADER_STM32IMAGE_V2,
61	HEADER_FIP,
62};
63
64struct image_header_s {
65	enum stm32prog_header_t type;
66	u32	image_checksum;
67	u32	image_length;
68	u32	length;
69};
70
71struct 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
89struct 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 */
115enum 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 */
127struct 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 */
139struct 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
164struct 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
200extern struct stm32prog_data *stm32prog_data;
201
202/* OTP access */
203int stm32prog_otp_write(struct stm32prog_data *data, u32 offset,
204			u8 *buffer, long *size);
205int stm32prog_otp_read(struct stm32prog_data *data, u32 offset,
206		       u8 *buffer, long *size);
207int stm32prog_otp_start(struct stm32prog_data *data);
208
209/* PMIC access */
210int stm32prog_pmic_write(struct stm32prog_data *data, u32 offset,
211			 u8 *buffer, long *size);
212int stm32prog_pmic_read(struct stm32prog_data *data, u32 offset,
213			u8 *buffer, long *size);
214int stm32prog_pmic_start(struct stm32prog_data *data);
215
216/* generic part*/
217void stm32prog_header_check(uintptr_t raw_header, struct image_header_s *header);
218int stm32prog_dfu_init(struct stm32prog_data *data);
219void stm32prog_next_phase(struct stm32prog_data *data);
220void stm32prog_do_reset(struct stm32prog_data *data);
221
222char *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 */
232int stm32prog_init(struct stm32prog_data *data, uintptr_t addr, ulong size);
233void stm32prog_clean(struct stm32prog_data *data);
234
235#ifdef CONFIG_CMD_STM32PROG_SERIAL
236int stm32prog_serial_init(struct stm32prog_data *data, int link_dev);
237bool stm32prog_serial_loop(struct stm32prog_data *data);
238#else
239static inline int stm32prog_serial_init(struct stm32prog_data *data, int link_dev)
240{
241	return -ENOSYS;
242}
243
244static inline bool stm32prog_serial_loop(struct stm32prog_data *data)
245{
246	return false;
247}
248#endif
249
250#ifdef CONFIG_CMD_STM32PROG_USB
251bool stm32prog_usb_loop(struct stm32prog_data *data, int dev);
252#else
253static inline bool stm32prog_usb_loop(struct stm32prog_data *data, int dev)
254{
255	return false;
256}
257#endif
258
259#endif
260