1 /* SPDX-License-Identifier: GPL-2.0-only 2 * 3 * Copyright (C) 2020-2021 Intel Corporation. 4 */ 5 6 #ifndef _IOSM_IPC_DEVLINK_H_ 7 #define _IOSM_IPC_DEVLINK_H_ 8 9 #include <net/devlink.h> 10 11 #include "iosm_ipc_imem.h" 12 #include "iosm_ipc_imem_ops.h" 13 #include "iosm_ipc_pcie.h" 14 15 /* Image ext max len */ 16 #define IOSM_DEVLINK_MAX_IMG_LEN 3 17 /* Magic Header */ 18 #define IOSM_DEVLINK_MAGIC_HEADER "IOSM_DEVLINK_HEADER" 19 /* Magic Header len */ 20 #define IOSM_DEVLINK_MAGIC_HEADER_LEN 20 21 /* Devlink image type */ 22 #define IOSM_DEVLINK_IMG_TYPE 4 23 /* Reserve header size */ 24 #define IOSM_DEVLINK_RESERVED 34 25 /* Devlink Image Header size */ 26 #define IOSM_DEVLINK_HDR_SIZE sizeof(struct iosm_devlink_image) 27 /* MAX file name length */ 28 #define IOSM_MAX_FILENAME_LEN 32 29 /* EBL response size */ 30 #define IOSM_EBL_RSP_SIZE 76 31 /* MAX number of regions supported */ 32 #define IOSM_NOF_CD_REGION 6 33 /* MAX number of SNAPSHOTS supported */ 34 #define MAX_SNAPSHOTS 1 35 /* Default Coredump file size */ 36 #define REPORT_JSON_SIZE 0x800 37 #define COREDUMP_FCD_SIZE 0x10E00000 38 #define CDD_LOG_SIZE 0x30000 39 #define EEPROM_BIN_SIZE 0x10000 40 #define BOOTCORE_TRC_BIN_SIZE 0x8000 41 #define BOOTCORE_PREV_TRC_BIN_SIZE 0x20000 42 43 /** 44 * enum iosm_devlink_param_id - Enum type to different devlink params 45 * @IOSM_DEVLINK_PARAM_ID_BASE: Devlink param base ID 46 * @IOSM_DEVLINK_PARAM_ID_ERASE_FULL_FLASH: Set if full erase required 47 */ 48 49 enum iosm_devlink_param_id { 50 IOSM_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX, 51 IOSM_DEVLINK_PARAM_ID_ERASE_FULL_FLASH, 52 }; 53 54 /** 55 * enum iosm_rpsi_cmd_code - Enum type for RPSI command list 56 * @rpsi_cmd_code_ebl: Command to load ebl 57 * @rpsi_cmd_coredump_start: Command to get list of files and 58 * file size info from PSI 59 * @rpsi_cmd_coredump_get: Command to get the coredump data 60 * @rpsi_cmd_coredump_end: Command to stop receiving the coredump 61 */ 62 enum iosm_rpsi_cmd_code { 63 rpsi_cmd_code_ebl = 0x02, 64 rpsi_cmd_coredump_start = 0x10, 65 rpsi_cmd_coredump_get = 0x11, 66 rpsi_cmd_coredump_end = 0x12, 67 }; 68 69 /** 70 * enum iosm_flash_comp_type - Enum for different flash component types 71 * @FLASH_COMP_TYPE_PSI: PSI flash comp type 72 * @FLASH_COMP_TYPE_EBL: EBL flash comp type 73 * @FLASH_COMP_TYPE_FLS: FLS flash comp type 74 * @FLASH_COMP_TYPE_INVAL: Invalid flash comp type 75 */ 76 enum iosm_flash_comp_type { 77 FLASH_COMP_TYPE_PSI, 78 FLASH_COMP_TYPE_EBL, 79 FLASH_COMP_TYPE_FLS, 80 FLASH_COMP_TYPE_INVAL, 81 }; 82 83 /** 84 * struct iosm_devlink_sio - SIO instance 85 * @rx_list: Downlink skbuf list received from CP 86 * @read_sem: Needed for the blocking read or downlink transfer 87 * @channel_id: Reserved channel id for flashing/CD collection to RAM 88 * @channel: Channel instance for flashing and coredump 89 * @devlink_read_pend: Check if read is pending 90 */ 91 struct iosm_devlink_sio { 92 struct sk_buff_head rx_list; 93 struct completion read_sem; 94 int channel_id; 95 struct ipc_mem_channel *channel; 96 u32 devlink_read_pend; 97 }; 98 99 /** 100 * struct iosm_flash_params - List of flash params required for flashing 101 * @erase_full_flash: To set the flashing mode 102 * erase_full_flash = 1; full erase 103 * erase_full_flash = 0; no erase 104 * @erase_full_flash_done: Flag to check if it is a full erase 105 */ 106 struct iosm_flash_params { 107 u8 erase_full_flash; 108 u8 erase_full_flash_done; 109 }; 110 111 /** 112 * struct iosm_devlink_image - Structure with Fls file header info 113 * @magic_header: Header of the firmware image 114 * @image_type: Firmware image type 115 * @region_address: Address of the region to be flashed 116 * @download_region: Field to identify if it is a region 117 * @last_region: Field to identify if it is last region 118 * @reserved: Reserved field 119 */ 120 struct iosm_devlink_image { 121 char magic_header[IOSM_DEVLINK_MAGIC_HEADER_LEN]; 122 char image_type[IOSM_DEVLINK_IMG_TYPE]; 123 __le32 region_address; 124 u8 download_region; 125 u8 last_region; 126 u8 reserved[IOSM_DEVLINK_RESERVED]; 127 } __packed; 128 129 /** 130 * struct iosm_ebl_ctx_data - EBL ctx data used during flashing 131 * @ebl_sw_info_version: SWID version info obtained from EBL 132 * @m_ebl_resp: Buffer used to read and write the ebl data 133 */ 134 struct iosm_ebl_ctx_data { 135 u8 ebl_sw_info_version; 136 u8 m_ebl_resp[IOSM_EBL_RSP_SIZE]; 137 }; 138 139 /** 140 * struct iosm_coredump_file_info - Coredump file info 141 * @filename: Name of coredump file 142 * @default_size: Default size of coredump file 143 * @actual_size: Actual size of coredump file 144 * @entry: Index of the coredump file 145 */ 146 struct iosm_coredump_file_info { 147 char filename[IOSM_MAX_FILENAME_LEN]; 148 u32 default_size; 149 u32 actual_size; 150 u32 entry; 151 }; 152 153 /** 154 * struct iosm_devlink - IOSM Devlink structure 155 * @devlink_sio: SIO instance for read/write functionality 156 * @pcie: Pointer to PCIe component 157 * @dev: Pointer to device struct 158 * @devlink_ctx: Pointer to devlink context 159 * @param: Params required for flashing 160 * @ebl_ctx: Data to be read and written to Modem 161 * @cd_file_info: coredump file info 162 * @iosm_devlink_mdm_coredump: region ops for coredump collection 163 * @cd_regions: coredump regions 164 */ 165 struct iosm_devlink { 166 struct iosm_devlink_sio devlink_sio; 167 struct iosm_pcie *pcie; 168 struct device *dev; 169 struct devlink *devlink_ctx; 170 struct iosm_flash_params param; 171 struct iosm_ebl_ctx_data ebl_ctx; 172 struct iosm_coredump_file_info *cd_file_info; 173 struct devlink_region_ops iosm_devlink_mdm_coredump[IOSM_NOF_CD_REGION]; 174 struct devlink_region *cd_regions[IOSM_NOF_CD_REGION]; 175 }; 176 177 /** 178 * union iosm_rpsi_param_u - RPSI cmd param for CRC calculation 179 * @word: Words member used in CRC calculation 180 * @dword: Actual data 181 */ 182 union iosm_rpsi_param_u { 183 __le16 word[2]; 184 __le32 dword; 185 }; 186 187 /** 188 * struct iosm_rpsi_cmd - Structure for RPSI Command 189 * @param: Used to calculate CRC 190 * @cmd: Stores the RPSI command 191 * @crc: Stores the CRC value 192 */ 193 struct iosm_rpsi_cmd { 194 union iosm_rpsi_param_u param; 195 __le16 cmd; 196 __le16 crc; 197 }; 198 199 struct iosm_devlink *ipc_devlink_init(struct iosm_imem *ipc_imem); 200 201 void ipc_devlink_deinit(struct iosm_devlink *ipc_devlink); 202 203 int ipc_devlink_send_cmd(struct iosm_devlink *ipc_devlink, u16 cmd, u32 entry); 204 205 #endif /* _IOSM_IPC_DEVLINK_H */ 206