1880b163d7f322bd8311481230e69505e8e7ae8d
[oweals/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 /* - 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
17
18 #define DEFAULT_ADDRESS         0xFFFFFFFF
19
20 enum stm32prog_target {
21         STM32PROG_NONE,
22         STM32PROG_MMC,
23         STM32PROG_NAND,
24         STM32PROG_NOR,
25         STM32PROG_SPI_NAND
26 };
27
28 enum stm32prog_link_t {
29         LINK_USB,
30         LINK_UNDEFINED,
31 };
32
33 struct image_header_s {
34         bool    present;
35         u32     image_checksum;
36         u32     image_length;
37 };
38
39 struct raw_header_s {
40         u32 magic_number;
41         u32 image_signature[64 / 4];
42         u32 image_checksum;
43         u32 header_version;
44         u32 image_length;
45         u32 image_entry_point;
46         u32 reserved1;
47         u32 load_address;
48         u32 reserved2;
49         u32 version_number;
50         u32 option_flags;
51         u32 ecdsa_algorithm;
52         u32 ecdsa_public_key[64 / 4];
53         u32 padding[83 / 4];
54         u32 binary_type;
55 };
56
57 #define BL_HEADER_SIZE  sizeof(struct raw_header_s)
58
59 /* partition type in flashlayout file */
60 enum stm32prog_part_type {
61         PART_BINARY,
62         PART_SYSTEM,
63         PART_FILESYSTEM,
64         RAW_IMAGE
65 };
66
67 /* device information */
68 struct stm32prog_dev_t {
69         enum stm32prog_target   target;
70         char                    dev_id;
71         u32                     erase_size;
72         struct mmc              *mmc;
73         struct mtd_info         *mtd;
74         /* list of partition for this device / ordered in offset */
75         struct list_head        part_list;
76         bool                    full_update;
77 };
78
79 /* partition information build from FlashLayout and device */
80 struct stm32prog_part_t {
81         /* FlashLayout information */
82         int                     option;
83         int                     id;
84         enum stm32prog_part_type part_type;
85         enum stm32prog_target   target;
86         char                    dev_id;
87
88         /* partition name
89          * (16 char in gpt, + 1 for null terminated string
90          */
91         char                    name[16 + 1];
92         u64                     addr;
93         u64                     size;
94         enum stm32prog_part_type bin_nb;        /* SSBL repeatition */
95
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 */
100
101         struct list_head        list;
102 };
103
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 */
111         bool                    tee_detected;
112         bool                    fsbl_nor_detected;
113
114         /* command internal information */
115         unsigned int            phase;
116         u32                     offset;
117         char                    error[255];
118         struct stm32prog_part_t *cur_part;
119
120         /* STM32 header information */
121         struct raw_header_s     *header_data;
122         struct image_header_s   header;
123 };
124
125 extern struct stm32prog_data *stm32prog_data;
126
127 /* generic part*/
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);
133
134 char *stm32prog_get_error(struct stm32prog_data *data);
135
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); } \
141         }
142
143 /* Main function */
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);
147
148 #endif