1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 2 /* QLogic qed NIC Driver 3 * Copyright (c) 2015-2017 QLogic Corporation 4 * Copyright (c) 2019-2020 Marvell International Ltd. 5 */ 6 7 #ifndef _QED_HW_H 8 #define _QED_HW_H 9 10 #include <linux/types.h> 11 #include <linux/bitops.h> 12 #include <linux/slab.h> 13 #include <linux/string.h> 14 #include "qed.h" 15 #include "qed_dev_api.h" 16 17 /* Forward decleration */ 18 struct qed_ptt; 19 20 enum reserved_ptts { 21 RESERVED_PTT_EDIAG, 22 RESERVED_PTT_USER_SPACE, 23 RESERVED_PTT_MAIN, 24 RESERVED_PTT_DPC, 25 RESERVED_PTT_MAX 26 }; 27 28 enum _dmae_cmd_dst_mask { 29 DMAE_CMD_DST_MASK_NONE = 0, 30 DMAE_CMD_DST_MASK_PCIE = 1, 31 DMAE_CMD_DST_MASK_GRC = 2 32 }; 33 34 enum _dmae_cmd_src_mask { 35 DMAE_CMD_SRC_MASK_PCIE = 0, 36 DMAE_CMD_SRC_MASK_GRC = 1 37 }; 38 39 enum _dmae_cmd_crc_mask { 40 DMAE_CMD_COMP_CRC_EN_MASK_NONE = 0, 41 DMAE_CMD_COMP_CRC_EN_MASK_SET = 1 42 }; 43 44 /* definitions for DMA constants */ 45 #define DMAE_GO_VALUE 0x1 46 47 #define DMAE_COMPLETION_VAL 0xD1AE 48 #define DMAE_CMD_ENDIANITY 0x2 49 50 #define DMAE_CMD_SIZE 14 51 #define DMAE_CMD_SIZE_TO_FILL (DMAE_CMD_SIZE - 5) 52 #define DMAE_MIN_WAIT_TIME 0x2 53 #define DMAE_MAX_CLIENTS 32 54 55 /** 56 * qed_gtt_init(): Initialize GTT windows. 57 * 58 * @p_hwfn: HW device data. 59 * 60 * Return: Void. 61 */ 62 void qed_gtt_init(struct qed_hwfn *p_hwfn); 63 64 /** 65 * qed_ptt_pool_alloc(): Allocate and initialize PTT pool. 66 * 67 * @p_hwfn: HW device data. 68 * 69 * Return: struct _qed_status - success (0), negative - error. 70 */ 71 int qed_ptt_pool_alloc(struct qed_hwfn *p_hwfn); 72 73 /** 74 * qed_ptt_pool_free(): Free PTT pool. 75 * 76 * @p_hwfn: HW device data. 77 * 78 * Return: Void. 79 */ 80 void qed_ptt_pool_free(struct qed_hwfn *p_hwfn); 81 82 /** 83 * qed_ptt_get_hw_addr(): Get PTT's GRC/HW address. 84 * 85 * @p_hwfn: HW device data. 86 * @p_ptt: P_ptt 87 * 88 * Return: u32. 89 */ 90 u32 qed_ptt_get_hw_addr(struct qed_hwfn *p_hwfn, 91 struct qed_ptt *p_ptt); 92 93 /** 94 * qed_ptt_get_bar_addr(): Get PPT's external BAR address. 95 * 96 * @p_ptt: P_ptt 97 * 98 * Return: u32. 99 */ 100 u32 qed_ptt_get_bar_addr(struct qed_ptt *p_ptt); 101 102 /** 103 * qed_ptt_set_win(): Set PTT Window's GRC BAR address 104 * 105 * @p_hwfn: HW device data. 106 * @new_hw_addr: New HW address. 107 * @p_ptt: P_Ptt 108 * 109 * Return: Void. 110 */ 111 void qed_ptt_set_win(struct qed_hwfn *p_hwfn, 112 struct qed_ptt *p_ptt, 113 u32 new_hw_addr); 114 115 /** 116 * qed_get_reserved_ptt(): Get a specific reserved PTT. 117 * 118 * @p_hwfn: HW device data. 119 * @ptt_idx: Ptt Index. 120 * 121 * Return: struct qed_ptt *. 122 */ 123 struct qed_ptt *qed_get_reserved_ptt(struct qed_hwfn *p_hwfn, 124 enum reserved_ptts ptt_idx); 125 126 /** 127 * qed_wr(): Write value to BAR using the given ptt. 128 * 129 * @p_hwfn: HW device data. 130 * @p_ptt: P_ptt. 131 * @val: Val. 132 * @hw_addr: HW address 133 * 134 * Return: Void. 135 */ 136 void qed_wr(struct qed_hwfn *p_hwfn, 137 struct qed_ptt *p_ptt, 138 u32 hw_addr, 139 u32 val); 140 141 /** 142 * qed_rd(): Read value from BAR using the given ptt. 143 * 144 * @p_hwfn: HW device data. 145 * @p_ptt: P_ptt. 146 * @hw_addr: HW address 147 * 148 * Return: Void. 149 */ 150 u32 qed_rd(struct qed_hwfn *p_hwfn, 151 struct qed_ptt *p_ptt, 152 u32 hw_addr); 153 154 /** 155 * qed_memcpy_from(): Copy n bytes from BAR using the given ptt. 156 * 157 * @p_hwfn: HW device data. 158 * @p_ptt: P_ptt. 159 * @dest: Destination. 160 * @hw_addr: HW address. 161 * @n: N 162 * 163 * Return: Void. 164 */ 165 void qed_memcpy_from(struct qed_hwfn *p_hwfn, 166 struct qed_ptt *p_ptt, 167 void *dest, 168 u32 hw_addr, 169 size_t n); 170 171 /** 172 * qed_memcpy_to(): Copy n bytes to BAR using the given ptt 173 * 174 * @p_hwfn: HW device data. 175 * @p_ptt: P_ptt. 176 * @hw_addr: HW address. 177 * @src: Source. 178 * @n: N 179 * 180 * Return: Void. 181 */ 182 void qed_memcpy_to(struct qed_hwfn *p_hwfn, 183 struct qed_ptt *p_ptt, 184 u32 hw_addr, 185 void *src, 186 size_t n); 187 /** 188 * qed_fid_pretend(): pretend to another function when 189 * accessing the ptt window. There is no way to unpretend 190 * a function. The only way to cancel a pretend is to 191 * pretend back to the original function. 192 * 193 * @p_hwfn: HW device data. 194 * @p_ptt: P_ptt. 195 * @fid: fid field of pxp_pretend structure. Can contain 196 * either pf / vf, port/path fields are don't care. 197 * 198 * Return: Void. 199 */ 200 void qed_fid_pretend(struct qed_hwfn *p_hwfn, 201 struct qed_ptt *p_ptt, 202 u16 fid); 203 204 /** 205 * qed_port_pretend(): Pretend to another port when accessing the ptt window 206 * 207 * @p_hwfn: HW device data. 208 * @p_ptt: P_ptt. 209 * @port_id: The port to pretend to 210 * 211 * Return: Void. 212 */ 213 void qed_port_pretend(struct qed_hwfn *p_hwfn, 214 struct qed_ptt *p_ptt, 215 u8 port_id); 216 217 /** 218 * qed_port_unpretend(): Cancel any previously set port pretend 219 * 220 * @p_hwfn: HW device data. 221 * @p_ptt: P_ptt. 222 * 223 * Return: Void. 224 */ 225 void qed_port_unpretend(struct qed_hwfn *p_hwfn, 226 struct qed_ptt *p_ptt); 227 228 /** 229 * qed_port_fid_pretend(): Pretend to another port and another function 230 * when accessing the ptt window 231 * 232 * @p_hwfn: HW device data. 233 * @p_ptt: P_ptt. 234 * @port_id: The port to pretend to 235 * @fid: fid field of pxp_pretend structure. Can contain either pf / vf. 236 * 237 * Return: Void. 238 */ 239 void qed_port_fid_pretend(struct qed_hwfn *p_hwfn, 240 struct qed_ptt *p_ptt, u8 port_id, u16 fid); 241 242 /** 243 * qed_vfid_to_concrete(): Build a concrete FID for a given VF ID 244 * 245 * @p_hwfn: HW device data. 246 * @vfid: VFID. 247 * 248 * Return: Void. 249 */ 250 u32 qed_vfid_to_concrete(struct qed_hwfn *p_hwfn, u8 vfid); 251 252 /** 253 * qed_dmae_idx_to_go_cmd(): Map the idx to dmae cmd 254 * this is declared here since other files will require it. 255 * 256 * @idx: Index 257 * 258 * Return: Void. 259 */ 260 u32 qed_dmae_idx_to_go_cmd(u8 idx); 261 262 /** 263 * qed_dmae_info_alloc(): Init the dmae_info structure 264 * which is part of p_hwfn. 265 * 266 * @p_hwfn: HW device data. 267 * 268 * Return: Int. 269 */ 270 int qed_dmae_info_alloc(struct qed_hwfn *p_hwfn); 271 272 /** 273 * qed_dmae_info_free(): Free the dmae_info structure 274 * which is part of p_hwfn. 275 * 276 * @p_hwfn: HW device data. 277 * 278 * Return: Void. 279 */ 280 void qed_dmae_info_free(struct qed_hwfn *p_hwfn); 281 282 union qed_qm_pq_params { 283 struct { 284 u8 q_idx; 285 } iscsi; 286 287 struct { 288 u8 tc; 289 } core; 290 291 struct { 292 u8 is_vf; 293 u8 vf_id; 294 u8 tc; 295 } eth; 296 297 struct { 298 u8 dcqcn; 299 u8 qpid; /* roce relative */ 300 } roce; 301 }; 302 303 int qed_init_fw_data(struct qed_dev *cdev, 304 const u8 *fw_data); 305 306 int qed_dmae_sanity(struct qed_hwfn *p_hwfn, 307 struct qed_ptt *p_ptt, const char *phase); 308 309 #define QED_HW_ERR_MAX_STR_SIZE 256 310 311 /** 312 * qed_hw_err_notify(): Notify upper layer driver and management FW 313 * about a HW error. 314 * 315 * @p_hwfn: HW device data. 316 * @p_ptt: P_ptt. 317 * @err_type: Err Type. 318 * @fmt: Debug data buffer to send to the MFW 319 * @...: buffer format args 320 * 321 * Return void. 322 */ 323 void __printf(4, 5) __cold qed_hw_err_notify(struct qed_hwfn *p_hwfn, 324 struct qed_ptt *p_ptt, 325 enum qed_hw_err_type err_type, 326 const char *fmt, ...); 327 #endif 328