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_DEVLINK_H_
762306a36Sopenharmony_ci#define _IOSM_IPC_DEVLINK_H_
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <net/devlink.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include "iosm_ipc_imem.h"
1262306a36Sopenharmony_ci#include "iosm_ipc_imem_ops.h"
1362306a36Sopenharmony_ci#include "iosm_ipc_pcie.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* Image ext max len */
1662306a36Sopenharmony_ci#define IOSM_DEVLINK_MAX_IMG_LEN 3
1762306a36Sopenharmony_ci/* Magic Header */
1862306a36Sopenharmony_ci#define IOSM_DEVLINK_MAGIC_HEADER "IOSM_DEVLINK_HEADER"
1962306a36Sopenharmony_ci/* Magic Header len */
2062306a36Sopenharmony_ci#define IOSM_DEVLINK_MAGIC_HEADER_LEN 20
2162306a36Sopenharmony_ci/* Devlink image type */
2262306a36Sopenharmony_ci#define IOSM_DEVLINK_IMG_TYPE 4
2362306a36Sopenharmony_ci/* Reserve header size */
2462306a36Sopenharmony_ci#define IOSM_DEVLINK_RESERVED 34
2562306a36Sopenharmony_ci/* Devlink Image Header size */
2662306a36Sopenharmony_ci#define IOSM_DEVLINK_HDR_SIZE sizeof(struct iosm_devlink_image)
2762306a36Sopenharmony_ci/* MAX file name length */
2862306a36Sopenharmony_ci#define IOSM_MAX_FILENAME_LEN 32
2962306a36Sopenharmony_ci/* EBL response size */
3062306a36Sopenharmony_ci#define IOSM_EBL_RSP_SIZE 76
3162306a36Sopenharmony_ci/* MAX number of regions supported */
3262306a36Sopenharmony_ci#define IOSM_NOF_CD_REGION 6
3362306a36Sopenharmony_ci/* MAX number of SNAPSHOTS supported */
3462306a36Sopenharmony_ci#define MAX_SNAPSHOTS 1
3562306a36Sopenharmony_ci/* Default Coredump file size */
3662306a36Sopenharmony_ci#define REPORT_JSON_SIZE 0x800
3762306a36Sopenharmony_ci#define COREDUMP_FCD_SIZE 0x10E00000
3862306a36Sopenharmony_ci#define CDD_LOG_SIZE 0x30000
3962306a36Sopenharmony_ci#define EEPROM_BIN_SIZE 0x10000
4062306a36Sopenharmony_ci#define BOOTCORE_TRC_BIN_SIZE 0x8000
4162306a36Sopenharmony_ci#define BOOTCORE_PREV_TRC_BIN_SIZE 0x20000
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci/**
4462306a36Sopenharmony_ci * enum iosm_devlink_param_id - Enum type to different devlink params
4562306a36Sopenharmony_ci * @IOSM_DEVLINK_PARAM_ID_BASE:			Devlink param base ID
4662306a36Sopenharmony_ci * @IOSM_DEVLINK_PARAM_ID_ERASE_FULL_FLASH:     Set if full erase required
4762306a36Sopenharmony_ci */
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cienum iosm_devlink_param_id {
5062306a36Sopenharmony_ci	IOSM_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX,
5162306a36Sopenharmony_ci	IOSM_DEVLINK_PARAM_ID_ERASE_FULL_FLASH,
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci/**
5562306a36Sopenharmony_ci * enum iosm_rpsi_cmd_code - Enum type for RPSI command list
5662306a36Sopenharmony_ci * @rpsi_cmd_code_ebl:		Command to load ebl
5762306a36Sopenharmony_ci * @rpsi_cmd_coredump_start:    Command to get list of files and
5862306a36Sopenharmony_ci *				file size info from PSI
5962306a36Sopenharmony_ci * @rpsi_cmd_coredump_get:      Command to get the coredump data
6062306a36Sopenharmony_ci * @rpsi_cmd_coredump_end:      Command to stop receiving the coredump
6162306a36Sopenharmony_ci */
6262306a36Sopenharmony_cienum iosm_rpsi_cmd_code {
6362306a36Sopenharmony_ci	rpsi_cmd_code_ebl = 0x02,
6462306a36Sopenharmony_ci	rpsi_cmd_coredump_start = 0x10,
6562306a36Sopenharmony_ci	rpsi_cmd_coredump_get   = 0x11,
6662306a36Sopenharmony_ci	rpsi_cmd_coredump_end   = 0x12,
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/**
7062306a36Sopenharmony_ci * enum iosm_flash_comp_type - Enum for different flash component types
7162306a36Sopenharmony_ci * @FLASH_COMP_TYPE_PSI:	PSI flash comp type
7262306a36Sopenharmony_ci * @FLASH_COMP_TYPE_EBL:	EBL flash comp type
7362306a36Sopenharmony_ci * @FLASH_COMP_TYPE_FLS:	FLS flash comp type
7462306a36Sopenharmony_ci * @FLASH_COMP_TYPE_INVAL:	Invalid flash comp type
7562306a36Sopenharmony_ci */
7662306a36Sopenharmony_cienum iosm_flash_comp_type {
7762306a36Sopenharmony_ci	FLASH_COMP_TYPE_PSI,
7862306a36Sopenharmony_ci	FLASH_COMP_TYPE_EBL,
7962306a36Sopenharmony_ci	FLASH_COMP_TYPE_FLS,
8062306a36Sopenharmony_ci	FLASH_COMP_TYPE_INVAL,
8162306a36Sopenharmony_ci};
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci/**
8462306a36Sopenharmony_ci * struct iosm_devlink_sio - SIO instance
8562306a36Sopenharmony_ci * @rx_list:	Downlink skbuf list received from CP
8662306a36Sopenharmony_ci * @read_sem:	Needed for the blocking read or downlink transfer
8762306a36Sopenharmony_ci * @channel_id: Reserved channel id for flashing/CD collection to RAM
8862306a36Sopenharmony_ci * @channel:	Channel instance for flashing and coredump
8962306a36Sopenharmony_ci * @devlink_read_pend: Check if read is pending
9062306a36Sopenharmony_ci */
9162306a36Sopenharmony_cistruct iosm_devlink_sio {
9262306a36Sopenharmony_ci	struct sk_buff_head rx_list;
9362306a36Sopenharmony_ci	struct completion read_sem;
9462306a36Sopenharmony_ci	int channel_id;
9562306a36Sopenharmony_ci	struct ipc_mem_channel *channel;
9662306a36Sopenharmony_ci	u32 devlink_read_pend;
9762306a36Sopenharmony_ci};
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci/**
10062306a36Sopenharmony_ci * struct iosm_flash_params - List of flash params required for flashing
10162306a36Sopenharmony_ci * @erase_full_flash:   To set the flashing mode
10262306a36Sopenharmony_ci *                      erase_full_flash = 1; full erase
10362306a36Sopenharmony_ci *                      erase_full_flash = 0; no erase
10462306a36Sopenharmony_ci * @erase_full_flash_done: Flag to check if it is a full erase
10562306a36Sopenharmony_ci */
10662306a36Sopenharmony_cistruct iosm_flash_params {
10762306a36Sopenharmony_ci	u8 erase_full_flash;
10862306a36Sopenharmony_ci	u8 erase_full_flash_done;
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci/**
11262306a36Sopenharmony_ci * struct iosm_devlink_image - Structure with Fls file header info
11362306a36Sopenharmony_ci * @magic_header:	Header of the firmware image
11462306a36Sopenharmony_ci * @image_type:		Firmware image type
11562306a36Sopenharmony_ci * @region_address:	Address of the region to be flashed
11662306a36Sopenharmony_ci * @download_region:	Field to identify if it is a region
11762306a36Sopenharmony_ci * @last_region:	Field to identify if it is last region
11862306a36Sopenharmony_ci * @reserved:		Reserved field
11962306a36Sopenharmony_ci */
12062306a36Sopenharmony_cistruct iosm_devlink_image {
12162306a36Sopenharmony_ci	char magic_header[IOSM_DEVLINK_MAGIC_HEADER_LEN];
12262306a36Sopenharmony_ci	char image_type[IOSM_DEVLINK_IMG_TYPE];
12362306a36Sopenharmony_ci	__le32 region_address;
12462306a36Sopenharmony_ci	u8 download_region;
12562306a36Sopenharmony_ci	u8 last_region;
12662306a36Sopenharmony_ci	u8 reserved[IOSM_DEVLINK_RESERVED];
12762306a36Sopenharmony_ci} __packed;
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci/**
13062306a36Sopenharmony_ci * struct iosm_ebl_ctx_data -  EBL ctx data used during flashing
13162306a36Sopenharmony_ci * @ebl_sw_info_version: SWID version info obtained from EBL
13262306a36Sopenharmony_ci * @m_ebl_resp:         Buffer used to read and write the ebl data
13362306a36Sopenharmony_ci */
13462306a36Sopenharmony_cistruct iosm_ebl_ctx_data {
13562306a36Sopenharmony_ci	u8 ebl_sw_info_version;
13662306a36Sopenharmony_ci	u8 m_ebl_resp[IOSM_EBL_RSP_SIZE];
13762306a36Sopenharmony_ci};
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci/**
14062306a36Sopenharmony_ci * struct iosm_coredump_file_info -  Coredump file info
14162306a36Sopenharmony_ci * @filename:		Name of coredump file
14262306a36Sopenharmony_ci * @default_size:	Default size of coredump file
14362306a36Sopenharmony_ci * @actual_size:	Actual size of coredump file
14462306a36Sopenharmony_ci * @entry:		Index of the coredump file
14562306a36Sopenharmony_ci */
14662306a36Sopenharmony_cistruct iosm_coredump_file_info {
14762306a36Sopenharmony_ci	char filename[IOSM_MAX_FILENAME_LEN];
14862306a36Sopenharmony_ci	u32 default_size;
14962306a36Sopenharmony_ci	u32 actual_size;
15062306a36Sopenharmony_ci	u32 entry;
15162306a36Sopenharmony_ci};
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci/**
15462306a36Sopenharmony_ci * struct iosm_devlink - IOSM Devlink structure
15562306a36Sopenharmony_ci * @devlink_sio:        SIO instance for read/write functionality
15662306a36Sopenharmony_ci * @pcie:               Pointer to PCIe component
15762306a36Sopenharmony_ci * @dev:                Pointer to device struct
15862306a36Sopenharmony_ci * @devlink_ctx:	Pointer to devlink context
15962306a36Sopenharmony_ci * @param:		Params required for flashing
16062306a36Sopenharmony_ci * @ebl_ctx:		Data to be read and written to Modem
16162306a36Sopenharmony_ci * @cd_file_info:	coredump file info
16262306a36Sopenharmony_ci * @iosm_devlink_mdm_coredump:	region ops for coredump collection
16362306a36Sopenharmony_ci * @cd_regions:		coredump regions
16462306a36Sopenharmony_ci */
16562306a36Sopenharmony_cistruct iosm_devlink {
16662306a36Sopenharmony_ci	struct iosm_devlink_sio devlink_sio;
16762306a36Sopenharmony_ci	struct iosm_pcie *pcie;
16862306a36Sopenharmony_ci	struct device *dev;
16962306a36Sopenharmony_ci	struct devlink *devlink_ctx;
17062306a36Sopenharmony_ci	struct iosm_flash_params param;
17162306a36Sopenharmony_ci	struct iosm_ebl_ctx_data ebl_ctx;
17262306a36Sopenharmony_ci	struct iosm_coredump_file_info *cd_file_info;
17362306a36Sopenharmony_ci	struct devlink_region_ops iosm_devlink_mdm_coredump[IOSM_NOF_CD_REGION];
17462306a36Sopenharmony_ci	struct devlink_region *cd_regions[IOSM_NOF_CD_REGION];
17562306a36Sopenharmony_ci};
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci/**
17862306a36Sopenharmony_ci * union iosm_rpsi_param_u - RPSI cmd param for CRC calculation
17962306a36Sopenharmony_ci * @word:	Words member used in CRC calculation
18062306a36Sopenharmony_ci * @dword:	Actual data
18162306a36Sopenharmony_ci */
18262306a36Sopenharmony_ciunion iosm_rpsi_param_u {
18362306a36Sopenharmony_ci	__le16 word[2];
18462306a36Sopenharmony_ci	__le32 dword;
18562306a36Sopenharmony_ci};
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci/**
18862306a36Sopenharmony_ci * struct iosm_rpsi_cmd - Structure for RPSI Command
18962306a36Sopenharmony_ci * @param:      Used to calculate CRC
19062306a36Sopenharmony_ci * @cmd:        Stores the RPSI command
19162306a36Sopenharmony_ci * @crc:        Stores the CRC value
19262306a36Sopenharmony_ci */
19362306a36Sopenharmony_cistruct iosm_rpsi_cmd {
19462306a36Sopenharmony_ci	union iosm_rpsi_param_u param;
19562306a36Sopenharmony_ci	__le16	cmd;
19662306a36Sopenharmony_ci	__le16	crc;
19762306a36Sopenharmony_ci};
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cistruct iosm_devlink *ipc_devlink_init(struct iosm_imem *ipc_imem);
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_civoid ipc_devlink_deinit(struct iosm_devlink *ipc_devlink);
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ciint ipc_devlink_send_cmd(struct iosm_devlink *ipc_devlink, u16 cmd, u32 entry);
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci#endif /* _IOSM_IPC_DEVLINK_H */
206