/* 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