diff options
Diffstat (limited to 'drivers/net/wwan/iosm/iosm_ipc_devlink.h')
| -rw-r--r-- | drivers/net/wwan/iosm/iosm_ipc_devlink.h | 205 | 
1 files changed, 205 insertions, 0 deletions
| diff --git a/drivers/net/wwan/iosm/iosm_ipc_devlink.h b/drivers/net/wwan/iosm/iosm_ipc_devlink.h new file mode 100644 index 000000000000..35c2d013b9cc --- /dev/null +++ b/drivers/net/wwan/iosm/iosm_ipc_devlink.h @@ -0,0 +1,205 @@ +/* SPDX-License-Identifier: GPL-2.0-only + * + * Copyright (C) 2020-2021 Intel Corporation. + */ + +#ifndef _IOSM_IPC_DEVLINK_H_ +#define _IOSM_IPC_DEVLINK_H_ + +#include <net/devlink.h> + +#include "iosm_ipc_imem.h" +#include "iosm_ipc_imem_ops.h" +#include "iosm_ipc_pcie.h" + +/* Image ext max len */ +#define IOSM_DEVLINK_MAX_IMG_LEN 3 +/* Magic Header */ +#define IOSM_DEVLINK_MAGIC_HEADER "IOSM_DEVLINK_HEADER" +/* Magic Header len */ +#define IOSM_DEVLINK_MAGIC_HEADER_LEN 20 +/* Devlink image type */ +#define IOSM_DEVLINK_IMG_TYPE 4 +/* Reserve header size */ +#define IOSM_DEVLINK_RESERVED 34 +/* Devlink Image Header size */ +#define IOSM_DEVLINK_HDR_SIZE sizeof(struct iosm_devlink_image) +/* MAX file name length */ +#define IOSM_MAX_FILENAME_LEN 32 +/* EBL response size */ +#define IOSM_EBL_RSP_SIZE 76 +/* MAX number of regions supported */ +#define IOSM_NOF_CD_REGION 6 +/* MAX number of SNAPSHOTS supported */ +#define MAX_SNAPSHOTS 1 +/* Default Coredump file size */ +#define REPORT_JSON_SIZE 0x800 +#define COREDUMP_FCD_SIZE 0x10E00000 +#define CDD_LOG_SIZE 0x30000 +#define EEPROM_BIN_SIZE 0x10000 +#define BOOTCORE_TRC_BIN_SIZE 0x8000 +#define BOOTCORE_PREV_TRC_BIN_SIZE 0x20000 + +/** + * enum iosm_devlink_param_id - Enum type to different devlink params + * @IOSM_DEVLINK_PARAM_ID_BASE:			Devlink param base ID + * @IOSM_DEVLINK_PARAM_ID_ERASE_FULL_FLASH:     Set if full erase required + */ + +enum iosm_devlink_param_id { +	IOSM_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX, +	IOSM_DEVLINK_PARAM_ID_ERASE_FULL_FLASH, +}; + +/** + * enum iosm_rpsi_cmd_code - Enum type for RPSI command list + * @rpsi_cmd_code_ebl:		Command to load ebl + * @rpsi_cmd_coredump_start:    Command to get list of files and + *				file size info from PSI + * @rpsi_cmd_coredump_get:      Command to get the coredump data + * @rpsi_cmd_coredump_end:      Command to stop receiving the coredump + */ +enum iosm_rpsi_cmd_code { +	rpsi_cmd_code_ebl = 0x02, +	rpsi_cmd_coredump_start = 0x10, +	rpsi_cmd_coredump_get   = 0x11, +	rpsi_cmd_coredump_end   = 0x12, +}; + +/** + * enum iosm_flash_comp_type - Enum for different flash component types + * @FLASH_COMP_TYPE_PSI:	PSI flash comp type + * @FLASH_COMP_TYPE_EBL:	EBL flash comp type + * @FLASH_COMP_TYPE_FLS:	FLS flash comp type + * @FLASH_COMP_TYPE_INVAL:	Invalid flash comp type + */ +enum iosm_flash_comp_type { +	FLASH_COMP_TYPE_PSI, +	FLASH_COMP_TYPE_EBL, +	FLASH_COMP_TYPE_FLS, +	FLASH_COMP_TYPE_INVAL, +}; + +/** + * struct iosm_devlink_sio - SIO instance + * @rx_list:	Downlink skbuf list received from CP + * @read_sem:	Needed for the blocking read or downlink transfer + * @channel_id: Reserved channel id for flashing/CD collection to RAM + * @channel:	Channel instance for flashing and coredump + * @devlink_read_pend: Check if read is pending + */ +struct iosm_devlink_sio { +	struct sk_buff_head rx_list; +	struct completion read_sem; +	int channel_id; +	struct ipc_mem_channel *channel; +	u32 devlink_read_pend; +}; + +/** + * struct iosm_flash_params - List of flash params required for flashing + * @erase_full_flash:   To set the flashing mode + *                      erase_full_flash = 1; full erase + *                      erase_full_flash = 0; no erase + * @erase_full_flash_done: Flag to check if it is a full erase + */ +struct iosm_flash_params { +	u8 erase_full_flash; +	u8 erase_full_flash_done; +}; + +/** + * struct iosm_devlink_image - Structure with Fls file header info + * @magic_header:	Header of the firmware image + * @image_type:		Firmware image type + * @region_address:	Address of the region to be flashed + * @download_region:	Field to identify if it is a region + * @last_region:	Field to identify if it is last region + * @reserved:		Reserved field + */ +struct iosm_devlink_image { +	char magic_header[IOSM_DEVLINK_MAGIC_HEADER_LEN]; +	char image_type[IOSM_DEVLINK_IMG_TYPE]; +	__le32 region_address; +	u8 download_region; +	u8 last_region; +	u8 reserved[IOSM_DEVLINK_RESERVED]; +} __packed; + +/** + * struct iosm_ebl_ctx_data -  EBL ctx data used during flashing + * @ebl_sw_info_version: SWID version info obtained from EBL + * @m_ebl_resp:         Buffer used to read and write the ebl data + */ +struct iosm_ebl_ctx_data { +	u8 ebl_sw_info_version; +	u8 m_ebl_resp[IOSM_EBL_RSP_SIZE]; +}; + +/** + * struct iosm_coredump_file_info -  Coredump file info + * @filename:		Name of coredump file + * @default_size:	Default size of coredump file + * @actual_size:	Actual size of coredump file + * @entry:		Index of the coredump file + */ +struct iosm_coredump_file_info { +	char filename[IOSM_MAX_FILENAME_LEN]; +	u32 default_size; +	u32 actual_size; +	u32 entry; +}; + +/** + * struct iosm_devlink - IOSM Devlink structure + * @devlink_sio:        SIO instance for read/write functionality + * @pcie:               Pointer to PCIe component + * @dev:                Pointer to device struct + * @devlink_ctx:	Pointer to devlink context + * @param:		Params required for flashing + * @ebl_ctx:		Data to be read and written to Modem + * @cd_file_info:	coredump file info + * @iosm_devlink_mdm_coredump:	region ops for coredump collection + * @cd_regions:		coredump regions + */ +struct iosm_devlink { +	struct iosm_devlink_sio devlink_sio; +	struct iosm_pcie *pcie; +	struct device *dev; +	struct devlink *devlink_ctx; +	struct iosm_flash_params param; +	struct iosm_ebl_ctx_data ebl_ctx; +	struct iosm_coredump_file_info *cd_file_info; +	struct devlink_region_ops iosm_devlink_mdm_coredump[IOSM_NOF_CD_REGION]; +	struct devlink_region *cd_regions[IOSM_NOF_CD_REGION]; +}; + +/** + * union iosm_rpsi_param_u - RPSI cmd param for CRC calculation + * @word:	Words member used in CRC calculation + * @dword:	Actual data + */ +union iosm_rpsi_param_u { +	__le16 word[2]; +	__le32 dword; +}; + +/** + * struct iosm_rpsi_cmd - Structure for RPSI Command + * @param:      Used to calculate CRC + * @cmd:        Stores the RPSI command + * @crc:        Stores the CRC value + */ +struct iosm_rpsi_cmd { +	union iosm_rpsi_param_u param; +	__le16	cmd; +	__le16	crc; +}; + +struct iosm_devlink *ipc_devlink_init(struct iosm_imem *ipc_imem); + +void ipc_devlink_deinit(struct iosm_devlink *ipc_devlink); + +int ipc_devlink_send_cmd(struct iosm_devlink *ipc_devlink, u16 cmd, u32 entry); + +#endif /* _IOSM_IPC_DEVLINK_H */ |