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