/* 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 0 x800
#define COREDUMP_FCD_SIZE 0 x10E00000
#define CDD_LOG_SIZE 0 x30000
#define EEPROM_BIN_SIZE 0 x10000
#define BOOTCORE_TRC_BIN_SIZE 0 x8000
#define BOOTCORE_PREV_TRC_BIN_SIZE 0 x20000
/**
* 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 = 0 x02,
rpsi_cmd_coredump_start = 0 x10,
rpsi_cmd_coredump_get = 0 x11,
rpsi_cmd_coredump_end = 0 x12,
};
/**
* 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 */
Messung V0.5 in Prozent C=96 H=87 G=91
¤ Dauer der Verarbeitung: 0.7 Sekunden
(vorverarbeitet am 2026-10-11)
¤
*© Formatika GbR, Deutschland