xref: /openbmc/linux/drivers/input/rmi4/rmi_f34.h (revision f79e4d5f)
1 /*
2  * Copyright (c) 2007-2016, Synaptics Incorporated
3  * Copyright (C) 2016 Zodiac Inflight Innovations
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 as published by
7  * the Free Software Foundation.
8  */
9 
10 #ifndef _RMI_F34_H
11 #define _RMI_F34_H
12 
13 /* F34 image file offsets. */
14 #define F34_FW_IMAGE_OFFSET	0x100
15 
16 /* F34 register offsets. */
17 #define F34_BLOCK_DATA_OFFSET	2
18 
19 /* F34 commands */
20 #define F34_WRITE_FW_BLOCK	0x2
21 #define F34_ERASE_ALL		0x3
22 #define F34_READ_CONFIG_BLOCK	0x5
23 #define F34_WRITE_CONFIG_BLOCK	0x6
24 #define F34_ERASE_CONFIG	0x7
25 #define F34_ENABLE_FLASH_PROG	0xf
26 
27 #define F34_STATUS_IN_PROGRESS	0xff
28 #define F34_STATUS_IDLE		0x80
29 
30 #define F34_IDLE_WAIT_MS	500
31 #define F34_ENABLE_WAIT_MS	300
32 #define F34_ERASE_WAIT_MS	5000
33 #define F34_WRITE_WAIT_MS	3000
34 
35 #define F34_BOOTLOADER_ID_LEN	2
36 
37 /* F34 V7 defines */
38 #define V7_FLASH_STATUS_OFFSET		0
39 #define V7_PARTITION_ID_OFFSET		1
40 #define V7_BLOCK_NUMBER_OFFSET		2
41 #define V7_TRANSFER_LENGTH_OFFSET	3
42 #define V7_COMMAND_OFFSET		4
43 #define V7_PAYLOAD_OFFSET		5
44 #define V7_BOOTLOADER_ID_OFFSET		1
45 
46 #define IMAGE_HEADER_VERSION_10		0x10
47 
48 #define CONFIG_ID_SIZE			32
49 #define PRODUCT_ID_SIZE			10
50 
51 
52 #define HAS_BSR				BIT(5)
53 #define HAS_CONFIG_ID			BIT(3)
54 #define HAS_GUEST_CODE			BIT(6)
55 #define HAS_DISP_CFG			BIT(5)
56 
57 /* F34 V7 commands */
58 #define CMD_V7_IDLE			0
59 #define CMD_V7_ENTER_BL			1
60 #define CMD_V7_READ			2
61 #define CMD_V7_WRITE			3
62 #define CMD_V7_ERASE			4
63 #define CMD_V7_ERASE_AP			5
64 #define CMD_V7_SENSOR_ID		6
65 
66 #define v7_CMD_IDLE			0
67 #define v7_CMD_WRITE_FW			1
68 #define v7_CMD_WRITE_CONFIG		2
69 #define v7_CMD_WRITE_LOCKDOWN		3
70 #define v7_CMD_WRITE_GUEST_CODE		4
71 #define v7_CMD_READ_CONFIG		5
72 #define v7_CMD_ERASE_ALL		6
73 #define v7_CMD_ERASE_UI_FIRMWARE	7
74 #define v7_CMD_ERASE_UI_CONFIG		8
75 #define v7_CMD_ERASE_BL_CONFIG		9
76 #define v7_CMD_ERASE_DISP_CONFIG	10
77 #define v7_CMD_ERASE_FLASH_CONFIG	11
78 #define v7_CMD_ERASE_GUEST_CODE		12
79 #define v7_CMD_ENABLE_FLASH_PROG	13
80 
81 #define v7_UI_CONFIG_AREA		0
82 #define v7_PM_CONFIG_AREA		1
83 #define v7_BL_CONFIG_AREA		2
84 #define v7_DP_CONFIG_AREA		3
85 #define v7_FLASH_CONFIG_AREA		4
86 
87 /* F34 V7 partition IDs */
88 #define BOOTLOADER_PARTITION		1
89 #define DEVICE_CONFIG_PARTITION		2
90 #define FLASH_CONFIG_PARTITION		3
91 #define MANUFACTURING_BLOCK_PARTITION	4
92 #define GUEST_SERIALIZATION_PARTITION	5
93 #define GLOBAL_PARAMETERS_PARTITION	6
94 #define CORE_CODE_PARTITION		7
95 #define CORE_CONFIG_PARTITION		8
96 #define GUEST_CODE_PARTITION		9
97 #define DISPLAY_CONFIG_PARTITION	10
98 
99 /* F34 V7 container IDs */
100 #define TOP_LEVEL_CONTAINER			0
101 #define UI_CONTAINER				1
102 #define UI_CONFIG_CONTAINER			2
103 #define BL_CONTAINER				3
104 #define BL_IMAGE_CONTAINER			4
105 #define BL_CONFIG_CONTAINER			5
106 #define BL_LOCKDOWN_INFO_CONTAINER		6
107 #define PERMANENT_CONFIG_CONTAINER		7
108 #define GUEST_CODE_CONTAINER			8
109 #define BL_PROTOCOL_DESCRIPTOR_CONTAINER	9
110 #define UI_PROTOCOL_DESCRIPTOR_CONTAINER	10
111 #define RMI_SELF_DISCOVERY_CONTAINER		11
112 #define RMI_PAGE_CONTENT_CONTAINER		12
113 #define GENERAL_INFORMATION_CONTAINER		13
114 #define DEVICE_CONFIG_CONTAINER			14
115 #define FLASH_CONFIG_CONTAINER			15
116 #define GUEST_SERIALIZATION_CONTAINER		16
117 #define GLOBAL_PARAMETERS_CONTAINER		17
118 #define CORE_CODE_CONTAINER			18
119 #define CORE_CONFIG_CONTAINER			19
120 #define DISPLAY_CONFIG_CONTAINER		20
121 
122 struct f34v7_query_1_7 {
123 	u8 bl_minor_revision;			/* query 1 */
124 	u8 bl_major_revision;
125 	__le32 bl_fw_id;			/* query 2 */
126 	u8 minimum_write_size;			/* query 3 */
127 	__le16 block_size;
128 	__le16 flash_page_size;
129 	__le16 adjustable_partition_area_size;	/* query 4 */
130 	__le16 flash_config_length;		/* query 5 */
131 	__le16 payload_length;			/* query 6 */
132 	u8 partition_support[4];		/* query 7 */
133 } __packed;
134 
135 struct f34v7_data_1_5 {
136 	u8 partition_id;
137 	__le16 block_offset;
138 	__le16 transfer_length;
139 	u8 command;
140 	u8 payload[2];
141 } __packed;
142 
143 struct block_data {
144 	const void *data;
145 	int size;
146 };
147 
148 struct partition_table {
149 	u8 partition_id;
150 	u8 byte_1_reserved;
151 	__le16 partition_length;
152 	__le16 start_physical_address;
153 	__le16 partition_properties;
154 } __packed;
155 
156 struct physical_address {
157 	u16 ui_firmware;
158 	u16 ui_config;
159 	u16 dp_config;
160 	u16 guest_code;
161 };
162 
163 struct container_descriptor {
164 	__le32 content_checksum;
165 	__le16 container_id;
166 	u8 minor_version;
167 	u8 major_version;
168 	u8 reserved_08;
169 	u8 reserved_09;
170 	u8 reserved_0a;
171 	u8 reserved_0b;
172 	u8 container_option_flags[4];
173 	__le32 content_options_length;
174 	__le32 content_options_address;
175 	__le32 content_length;
176 	__le32 content_address;
177 } __packed;
178 
179 struct block_count {
180 	u16 ui_firmware;
181 	u16 ui_config;
182 	u16 dp_config;
183 	u16 fl_config;
184 	u16 pm_config;
185 	u16 bl_config;
186 	u16 lockdown;
187 	u16 guest_code;
188 };
189 
190 struct image_header_10 {
191 	__le32 checksum;
192 	u8 reserved_04;
193 	u8 reserved_05;
194 	u8 minor_header_version;
195 	u8 major_header_version;
196 	u8 reserved_08;
197 	u8 reserved_09;
198 	u8 reserved_0a;
199 	u8 reserved_0b;
200 	__le32 top_level_container_start_addr;
201 };
202 
203 struct image_metadata {
204 	bool contains_firmware_id;
205 	bool contains_bootloader;
206 	bool contains_display_cfg;
207 	bool contains_guest_code;
208 	bool contains_flash_config;
209 	unsigned int firmware_id;
210 	unsigned int checksum;
211 	unsigned int bootloader_size;
212 	unsigned int display_cfg_offset;
213 	unsigned char bl_version;
214 	unsigned char product_id[PRODUCT_ID_SIZE + 1];
215 	unsigned char cstmr_product_id[PRODUCT_ID_SIZE + 1];
216 	struct block_data bootloader;
217 	struct block_data ui_firmware;
218 	struct block_data ui_config;
219 	struct block_data dp_config;
220 	struct block_data fl_config;
221 	struct block_data bl_config;
222 	struct block_data guest_code;
223 	struct block_data lockdown;
224 	struct block_count blkcount;
225 	struct physical_address phyaddr;
226 };
227 
228 struct register_offset {
229 	u8 properties;
230 	u8 properties_2;
231 	u8 block_size;
232 	u8 block_count;
233 	u8 gc_block_count;
234 	u8 flash_status;
235 	u8 partition_id;
236 	u8 block_number;
237 	u8 transfer_length;
238 	u8 flash_cmd;
239 	u8 payload;
240 };
241 
242 struct rmi_f34_firmware {
243 	__le32 checksum;
244 	u8 pad1[3];
245 	u8 bootloader_version;
246 	__le32 image_size;
247 	__le32 config_size;
248 	u8 product_id[10];
249 	u8 product_info[2];
250 	u8 pad2[228];
251 	u8 data[];
252 };
253 
254 struct f34v5_data {
255 	u16 block_size;
256 	u16 fw_blocks;
257 	u16 config_blocks;
258 	u16 ctrl_address;
259 	u8 status;
260 
261 	struct completion cmd_done;
262 	struct mutex flash_mutex;
263 };
264 
265 struct f34v7_data {
266 	bool has_display_cfg;
267 	bool has_guest_code;
268 	bool force_update;
269 	bool in_bl_mode;
270 	u8 *read_config_buf;
271 	size_t read_config_buf_size;
272 	u8 command;
273 	u8 flash_status;
274 	u16 block_size;
275 	u16 config_block_count;
276 	u16 config_size;
277 	u16 config_area;
278 	u16 flash_config_length;
279 	u16 payload_length;
280 	u8 partitions;
281 	u16 partition_table_bytes;
282 	bool new_partition_table;
283 
284 	struct register_offset off;
285 	struct block_count blkcount;
286 	struct physical_address phyaddr;
287 	struct image_metadata img;
288 
289 	const void *config_data;
290 	const void *image;
291 	struct completion cmd_done;
292 };
293 
294 struct f34_data {
295 	struct rmi_function *fn;
296 
297 	u8 bl_version;
298 	unsigned char bootloader_id[5];
299 	unsigned char configuration_id[CONFIG_ID_SIZE*2 + 1];
300 
301 	int update_status;
302 	int update_progress;
303 	int update_size;
304 
305 	union {
306 		struct f34v5_data v5;
307 		struct f34v7_data v7;
308 	};
309 };
310 
311 int rmi_f34v7_start_reflash(struct f34_data *f34, const struct firmware *fw);
312 int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw);
313 int rmi_f34v7_probe(struct f34_data *f34);
314 
315 #endif /* _RMI_F34_H */
316