1 /* SPDX-License-Identifier: GPL-2.0-only 2 * 3 * Copyright (C) 2020-2021 Intel Corporation. 4 */ 5 6 #ifndef _IOSM_IPC_FLASH_H 7 #define _IOSM_IPC_FLASH_H 8 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) 25 /* EBL name 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 33 /* PSI ACK len */ 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 53 /* Flag To be set */ 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 61 62 /** 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 73 */ 74 enum iosm_flash_package_type { 75 FLASH_SET_PROT_CONF = 0x0086, 76 FLASH_SEC_START = 0x0204, 77 FLASH_SEC_END, 78 FLASH_SET_ADDRESS = 0x0802, 79 FLASH_ERASE_START = 0x0805, 80 FLASH_ERASE_CHECK, 81 FLASH_OOS_CONTROL = 0x080C, 82 FLASH_OOS_DATA_READ = 0x080E, 83 FLASH_WRITE_IMAGE_RAW, 84 }; 85 86 /** 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 91 */ 92 enum iosm_out_of_session_action { 93 FLASH_OOSC_ACTION_READ = 2, 94 FLASH_OOSC_ACTION_ERASE = 3, 95 }; 96 97 /** 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 102 */ 103 enum iosm_out_of_session_type { 104 FLASH_OOSC_TYPE_ALL_FLASH = 8, 105 FLASH_OOSC_TYPE_SWID_TABLE = 16, 106 }; 107 108 /** 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 114 */ 115 enum iosm_ebl_caps { 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, 120 }; 121 122 /** 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 130 */ 131 enum iosm_ebl_rsp { 132 EBL_CAPS_FLAG = 50, 133 EBL_SKIP_ERASE = 54, 134 EBL_SKIP_CRC = 55, 135 EBL_EXT_CAPS_HANDLED = 57, 136 EBL_OOS_CONFIG = 64, 137 EBL_RSP_SW_INFO_VER = 70, 138 }; 139 140 /** 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 146 */ 147 enum iosm_mdm_send_recv_data { 148 IOSM_MDM_SEND_2 = 2, 149 IOSM_MDM_SEND_4 = 4, 150 IOSM_MDM_SEND_8 = 8, 151 IOSM_MDM_SEND_16 = 16, 152 }; 153 154 /** 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 158 */ 159 struct iosm_ebl_one_error { 160 u16 error_class; 161 u16 error_code; 162 }; 163 164 /** 165 * struct iosm_ebl_error- Structure with max error type supported 166 * @error: Array of one_error structure with max errors 167 */ 168 struct iosm_ebl_error { 169 struct iosm_ebl_one_error error[IOSM_MAX_ERRORS]; 170 }; 171 172 /** 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 179 */ 180 struct iosm_swid_table { 181 u32 number_of_data_sets; 182 char sw_id_type[IOSM_EBL_NAME]; 183 u32 sw_id_val; 184 char rf_engine_id_type[IOSM_EBL_NAME]; 185 u32 rf_engine_id_val; 186 }; 187 188 /** 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 194 */ 195 struct iosm_flash_msg_control { 196 __le32 action; 197 __le32 type; 198 __le32 length; 199 __le32 arguments; 200 }; 201 202 /** 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 207 */ 208 struct iosm_flash_data { 209 __le16 checksum; 210 __le16 pack_id; 211 __le32 msg_length; 212 }; 213 214 int ipc_flash_boot_psi(struct iosm_devlink *ipc_devlink, 215 const struct firmware *fw); 216 217 int ipc_flash_boot_ebl(struct iosm_devlink *ipc_devlink, 218 const struct firmware *fw); 219 220 int ipc_flash_boot_set_capabilities(struct iosm_devlink *ipc_devlink, 221 u8 *mdm_rsp); 222 223 int ipc_flash_link_establish(struct iosm_imem *ipc_imem); 224 225 int ipc_flash_read_swid(struct iosm_devlink *ipc_devlink, u8 *mdm_rsp); 226 227 int ipc_flash_send_fls(struct iosm_devlink *ipc_devlink, 228 const struct firmware *fw, u8 *mdm_rsp); 229 #endif 230