1*14b24e2bSVaishali Kulkarni /* 2*14b24e2bSVaishali Kulkarni * CDDL HEADER START 3*14b24e2bSVaishali Kulkarni * 4*14b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the 5*14b24e2bSVaishali Kulkarni * Common Development and Distribution License, v.1, (the "License"). 6*14b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License. 7*14b24e2bSVaishali Kulkarni * 8*14b24e2bSVaishali Kulkarni * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*14b24e2bSVaishali Kulkarni * or http://opensource.org/licenses/CDDL-1.0. 10*14b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions 11*14b24e2bSVaishali Kulkarni * and limitations under the License. 12*14b24e2bSVaishali Kulkarni * 13*14b24e2bSVaishali Kulkarni * When distributing Covered Code, include this CDDL HEADER in each 14*14b24e2bSVaishali Kulkarni * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*14b24e2bSVaishali Kulkarni * If applicable, add the following below this CDDL HEADER, with the 16*14b24e2bSVaishali Kulkarni * fields enclosed by brackets "[]" replaced with your own identifying 17*14b24e2bSVaishali Kulkarni * information: Portions Copyright [yyyy] [name of copyright owner] 18*14b24e2bSVaishali Kulkarni * 19*14b24e2bSVaishali Kulkarni * CDDL HEADER END 20*14b24e2bSVaishali Kulkarni */ 21*14b24e2bSVaishali Kulkarni 22*14b24e2bSVaishali Kulkarni /* 23*14b24e2bSVaishali Kulkarni * Copyright 2014-2017 Cavium, Inc. 24*14b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the Common Development 25*14b24e2bSVaishali Kulkarni * and Distribution License, v.1, (the "License"). 26*14b24e2bSVaishali Kulkarni 27*14b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License. 28*14b24e2bSVaishali Kulkarni 29*14b24e2bSVaishali Kulkarni * You can obtain a copy of the License at available 30*14b24e2bSVaishali Kulkarni * at http://opensource.org/licenses/CDDL-1.0 31*14b24e2bSVaishali Kulkarni 32*14b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions and 33*14b24e2bSVaishali Kulkarni * limitations under the License. 34*14b24e2bSVaishali Kulkarni */ 35*14b24e2bSVaishali Kulkarni 36*14b24e2bSVaishali Kulkarni #ifndef __ECORE_MCP_H__ 37*14b24e2bSVaishali Kulkarni #define __ECORE_MCP_H__ 38*14b24e2bSVaishali Kulkarni 39*14b24e2bSVaishali Kulkarni #include "bcm_osal.h" 40*14b24e2bSVaishali Kulkarni #include "mcp_public.h" 41*14b24e2bSVaishali Kulkarni #include "ecore.h" 42*14b24e2bSVaishali Kulkarni #include "ecore_mcp_api.h" 43*14b24e2bSVaishali Kulkarni #include "ecore_dev_api.h" 44*14b24e2bSVaishali Kulkarni 45*14b24e2bSVaishali Kulkarni /* Using hwfn number (and not pf_num) is required since in CMT mode, 46*14b24e2bSVaishali Kulkarni * same pf_num may be used by two different hwfn 47*14b24e2bSVaishali Kulkarni * TODO - this shouldn't really be in .h file, but until all fields 48*14b24e2bSVaishali Kulkarni * required during hw-init will be placed in their correct place in shmem 49*14b24e2bSVaishali Kulkarni * we need it in ecore_dev.c [for readin the nvram reflection in shmem]. 50*14b24e2bSVaishali Kulkarni */ 51*14b24e2bSVaishali Kulkarni #define MCP_PF_ID_BY_REL(p_hwfn, rel_pfid) (ECORE_IS_BB((p_hwfn)->p_dev) ? \ 52*14b24e2bSVaishali Kulkarni ((rel_pfid) | \ 53*14b24e2bSVaishali Kulkarni ((p_hwfn)->abs_pf_id & 1) << 3) : \ 54*14b24e2bSVaishali Kulkarni rel_pfid) 55*14b24e2bSVaishali Kulkarni #define MCP_PF_ID(p_hwfn) MCP_PF_ID_BY_REL(p_hwfn, (p_hwfn)->rel_pf_id) 56*14b24e2bSVaishali Kulkarni 57*14b24e2bSVaishali Kulkarni #define MFW_PORT(_p_hwfn) ((_p_hwfn)->abs_pf_id % \ 58*14b24e2bSVaishali Kulkarni ((_p_hwfn)->p_dev->num_ports_in_engine * \ 59*14b24e2bSVaishali Kulkarni ecore_device_num_engines((_p_hwfn)->p_dev))) 60*14b24e2bSVaishali Kulkarni 61*14b24e2bSVaishali Kulkarni struct ecore_mcp_info { 62*14b24e2bSVaishali Kulkarni /* Spinlock used for protecting the access to the MFW mailbox */ 63*14b24e2bSVaishali Kulkarni osal_spinlock_t lock; 64*14b24e2bSVaishali Kulkarni 65*14b24e2bSVaishali Kulkarni /* Spinglock used for syncing SW link-changes and link-changes 66*14b24e2bSVaishali Kulkarni * originating from attention context. 67*14b24e2bSVaishali Kulkarni */ 68*14b24e2bSVaishali Kulkarni osal_spinlock_t link_lock; 69*14b24e2bSVaishali Kulkarni 70*14b24e2bSVaishali Kulkarni /* Flag to indicate whether sending a MFW mailbox is forbidden */ 71*14b24e2bSVaishali Kulkarni bool block_mb_sending; 72*14b24e2bSVaishali Kulkarni 73*14b24e2bSVaishali Kulkarni /* Address of the MCP public area */ 74*14b24e2bSVaishali Kulkarni u32 public_base; 75*14b24e2bSVaishali Kulkarni /* Address of the driver mailbox */ 76*14b24e2bSVaishali Kulkarni u32 drv_mb_addr; 77*14b24e2bSVaishali Kulkarni /* Address of the MFW mailbox */ 78*14b24e2bSVaishali Kulkarni u32 mfw_mb_addr; 79*14b24e2bSVaishali Kulkarni /* Address of the port configuration (link) */ 80*14b24e2bSVaishali Kulkarni u32 port_addr; 81*14b24e2bSVaishali Kulkarni 82*14b24e2bSVaishali Kulkarni /* Current driver mailbox sequence */ 83*14b24e2bSVaishali Kulkarni u16 drv_mb_seq; 84*14b24e2bSVaishali Kulkarni /* Current driver pulse sequence */ 85*14b24e2bSVaishali Kulkarni u16 drv_pulse_seq; 86*14b24e2bSVaishali Kulkarni 87*14b24e2bSVaishali Kulkarni struct ecore_mcp_link_params link_input; 88*14b24e2bSVaishali Kulkarni struct ecore_mcp_link_state link_output; 89*14b24e2bSVaishali Kulkarni struct ecore_mcp_link_capabilities link_capabilities; 90*14b24e2bSVaishali Kulkarni 91*14b24e2bSVaishali Kulkarni struct ecore_mcp_function_info func_info; 92*14b24e2bSVaishali Kulkarni 93*14b24e2bSVaishali Kulkarni u8 *mfw_mb_cur; 94*14b24e2bSVaishali Kulkarni u8 *mfw_mb_shadow; 95*14b24e2bSVaishali Kulkarni u16 mfw_mb_length; 96*14b24e2bSVaishali Kulkarni u16 mcp_hist; 97*14b24e2bSVaishali Kulkarni 98*14b24e2bSVaishali Kulkarni /* Capabilties negotiated with the MFW */ 99*14b24e2bSVaishali Kulkarni u32 capabilities; 100*14b24e2bSVaishali Kulkarni }; 101*14b24e2bSVaishali Kulkarni 102*14b24e2bSVaishali Kulkarni struct ecore_mcp_mb_params { 103*14b24e2bSVaishali Kulkarni u32 cmd; 104*14b24e2bSVaishali Kulkarni u32 param; 105*14b24e2bSVaishali Kulkarni void *p_data_src; 106*14b24e2bSVaishali Kulkarni u8 data_src_size; 107*14b24e2bSVaishali Kulkarni void *p_data_dst; 108*14b24e2bSVaishali Kulkarni u8 data_dst_size; 109*14b24e2bSVaishali Kulkarni u32 mcp_resp; 110*14b24e2bSVaishali Kulkarni u32 mcp_param; 111*14b24e2bSVaishali Kulkarni }; 112*14b24e2bSVaishali Kulkarni 113*14b24e2bSVaishali Kulkarni enum ecore_ov_eswitch { 114*14b24e2bSVaishali Kulkarni ECORE_OV_ESWITCH_NONE, 115*14b24e2bSVaishali Kulkarni ECORE_OV_ESWITCH_VEB, 116*14b24e2bSVaishali Kulkarni ECORE_OV_ESWITCH_VEPA 117*14b24e2bSVaishali Kulkarni }; 118*14b24e2bSVaishali Kulkarni 119*14b24e2bSVaishali Kulkarni struct ecore_drv_tlv_hdr { 120*14b24e2bSVaishali Kulkarni u8 tlv_type; /* According to the enum below */ 121*14b24e2bSVaishali Kulkarni u8 tlv_length; /* In dwords - not including this header */ 122*14b24e2bSVaishali Kulkarni u8 tlv_reserved; 123*14b24e2bSVaishali Kulkarni #define ECORE_DRV_TLV_FLAGS_CHANGED 0x01 124*14b24e2bSVaishali Kulkarni u8 tlv_flags; 125*14b24e2bSVaishali Kulkarni }; 126*14b24e2bSVaishali Kulkarni 127*14b24e2bSVaishali Kulkarni /** 128*14b24e2bSVaishali Kulkarni * @brief Initialize the interface with the MCP 129*14b24e2bSVaishali Kulkarni * 130*14b24e2bSVaishali Kulkarni * @param p_hwfn - HW func 131*14b24e2bSVaishali Kulkarni * @param p_ptt - PTT required for register access 132*14b24e2bSVaishali Kulkarni * 133*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t 134*14b24e2bSVaishali Kulkarni */ 135*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_cmd_init(struct ecore_hwfn *p_hwfn, 136*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 137*14b24e2bSVaishali Kulkarni 138*14b24e2bSVaishali Kulkarni /** 139*14b24e2bSVaishali Kulkarni * @brief Intialize the port interface with the MCP 140*14b24e2bSVaishali Kulkarni * 141*14b24e2bSVaishali Kulkarni * @param p_hwfn 142*14b24e2bSVaishali Kulkarni * @param p_ptt 143*14b24e2bSVaishali Kulkarni * Can only be called after `num_ports_in_engine' is set 144*14b24e2bSVaishali Kulkarni */ 145*14b24e2bSVaishali Kulkarni void ecore_mcp_cmd_port_init(struct ecore_hwfn *p_hwfn, 146*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 147*14b24e2bSVaishali Kulkarni /** 148*14b24e2bSVaishali Kulkarni * @brief Releases resources allocated during the init process. 149*14b24e2bSVaishali Kulkarni * 150*14b24e2bSVaishali Kulkarni * @param p_hwfn - HW func 151*14b24e2bSVaishali Kulkarni * @param p_ptt - PTT required for register access 152*14b24e2bSVaishali Kulkarni * 153*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t 154*14b24e2bSVaishali Kulkarni */ 155*14b24e2bSVaishali Kulkarni 156*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_free(struct ecore_hwfn *p_hwfn); 157*14b24e2bSVaishali Kulkarni 158*14b24e2bSVaishali Kulkarni /** 159*14b24e2bSVaishali Kulkarni * @brief This function is called from the DPC context. After 160*14b24e2bSVaishali Kulkarni * pointing PTT to the mfw mb, check for events sent by the MCP 161*14b24e2bSVaishali Kulkarni * to the driver and ack them. In case a critical event 162*14b24e2bSVaishali Kulkarni * detected, it will be handled here, otherwise the work will be 163*14b24e2bSVaishali Kulkarni * queued to a sleepable work-queue. 164*14b24e2bSVaishali Kulkarni * 165*14b24e2bSVaishali Kulkarni * @param p_hwfn - HW function 166*14b24e2bSVaishali Kulkarni * @param p_ptt - PTT required for register access 167*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t - ECORE_SUCCESS - operation 168*14b24e2bSVaishali Kulkarni * was successul. 169*14b24e2bSVaishali Kulkarni */ 170*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_handle_events(struct ecore_hwfn *p_hwfn, 171*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 172*14b24e2bSVaishali Kulkarni 173*14b24e2bSVaishali Kulkarni /** 174*14b24e2bSVaishali Kulkarni * @brief When MFW doesn't get driver pulse for couple of seconds, at some 175*14b24e2bSVaishali Kulkarni * threshold before timeout expires, it will generate interrupt 176*14b24e2bSVaishali Kulkarni * through a dedicated status block (DPSB - Driver Pulse Status 177*14b24e2bSVaishali Kulkarni * Block), which the driver should respond immediately, by 178*14b24e2bSVaishali Kulkarni * providing keepalive indication after setting the PTT to the 179*14b24e2bSVaishali Kulkarni * driver-MFW mailbox. This function is called directly from the 180*14b24e2bSVaishali Kulkarni * DPC upon receiving the DPSB attention. 181*14b24e2bSVaishali Kulkarni * 182*14b24e2bSVaishali Kulkarni * @param p_hwfn - hw function 183*14b24e2bSVaishali Kulkarni * @param p_ptt - PTT required for register access 184*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t - ECORE_SUCCESS - operation 185*14b24e2bSVaishali Kulkarni * was successful. 186*14b24e2bSVaishali Kulkarni */ 187*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_issue_pulse(struct ecore_hwfn *p_hwfn, 188*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 189*14b24e2bSVaishali Kulkarni 190*14b24e2bSVaishali Kulkarni enum ecore_drv_role { 191*14b24e2bSVaishali Kulkarni ECORE_DRV_ROLE_OS, 192*14b24e2bSVaishali Kulkarni ECORE_DRV_ROLE_KDUMP, 193*14b24e2bSVaishali Kulkarni }; 194*14b24e2bSVaishali Kulkarni 195*14b24e2bSVaishali Kulkarni struct ecore_load_req_params { 196*14b24e2bSVaishali Kulkarni /* Input params */ 197*14b24e2bSVaishali Kulkarni enum ecore_drv_role drv_role; 198*14b24e2bSVaishali Kulkarni u8 timeout_val; /* 1..254, '0' - default value, '255' - no timeout */ 199*14b24e2bSVaishali Kulkarni bool avoid_eng_reset; 200*14b24e2bSVaishali Kulkarni enum ecore_override_force_load override_force_load; 201*14b24e2bSVaishali Kulkarni 202*14b24e2bSVaishali Kulkarni /* Output params */ 203*14b24e2bSVaishali Kulkarni u32 load_code; 204*14b24e2bSVaishali Kulkarni }; 205*14b24e2bSVaishali Kulkarni 206*14b24e2bSVaishali Kulkarni /** 207*14b24e2bSVaishali Kulkarni * @brief Sends a LOAD_REQ to the MFW, and in case the operation succeeds, 208*14b24e2bSVaishali Kulkarni * returns whether this PF is the first on the engine/port or function. 209*14b24e2bSVaishali Kulkarni * 210*14b24e2bSVaishali Kulkarni * @param p_hwfn 211*14b24e2bSVaishali Kulkarni * @param p_ptt 212*14b24e2bSVaishali Kulkarni * @param p_params 213*14b24e2bSVaishali Kulkarni * 214*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t - ECORE_SUCCESS - Operation was successful. 215*14b24e2bSVaishali Kulkarni */ 216*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_load_req(struct ecore_hwfn *p_hwfn, 217*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt, 218*14b24e2bSVaishali Kulkarni struct ecore_load_req_params *p_params); 219*14b24e2bSVaishali Kulkarni 220*14b24e2bSVaishali Kulkarni /** 221*14b24e2bSVaishali Kulkarni * @brief Sends a UNLOAD_REQ message to the MFW 222*14b24e2bSVaishali Kulkarni * 223*14b24e2bSVaishali Kulkarni * @param p_hwfn 224*14b24e2bSVaishali Kulkarni * @param p_ptt 225*14b24e2bSVaishali Kulkarni * 226*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t - ECORE_SUCCESS - Operation was successful. 227*14b24e2bSVaishali Kulkarni */ 228*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_unload_req(struct ecore_hwfn *p_hwfn, 229*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 230*14b24e2bSVaishali Kulkarni 231*14b24e2bSVaishali Kulkarni /** 232*14b24e2bSVaishali Kulkarni * @brief Sends a UNLOAD_DONE message to the MFW 233*14b24e2bSVaishali Kulkarni * 234*14b24e2bSVaishali Kulkarni * @param p_hwfn 235*14b24e2bSVaishali Kulkarni * @param p_ptt 236*14b24e2bSVaishali Kulkarni * 237*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t - ECORE_SUCCESS - Operation was successful. 238*14b24e2bSVaishali Kulkarni */ 239*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_unload_done(struct ecore_hwfn *p_hwfn, 240*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 241*14b24e2bSVaishali Kulkarni 242*14b24e2bSVaishali Kulkarni /** 243*14b24e2bSVaishali Kulkarni * @brief Read the MFW mailbox into Current buffer. 244*14b24e2bSVaishali Kulkarni * 245*14b24e2bSVaishali Kulkarni * @param p_hwfn 246*14b24e2bSVaishali Kulkarni * @param p_ptt 247*14b24e2bSVaishali Kulkarni */ 248*14b24e2bSVaishali Kulkarni void ecore_mcp_read_mb(struct ecore_hwfn *p_hwfn, 249*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 250*14b24e2bSVaishali Kulkarni 251*14b24e2bSVaishali Kulkarni /** 252*14b24e2bSVaishali Kulkarni * @brief Ack to mfw that driver finished FLR process for VFs 253*14b24e2bSVaishali Kulkarni * 254*14b24e2bSVaishali Kulkarni * @param p_hwfn 255*14b24e2bSVaishali Kulkarni * @param p_ptt 256*14b24e2bSVaishali Kulkarni * @param vfs_to_ack - bit mask of all engine VFs for which the PF acks. 257*14b24e2bSVaishali Kulkarni * 258*14b24e2bSVaishali Kulkarni * @param return enum _ecore_status_t - ECORE_SUCCESS upon success. 259*14b24e2bSVaishali Kulkarni */ 260*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_ack_vf_flr(struct ecore_hwfn *p_hwfn, 261*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt, 262*14b24e2bSVaishali Kulkarni u32 *vfs_to_ack); 263*14b24e2bSVaishali Kulkarni 264*14b24e2bSVaishali Kulkarni /** 265*14b24e2bSVaishali Kulkarni * @brief - calls during init to read shmem of all function-related info. 266*14b24e2bSVaishali Kulkarni * 267*14b24e2bSVaishali Kulkarni * @param p_hwfn 268*14b24e2bSVaishali Kulkarni * 269*14b24e2bSVaishali Kulkarni * @param return ECORE_SUCCESS upon success. 270*14b24e2bSVaishali Kulkarni */ 271*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_fill_shmem_func_info(struct ecore_hwfn *p_hwfn, 272*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 273*14b24e2bSVaishali Kulkarni 274*14b24e2bSVaishali Kulkarni /** 275*14b24e2bSVaishali Kulkarni * @brief - Reset the MCP using mailbox command. 276*14b24e2bSVaishali Kulkarni * 277*14b24e2bSVaishali Kulkarni * @param p_hwfn 278*14b24e2bSVaishali Kulkarni * @param p_ptt 279*14b24e2bSVaishali Kulkarni * 280*14b24e2bSVaishali Kulkarni * @param return ECORE_SUCCESS upon success. 281*14b24e2bSVaishali Kulkarni */ 282*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_reset(struct ecore_hwfn *p_hwfn, 283*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 284*14b24e2bSVaishali Kulkarni 285*14b24e2bSVaishali Kulkarni /** 286*14b24e2bSVaishali Kulkarni * @brief - Sends an NVM write command request to the MFW with 287*14b24e2bSVaishali Kulkarni * payload. 288*14b24e2bSVaishali Kulkarni * 289*14b24e2bSVaishali Kulkarni * @param p_hwfn 290*14b24e2bSVaishali Kulkarni * @param p_ptt 291*14b24e2bSVaishali Kulkarni * @param cmd - Command: Either DRV_MSG_CODE_NVM_WRITE_NVRAM or 292*14b24e2bSVaishali Kulkarni * DRV_MSG_CODE_NVM_PUT_FILE_DATA 293*14b24e2bSVaishali Kulkarni * @param param - [0:23] - Offset [24:31] - Size 294*14b24e2bSVaishali Kulkarni * @param o_mcp_resp - MCP response 295*14b24e2bSVaishali Kulkarni * @param o_mcp_param - MCP response param 296*14b24e2bSVaishali Kulkarni * @param i_txn_size - Buffer size 297*14b24e2bSVaishali Kulkarni * @param i_buf - Pointer to the buffer 298*14b24e2bSVaishali Kulkarni * 299*14b24e2bSVaishali Kulkarni * @param return ECORE_SUCCESS upon success. 300*14b24e2bSVaishali Kulkarni */ 301*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_nvm_wr_cmd(struct ecore_hwfn *p_hwfn, 302*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt, 303*14b24e2bSVaishali Kulkarni u32 cmd, 304*14b24e2bSVaishali Kulkarni u32 param, 305*14b24e2bSVaishali Kulkarni u32 *o_mcp_resp, 306*14b24e2bSVaishali Kulkarni u32 *o_mcp_param, 307*14b24e2bSVaishali Kulkarni u32 i_txn_size, 308*14b24e2bSVaishali Kulkarni u32 *i_buf); 309*14b24e2bSVaishali Kulkarni 310*14b24e2bSVaishali Kulkarni /** 311*14b24e2bSVaishali Kulkarni * @brief - Sends an NVM read command request to the MFW to get 312*14b24e2bSVaishali Kulkarni * a buffer. 313*14b24e2bSVaishali Kulkarni * 314*14b24e2bSVaishali Kulkarni * @param p_hwfn 315*14b24e2bSVaishali Kulkarni * @param p_ptt 316*14b24e2bSVaishali Kulkarni * @param cmd - Command: DRV_MSG_CODE_NVM_GET_FILE_DATA or 317*14b24e2bSVaishali Kulkarni * DRV_MSG_CODE_NVM_READ_NVRAM commands 318*14b24e2bSVaishali Kulkarni * @param param - [0:23] - Offset [24:31] - Size 319*14b24e2bSVaishali Kulkarni * @param o_mcp_resp - MCP response 320*14b24e2bSVaishali Kulkarni * @param o_mcp_param - MCP response param 321*14b24e2bSVaishali Kulkarni * @param o_txn_size - Buffer size output 322*14b24e2bSVaishali Kulkarni * @param o_buf - Pointer to the buffer returned by the MFW. 323*14b24e2bSVaishali Kulkarni * 324*14b24e2bSVaishali Kulkarni * @param return ECORE_SUCCESS upon success. 325*14b24e2bSVaishali Kulkarni */ 326*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_nvm_rd_cmd(struct ecore_hwfn *p_hwfn, 327*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt, 328*14b24e2bSVaishali Kulkarni u32 cmd, 329*14b24e2bSVaishali Kulkarni u32 param, 330*14b24e2bSVaishali Kulkarni u32 *o_mcp_resp, 331*14b24e2bSVaishali Kulkarni u32 *o_mcp_param, 332*14b24e2bSVaishali Kulkarni u32 *o_txn_size, 333*14b24e2bSVaishali Kulkarni u32 *o_buf); 334*14b24e2bSVaishali Kulkarni 335*14b24e2bSVaishali Kulkarni /** 336*14b24e2bSVaishali Kulkarni * @brief indicates whether the MFW objects [under mcp_info] are accessible 337*14b24e2bSVaishali Kulkarni * 338*14b24e2bSVaishali Kulkarni * @param p_hwfn 339*14b24e2bSVaishali Kulkarni * 340*14b24e2bSVaishali Kulkarni * @return true iff MFW is running and mcp_info is initialized 341*14b24e2bSVaishali Kulkarni */ 342*14b24e2bSVaishali Kulkarni bool ecore_mcp_is_init(struct ecore_hwfn *p_hwfn); 343*14b24e2bSVaishali Kulkarni 344*14b24e2bSVaishali Kulkarni /** 345*14b24e2bSVaishali Kulkarni * @brief request MFW to configure MSI-X for a VF 346*14b24e2bSVaishali Kulkarni * 347*14b24e2bSVaishali Kulkarni * @param p_hwfn 348*14b24e2bSVaishali Kulkarni * @param p_ptt 349*14b24e2bSVaishali Kulkarni * @param vf_id - absolute inside engine 350*14b24e2bSVaishali Kulkarni * @param num_sbs - number of entries to request 351*14b24e2bSVaishali Kulkarni * 352*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t 353*14b24e2bSVaishali Kulkarni */ 354*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_config_vf_msix(struct ecore_hwfn *p_hwfn, 355*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt, 356*14b24e2bSVaishali Kulkarni u8 vf_id, u8 num); 357*14b24e2bSVaishali Kulkarni 358*14b24e2bSVaishali Kulkarni /** 359*14b24e2bSVaishali Kulkarni * @brief - Halt the MCP. 360*14b24e2bSVaishali Kulkarni * 361*14b24e2bSVaishali Kulkarni * @param p_hwfn 362*14b24e2bSVaishali Kulkarni * @param p_ptt 363*14b24e2bSVaishali Kulkarni * 364*14b24e2bSVaishali Kulkarni * @param return ECORE_SUCCESS upon success. 365*14b24e2bSVaishali Kulkarni */ 366*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_halt(struct ecore_hwfn *p_hwfn, 367*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 368*14b24e2bSVaishali Kulkarni 369*14b24e2bSVaishali Kulkarni /** 370*14b24e2bSVaishali Kulkarni * @brief - Wake up the MCP. 371*14b24e2bSVaishali Kulkarni * 372*14b24e2bSVaishali Kulkarni * @param p_hwfn 373*14b24e2bSVaishali Kulkarni * @param p_ptt 374*14b24e2bSVaishali Kulkarni * 375*14b24e2bSVaishali Kulkarni * @param return ECORE_SUCCESS upon success. 376*14b24e2bSVaishali Kulkarni */ 377*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_resume(struct ecore_hwfn *p_hwfn, 378*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 379*14b24e2bSVaishali Kulkarni int __ecore_configure_pf_max_bandwidth(struct ecore_hwfn *p_hwfn, 380*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt, 381*14b24e2bSVaishali Kulkarni struct ecore_mcp_link_state *p_link, 382*14b24e2bSVaishali Kulkarni u8 max_bw); 383*14b24e2bSVaishali Kulkarni int __ecore_configure_pf_min_bandwidth(struct ecore_hwfn *p_hwfn, 384*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt, 385*14b24e2bSVaishali Kulkarni struct ecore_mcp_link_state *p_link, 386*14b24e2bSVaishali Kulkarni u8 min_bw); 387*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_mask_parities(struct ecore_hwfn *p_hwfn, 388*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt, 389*14b24e2bSVaishali Kulkarni u32 mask_parities); 390*14b24e2bSVaishali Kulkarni #if 0 391*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_hw_init_first_eth(struct ecore_hwfn *p_hwfn, 392*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt, 393*14b24e2bSVaishali Kulkarni u8 *p_pf); 394*14b24e2bSVaishali Kulkarni #endif 395*14b24e2bSVaishali Kulkarni 396*14b24e2bSVaishali Kulkarni /** 397*14b24e2bSVaishali Kulkarni * @brief - Sends crash mdump related info to the MFW. 398*14b24e2bSVaishali Kulkarni * 399*14b24e2bSVaishali Kulkarni * @param p_hwfn 400*14b24e2bSVaishali Kulkarni * @param p_ptt 401*14b24e2bSVaishali Kulkarni * @param epoch 402*14b24e2bSVaishali Kulkarni * 403*14b24e2bSVaishali Kulkarni * @param return ECORE_SUCCESS upon success. 404*14b24e2bSVaishali Kulkarni */ 405*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_mdump_set_values(struct ecore_hwfn *p_hwfn, 406*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt, 407*14b24e2bSVaishali Kulkarni u32 epoch); 408*14b24e2bSVaishali Kulkarni 409*14b24e2bSVaishali Kulkarni /** 410*14b24e2bSVaishali Kulkarni * @brief - Triggers a MFW crash dump procedure. 411*14b24e2bSVaishali Kulkarni * 412*14b24e2bSVaishali Kulkarni * @param p_hwfn 413*14b24e2bSVaishali Kulkarni * @param p_ptt 414*14b24e2bSVaishali Kulkarni * 415*14b24e2bSVaishali Kulkarni * @param return ECORE_SUCCESS upon success. 416*14b24e2bSVaishali Kulkarni */ 417*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_mdump_trigger(struct ecore_hwfn *p_hwfn, 418*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 419*14b24e2bSVaishali Kulkarni 420*14b24e2bSVaishali Kulkarni struct ecore_mdump_retain_data { 421*14b24e2bSVaishali Kulkarni u32 valid; 422*14b24e2bSVaishali Kulkarni u32 epoch; 423*14b24e2bSVaishali Kulkarni u32 pf; 424*14b24e2bSVaishali Kulkarni u32 status; 425*14b24e2bSVaishali Kulkarni }; 426*14b24e2bSVaishali Kulkarni 427*14b24e2bSVaishali Kulkarni /** 428*14b24e2bSVaishali Kulkarni * @brief - Gets the mdump retained data from the MFW. 429*14b24e2bSVaishali Kulkarni * 430*14b24e2bSVaishali Kulkarni * @param p_hwfn 431*14b24e2bSVaishali Kulkarni * @param p_ptt 432*14b24e2bSVaishali Kulkarni * @param p_mdump_retain 433*14b24e2bSVaishali Kulkarni * 434*14b24e2bSVaishali Kulkarni * @param return ECORE_SUCCESS upon success. 435*14b24e2bSVaishali Kulkarni */ 436*14b24e2bSVaishali Kulkarni enum _ecore_status_t 437*14b24e2bSVaishali Kulkarni ecore_mcp_mdump_get_retain(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt, 438*14b24e2bSVaishali Kulkarni struct ecore_mdump_retain_data *p_mdump_retain); 439*14b24e2bSVaishali Kulkarni 440*14b24e2bSVaishali Kulkarni /** 441*14b24e2bSVaishali Kulkarni * @brief - Clear the mdump retained data. 442*14b24e2bSVaishali Kulkarni * 443*14b24e2bSVaishali Kulkarni * @param p_hwfn 444*14b24e2bSVaishali Kulkarni * @param p_ptt 445*14b24e2bSVaishali Kulkarni * 446*14b24e2bSVaishali Kulkarni * @param return ECORE_SUCCESS upon success. 447*14b24e2bSVaishali Kulkarni */ 448*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_mdump_clr_retain(struct ecore_hwfn *p_hwfn, 449*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 450*14b24e2bSVaishali Kulkarni 451*14b24e2bSVaishali Kulkarni /** 452*14b24e2bSVaishali Kulkarni * @brief - Sets the MFW's max value for the given resource 453*14b24e2bSVaishali Kulkarni * 454*14b24e2bSVaishali Kulkarni * @param p_hwfn 455*14b24e2bSVaishali Kulkarni * @param p_ptt 456*14b24e2bSVaishali Kulkarni * @param res_id 457*14b24e2bSVaishali Kulkarni * @param resc_max_val 458*14b24e2bSVaishali Kulkarni * @param p_mcp_resp 459*14b24e2bSVaishali Kulkarni * 460*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t - ECORE_SUCCESS - operation was successful. 461*14b24e2bSVaishali Kulkarni */ 462*14b24e2bSVaishali Kulkarni enum _ecore_status_t 463*14b24e2bSVaishali Kulkarni ecore_mcp_set_resc_max_val(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt, 464*14b24e2bSVaishali Kulkarni enum ecore_resources res_id, u32 resc_max_val, 465*14b24e2bSVaishali Kulkarni u32 *p_mcp_resp); 466*14b24e2bSVaishali Kulkarni 467*14b24e2bSVaishali Kulkarni /** 468*14b24e2bSVaishali Kulkarni * @brief - Gets the MFW allocation info for the given resource 469*14b24e2bSVaishali Kulkarni * 470*14b24e2bSVaishali Kulkarni * @param p_hwfn 471*14b24e2bSVaishali Kulkarni * @param p_ptt 472*14b24e2bSVaishali Kulkarni * @param res_id 473*14b24e2bSVaishali Kulkarni * @param p_mcp_resp 474*14b24e2bSVaishali Kulkarni * @param p_resc_num 475*14b24e2bSVaishali Kulkarni * @param p_resc_start 476*14b24e2bSVaishali Kulkarni * 477*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t - ECORE_SUCCESS - operation was successful. 478*14b24e2bSVaishali Kulkarni */ 479*14b24e2bSVaishali Kulkarni enum _ecore_status_t 480*14b24e2bSVaishali Kulkarni ecore_mcp_get_resc_info(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt, 481*14b24e2bSVaishali Kulkarni enum ecore_resources res_id, u32 *p_mcp_resp, 482*14b24e2bSVaishali Kulkarni u32 *p_resc_num, u32 *p_resc_start); 483*14b24e2bSVaishali Kulkarni 484*14b24e2bSVaishali Kulkarni /** 485*14b24e2bSVaishali Kulkarni * @brief - Initiates PF FLR 486*14b24e2bSVaishali Kulkarni * 487*14b24e2bSVaishali Kulkarni * @param p_hwfn 488*14b24e2bSVaishali Kulkarni * @param p_ptt 489*14b24e2bSVaishali Kulkarni * 490*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t - ECORE_SUCCESS - operation was successful. 491*14b24e2bSVaishali Kulkarni */ 492*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_initiate_pf_flr(struct ecore_hwfn *p_hwfn, 493*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 494*14b24e2bSVaishali Kulkarni 495*14b24e2bSVaishali Kulkarni /** 496*14b24e2bSVaishali Kulkarni * @brief Send eswitch mode to MFW 497*14b24e2bSVaishali Kulkarni * 498*14b24e2bSVaishali Kulkarni * @param p_hwfn 499*14b24e2bSVaishali Kulkarni * @param p_ptt 500*14b24e2bSVaishali Kulkarni * @param eswitch - eswitch mode 501*14b24e2bSVaishali Kulkarni * 502*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t - ECORE_SUCCESS - operation was successful. 503*14b24e2bSVaishali Kulkarni */ 504*14b24e2bSVaishali Kulkarni enum _ecore_status_t 505*14b24e2bSVaishali Kulkarni ecore_mcp_ov_update_eswitch(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt, 506*14b24e2bSVaishali Kulkarni enum ecore_ov_eswitch eswitch); 507*14b24e2bSVaishali Kulkarni 508*14b24e2bSVaishali Kulkarni #define ECORE_MCP_RESC_LOCK_MIN_VAL RESOURCE_DUMP /* 0 */ 509*14b24e2bSVaishali Kulkarni #define ECORE_MCP_RESC_LOCK_MAX_VAL 31 510*14b24e2bSVaishali Kulkarni 511*14b24e2bSVaishali Kulkarni enum ecore_resc_lock { 512*14b24e2bSVaishali Kulkarni ECORE_RESC_LOCK_DBG_DUMP = ECORE_MCP_RESC_LOCK_MIN_VAL, 513*14b24e2bSVaishali Kulkarni /* Locks that the MFW is aware of should be added here downwards */ 514*14b24e2bSVaishali Kulkarni 515*14b24e2bSVaishali Kulkarni /* Ecore only locks should be added here upwards */ 516*14b24e2bSVaishali Kulkarni ECORE_RESC_LOCK_PTP_PORT0, 517*14b24e2bSVaishali Kulkarni ECORE_RESC_LOCK_PTP_PORT1, 518*14b24e2bSVaishali Kulkarni ECORE_RESC_LOCK_PTP_PORT2, 519*14b24e2bSVaishali Kulkarni ECORE_RESC_LOCK_PTP_PORT3, 520*14b24e2bSVaishali Kulkarni ECORE_RESC_LOCK_RESC_ALLOC = ECORE_MCP_RESC_LOCK_MAX_VAL 521*14b24e2bSVaishali Kulkarni }; 522*14b24e2bSVaishali Kulkarni 523*14b24e2bSVaishali Kulkarni struct ecore_resc_lock_params { 524*14b24e2bSVaishali Kulkarni /* Resource number [valid values are 0..31] */ 525*14b24e2bSVaishali Kulkarni u8 resource; 526*14b24e2bSVaishali Kulkarni 527*14b24e2bSVaishali Kulkarni /* Lock timeout value in seconds [default, none or 1..254] */ 528*14b24e2bSVaishali Kulkarni u8 timeout; 529*14b24e2bSVaishali Kulkarni #define ECORE_MCP_RESC_LOCK_TO_DEFAULT 0 530*14b24e2bSVaishali Kulkarni #define ECORE_MCP_RESC_LOCK_TO_NONE 255 531*14b24e2bSVaishali Kulkarni 532*14b24e2bSVaishali Kulkarni /* Number of times to retry locking */ 533*14b24e2bSVaishali Kulkarni u8 retry_num; 534*14b24e2bSVaishali Kulkarni 535*14b24e2bSVaishali Kulkarni /* The interval in usec between retries */ 536*14b24e2bSVaishali Kulkarni u16 retry_interval; 537*14b24e2bSVaishali Kulkarni 538*14b24e2bSVaishali Kulkarni /* Use sleep or delay between retries */ 539*14b24e2bSVaishali Kulkarni bool sleep_b4_retry; 540*14b24e2bSVaishali Kulkarni 541*14b24e2bSVaishali Kulkarni /* Will be set as true if the resource is free and granted */ 542*14b24e2bSVaishali Kulkarni bool b_granted; 543*14b24e2bSVaishali Kulkarni 544*14b24e2bSVaishali Kulkarni /* Will be filled with the resource owner. 545*14b24e2bSVaishali Kulkarni * [0..15 = PF0-15, 16 = MFW, 17 = diag over serial] 546*14b24e2bSVaishali Kulkarni */ 547*14b24e2bSVaishali Kulkarni u8 owner; 548*14b24e2bSVaishali Kulkarni }; 549*14b24e2bSVaishali Kulkarni 550*14b24e2bSVaishali Kulkarni /** 551*14b24e2bSVaishali Kulkarni * @brief Acquires MFW generic resource lock 552*14b24e2bSVaishali Kulkarni * 553*14b24e2bSVaishali Kulkarni * @param p_hwfn 554*14b24e2bSVaishali Kulkarni * @param p_ptt 555*14b24e2bSVaishali Kulkarni * @param p_params 556*14b24e2bSVaishali Kulkarni * 557*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t - ECORE_SUCCESS - operation was successful. 558*14b24e2bSVaishali Kulkarni */ 559*14b24e2bSVaishali Kulkarni enum _ecore_status_t 560*14b24e2bSVaishali Kulkarni ecore_mcp_resc_lock(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt, 561*14b24e2bSVaishali Kulkarni struct ecore_resc_lock_params *p_params); 562*14b24e2bSVaishali Kulkarni 563*14b24e2bSVaishali Kulkarni struct ecore_resc_unlock_params { 564*14b24e2bSVaishali Kulkarni /* Resource number [valid values are 0..31] */ 565*14b24e2bSVaishali Kulkarni u8 resource; 566*14b24e2bSVaishali Kulkarni 567*14b24e2bSVaishali Kulkarni /* Allow to release a resource even if belongs to another PF */ 568*14b24e2bSVaishali Kulkarni bool b_force; 569*14b24e2bSVaishali Kulkarni 570*14b24e2bSVaishali Kulkarni /* Will be set as true if the resource is released */ 571*14b24e2bSVaishali Kulkarni bool b_released; 572*14b24e2bSVaishali Kulkarni }; 573*14b24e2bSVaishali Kulkarni 574*14b24e2bSVaishali Kulkarni /** 575*14b24e2bSVaishali Kulkarni * @brief Releases MFW generic resource lock 576*14b24e2bSVaishali Kulkarni * 577*14b24e2bSVaishali Kulkarni * @param p_hwfn 578*14b24e2bSVaishali Kulkarni * @param p_ptt 579*14b24e2bSVaishali Kulkarni * @param p_params 580*14b24e2bSVaishali Kulkarni * 581*14b24e2bSVaishali Kulkarni * @return enum _ecore_status_t - ECORE_SUCCESS - operation was successful. 582*14b24e2bSVaishali Kulkarni */ 583*14b24e2bSVaishali Kulkarni enum _ecore_status_t 584*14b24e2bSVaishali Kulkarni ecore_mcp_resc_unlock(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt, 585*14b24e2bSVaishali Kulkarni struct ecore_resc_unlock_params *p_params); 586*14b24e2bSVaishali Kulkarni 587*14b24e2bSVaishali Kulkarni void ecore_mcp_wol_wr(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt, 588*14b24e2bSVaishali Kulkarni u32 offset, u32 val); 589*14b24e2bSVaishali Kulkarni 590*14b24e2bSVaishali Kulkarni /** 591*14b24e2bSVaishali Kulkarni * @brief Learn of supported MFW features; To be done during early init 592*14b24e2bSVaishali Kulkarni * 593*14b24e2bSVaishali Kulkarni * @param p_hwfn 594*14b24e2bSVaishali Kulkarni * @param p_ptt 595*14b24e2bSVaishali Kulkarni */ 596*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_get_capabilities(struct ecore_hwfn *p_hwfn, 597*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 598*14b24e2bSVaishali Kulkarni 599*14b24e2bSVaishali Kulkarni /** 600*14b24e2bSVaishali Kulkarni * @brief Inform MFW of set of features supported by driver. Should be done 601*14b24e2bSVaishali Kulkarni * inside the contet of the LOAD_REQ. 602*14b24e2bSVaishali Kulkarni * 603*14b24e2bSVaishali Kulkarni * @param p_hwfn 604*14b24e2bSVaishali Kulkarni * @param p_ptt 605*14b24e2bSVaishali Kulkarni */ 606*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_mcp_set_capabilities(struct ecore_hwfn *p_hwfn, 607*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 608*14b24e2bSVaishali Kulkarni 609*14b24e2bSVaishali Kulkarni /** 610*14b24e2bSVaishali Kulkarni * @brief Initialize MFW mailbox and sequence values for driver interaction. 611*14b24e2bSVaishali Kulkarni * 612*14b24e2bSVaishali Kulkarni * @param p_hwfn 613*14b24e2bSVaishali Kulkarni * @param p_ptt 614*14b24e2bSVaishali Kulkarni */ 615*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_load_mcp_offsets(struct ecore_hwfn *p_hwfn, 616*14b24e2bSVaishali Kulkarni struct ecore_ptt *p_ptt); 617*14b24e2bSVaishali Kulkarni 618*14b24e2bSVaishali Kulkarni #endif /* __ECORE_MCP_H__ */ 619