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