162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * Copyright (C) 2020-2021 Intel Corporation. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef _IOSM_IPC_FLASH_H 762306a36Sopenharmony_ci#define _IOSM_IPC_FLASH_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/* Buffer size used to read the fls image */ 1062306a36Sopenharmony_ci#define IOSM_FLS_BUF_SIZE 0x00100000 1162306a36Sopenharmony_ci/* Full erase start address */ 1262306a36Sopenharmony_ci#define IOSM_ERASE_START_ADDR 0x00000000 1362306a36Sopenharmony_ci/* Erase length for NAND flash */ 1462306a36Sopenharmony_ci#define IOSM_ERASE_LEN 0xFFFFFFFF 1562306a36Sopenharmony_ci/* EBL response Header size */ 1662306a36Sopenharmony_ci#define IOSM_EBL_HEAD_SIZE 8 1762306a36Sopenharmony_ci/* EBL payload size */ 1862306a36Sopenharmony_ci#define IOSM_EBL_W_PAYL_SIZE 2048 1962306a36Sopenharmony_ci/* Total EBL pack size */ 2062306a36Sopenharmony_ci#define IOSM_EBL_W_PACK_SIZE (IOSM_EBL_HEAD_SIZE + IOSM_EBL_W_PAYL_SIZE) 2162306a36Sopenharmony_ci/* EBL payload size */ 2262306a36Sopenharmony_ci#define IOSM_EBL_DW_PAYL_SIZE 16384 2362306a36Sopenharmony_ci/* Total EBL pack size */ 2462306a36Sopenharmony_ci#define IOSM_EBL_DW_PACK_SIZE (IOSM_EBL_HEAD_SIZE + IOSM_EBL_DW_PAYL_SIZE) 2562306a36Sopenharmony_ci/* EBL name size */ 2662306a36Sopenharmony_ci#define IOSM_EBL_NAME 32 2762306a36Sopenharmony_ci/* Maximum supported error types */ 2862306a36Sopenharmony_ci#define IOSM_MAX_ERRORS 8 2962306a36Sopenharmony_ci/* Read size for RPSI/EBL response */ 3062306a36Sopenharmony_ci#define IOSM_READ_SIZE 2 3162306a36Sopenharmony_ci/* Link establishment response ack size */ 3262306a36Sopenharmony_ci#define IOSM_LER_ACK_SIZE 2 3362306a36Sopenharmony_ci/* PSI ACK len */ 3462306a36Sopenharmony_ci#define IOSM_PSI_ACK 8 3562306a36Sopenharmony_ci/* SWID capability for packed swid type */ 3662306a36Sopenharmony_ci#define IOSM_EXT_CAP_SWID_OOS_PACK 0x02 3762306a36Sopenharmony_ci/* EBL error response buffer */ 3862306a36Sopenharmony_ci#define IOSM_EBL_RSP_BUFF 0x0041 3962306a36Sopenharmony_ci/* SWID string length */ 4062306a36Sopenharmony_ci#define IOSM_SWID_STR 64 4162306a36Sopenharmony_ci/* Load EBL command size */ 4262306a36Sopenharmony_ci#define IOSM_RPSI_LOAD_SIZE 0 4362306a36Sopenharmony_ci/* EBL payload checksum */ 4462306a36Sopenharmony_ci#define IOSM_EBL_CKSM 0x0000FFFF 4562306a36Sopenharmony_ci/* SWID msg len and argument */ 4662306a36Sopenharmony_ci#define IOSM_MSG_LEN_ARG 0 4762306a36Sopenharmony_ci/* Data to be sent to modem */ 4862306a36Sopenharmony_ci#define IOSM_MDM_SEND_DATA 0x0000 4962306a36Sopenharmony_ci/* Data received from modem as part of erase check */ 5062306a36Sopenharmony_ci#define IOSM_MDM_ERASE_RSP 0x0001 5162306a36Sopenharmony_ci/* Bit shift to calculate Checksum */ 5262306a36Sopenharmony_ci#define IOSM_EBL_PAYL_SHIFT 16 5362306a36Sopenharmony_ci/* Flag To be set */ 5462306a36Sopenharmony_ci#define IOSM_SET_FLAG 1 5562306a36Sopenharmony_ci/* Set flash erase check timeout to 100 msec */ 5662306a36Sopenharmony_ci#define IOSM_FLASH_ERASE_CHECK_TIMEOUT 100 5762306a36Sopenharmony_ci/* Set flash erase check interval to 20 msec */ 5862306a36Sopenharmony_ci#define IOSM_FLASH_ERASE_CHECK_INTERVAL 20 5962306a36Sopenharmony_ci/* Link establishment response ack size */ 6062306a36Sopenharmony_ci#define IOSM_LER_RSP_SIZE 60 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci/** 6362306a36Sopenharmony_ci * enum iosm_flash_package_type - Enum for the flashing operations 6462306a36Sopenharmony_ci * @FLASH_SET_PROT_CONF: Write EBL capabilities 6562306a36Sopenharmony_ci * @FLASH_SEC_START: Start writing the secpack 6662306a36Sopenharmony_ci * @FLASH_SEC_END: Validate secpack end 6762306a36Sopenharmony_ci * @FLASH_SET_ADDRESS: Set the address for flashing 6862306a36Sopenharmony_ci * @FLASH_ERASE_START: Start erase before flashing 6962306a36Sopenharmony_ci * @FLASH_ERASE_CHECK: Validate the erase functionality 7062306a36Sopenharmony_ci * @FLASH_OOS_CONTROL: Retrieve data based on oos actions 7162306a36Sopenharmony_ci * @FLASH_OOS_DATA_READ: Read data from EBL 7262306a36Sopenharmony_ci * @FLASH_WRITE_IMAGE_RAW: Write the raw image to flash 7362306a36Sopenharmony_ci */ 7462306a36Sopenharmony_cienum iosm_flash_package_type { 7562306a36Sopenharmony_ci FLASH_SET_PROT_CONF = 0x0086, 7662306a36Sopenharmony_ci FLASH_SEC_START = 0x0204, 7762306a36Sopenharmony_ci FLASH_SEC_END, 7862306a36Sopenharmony_ci FLASH_SET_ADDRESS = 0x0802, 7962306a36Sopenharmony_ci FLASH_ERASE_START = 0x0805, 8062306a36Sopenharmony_ci FLASH_ERASE_CHECK, 8162306a36Sopenharmony_ci FLASH_OOS_CONTROL = 0x080C, 8262306a36Sopenharmony_ci FLASH_OOS_DATA_READ = 0x080E, 8362306a36Sopenharmony_ci FLASH_WRITE_IMAGE_RAW, 8462306a36Sopenharmony_ci}; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/** 8762306a36Sopenharmony_ci * enum iosm_out_of_session_action - Actions possible over the 8862306a36Sopenharmony_ci * OutOfSession command interface 8962306a36Sopenharmony_ci * @FLASH_OOSC_ACTION_READ: Read data according to its type 9062306a36Sopenharmony_ci * @FLASH_OOSC_ACTION_ERASE: Erase data according to its type 9162306a36Sopenharmony_ci */ 9262306a36Sopenharmony_cienum iosm_out_of_session_action { 9362306a36Sopenharmony_ci FLASH_OOSC_ACTION_READ = 2, 9462306a36Sopenharmony_ci FLASH_OOSC_ACTION_ERASE = 3, 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci/** 9862306a36Sopenharmony_ci * enum iosm_out_of_session_type - Data types that can be handled over the 9962306a36Sopenharmony_ci * Out Of Session command Interface 10062306a36Sopenharmony_ci * @FLASH_OOSC_TYPE_ALL_FLASH: The whole flash area 10162306a36Sopenharmony_ci * @FLASH_OOSC_TYPE_SWID_TABLE: Read the swid table from the target 10262306a36Sopenharmony_ci */ 10362306a36Sopenharmony_cienum iosm_out_of_session_type { 10462306a36Sopenharmony_ci FLASH_OOSC_TYPE_ALL_FLASH = 8, 10562306a36Sopenharmony_ci FLASH_OOSC_TYPE_SWID_TABLE = 16, 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci/** 10962306a36Sopenharmony_ci * enum iosm_ebl_caps - EBL capability settings 11062306a36Sopenharmony_ci * @IOSM_CAP_NOT_ENHANCED: If capability not supported 11162306a36Sopenharmony_ci * @IOSM_CAP_USE_EXT_CAP: To be set if extended capability is set 11262306a36Sopenharmony_ci * @IOSM_EXT_CAP_ERASE_ALL: Set Erase all capability 11362306a36Sopenharmony_ci * @IOSM_EXT_CAP_COMMIT_ALL: Set the commit all capability 11462306a36Sopenharmony_ci */ 11562306a36Sopenharmony_cienum iosm_ebl_caps { 11662306a36Sopenharmony_ci IOSM_CAP_NOT_ENHANCED = 0x00, 11762306a36Sopenharmony_ci IOSM_CAP_USE_EXT_CAP = 0x01, 11862306a36Sopenharmony_ci IOSM_EXT_CAP_ERASE_ALL = 0x08, 11962306a36Sopenharmony_ci IOSM_EXT_CAP_COMMIT_ALL = 0x20, 12062306a36Sopenharmony_ci}; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci/** 12362306a36Sopenharmony_ci * enum iosm_ebl_rsp - EBL response field 12462306a36Sopenharmony_ci * @EBL_CAPS_FLAG: EBL capability flag 12562306a36Sopenharmony_ci * @EBL_SKIP_ERASE: EBL skip erase flag 12662306a36Sopenharmony_ci * @EBL_SKIP_CRC: EBL skip wr_pack crc 12762306a36Sopenharmony_ci * @EBL_EXT_CAPS_HANDLED: EBL extended capability handled flag 12862306a36Sopenharmony_ci * @EBL_OOS_CONFIG: EBL oos configuration 12962306a36Sopenharmony_ci * @EBL_RSP_SW_INFO_VER: EBL SW info version 13062306a36Sopenharmony_ci */ 13162306a36Sopenharmony_cienum iosm_ebl_rsp { 13262306a36Sopenharmony_ci EBL_CAPS_FLAG = 50, 13362306a36Sopenharmony_ci EBL_SKIP_ERASE = 54, 13462306a36Sopenharmony_ci EBL_SKIP_CRC = 55, 13562306a36Sopenharmony_ci EBL_EXT_CAPS_HANDLED = 57, 13662306a36Sopenharmony_ci EBL_OOS_CONFIG = 64, 13762306a36Sopenharmony_ci EBL_RSP_SW_INFO_VER = 70, 13862306a36Sopenharmony_ci}; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/** 14162306a36Sopenharmony_ci * enum iosm_mdm_send_recv_data - Data to send to modem 14262306a36Sopenharmony_ci * @IOSM_MDM_SEND_2: Send 2 bytes of payload 14362306a36Sopenharmony_ci * @IOSM_MDM_SEND_4: Send 4 bytes of payload 14462306a36Sopenharmony_ci * @IOSM_MDM_SEND_8: Send 8 bytes of payload 14562306a36Sopenharmony_ci * @IOSM_MDM_SEND_16: Send 16 bytes of payload 14662306a36Sopenharmony_ci */ 14762306a36Sopenharmony_cienum iosm_mdm_send_recv_data { 14862306a36Sopenharmony_ci IOSM_MDM_SEND_2 = 2, 14962306a36Sopenharmony_ci IOSM_MDM_SEND_4 = 4, 15062306a36Sopenharmony_ci IOSM_MDM_SEND_8 = 8, 15162306a36Sopenharmony_ci IOSM_MDM_SEND_16 = 16, 15262306a36Sopenharmony_ci}; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/** 15562306a36Sopenharmony_ci * struct iosm_ebl_one_error - Structure containing error details 15662306a36Sopenharmony_ci * @error_class: Error type- standard, security and text error 15762306a36Sopenharmony_ci * @error_code: Specific error from error type 15862306a36Sopenharmony_ci */ 15962306a36Sopenharmony_cistruct iosm_ebl_one_error { 16062306a36Sopenharmony_ci u16 error_class; 16162306a36Sopenharmony_ci u16 error_code; 16262306a36Sopenharmony_ci}; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci/** 16562306a36Sopenharmony_ci * struct iosm_ebl_error- Structure with max error type supported 16662306a36Sopenharmony_ci * @error: Array of one_error structure with max errors 16762306a36Sopenharmony_ci */ 16862306a36Sopenharmony_cistruct iosm_ebl_error { 16962306a36Sopenharmony_ci struct iosm_ebl_one_error error[IOSM_MAX_ERRORS]; 17062306a36Sopenharmony_ci}; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci/** 17362306a36Sopenharmony_ci * struct iosm_swid_table - SWID table data for modem 17462306a36Sopenharmony_ci * @number_of_data_sets: Number of swid types 17562306a36Sopenharmony_ci * @sw_id_type: SWID type - SWID 17662306a36Sopenharmony_ci * @sw_id_val: SWID value 17762306a36Sopenharmony_ci * @rf_engine_id_type: RF engine ID type - RF_ENGINE_ID 17862306a36Sopenharmony_ci * @rf_engine_id_val: RF engine ID value 17962306a36Sopenharmony_ci */ 18062306a36Sopenharmony_cistruct iosm_swid_table { 18162306a36Sopenharmony_ci u32 number_of_data_sets; 18262306a36Sopenharmony_ci char sw_id_type[IOSM_EBL_NAME]; 18362306a36Sopenharmony_ci u32 sw_id_val; 18462306a36Sopenharmony_ci char rf_engine_id_type[IOSM_EBL_NAME]; 18562306a36Sopenharmony_ci u32 rf_engine_id_val; 18662306a36Sopenharmony_ci}; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci/** 18962306a36Sopenharmony_ci * struct iosm_flash_msg_control - Data sent to modem 19062306a36Sopenharmony_ci * @action: Action to be performed 19162306a36Sopenharmony_ci * @type: Type of action 19262306a36Sopenharmony_ci * @length: Length of the action 19362306a36Sopenharmony_ci * @arguments: Argument value sent to modem 19462306a36Sopenharmony_ci */ 19562306a36Sopenharmony_cistruct iosm_flash_msg_control { 19662306a36Sopenharmony_ci __le32 action; 19762306a36Sopenharmony_ci __le32 type; 19862306a36Sopenharmony_ci __le32 length; 19962306a36Sopenharmony_ci __le32 arguments; 20062306a36Sopenharmony_ci}; 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci/** 20362306a36Sopenharmony_ci * struct iosm_flash_data - Header Data to be sent to modem 20462306a36Sopenharmony_ci * @checksum: Checksum value calculated for the payload data 20562306a36Sopenharmony_ci * @pack_id: Flash Action type 20662306a36Sopenharmony_ci * @msg_length: Payload length 20762306a36Sopenharmony_ci */ 20862306a36Sopenharmony_cistruct iosm_flash_data { 20962306a36Sopenharmony_ci __le16 checksum; 21062306a36Sopenharmony_ci __le16 pack_id; 21162306a36Sopenharmony_ci __le32 msg_length; 21262306a36Sopenharmony_ci}; 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ciint ipc_flash_boot_psi(struct iosm_devlink *ipc_devlink, 21562306a36Sopenharmony_ci const struct firmware *fw); 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ciint ipc_flash_boot_ebl(struct iosm_devlink *ipc_devlink, 21862306a36Sopenharmony_ci const struct firmware *fw); 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ciint ipc_flash_boot_set_capabilities(struct iosm_devlink *ipc_devlink, 22162306a36Sopenharmony_ci u8 *mdm_rsp); 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ciint ipc_flash_link_establish(struct iosm_imem *ipc_imem); 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ciint ipc_flash_read_swid(struct iosm_devlink *ipc_devlink, u8 *mdm_rsp); 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ciint ipc_flash_send_fls(struct iosm_devlink *ipc_devlink, 22862306a36Sopenharmony_ci const struct firmware *fw, u8 *mdm_rsp); 22962306a36Sopenharmony_ci#endif 230