206 lines
6.0 KiB
C
206 lines
6.0 KiB
C
/* 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 */
|