aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wwan/iosm/iosm_ipc_flash.h
blob: aee848927228ca91685d376b141d73ae1dbd1803 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
/* SPDX-License-Identifier: GPL-2.0-only
 *
 * Copyright (C) 2020-2021 Intel Corporation.
 */

#ifndef _IOSM_IPC_FLASH_H
#define _IOSM_IPC_FLASH_H

/* Buffer size used to read the fls image */
#define IOSM_FLS_BUF_SIZE 0x00100000
/* Full erase start address */
#define IOSM_ERASE_START_ADDR 0x00000000
/* Erase length for NAND flash */
#define IOSM_ERASE_LEN 0xFFFFFFFF
/* EBL response Header size */
#define IOSM_EBL_HEAD_SIZE  8
/* EBL payload size */
#define IOSM_EBL_W_PAYL_SIZE  2048
/* Total EBL pack size */
#define IOSM_EBL_W_PACK_SIZE  (IOSM_EBL_HEAD_SIZE + IOSM_EBL_W_PAYL_SIZE)
/* EBL payload size */
#define IOSM_EBL_DW_PAYL_SIZE  16384
/* Total EBL pack size */
#define IOSM_EBL_DW_PACK_SIZE  (IOSM_EBL_HEAD_SIZE + IOSM_EBL_DW_PAYL_SIZE)
/* EBL name size */
#define IOSM_EBL_NAME  32
/* Maximum supported error types */
#define IOSM_MAX_ERRORS 8
/* Read size for RPSI/EBL response */
#define IOSM_READ_SIZE 2
/* Link establishment response ack size */
#define IOSM_LER_ACK_SIZE 2
/* PSI ACK len */
#define IOSM_PSI_ACK 8
/* SWID capability for packed swid type */
#define IOSM_EXT_CAP_SWID_OOS_PACK     0x02
/* EBL error response buffer */
#define IOSM_EBL_RSP_BUFF 0x0041
/* SWID string length */
#define IOSM_SWID_STR 64
/* Load EBL command size */
#define IOSM_RPSI_LOAD_SIZE 0
/* EBL payload checksum */
#define IOSM_EBL_CKSM 0x0000FFFF
/* SWID msg len and argument */
#define IOSM_MSG_LEN_ARG 0
/* Data to be sent to modem */
#define IOSM_MDM_SEND_DATA 0x0000
/* Data received from modem as part of erase check */
#define IOSM_MDM_ERASE_RSP 0x0001
/* Bit shift to calculate Checksum */
#define IOSM_EBL_PAYL_SHIFT 16
/* Flag To be set */
#define IOSM_SET_FLAG 1
/* Set flash erase check timeout to 100 msec */
#define IOSM_FLASH_ERASE_CHECK_TIMEOUT 100
/* Set flash erase check interval to 20 msec */
#define IOSM_FLASH_ERASE_CHECK_INTERVAL 20
/* Link establishment response ack size */
#define IOSM_LER_RSP_SIZE 60

/**
 * enum iosm_flash_package_type -	Enum for the flashing operations
 * @FLASH_SET_PROT_CONF:	Write EBL capabilities
 * @FLASH_SEC_START:		Start writing the secpack
 * @FLASH_SEC_END:		Validate secpack end
 * @FLASH_SET_ADDRESS:		Set the address for flashing
 * @FLASH_ERASE_START:		Start erase before flashing
 * @FLASH_ERASE_CHECK:		Validate the erase functionality
 * @FLASH_OOS_CONTROL:		Retrieve data based on oos actions
 * @FLASH_OOS_DATA_READ:	Read data from EBL
 * @FLASH_WRITE_IMAGE_RAW:	Write the raw image to flash
 */
enum iosm_flash_package_type {
	FLASH_SET_PROT_CONF = 0x0086,
	FLASH_SEC_START = 0x0204,
	FLASH_SEC_END,
	FLASH_SET_ADDRESS = 0x0802,
	FLASH_ERASE_START = 0x0805,
	FLASH_ERASE_CHECK,
	FLASH_OOS_CONTROL = 0x080C,
	FLASH_OOS_DATA_READ = 0x080E,
	FLASH_WRITE_IMAGE_RAW,
};

/**
 * enum iosm_out_of_session_action -	Actions possible over the
 *					OutOfSession command interface
 * @FLASH_OOSC_ACTION_READ:		Read data according to its type
 * @FLASH_OOSC_ACTION_ERASE:		Erase data according to its type
 */
enum iosm_out_of_session_action {
	FLASH_OOSC_ACTION_READ = 2,
	FLASH_OOSC_ACTION_ERASE = 3,
};

/**
 * enum iosm_out_of_session_type -	Data types that can be handled over the
 *					Out Of Session command Interface
 * @FLASH_OOSC_TYPE_ALL_FLASH:		The whole flash area
 * @FLASH_OOSC_TYPE_SWID_TABLE:		Read the swid table from the target
 */
enum iosm_out_of_session_type {
	FLASH_OOSC_TYPE_ALL_FLASH = 8,
	FLASH_OOSC_TYPE_SWID_TABLE = 16,
};

/**
 * enum iosm_ebl_caps -	EBL capability settings
 * @IOSM_CAP_NOT_ENHANCED:	If capability not supported
 * @IOSM_CAP_USE_EXT_CAP:	To be set if extended capability is set
 * @IOSM_EXT_CAP_ERASE_ALL:	Set Erase all capability
 * @IOSM_EXT_CAP_COMMIT_ALL:	Set the commit all capability
 */
enum iosm_ebl_caps {
	IOSM_CAP_NOT_ENHANCED = 0x00,
	IOSM_CAP_USE_EXT_CAP = 0x01,
	IOSM_EXT_CAP_ERASE_ALL = 0x08,
	IOSM_EXT_CAP_COMMIT_ALL = 0x20,
};

/**
 * enum iosm_ebl_rsp -  EBL response field
 * @EBL_CAPS_FLAG:	EBL capability flag
 * @EBL_SKIP_ERASE:	EBL skip erase flag
 * @EBL_SKIP_CRC:	EBL skip wr_pack crc
 * @EBL_EXT_CAPS_HANDLED:	EBL extended capability handled flag
 * @EBL_OOS_CONFIG:	EBL oos configuration
 * @EBL_RSP_SW_INFO_VER: EBL SW info version
 */
enum iosm_ebl_rsp {
	EBL_CAPS_FLAG = 50,
	EBL_SKIP_ERASE = 54,
	EBL_SKIP_CRC = 55,
	EBL_EXT_CAPS_HANDLED = 57,
	EBL_OOS_CONFIG = 64,
	EBL_RSP_SW_INFO_VER = 70,
};

/**
 * enum iosm_mdm_send_recv_data - Data to send to modem
 * @IOSM_MDM_SEND_2:	Send 2 bytes of payload
 * @IOSM_MDM_SEND_4:	Send 4 bytes of payload
 * @IOSM_MDM_SEND_8:	Send 8 bytes of payload
 * @IOSM_MDM_SEND_16:	Send 16 bytes of payload
 */
enum iosm_mdm_send_recv_data {
	IOSM_MDM_SEND_2 = 2,
	IOSM_MDM_SEND_4 = 4,
	IOSM_MDM_SEND_8 = 8,
	IOSM_MDM_SEND_16 = 16,
};

/**
 * struct iosm_ebl_one_error -	Structure containing error details
 * @error_class:		Error type- standard, security and text error
 * @error_code:			Specific error from error type
 */
struct iosm_ebl_one_error {
	u16 error_class;
	u16 error_code;
};

/**
 * struct iosm_ebl_error- Structure with max error type supported
 * @error:		Array of one_error structure with max errors
 */
struct iosm_ebl_error {
	struct iosm_ebl_one_error error[IOSM_MAX_ERRORS];
};

/**
 * struct iosm_swid_table - SWID table data for modem
 * @number_of_data_sets:	Number of swid types
 * @sw_id_type:			SWID type - SWID
 * @sw_id_val:			SWID value
 * @rf_engine_id_type:		RF engine ID type - RF_ENGINE_ID
 * @rf_engine_id_val:		RF engine ID value
 */
struct iosm_swid_table {
	u32 number_of_data_sets;
	char sw_id_type[IOSM_EBL_NAME];
	u32 sw_id_val;
	char rf_engine_id_type[IOSM_EBL_NAME];
	u32 rf_engine_id_val;
};

/**
 * struct iosm_flash_msg_control - Data sent to modem
 * @action:	Action to be performed
 * @type:	Type of action
 * @length:	Length of the action
 * @arguments:	Argument value sent to modem
 */
struct iosm_flash_msg_control {
	__le32 action;
	__le32 type;
	__le32 length;
	__le32 arguments;
};

/**
 * struct iosm_flash_data -  Header Data to be sent to modem
 * @checksum:	Checksum value calculated for the payload data
 * @pack_id:	Flash Action type
 * @msg_length:	Payload length
 */
struct iosm_flash_data {
	__le16  checksum;
	__le16  pack_id;
	__le32  msg_length;
};

/**
 * ipc_flash_boot_psi - Inject PSI image
 * @ipc_devlink:	Pointer to devlink structure
 * @fw:			FW image
 *
 * Returns:             0 on success and failure value on error
 */
int ipc_flash_boot_psi(struct iosm_devlink *ipc_devlink,
		       const struct firmware *fw);

/**
 * ipc_flash_boot_ebl  - Inject EBL image
 * @ipc_devlink:        Pointer to devlink structure
 * @fw:			FW image
 *
 * Returns:             0 on success and failure value on error
 */
int ipc_flash_boot_ebl(struct iosm_devlink *ipc_devlink,
		       const struct firmware *fw);

/**
 * ipc_flash_boot_set_capabilities  - Set modem bool capabilities in flash
 * @ipc_devlink:        Pointer to devlink structure
 * @mdm_rsp:		Pointer to modem response buffer
 *
 * Returns:             0 on success and failure value on error
 */
int ipc_flash_boot_set_capabilities(struct iosm_devlink *ipc_devlink,
				    u8 *mdm_rsp);

/**
 * ipc_flash_link_establish - Flash link establishment
 * @ipc_imem:		Pointer to struct iosm_imem
 *
 * Returns:	0 on success and failure value on error
 */
int ipc_flash_link_establish(struct iosm_imem *ipc_imem);

/**
 * ipc_flash_read_swid - Get swid during flash phase
 * @ipc_devlink:        Pointer to devlink structure
 * @mdm_rsp:		Pointer to modem response buffer
 *
 * Returns:             0 on success and failure value on error
 */
int ipc_flash_read_swid(struct iosm_devlink *ipc_devlink, u8 *mdm_rsp);

/**
 * ipc_flash_send_fls  - Inject Modem subsystem fls file to device
 * @ipc_devlink:        Pointer to devlink structure
 * @fw:			FW image
 * @mdm_rsp:		Pointer to modem response buffer
 *
 * Returns:             0 on success and failure value on error
 */
int ipc_flash_send_fls(struct iosm_devlink *ipc_devlink,
		       const struct firmware *fw, u8 *mdm_rsp);
#endif