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