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