1 /* SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2020-2021 Intel Corporation.
6 #ifndef _IOSM_IPC_FLASH_H
7 #define _IOSM_IPC_FLASH_H
9 /* Buffer size used to read the fls image */
10 #define IOSM_FLS_BUF_SIZE 0x00100000
11 /* Full erase start address */
12 #define IOSM_ERASE_START_ADDR 0x00000000
13 /* Erase length for NAND flash */
14 #define IOSM_ERASE_LEN 0xFFFFFFFF
15 /* EBL response Header size */
16 #define IOSM_EBL_HEAD_SIZE 8
17 /* EBL payload size */
18 #define IOSM_EBL_W_PAYL_SIZE 2048
19 /* Total EBL pack size */
20 #define IOSM_EBL_W_PACK_SIZE (IOSM_EBL_HEAD_SIZE + IOSM_EBL_W_PAYL_SIZE)
21 /* EBL payload size */
22 #define IOSM_EBL_DW_PAYL_SIZE 16384
23 /* Total EBL pack size */
24 #define IOSM_EBL_DW_PACK_SIZE (IOSM_EBL_HEAD_SIZE + IOSM_EBL_DW_PAYL_SIZE)
26 #define IOSM_EBL_NAME 32
27 /* Maximum supported error types */
28 #define IOSM_MAX_ERRORS 8
29 /* Read size for RPSI/EBL response */
30 #define IOSM_READ_SIZE 2
31 /* Link establishment response ack size */
32 #define IOSM_LER_ACK_SIZE 2
34 #define IOSM_PSI_ACK 8
35 /* SWID capability for packed swid type */
36 #define IOSM_EXT_CAP_SWID_OOS_PACK 0x02
37 /* EBL error response buffer */
38 #define IOSM_EBL_RSP_BUFF 0x0041
39 /* SWID string length */
40 #define IOSM_SWID_STR 64
41 /* Load EBL command size */
42 #define IOSM_RPSI_LOAD_SIZE 0
43 /* EBL payload checksum */
44 #define IOSM_EBL_CKSM 0x0000FFFF
45 /* SWID msg len and argument */
46 #define IOSM_MSG_LEN_ARG 0
47 /* Data to be sent to modem */
48 #define IOSM_MDM_SEND_DATA 0x0000
49 /* Data received from modem as part of erase check */
50 #define IOSM_MDM_ERASE_RSP 0x0001
51 /* Bit shift to calculate Checksum */
52 #define IOSM_EBL_PAYL_SHIFT 16
54 #define IOSM_SET_FLAG 1
55 /* Set flash erase check timeout to 100 msec */
56 #define IOSM_FLASH_ERASE_CHECK_TIMEOUT 100
57 /* Set flash erase check interval to 20 msec */
58 #define IOSM_FLASH_ERASE_CHECK_INTERVAL 20
59 /* Link establishment response ack size */
60 #define IOSM_LER_RSP_SIZE 60
63 * enum iosm_flash_package_type - Enum for the flashing operations
64 * @FLASH_SET_PROT_CONF: Write EBL capabilities
65 * @FLASH_SEC_START: Start writing the secpack
66 * @FLASH_SEC_END: Validate secpack end
67 * @FLASH_SET_ADDRESS: Set the address for flashing
68 * @FLASH_ERASE_START: Start erase before flashing
69 * @FLASH_ERASE_CHECK: Validate the erase functionality
70 * @FLASH_OOS_CONTROL: Retrieve data based on oos actions
71 * @FLASH_OOS_DATA_READ: Read data from EBL
72 * @FLASH_WRITE_IMAGE_RAW: Write the raw image to flash
74 enum iosm_flash_package_type {
75 FLASH_SET_PROT_CONF = 0x0086,
76 FLASH_SEC_START = 0x0204,
78 FLASH_SET_ADDRESS = 0x0802,
79 FLASH_ERASE_START = 0x0805,
81 FLASH_OOS_CONTROL = 0x080C,
82 FLASH_OOS_DATA_READ = 0x080E,
83 FLASH_WRITE_IMAGE_RAW,
87 * enum iosm_out_of_session_action - Actions possible over the
88 * OutOfSession command interface
89 * @FLASH_OOSC_ACTION_READ: Read data according to its type
90 * @FLASH_OOSC_ACTION_ERASE: Erase data according to its type
92 enum iosm_out_of_session_action {
93 FLASH_OOSC_ACTION_READ = 2,
94 FLASH_OOSC_ACTION_ERASE = 3,
98 * enum iosm_out_of_session_type - Data types that can be handled over the
99 * Out Of Session command Interface
100 * @FLASH_OOSC_TYPE_ALL_FLASH: The whole flash area
101 * @FLASH_OOSC_TYPE_SWID_TABLE: Read the swid table from the target
103 enum iosm_out_of_session_type {
104 FLASH_OOSC_TYPE_ALL_FLASH = 8,
105 FLASH_OOSC_TYPE_SWID_TABLE = 16,
109 * enum iosm_ebl_caps - EBL capability settings
110 * @IOSM_CAP_NOT_ENHANCED: If capability not supported
111 * @IOSM_CAP_USE_EXT_CAP: To be set if extended capability is set
112 * @IOSM_EXT_CAP_ERASE_ALL: Set Erase all capability
113 * @IOSM_EXT_CAP_COMMIT_ALL: Set the commit all capability
116 IOSM_CAP_NOT_ENHANCED = 0x00,
117 IOSM_CAP_USE_EXT_CAP = 0x01,
118 IOSM_EXT_CAP_ERASE_ALL = 0x08,
119 IOSM_EXT_CAP_COMMIT_ALL = 0x20,
123 * enum iosm_ebl_rsp - EBL response field
124 * @EBL_CAPS_FLAG: EBL capability flag
125 * @EBL_SKIP_ERASE: EBL skip erase flag
126 * @EBL_SKIP_CRC: EBL skip wr_pack crc
127 * @EBL_EXT_CAPS_HANDLED: EBL extended capability handled flag
128 * @EBL_OOS_CONFIG: EBL oos configuration
129 * @EBL_RSP_SW_INFO_VER: EBL SW info version
135 EBL_EXT_CAPS_HANDLED = 57,
137 EBL_RSP_SW_INFO_VER = 70,
141 * enum iosm_mdm_send_recv_data - Data to send to modem
142 * @IOSM_MDM_SEND_2: Send 2 bytes of payload
143 * @IOSM_MDM_SEND_4: Send 4 bytes of payload
144 * @IOSM_MDM_SEND_8: Send 8 bytes of payload
145 * @IOSM_MDM_SEND_16: Send 16 bytes of payload
147 enum iosm_mdm_send_recv_data {
151 IOSM_MDM_SEND_16 = 16,
155 * struct iosm_ebl_one_error - Structure containing error details
156 * @error_class: Error type- standard, security and text error
157 * @error_code: Specific error from error type
159 struct iosm_ebl_one_error {
165 * struct iosm_ebl_error- Structure with max error type supported
166 * @error: Array of one_error structure with max errors
168 struct iosm_ebl_error {
169 struct iosm_ebl_one_error error[IOSM_MAX_ERRORS];
173 * struct iosm_swid_table - SWID table data for modem
174 * @number_of_data_sets: Number of swid types
175 * @sw_id_type: SWID type - SWID
176 * @sw_id_val: SWID value
177 * @rf_engine_id_type: RF engine ID type - RF_ENGINE_ID
178 * @rf_engine_id_val: RF engine ID value
180 struct iosm_swid_table {
181 u32 number_of_data_sets;
182 char sw_id_type[IOSM_EBL_NAME];
184 char rf_engine_id_type[IOSM_EBL_NAME];
185 u32 rf_engine_id_val;
189 * struct iosm_flash_msg_control - Data sent to modem
190 * @action: Action to be performed
191 * @type: Type of action
192 * @length: Length of the action
193 * @arguments: Argument value sent to modem
195 struct iosm_flash_msg_control {
203 * struct iosm_flash_data - Header Data to be sent to modem
204 * @checksum: Checksum value calculated for the payload data
205 * @pack_id: Flash Action type
206 * @msg_length: Payload length
208 struct iosm_flash_data {
214 int ipc_flash_boot_psi(struct iosm_devlink *ipc_devlink,
215 const struct firmware *fw);
217 int ipc_flash_boot_ebl(struct iosm_devlink *ipc_devlink,
218 const struct firmware *fw);
220 int ipc_flash_boot_set_capabilities(struct iosm_devlink *ipc_devlink,
223 int ipc_flash_link_establish(struct iosm_imem *ipc_imem);
225 int ipc_flash_read_swid(struct iosm_devlink *ipc_devlink, u8 *mdm_rsp);
227 int ipc_flash_send_fls(struct iosm_devlink *ipc_devlink,
228 const struct firmware *fw, u8 *mdm_rsp);