1*b5573474SM Chetan Kumar /* SPDX-License-Identifier: GPL-2.0-only 2*b5573474SM Chetan Kumar * 3*b5573474SM Chetan Kumar * Copyright (C) 2020-2021 Intel Corporation. 4*b5573474SM Chetan Kumar */ 5*b5573474SM Chetan Kumar 6*b5573474SM Chetan Kumar #ifndef _IOSM_IPC_FLASH_H 7*b5573474SM Chetan Kumar #define _IOSM_IPC_FLASH_H 8*b5573474SM Chetan Kumar 9*b5573474SM Chetan Kumar /* Buffer size used to read the fls image */ 10*b5573474SM Chetan Kumar #define IOSM_FLS_BUF_SIZE 0x00100000 11*b5573474SM Chetan Kumar /* Full erase start address */ 12*b5573474SM Chetan Kumar #define IOSM_ERASE_START_ADDR 0x00000000 13*b5573474SM Chetan Kumar /* Erase length for NAND flash */ 14*b5573474SM Chetan Kumar #define IOSM_ERASE_LEN 0xFFFFFFFF 15*b5573474SM Chetan Kumar /* EBL response Header size */ 16*b5573474SM Chetan Kumar #define IOSM_EBL_HEAD_SIZE 8 17*b5573474SM Chetan Kumar /* EBL payload size */ 18*b5573474SM Chetan Kumar #define IOSM_EBL_W_PAYL_SIZE 2048 19*b5573474SM Chetan Kumar /* Total EBL pack size */ 20*b5573474SM Chetan Kumar #define IOSM_EBL_W_PACK_SIZE (IOSM_EBL_HEAD_SIZE + IOSM_EBL_W_PAYL_SIZE) 21*b5573474SM Chetan Kumar /* EBL payload size */ 22*b5573474SM Chetan Kumar #define IOSM_EBL_DW_PAYL_SIZE 16384 23*b5573474SM Chetan Kumar /* Total EBL pack size */ 24*b5573474SM Chetan Kumar #define IOSM_EBL_DW_PACK_SIZE (IOSM_EBL_HEAD_SIZE + IOSM_EBL_DW_PAYL_SIZE) 25*b5573474SM Chetan Kumar /* EBL name size */ 26*b5573474SM Chetan Kumar #define IOSM_EBL_NAME 32 27*b5573474SM Chetan Kumar /* Maximum supported error types */ 28*b5573474SM Chetan Kumar #define IOSM_MAX_ERRORS 8 29*b5573474SM Chetan Kumar /* Read size for RPSI/EBL response */ 30*b5573474SM Chetan Kumar #define IOSM_READ_SIZE 2 31*b5573474SM Chetan Kumar /* Link establishment response ack size */ 32*b5573474SM Chetan Kumar #define IOSM_LER_ACK_SIZE 2 33*b5573474SM Chetan Kumar /* PSI ACK len */ 34*b5573474SM Chetan Kumar #define IOSM_PSI_ACK 8 35*b5573474SM Chetan Kumar /* SWID capability for packed swid type */ 36*b5573474SM Chetan Kumar #define IOSM_EXT_CAP_SWID_OOS_PACK 0x02 37*b5573474SM Chetan Kumar /* EBL error response buffer */ 38*b5573474SM Chetan Kumar #define IOSM_EBL_RSP_BUFF 0x0041 39*b5573474SM Chetan Kumar /* SWID string length */ 40*b5573474SM Chetan Kumar #define IOSM_SWID_STR 64 41*b5573474SM Chetan Kumar /* Load EBL command size */ 42*b5573474SM Chetan Kumar #define IOSM_RPSI_LOAD_SIZE 0 43*b5573474SM Chetan Kumar /* EBL payload checksum */ 44*b5573474SM Chetan Kumar #define IOSM_EBL_CKSM 0x0000FFFF 45*b5573474SM Chetan Kumar /* SWID msg len and argument */ 46*b5573474SM Chetan Kumar #define IOSM_MSG_LEN_ARG 0 47*b5573474SM Chetan Kumar /* Data to be sent to modem */ 48*b5573474SM Chetan Kumar #define IOSM_MDM_SEND_DATA 0x0000 49*b5573474SM Chetan Kumar /* Data received from modem as part of erase check */ 50*b5573474SM Chetan Kumar #define IOSM_MDM_ERASE_RSP 0x0001 51*b5573474SM Chetan Kumar /* Bit shift to calculate Checksum */ 52*b5573474SM Chetan Kumar #define IOSM_EBL_PAYL_SHIFT 16 53*b5573474SM Chetan Kumar /* Flag To be set */ 54*b5573474SM Chetan Kumar #define IOSM_SET_FLAG 1 55*b5573474SM Chetan Kumar /* Set flash erase check timeout to 100 msec */ 56*b5573474SM Chetan Kumar #define IOSM_FLASH_ERASE_CHECK_TIMEOUT 100 57*b5573474SM Chetan Kumar /* Set flash erase check interval to 20 msec */ 58*b5573474SM Chetan Kumar #define IOSM_FLASH_ERASE_CHECK_INTERVAL 20 59*b5573474SM Chetan Kumar /* Link establishment response ack size */ 60*b5573474SM Chetan Kumar #define IOSM_LER_RSP_SIZE 60 61*b5573474SM Chetan Kumar 62*b5573474SM Chetan Kumar /** 63*b5573474SM Chetan Kumar * enum iosm_flash_package_type - Enum for the flashing operations 64*b5573474SM Chetan Kumar * @FLASH_SET_PROT_CONF: Write EBL capabilities 65*b5573474SM Chetan Kumar * @FLASH_SEC_START: Start writing the secpack 66*b5573474SM Chetan Kumar * @FLASH_SEC_END: Validate secpack end 67*b5573474SM Chetan Kumar * @FLASH_SET_ADDRESS: Set the address for flashing 68*b5573474SM Chetan Kumar * @FLASH_ERASE_START: Start erase before flashing 69*b5573474SM Chetan Kumar * @FLASH_ERASE_CHECK: Validate the erase functionality 70*b5573474SM Chetan Kumar * @FLASH_OOS_CONTROL: Retrieve data based on oos actions 71*b5573474SM Chetan Kumar * @FLASH_OOS_DATA_READ: Read data from EBL 72*b5573474SM Chetan Kumar * @FLASH_WRITE_IMAGE_RAW: Write the raw image to flash 73*b5573474SM Chetan Kumar */ 74*b5573474SM Chetan Kumar enum iosm_flash_package_type { 75*b5573474SM Chetan Kumar FLASH_SET_PROT_CONF = 0x0086, 76*b5573474SM Chetan Kumar FLASH_SEC_START = 0x0204, 77*b5573474SM Chetan Kumar FLASH_SEC_END, 78*b5573474SM Chetan Kumar FLASH_SET_ADDRESS = 0x0802, 79*b5573474SM Chetan Kumar FLASH_ERASE_START = 0x0805, 80*b5573474SM Chetan Kumar FLASH_ERASE_CHECK, 81*b5573474SM Chetan Kumar FLASH_OOS_CONTROL = 0x080C, 82*b5573474SM Chetan Kumar FLASH_OOS_DATA_READ = 0x080E, 83*b5573474SM Chetan Kumar FLASH_WRITE_IMAGE_RAW, 84*b5573474SM Chetan Kumar }; 85*b5573474SM Chetan Kumar 86*b5573474SM Chetan Kumar /** 87*b5573474SM Chetan Kumar * enum iosm_out_of_session_action - Actions possible over the 88*b5573474SM Chetan Kumar * OutOfSession command interface 89*b5573474SM Chetan Kumar * @FLASH_OOSC_ACTION_READ: Read data according to its type 90*b5573474SM Chetan Kumar * @FLASH_OOSC_ACTION_ERASE: Erase data according to its type 91*b5573474SM Chetan Kumar */ 92*b5573474SM Chetan Kumar enum iosm_out_of_session_action { 93*b5573474SM Chetan Kumar FLASH_OOSC_ACTION_READ = 2, 94*b5573474SM Chetan Kumar FLASH_OOSC_ACTION_ERASE = 3, 95*b5573474SM Chetan Kumar }; 96*b5573474SM Chetan Kumar 97*b5573474SM Chetan Kumar /** 98*b5573474SM Chetan Kumar * enum iosm_out_of_session_type - Data types that can be handled over the 99*b5573474SM Chetan Kumar * Out Of Session command Interface 100*b5573474SM Chetan Kumar * @FLASH_OOSC_TYPE_ALL_FLASH: The whole flash area 101*b5573474SM Chetan Kumar * @FLASH_OOSC_TYPE_SWID_TABLE: Read the swid table from the target 102*b5573474SM Chetan Kumar */ 103*b5573474SM Chetan Kumar enum iosm_out_of_session_type { 104*b5573474SM Chetan Kumar FLASH_OOSC_TYPE_ALL_FLASH = 8, 105*b5573474SM Chetan Kumar FLASH_OOSC_TYPE_SWID_TABLE = 16, 106*b5573474SM Chetan Kumar }; 107*b5573474SM Chetan Kumar 108*b5573474SM Chetan Kumar /** 109*b5573474SM Chetan Kumar * enum iosm_ebl_caps - EBL capability settings 110*b5573474SM Chetan Kumar * @IOSM_CAP_NOT_ENHANCED: If capability not supported 111*b5573474SM Chetan Kumar * @IOSM_CAP_USE_EXT_CAP: To be set if extended capability is set 112*b5573474SM Chetan Kumar * @IOSM_EXT_CAP_ERASE_ALL: Set Erase all capability 113*b5573474SM Chetan Kumar * @IOSM_EXT_CAP_COMMIT_ALL: Set the commit all capability 114*b5573474SM Chetan Kumar */ 115*b5573474SM Chetan Kumar enum iosm_ebl_caps { 116*b5573474SM Chetan Kumar IOSM_CAP_NOT_ENHANCED = 0x00, 117*b5573474SM Chetan Kumar IOSM_CAP_USE_EXT_CAP = 0x01, 118*b5573474SM Chetan Kumar IOSM_EXT_CAP_ERASE_ALL = 0x08, 119*b5573474SM Chetan Kumar IOSM_EXT_CAP_COMMIT_ALL = 0x20, 120*b5573474SM Chetan Kumar }; 121*b5573474SM Chetan Kumar 122*b5573474SM Chetan Kumar /** 123*b5573474SM Chetan Kumar * enum iosm_ebl_rsp - EBL response field 124*b5573474SM Chetan Kumar * @EBL_CAPS_FLAG: EBL capability flag 125*b5573474SM Chetan Kumar * @EBL_SKIP_ERASE: EBL skip erase flag 126*b5573474SM Chetan Kumar * @EBL_SKIP_CRC: EBL skip wr_pack crc 127*b5573474SM Chetan Kumar * @EBL_EXT_CAPS_HANDLED: EBL extended capability handled flag 128*b5573474SM Chetan Kumar * @EBL_OOS_CONFIG: EBL oos configuration 129*b5573474SM Chetan Kumar * @EBL_RSP_SW_INFO_VER: EBL SW info version 130*b5573474SM Chetan Kumar */ 131*b5573474SM Chetan Kumar enum iosm_ebl_rsp { 132*b5573474SM Chetan Kumar EBL_CAPS_FLAG = 50, 133*b5573474SM Chetan Kumar EBL_SKIP_ERASE = 54, 134*b5573474SM Chetan Kumar EBL_SKIP_CRC = 55, 135*b5573474SM Chetan Kumar EBL_EXT_CAPS_HANDLED = 57, 136*b5573474SM Chetan Kumar EBL_OOS_CONFIG = 64, 137*b5573474SM Chetan Kumar EBL_RSP_SW_INFO_VER = 70, 138*b5573474SM Chetan Kumar }; 139*b5573474SM Chetan Kumar 140*b5573474SM Chetan Kumar /** 141*b5573474SM Chetan Kumar * enum iosm_mdm_send_recv_data - Data to send to modem 142*b5573474SM Chetan Kumar * @IOSM_MDM_SEND_2: Send 2 bytes of payload 143*b5573474SM Chetan Kumar * @IOSM_MDM_SEND_4: Send 4 bytes of payload 144*b5573474SM Chetan Kumar * @IOSM_MDM_SEND_8: Send 8 bytes of payload 145*b5573474SM Chetan Kumar * @IOSM_MDM_SEND_16: Send 16 bytes of payload 146*b5573474SM Chetan Kumar */ 147*b5573474SM Chetan Kumar enum iosm_mdm_send_recv_data { 148*b5573474SM Chetan Kumar IOSM_MDM_SEND_2 = 2, 149*b5573474SM Chetan Kumar IOSM_MDM_SEND_4 = 4, 150*b5573474SM Chetan Kumar IOSM_MDM_SEND_8 = 8, 151*b5573474SM Chetan Kumar IOSM_MDM_SEND_16 = 16, 152*b5573474SM Chetan Kumar }; 153*b5573474SM Chetan Kumar 154*b5573474SM Chetan Kumar /** 155*b5573474SM Chetan Kumar * struct iosm_ebl_one_error - Structure containing error details 156*b5573474SM Chetan Kumar * @error_class: Error type- standard, security and text error 157*b5573474SM Chetan Kumar * @error_code: Specific error from error type 158*b5573474SM Chetan Kumar */ 159*b5573474SM Chetan Kumar struct iosm_ebl_one_error { 160*b5573474SM Chetan Kumar u16 error_class; 161*b5573474SM Chetan Kumar u16 error_code; 162*b5573474SM Chetan Kumar }; 163*b5573474SM Chetan Kumar 164*b5573474SM Chetan Kumar /** 165*b5573474SM Chetan Kumar * struct iosm_ebl_error- Structure with max error type supported 166*b5573474SM Chetan Kumar * @error: Array of one_error structure with max errors 167*b5573474SM Chetan Kumar */ 168*b5573474SM Chetan Kumar struct iosm_ebl_error { 169*b5573474SM Chetan Kumar struct iosm_ebl_one_error error[IOSM_MAX_ERRORS]; 170*b5573474SM Chetan Kumar }; 171*b5573474SM Chetan Kumar 172*b5573474SM Chetan Kumar /** 173*b5573474SM Chetan Kumar * struct iosm_swid_table - SWID table data for modem 174*b5573474SM Chetan Kumar * @number_of_data_sets: Number of swid types 175*b5573474SM Chetan Kumar * @sw_id_type: SWID type - SWID 176*b5573474SM Chetan Kumar * @sw_id_val: SWID value 177*b5573474SM Chetan Kumar * @rf_engine_id_type: RF engine ID type - RF_ENGINE_ID 178*b5573474SM Chetan Kumar * @rf_engine_id_val: RF engine ID value 179*b5573474SM Chetan Kumar */ 180*b5573474SM Chetan Kumar struct iosm_swid_table { 181*b5573474SM Chetan Kumar u32 number_of_data_sets; 182*b5573474SM Chetan Kumar char sw_id_type[IOSM_EBL_NAME]; 183*b5573474SM Chetan Kumar u32 sw_id_val; 184*b5573474SM Chetan Kumar char rf_engine_id_type[IOSM_EBL_NAME]; 185*b5573474SM Chetan Kumar u32 rf_engine_id_val; 186*b5573474SM Chetan Kumar }; 187*b5573474SM Chetan Kumar 188*b5573474SM Chetan Kumar /** 189*b5573474SM Chetan Kumar * struct iosm_flash_msg_control - Data sent to modem 190*b5573474SM Chetan Kumar * @action: Action to be performed 191*b5573474SM Chetan Kumar * @type: Type of action 192*b5573474SM Chetan Kumar * @length: Length of the action 193*b5573474SM Chetan Kumar * @arguments: Argument value sent to modem 194*b5573474SM Chetan Kumar */ 195*b5573474SM Chetan Kumar struct iosm_flash_msg_control { 196*b5573474SM Chetan Kumar __le32 action; 197*b5573474SM Chetan Kumar __le32 type; 198*b5573474SM Chetan Kumar __le32 length; 199*b5573474SM Chetan Kumar __le32 arguments; 200*b5573474SM Chetan Kumar }; 201*b5573474SM Chetan Kumar 202*b5573474SM Chetan Kumar /** 203*b5573474SM Chetan Kumar * struct iosm_flash_data - Header Data to be sent to modem 204*b5573474SM Chetan Kumar * @checksum: Checksum value calculated for the payload data 205*b5573474SM Chetan Kumar * @pack_id: Flash Action type 206*b5573474SM Chetan Kumar * @msg_length: Payload length 207*b5573474SM Chetan Kumar */ 208*b5573474SM Chetan Kumar struct iosm_flash_data { 209*b5573474SM Chetan Kumar __le16 checksum; 210*b5573474SM Chetan Kumar __le16 pack_id; 211*b5573474SM Chetan Kumar __le32 msg_length; 212*b5573474SM Chetan Kumar }; 213*b5573474SM Chetan Kumar 214*b5573474SM Chetan Kumar /** 215*b5573474SM Chetan Kumar * ipc_flash_boot_psi - Inject PSI image 216*b5573474SM Chetan Kumar * @ipc_devlink: Pointer to devlink structure 217*b5573474SM Chetan Kumar * @fw: FW image 218*b5573474SM Chetan Kumar * 219*b5573474SM Chetan Kumar * Returns: 0 on success and failure value on error 220*b5573474SM Chetan Kumar */ 221*b5573474SM Chetan Kumar int ipc_flash_boot_psi(struct iosm_devlink *ipc_devlink, 222*b5573474SM Chetan Kumar const struct firmware *fw); 223*b5573474SM Chetan Kumar 224*b5573474SM Chetan Kumar /** 225*b5573474SM Chetan Kumar * ipc_flash_boot_ebl - Inject EBL image 226*b5573474SM Chetan Kumar * @ipc_devlink: Pointer to devlink structure 227*b5573474SM Chetan Kumar * @fw: FW image 228*b5573474SM Chetan Kumar * 229*b5573474SM Chetan Kumar * Returns: 0 on success and failure value on error 230*b5573474SM Chetan Kumar */ 231*b5573474SM Chetan Kumar int ipc_flash_boot_ebl(struct iosm_devlink *ipc_devlink, 232*b5573474SM Chetan Kumar const struct firmware *fw); 233*b5573474SM Chetan Kumar 234*b5573474SM Chetan Kumar /** 235*b5573474SM Chetan Kumar * ipc_flash_boot_set_capabilities - Set modem bool capabilities in flash 236*b5573474SM Chetan Kumar * @ipc_devlink: Pointer to devlink structure 237*b5573474SM Chetan Kumar * @mdm_rsp: Pointer to modem response buffer 238*b5573474SM Chetan Kumar * 239*b5573474SM Chetan Kumar * Returns: 0 on success and failure value on error 240*b5573474SM Chetan Kumar */ 241*b5573474SM Chetan Kumar int ipc_flash_boot_set_capabilities(struct iosm_devlink *ipc_devlink, 242*b5573474SM Chetan Kumar u8 *mdm_rsp); 243*b5573474SM Chetan Kumar 244*b5573474SM Chetan Kumar /** 245*b5573474SM Chetan Kumar * ipc_flash_link_establish - Flash link establishment 246*b5573474SM Chetan Kumar * @ipc_imem: Pointer to struct iosm_imem 247*b5573474SM Chetan Kumar * 248*b5573474SM Chetan Kumar * Returns: 0 on success and failure value on error 249*b5573474SM Chetan Kumar */ 250*b5573474SM Chetan Kumar int ipc_flash_link_establish(struct iosm_imem *ipc_imem); 251*b5573474SM Chetan Kumar 252*b5573474SM Chetan Kumar /** 253*b5573474SM Chetan Kumar * ipc_flash_read_swid - Get swid during flash phase 254*b5573474SM Chetan Kumar * @ipc_devlink: Pointer to devlink structure 255*b5573474SM Chetan Kumar * @mdm_rsp: Pointer to modem response buffer 256*b5573474SM Chetan Kumar * 257*b5573474SM Chetan Kumar * Returns: 0 on success and failure value on error 258*b5573474SM Chetan Kumar */ 259*b5573474SM Chetan Kumar int ipc_flash_read_swid(struct iosm_devlink *ipc_devlink, u8 *mdm_rsp); 260*b5573474SM Chetan Kumar 261*b5573474SM Chetan Kumar /** 262*b5573474SM Chetan Kumar * ipc_flash_send_fls - Inject Modem subsystem fls file to device 263*b5573474SM Chetan Kumar * @ipc_devlink: Pointer to devlink structure 264*b5573474SM Chetan Kumar * @fw: FW image 265*b5573474SM Chetan Kumar * @mdm_rsp: Pointer to modem response buffer 266*b5573474SM Chetan Kumar * 267*b5573474SM Chetan Kumar * Returns: 0 on success and failure value on error 268*b5573474SM Chetan Kumar */ 269*b5573474SM Chetan Kumar int ipc_flash_send_fls(struct iosm_devlink *ipc_devlink, 270*b5573474SM Chetan Kumar const struct firmware *fw, u8 *mdm_rsp); 271*b5573474SM Chetan Kumar #endif 272