13126df22SRasesh Mody /* SPDX-License-Identifier: BSD-3-Clause 29adde217SRasesh Mody * Copyright (c) 2016 - 2018 Cavium Inc. 3ec94dbc5SRasesh Mody * All rights reserved. 49adde217SRasesh Mody * www.cavium.com 5ec94dbc5SRasesh Mody */ 6ec94dbc5SRasesh Mody 7ec94dbc5SRasesh Mody #ifndef __ECORE_INT_H__ 8ec94dbc5SRasesh Mody #define __ECORE_INT_H__ 9ec94dbc5SRasesh Mody 10ec94dbc5SRasesh Mody #include "ecore.h" 11ec94dbc5SRasesh Mody #include "ecore_int_api.h" 12ec94dbc5SRasesh Mody 13ec94dbc5SRasesh Mody #define ECORE_CAU_DEF_RX_TIMER_RES 0 14ec94dbc5SRasesh Mody #define ECORE_CAU_DEF_TX_TIMER_RES 0 15ec94dbc5SRasesh Mody 16ec94dbc5SRasesh Mody #define ECORE_SB_ATT_IDX 0x0001 17ec94dbc5SRasesh Mody #define ECORE_SB_EVENT_MASK 0x0003 18ec94dbc5SRasesh Mody 19ec94dbc5SRasesh Mody #define SB_ALIGNED_SIZE(p_hwfn) \ 20*52fa735cSRasesh Mody ALIGNED_TYPE_SIZE(struct status_block, p_hwfn) 21ec94dbc5SRasesh Mody 226e4fcea9SRasesh Mody #define ECORE_SB_INVALID_IDX 0xffff 236e4fcea9SRasesh Mody 24ec94dbc5SRasesh Mody struct ecore_igu_block { 25ec94dbc5SRasesh Mody u8 status; 26ec94dbc5SRasesh Mody #define ECORE_IGU_STATUS_FREE 0x01 27ec94dbc5SRasesh Mody #define ECORE_IGU_STATUS_VALID 0x02 28ec94dbc5SRasesh Mody #define ECORE_IGU_STATUS_PF 0x04 296e4fcea9SRasesh Mody #define ECORE_IGU_STATUS_DSB 0x08 30ec94dbc5SRasesh Mody 31ec94dbc5SRasesh Mody u8 vector_number; 32ec94dbc5SRasesh Mody u8 function_id; 33ec94dbc5SRasesh Mody u8 is_pf; 34ec94dbc5SRasesh Mody 356e4fcea9SRasesh Mody /* Index inside IGU [meant for back reference] */ 366e4fcea9SRasesh Mody u16 igu_sb_id; 376e4fcea9SRasesh Mody 386e4fcea9SRasesh Mody struct ecore_sb_info *sb_info; 39ec94dbc5SRasesh Mody }; 40ec94dbc5SRasesh Mody 41ec94dbc5SRasesh Mody struct ecore_igu_info { 426e4fcea9SRasesh Mody struct ecore_igu_block entry[MAX_TOT_SB_PER_PATH]; 43ec94dbc5SRasesh Mody u16 igu_dsb_id; 446e4fcea9SRasesh Mody 456e4fcea9SRasesh Mody /* The numbers can shift when using APIs to switch SBs between PF and 466e4fcea9SRasesh Mody * VF. 476e4fcea9SRasesh Mody */ 486e4fcea9SRasesh Mody struct ecore_sb_cnt_info usage; 496e4fcea9SRasesh Mody 506e4fcea9SRasesh Mody /* Determine whether we can shift SBs between VFs and PFs */ 516e4fcea9SRasesh Mody bool b_allow_pf_vf_change; 52ec94dbc5SRasesh Mody }; 53ec94dbc5SRasesh Mody 546e4fcea9SRasesh Mody /** 556e4fcea9SRasesh Mody * @brief - Make sure the IGU CAM reflects the resources provided by MFW 566e4fcea9SRasesh Mody * 576e4fcea9SRasesh Mody * @param p_hwfn 586e4fcea9SRasesh Mody * @param p_ptt 596e4fcea9SRasesh Mody */ 606e4fcea9SRasesh Mody int ecore_int_igu_reset_cam(struct ecore_hwfn *p_hwfn, 616e4fcea9SRasesh Mody struct ecore_ptt *p_ptt); 626e4fcea9SRasesh Mody 636e4fcea9SRasesh Mody /** 646e4fcea9SRasesh Mody * @brief - Make sure IGU CAM reflects the default resources once again, 656e4fcea9SRasesh Mody * starting with a 'dirty' SW database. 666e4fcea9SRasesh Mody * @param p_hwfn 676e4fcea9SRasesh Mody * @param p_ptt 686e4fcea9SRasesh Mody */ 696e4fcea9SRasesh Mody int ecore_int_igu_reset_cam_default(struct ecore_hwfn *p_hwfn, 706e4fcea9SRasesh Mody struct ecore_ptt *p_ptt); 716e4fcea9SRasesh Mody 726e4fcea9SRasesh Mody /** 736e4fcea9SRasesh Mody * @brief Translate the weakly-defined client sb-id into an IGU sb-id 746e4fcea9SRasesh Mody * 756e4fcea9SRasesh Mody * @param p_hwfn 766e4fcea9SRasesh Mody * @param sb_id - user provided sb_id 776e4fcea9SRasesh Mody * 786e4fcea9SRasesh Mody * @return an index inside IGU CAM where the SB resides 796e4fcea9SRasesh Mody */ 806e4fcea9SRasesh Mody u16 ecore_get_igu_sb_id(struct ecore_hwfn *p_hwfn, u16 sb_id); 816e4fcea9SRasesh Mody 826e4fcea9SRasesh Mody /** 836e4fcea9SRasesh Mody * @brief return a pointer to an unused valid SB 846e4fcea9SRasesh Mody * 856e4fcea9SRasesh Mody * @param p_hwfn 866e4fcea9SRasesh Mody * @param b_is_pf - true iff we want a SB belonging to a PF 876e4fcea9SRasesh Mody * 886e4fcea9SRasesh Mody * @return point to an igu_block, OSAL_NULL if none is available 896e4fcea9SRasesh Mody */ 906e4fcea9SRasesh Mody struct ecore_igu_block * 916e4fcea9SRasesh Mody ecore_get_igu_free_sb(struct ecore_hwfn *p_hwfn, bool b_is_pf); 92ec94dbc5SRasesh Mody /* TODO Names of function may change... */ 93ec94dbc5SRasesh Mody void ecore_int_igu_init_pure_rt(struct ecore_hwfn *p_hwfn, 94ec94dbc5SRasesh Mody struct ecore_ptt *p_ptt, 95ec94dbc5SRasesh Mody bool b_set, bool b_slowpath); 96ec94dbc5SRasesh Mody 97ec94dbc5SRasesh Mody void ecore_int_igu_init_rt(struct ecore_hwfn *p_hwfn); 98ec94dbc5SRasesh Mody 99ec94dbc5SRasesh Mody /** 100ec94dbc5SRasesh Mody * @brief ecore_int_igu_read_cam - Reads the IGU CAM. 101ec94dbc5SRasesh Mody * This function needs to be called during hardware 102ec94dbc5SRasesh Mody * prepare. It reads the info from igu cam to know which 103ec94dbc5SRasesh Mody * status block is the default / base status block etc. 104ec94dbc5SRasesh Mody * 105ec94dbc5SRasesh Mody * @param p_hwfn 106ec94dbc5SRasesh Mody * @param p_ptt 107ec94dbc5SRasesh Mody * 108ec94dbc5SRasesh Mody * @return enum _ecore_status_t 109ec94dbc5SRasesh Mody */ 110ec94dbc5SRasesh Mody enum _ecore_status_t ecore_int_igu_read_cam(struct ecore_hwfn *p_hwfn, 111ec94dbc5SRasesh Mody struct ecore_ptt *p_ptt); 112ec94dbc5SRasesh Mody 113ec94dbc5SRasesh Mody typedef enum _ecore_status_t (*ecore_int_comp_cb_t) (struct ecore_hwfn *p_hwfn, 114ec94dbc5SRasesh Mody void *cookie); 115ec94dbc5SRasesh Mody /** 116ec94dbc5SRasesh Mody * @brief ecore_int_register_cb - Register callback func for 117ec94dbc5SRasesh Mody * slowhwfn statusblock. 118ec94dbc5SRasesh Mody * 119ec94dbc5SRasesh Mody * Every protocol that uses the slowhwfn status block 120ec94dbc5SRasesh Mody * should register a callback function that will be called 121ec94dbc5SRasesh Mody * once there is an update of the sp status block. 122ec94dbc5SRasesh Mody * 123ec94dbc5SRasesh Mody * @param p_hwfn 124ec94dbc5SRasesh Mody * @param comp_cb - function to be called when there is an 125ec94dbc5SRasesh Mody * interrupt on the sp sb 126ec94dbc5SRasesh Mody * 127ec94dbc5SRasesh Mody * @param cookie - passed to the callback function 128ec94dbc5SRasesh Mody * @param sb_idx - OUT parameter which gives the chosen index 129ec94dbc5SRasesh Mody * for this protocol. 130ec94dbc5SRasesh Mody * @param p_fw_cons - pointer to the actual address of the 131ec94dbc5SRasesh Mody * consumer for this protocol. 132ec94dbc5SRasesh Mody * 133ec94dbc5SRasesh Mody * @return enum _ecore_status_t 134ec94dbc5SRasesh Mody */ 135ec94dbc5SRasesh Mody enum _ecore_status_t ecore_int_register_cb(struct ecore_hwfn *p_hwfn, 136ec94dbc5SRasesh Mody ecore_int_comp_cb_t comp_cb, 137ec94dbc5SRasesh Mody void *cookie, 138ec94dbc5SRasesh Mody u8 *sb_idx, __le16 **p_fw_cons); 139ec94dbc5SRasesh Mody /** 140ec94dbc5SRasesh Mody * @brief ecore_int_unregister_cb - Unregisters callback 141ec94dbc5SRasesh Mody * function from sp sb. 142ec94dbc5SRasesh Mody * Partner of ecore_int_register_cb -> should be called 143ec94dbc5SRasesh Mody * when no longer required. 144ec94dbc5SRasesh Mody * 145ec94dbc5SRasesh Mody * @param p_hwfn 146ec94dbc5SRasesh Mody * @param pi 147ec94dbc5SRasesh Mody * 148ec94dbc5SRasesh Mody * @return enum _ecore_status_t 149ec94dbc5SRasesh Mody */ 150ec94dbc5SRasesh Mody enum _ecore_status_t ecore_int_unregister_cb(struct ecore_hwfn *p_hwfn, u8 pi); 151ec94dbc5SRasesh Mody 152ec94dbc5SRasesh Mody /** 153ec94dbc5SRasesh Mody * @brief ecore_int_get_sp_sb_id - Get the slowhwfn sb id. 154ec94dbc5SRasesh Mody * 155ec94dbc5SRasesh Mody * @param p_hwfn 156ec94dbc5SRasesh Mody * 157ec94dbc5SRasesh Mody * @return u16 158ec94dbc5SRasesh Mody */ 159ec94dbc5SRasesh Mody u16 ecore_int_get_sp_sb_id(struct ecore_hwfn *p_hwfn); 160ec94dbc5SRasesh Mody 161ec94dbc5SRasesh Mody /** 162ec94dbc5SRasesh Mody * @brief Status block cleanup. Should be called for each status 163ec94dbc5SRasesh Mody * block that will be used -> both PF / VF 164ec94dbc5SRasesh Mody * 165ec94dbc5SRasesh Mody * @param p_hwfn 166ec94dbc5SRasesh Mody * @param p_ptt 167ec94dbc5SRasesh Mody * @param sb_id - igu status block id 168ec94dbc5SRasesh Mody * @param opaque - opaque fid of the sb owner. 169ec94dbc5SRasesh Mody * @param cleanup_set - set(1) / clear(0) 170ec94dbc5SRasesh Mody */ 171ec94dbc5SRasesh Mody void ecore_int_igu_init_pure_rt_single(struct ecore_hwfn *p_hwfn, 172ec94dbc5SRasesh Mody struct ecore_ptt *p_ptt, 1736e4fcea9SRasesh Mody u16 sb_id, 1746e4fcea9SRasesh Mody u16 opaque, 1756e4fcea9SRasesh Mody bool b_set); 176ec94dbc5SRasesh Mody 177ec94dbc5SRasesh Mody /** 178ec94dbc5SRasesh Mody * @brief ecore_int_cau_conf - configure cau for a given status 179ec94dbc5SRasesh Mody * block 180ec94dbc5SRasesh Mody * 181ec94dbc5SRasesh Mody * @param p_hwfn 182ec94dbc5SRasesh Mody * @param ptt 183ec94dbc5SRasesh Mody * @param sb_phys 184ec94dbc5SRasesh Mody * @param igu_sb_id 185ec94dbc5SRasesh Mody * @param vf_number 186ec94dbc5SRasesh Mody * @param vf_valid 187ec94dbc5SRasesh Mody */ 188ec94dbc5SRasesh Mody void ecore_int_cau_conf_sb(struct ecore_hwfn *p_hwfn, 189ec94dbc5SRasesh Mody struct ecore_ptt *p_ptt, 190ec94dbc5SRasesh Mody dma_addr_t sb_phys, 191ec94dbc5SRasesh Mody u16 igu_sb_id, u16 vf_number, u8 vf_valid); 192ec94dbc5SRasesh Mody 193ec94dbc5SRasesh Mody /** 194ec94dbc5SRasesh Mody * @brief ecore_int_alloc 195ec94dbc5SRasesh Mody * 196ec94dbc5SRasesh Mody * @param p_hwfn 197ec94dbc5SRasesh Mody * @param p_ptt 198ec94dbc5SRasesh Mody * 199ec94dbc5SRasesh Mody * @return enum _ecore_status_t 200ec94dbc5SRasesh Mody */ 201ec94dbc5SRasesh Mody enum _ecore_status_t ecore_int_alloc(struct ecore_hwfn *p_hwfn, 202ec94dbc5SRasesh Mody struct ecore_ptt *p_ptt); 203ec94dbc5SRasesh Mody 204ec94dbc5SRasesh Mody /** 205ec94dbc5SRasesh Mody * @brief ecore_int_free 206ec94dbc5SRasesh Mody * 207ec94dbc5SRasesh Mody * @param p_hwfn 208ec94dbc5SRasesh Mody */ 209ec94dbc5SRasesh Mody void ecore_int_free(struct ecore_hwfn *p_hwfn); 210ec94dbc5SRasesh Mody 211ec94dbc5SRasesh Mody /** 212ec94dbc5SRasesh Mody * @brief ecore_int_setup 213ec94dbc5SRasesh Mody * 214ec94dbc5SRasesh Mody * @param p_hwfn 215ec94dbc5SRasesh Mody * @param p_ptt 216ec94dbc5SRasesh Mody */ 217ec94dbc5SRasesh Mody void ecore_int_setup(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt); 218ec94dbc5SRasesh Mody 219ec94dbc5SRasesh Mody /** 220ec94dbc5SRasesh Mody * @brief - Enable Interrupt & Attention for hw function 221ec94dbc5SRasesh Mody * 222ec94dbc5SRasesh Mody * @param p_hwfn 223ec94dbc5SRasesh Mody * @param p_ptt 224ec94dbc5SRasesh Mody * @param int_mode 225ec94dbc5SRasesh Mody * 226ec94dbc5SRasesh Mody * @return enum _ecore_status_t 227ec94dbc5SRasesh Mody */ 228ec94dbc5SRasesh Mody enum _ecore_status_t ecore_int_igu_enable(struct ecore_hwfn *p_hwfn, 229ec94dbc5SRasesh Mody struct ecore_ptt *p_ptt, 230ec94dbc5SRasesh Mody enum ecore_int_mode int_mode); 231ec94dbc5SRasesh Mody 232ec94dbc5SRasesh Mody /** 233ec94dbc5SRasesh Mody * @brief - Initialize CAU status block entry 234ec94dbc5SRasesh Mody * 235ec94dbc5SRasesh Mody * @param p_hwfn 236ec94dbc5SRasesh Mody * @param p_sb_entry 237ec94dbc5SRasesh Mody * @param pf_id 238ec94dbc5SRasesh Mody * @param vf_number 239ec94dbc5SRasesh Mody * @param vf_valid 240ec94dbc5SRasesh Mody */ 241ec94dbc5SRasesh Mody void ecore_init_cau_sb_entry(struct ecore_hwfn *p_hwfn, 242ec94dbc5SRasesh Mody struct cau_sb_entry *p_sb_entry, u8 pf_id, 243ec94dbc5SRasesh Mody u16 vf_number, u8 vf_valid); 244ec94dbc5SRasesh Mody 24522d07d93SRasesh Mody enum _ecore_status_t ecore_int_set_timer_res(struct ecore_hwfn *p_hwfn, 24622d07d93SRasesh Mody struct ecore_ptt *p_ptt, 24722d07d93SRasesh Mody u8 timer_res, u16 sb_id, bool tx); 248ec94dbc5SRasesh Mody #ifndef ASIC_ONLY 249ec94dbc5SRasesh Mody #define ECORE_MAPPING_MEMORY_SIZE(dev) \ 250ec94dbc5SRasesh Mody ((CHIP_REV_IS_SLOW(dev) && (!(dev)->b_is_emul_full)) ? \ 251ec94dbc5SRasesh Mody 136 : NUM_OF_SBS(dev)) 252ec94dbc5SRasesh Mody #else 253ec94dbc5SRasesh Mody #define ECORE_MAPPING_MEMORY_SIZE(dev) NUM_OF_SBS(dev) 254ec94dbc5SRasesh Mody #endif 255ec94dbc5SRasesh Mody 25660c78a5eSRasesh Mody enum _ecore_status_t ecore_pglueb_rbc_attn_handler(struct ecore_hwfn *p_hwfn, 25752c5f7b5SRasesh Mody struct ecore_ptt *p_ptt, 25852c5f7b5SRasesh Mody bool is_hw_init); 259797ce8eeSShahed Shaikh void ecore_pf_flr_igu_cleanup(struct ecore_hwfn *p_hwfn); 26060c78a5eSRasesh Mody 261ec94dbc5SRasesh Mody #endif /* __ECORE_INT_H__ */ 262