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