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