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_SPQ_H__ 8ec94dbc5SRasesh Mody #define __ECORE_SPQ_H__ 9ec94dbc5SRasesh Mody 10ec94dbc5SRasesh Mody #include "ecore_hsi_common.h" 11ec94dbc5SRasesh Mody #include "ecore_status.h" 12ec94dbc5SRasesh Mody #include "ecore_hsi_eth.h" 13ec94dbc5SRasesh Mody #include "ecore_chain.h" 14ec94dbc5SRasesh Mody #include "ecore_sp_api.h" 15ec94dbc5SRasesh Mody 16ec94dbc5SRasesh Mody union ramrod_data { 17ec94dbc5SRasesh Mody struct pf_start_ramrod_data pf_start; 18ec94dbc5SRasesh Mody struct pf_update_ramrod_data pf_update; 1922d07d93SRasesh Mody struct rl_update_ramrod_data rl_update; 20ec94dbc5SRasesh Mody struct rx_queue_start_ramrod_data rx_queue_start; 21ec94dbc5SRasesh Mody struct rx_queue_update_ramrod_data rx_queue_update; 22ec94dbc5SRasesh Mody struct rx_queue_stop_ramrod_data rx_queue_stop; 23ec94dbc5SRasesh Mody struct tx_queue_start_ramrod_data tx_queue_start; 24ec94dbc5SRasesh Mody struct tx_queue_stop_ramrod_data tx_queue_stop; 25ec94dbc5SRasesh Mody struct vport_start_ramrod_data vport_start; 26ec94dbc5SRasesh Mody struct vport_stop_ramrod_data vport_stop; 2753437002SHarish Patil struct rx_update_gft_filter_data rx_update_gft; 28ec94dbc5SRasesh Mody struct vport_update_ramrod_data vport_update; 29ec94dbc5SRasesh Mody struct core_rx_start_ramrod_data core_rx_queue_start; 30ec94dbc5SRasesh Mody struct core_rx_stop_ramrod_data core_rx_queue_stop; 31ec94dbc5SRasesh Mody struct core_tx_start_ramrod_data core_tx_queue_start; 32ec94dbc5SRasesh Mody struct core_tx_stop_ramrod_data core_tx_queue_stop; 33ec94dbc5SRasesh Mody struct vport_filter_update_ramrod_data vport_filter_update; 34ec94dbc5SRasesh Mody 35ec94dbc5SRasesh Mody struct vf_start_ramrod_data vf_start; 36ec94dbc5SRasesh Mody struct vf_stop_ramrod_data vf_stop; 37ec94dbc5SRasesh Mody }; 38ec94dbc5SRasesh Mody 39ec94dbc5SRasesh Mody #define EQ_MAX_CREDIT 0xffffffff 40ec94dbc5SRasesh Mody 41ec94dbc5SRasesh Mody enum spq_priority { 42ec94dbc5SRasesh Mody ECORE_SPQ_PRIORITY_NORMAL, 43ec94dbc5SRasesh Mody ECORE_SPQ_PRIORITY_HIGH, 44ec94dbc5SRasesh Mody }; 45ec94dbc5SRasesh Mody 46ec94dbc5SRasesh Mody union ecore_spq_req_comp { 47ec94dbc5SRasesh Mody struct ecore_spq_comp_cb cb; 48ec94dbc5SRasesh Mody u64 *done_addr; 49ec94dbc5SRasesh Mody }; 50ec94dbc5SRasesh Mody 51ec94dbc5SRasesh Mody /* SPQ_MODE_EBLOCK */ 52ec94dbc5SRasesh Mody struct ecore_spq_comp_done { 53ec94dbc5SRasesh Mody u64 done; 54ec94dbc5SRasesh Mody u8 fw_return_code; 55ec94dbc5SRasesh Mody }; 56ec94dbc5SRasesh Mody 57ec94dbc5SRasesh Mody struct ecore_spq_entry { 58ec94dbc5SRasesh Mody osal_list_entry_t list; 59ec94dbc5SRasesh Mody 60ec94dbc5SRasesh Mody u8 flags; 61ec94dbc5SRasesh Mody 62ec94dbc5SRasesh Mody /* HSI slow path element */ 63ec94dbc5SRasesh Mody struct slow_path_element elem; 64ec94dbc5SRasesh Mody 65ec94dbc5SRasesh Mody union ramrod_data ramrod; 66ec94dbc5SRasesh Mody 67ec94dbc5SRasesh Mody enum spq_priority priority; 68ec94dbc5SRasesh Mody 69ec94dbc5SRasesh Mody /* pending queue for this entry */ 70ec94dbc5SRasesh Mody osal_list_t *queue; 71ec94dbc5SRasesh Mody 72ec94dbc5SRasesh Mody enum spq_mode comp_mode; 73ec94dbc5SRasesh Mody struct ecore_spq_comp_cb comp_cb; 74ec94dbc5SRasesh Mody struct ecore_spq_comp_done comp_done; /* SPQ_MODE_EBLOCK */ 75ec94dbc5SRasesh Mody }; 76ec94dbc5SRasesh Mody 77ec94dbc5SRasesh Mody struct ecore_eq { 78ec94dbc5SRasesh Mody struct ecore_chain chain; 79ec94dbc5SRasesh Mody u8 eq_sb_index; /* index within the SB */ 80ec94dbc5SRasesh Mody __le16 *p_fw_cons; /* ptr to index value */ 81ec94dbc5SRasesh Mody }; 82ec94dbc5SRasesh Mody 83ec94dbc5SRasesh Mody struct ecore_consq { 84ec94dbc5SRasesh Mody struct ecore_chain chain; 85ec94dbc5SRasesh Mody }; 86ec94dbc5SRasesh Mody 877f474588SRasesh Mody typedef enum _ecore_status_t 887f474588SRasesh Mody (*ecore_spq_async_comp_cb)(struct ecore_hwfn *p_hwfn, 897f474588SRasesh Mody u8 opcode, 907f474588SRasesh Mody u16 echo, 917f474588SRasesh Mody union event_ring_data *data, 927f474588SRasesh Mody u8 fw_return_code); 937f474588SRasesh Mody 947f474588SRasesh Mody enum _ecore_status_t 957f474588SRasesh Mody ecore_spq_register_async_cb(struct ecore_hwfn *p_hwfn, 967f474588SRasesh Mody enum protocol_type protocol_id, 977f474588SRasesh Mody ecore_spq_async_comp_cb cb); 987f474588SRasesh Mody 997f474588SRasesh Mody void 1007f474588SRasesh Mody ecore_spq_unregister_async_cb(struct ecore_hwfn *p_hwfn, 1017f474588SRasesh Mody enum protocol_type protocol_id); 1027f474588SRasesh Mody 103ec94dbc5SRasesh Mody struct ecore_spq { 104ec94dbc5SRasesh Mody osal_spinlock_t lock; 105ec94dbc5SRasesh Mody 106ec94dbc5SRasesh Mody osal_list_t unlimited_pending; 107ec94dbc5SRasesh Mody osal_list_t pending; 108ec94dbc5SRasesh Mody osal_list_t completion_pending; 109ec94dbc5SRasesh Mody osal_list_t free_pool; 110ec94dbc5SRasesh Mody 111ec94dbc5SRasesh Mody struct ecore_chain chain; 112ec94dbc5SRasesh Mody 113ec94dbc5SRasesh Mody /* allocated dma-able memory for spq entries (+ramrod data) */ 114ec94dbc5SRasesh Mody dma_addr_t p_phys; 115ec94dbc5SRasesh Mody struct ecore_spq_entry *p_virt; 116ec94dbc5SRasesh Mody 1172d52085eSRasesh Mody /* SPQ max sleep iterations used in __ecore_spq_block() */ 1182d52085eSRasesh Mody u32 block_sleep_max_iter; 1192d52085eSRasesh Mody 120ec94dbc5SRasesh Mody /* Bitmap for handling out-of-order completions */ 121ec94dbc5SRasesh Mody #define SPQ_RING_SIZE \ 122ec94dbc5SRasesh Mody (CORE_SPQE_PAGE_SIZE_BYTES / sizeof(struct slow_path_element)) 12322d07d93SRasesh Mody /* BITS_PER_LONG */ 124*5018f1fcSJoyce Kong #define SPQ_COMP_BMAP_SIZE (SPQ_RING_SIZE / (sizeof(u32) * 8)) 125*5018f1fcSJoyce Kong u32 p_comp_bitmap[SPQ_COMP_BMAP_SIZE]; 126ec94dbc5SRasesh Mody u8 comp_bitmap_idx; 127ec94dbc5SRasesh Mody #define SPQ_COMP_BMAP_SET_BIT(p_spq, idx) \ 128ec94dbc5SRasesh Mody (OSAL_SET_BIT(((idx) % SPQ_RING_SIZE), (p_spq)->p_comp_bitmap)) 129ec94dbc5SRasesh Mody 130ec94dbc5SRasesh Mody #define SPQ_COMP_BMAP_CLEAR_BIT(p_spq, idx) \ 131ec94dbc5SRasesh Mody (OSAL_CLEAR_BIT(((idx) % SPQ_RING_SIZE), (p_spq)->p_comp_bitmap)) 132ec94dbc5SRasesh Mody 133*5018f1fcSJoyce Kong #define SPQ_COMP_BMAP_GET_BIT(p_spq, idx) \ 134*5018f1fcSJoyce Kong (OSAL_GET_BIT(((idx) % SPQ_RING_SIZE), (p_spq)->p_comp_bitmap)) 135ec94dbc5SRasesh Mody 136ec94dbc5SRasesh Mody /* Statistics */ 137ec94dbc5SRasesh Mody u32 unlimited_pending_count; 138ec94dbc5SRasesh Mody u32 normal_count; 139ec94dbc5SRasesh Mody u32 high_count; 140ec94dbc5SRasesh Mody u32 comp_sent_count; 141ec94dbc5SRasesh Mody u32 comp_count; 142ec94dbc5SRasesh Mody 143ec94dbc5SRasesh Mody u32 cid; 144e916697fSRasesh Mody 145e916697fSRasesh Mody u32 db_addr_offset; 146e916697fSRasesh Mody struct core_db_data db_data; 1477f474588SRasesh Mody ecore_spq_async_comp_cb async_comp_cb[MAX_PROTOCOL_TYPE]; 148ec94dbc5SRasesh Mody }; 149ec94dbc5SRasesh Mody 150ec94dbc5SRasesh Mody struct ecore_port; 151ec94dbc5SRasesh Mody struct ecore_hwfn; 152ec94dbc5SRasesh Mody 153ec94dbc5SRasesh Mody /** 1542d52085eSRasesh Mody * @brief ecore_set_spq_block_timeout - calculates the maximum sleep 1552d52085eSRasesh Mody * iterations used in __ecore_spq_block(); 1562d52085eSRasesh Mody * 1572d52085eSRasesh Mody * @param p_hwfn 1582d52085eSRasesh Mody * @param spq_timeout_ms 1592d52085eSRasesh Mody */ 1602d52085eSRasesh Mody void ecore_set_spq_block_timeout(struct ecore_hwfn *p_hwfn, 1612d52085eSRasesh Mody u32 spq_timeout_ms); 1622d52085eSRasesh Mody 1632d52085eSRasesh Mody /** 164ec94dbc5SRasesh Mody * @brief ecore_spq_post - Posts a Slow hwfn request to FW, or lacking that 165ec94dbc5SRasesh Mody * Pends it to the future list. 166ec94dbc5SRasesh Mody * 167ec94dbc5SRasesh Mody * @param p_hwfn 168ec94dbc5SRasesh Mody * @param p_req 169ec94dbc5SRasesh Mody * 170ec94dbc5SRasesh Mody * @return enum _ecore_status_t 171ec94dbc5SRasesh Mody */ 172ec94dbc5SRasesh Mody enum _ecore_status_t ecore_spq_post(struct ecore_hwfn *p_hwfn, 173ec94dbc5SRasesh Mody struct ecore_spq_entry *p_ent, 174ec94dbc5SRasesh Mody u8 *fw_return_code); 175ec94dbc5SRasesh Mody 176ec94dbc5SRasesh Mody /** 177ec94dbc5SRasesh Mody * @brief ecore_spq_allocate - Alloocates & initializes the SPQ and EQ. 178ec94dbc5SRasesh Mody * 179ec94dbc5SRasesh Mody * @param p_hwfn 180ec94dbc5SRasesh Mody * 181ec94dbc5SRasesh Mody * @return enum _ecore_status_t 182ec94dbc5SRasesh Mody */ 183ec94dbc5SRasesh Mody enum _ecore_status_t ecore_spq_alloc(struct ecore_hwfn *p_hwfn); 184ec94dbc5SRasesh Mody 185ec94dbc5SRasesh Mody /** 186ec94dbc5SRasesh Mody * @brief ecore_spq_setup - Reset the SPQ to its start state. 187ec94dbc5SRasesh Mody * 188ec94dbc5SRasesh Mody * @param p_hwfn 189ec94dbc5SRasesh Mody */ 190ec94dbc5SRasesh Mody void ecore_spq_setup(struct ecore_hwfn *p_hwfn); 191ec94dbc5SRasesh Mody 192ec94dbc5SRasesh Mody /** 193ec94dbc5SRasesh Mody * @brief ecore_spq_deallocate - Deallocates the given SPQ struct. 194ec94dbc5SRasesh Mody * 195ec94dbc5SRasesh Mody * @param p_hwfn 196ec94dbc5SRasesh Mody */ 197ec94dbc5SRasesh Mody void ecore_spq_free(struct ecore_hwfn *p_hwfn); 198ec94dbc5SRasesh Mody 199ec94dbc5SRasesh Mody /** 200ec94dbc5SRasesh Mody * @brief ecore_spq_get_entry - Obtain an entrry from the spq 201ec94dbc5SRasesh Mody * free pool list. 202ec94dbc5SRasesh Mody * 203ec94dbc5SRasesh Mody * 204ec94dbc5SRasesh Mody * 205ec94dbc5SRasesh Mody * @param p_hwfn 206ec94dbc5SRasesh Mody * @param pp_ent 207ec94dbc5SRasesh Mody * 208ec94dbc5SRasesh Mody * @return enum _ecore_status_t 209ec94dbc5SRasesh Mody */ 210ec94dbc5SRasesh Mody enum _ecore_status_t 2119455b556SRasesh Mody ecore_spq_get_entry(struct ecore_hwfn *p_hwfn, 2129455b556SRasesh Mody struct ecore_spq_entry **pp_ent); 213ec94dbc5SRasesh Mody 214ec94dbc5SRasesh Mody /** 215ec94dbc5SRasesh Mody * @brief ecore_spq_return_entry - Return an entry to spq free 216ec94dbc5SRasesh Mody * pool list 217ec94dbc5SRasesh Mody * 218ec94dbc5SRasesh Mody * @param p_hwfn 219ec94dbc5SRasesh Mody * @param p_ent 220ec94dbc5SRasesh Mody */ 221ec94dbc5SRasesh Mody void ecore_spq_return_entry(struct ecore_hwfn *p_hwfn, 222ec94dbc5SRasesh Mody struct ecore_spq_entry *p_ent); 223ec94dbc5SRasesh Mody /** 224ec94dbc5SRasesh Mody * @brief ecore_eq_allocate - Allocates & initializes an EQ struct 225ec94dbc5SRasesh Mody * 226ec94dbc5SRasesh Mody * @param p_hwfn 227ec94dbc5SRasesh Mody * @param num_elem number of elements in the eq 228ec94dbc5SRasesh Mody * 229d411a2b5SRasesh Mody * @return enum _ecore_status_t 230ec94dbc5SRasesh Mody */ 231d411a2b5SRasesh Mody enum _ecore_status_t ecore_eq_alloc(struct ecore_hwfn *p_hwfn, u16 num_elem); 232ec94dbc5SRasesh Mody 233ec94dbc5SRasesh Mody /** 234d411a2b5SRasesh Mody * @brief ecore_eq_setup - Reset the EQ to its start state. 235ec94dbc5SRasesh Mody * 236ec94dbc5SRasesh Mody * @param p_hwfn 237ec94dbc5SRasesh Mody */ 238d411a2b5SRasesh Mody void ecore_eq_setup(struct ecore_hwfn *p_hwfn); 239ec94dbc5SRasesh Mody 240ec94dbc5SRasesh Mody /** 241d411a2b5SRasesh Mody * @brief ecore_eq_free - deallocates the given EQ struct. 242ec94dbc5SRasesh Mody * 243ec94dbc5SRasesh Mody * @param p_hwfn 244ec94dbc5SRasesh Mody */ 245d411a2b5SRasesh Mody void ecore_eq_free(struct ecore_hwfn *p_hwfn); 246ec94dbc5SRasesh Mody 247ec94dbc5SRasesh Mody /** 248ec94dbc5SRasesh Mody * @brief ecore_eq_prod_update - update the FW with default EQ producer 249ec94dbc5SRasesh Mody * 250ec94dbc5SRasesh Mody * @param p_hwfn 251ec94dbc5SRasesh Mody * @param prod 252ec94dbc5SRasesh Mody */ 2539455b556SRasesh Mody void ecore_eq_prod_update(struct ecore_hwfn *p_hwfn, 2549455b556SRasesh Mody u16 prod); 255ec94dbc5SRasesh Mody 256ec94dbc5SRasesh Mody /** 257ec94dbc5SRasesh Mody * @brief ecore_eq_completion - Completes currently pending EQ elements 258ec94dbc5SRasesh Mody * 259ec94dbc5SRasesh Mody * @param p_hwfn 260ec94dbc5SRasesh Mody * @param cookie 261ec94dbc5SRasesh Mody * 262ec94dbc5SRasesh Mody * @return enum _ecore_status_t 263ec94dbc5SRasesh Mody */ 264ec94dbc5SRasesh Mody enum _ecore_status_t ecore_eq_completion(struct ecore_hwfn *p_hwfn, 265ec94dbc5SRasesh Mody void *cookie); 266ec94dbc5SRasesh Mody 267ec94dbc5SRasesh Mody /** 268ec94dbc5SRasesh Mody * @brief ecore_spq_completion - Completes a single event 269ec94dbc5SRasesh Mody * 270ec94dbc5SRasesh Mody * @param p_hwfn 271ec94dbc5SRasesh Mody * @param echo - echo value from cookie (used for determining completion) 272ec94dbc5SRasesh Mody * @param p_data - data from cookie (used in callback function if applicable) 273ec94dbc5SRasesh Mody * 274ec94dbc5SRasesh Mody * @return enum _ecore_status_t 275ec94dbc5SRasesh Mody */ 276ec94dbc5SRasesh Mody enum _ecore_status_t ecore_spq_completion(struct ecore_hwfn *p_hwfn, 277ec94dbc5SRasesh Mody __le16 echo, 278ec94dbc5SRasesh Mody u8 fw_return_code, 279ec94dbc5SRasesh Mody union event_ring_data *p_data); 280ec94dbc5SRasesh Mody 281ec94dbc5SRasesh Mody /** 282ec94dbc5SRasesh Mody * @brief ecore_spq_get_cid - Given p_hwfn, return cid for the hwfn's SPQ 283ec94dbc5SRasesh Mody * 284ec94dbc5SRasesh Mody * @param p_hwfn 285ec94dbc5SRasesh Mody * 286ec94dbc5SRasesh Mody * @return u32 - SPQ CID 287ec94dbc5SRasesh Mody */ 288ec94dbc5SRasesh Mody u32 ecore_spq_get_cid(struct ecore_hwfn *p_hwfn); 289ec94dbc5SRasesh Mody 290ec94dbc5SRasesh Mody /** 291d411a2b5SRasesh Mody * @brief ecore_consq_alloc - Allocates & initializes an ConsQ struct 292ec94dbc5SRasesh Mody * 293ec94dbc5SRasesh Mody * @param p_hwfn 294ec94dbc5SRasesh Mody * 295d411a2b5SRasesh Mody * @return enum _ecore_status_t 296ec94dbc5SRasesh Mody */ 297d411a2b5SRasesh Mody enum _ecore_status_t ecore_consq_alloc(struct ecore_hwfn *p_hwfn); 298ec94dbc5SRasesh Mody 299ec94dbc5SRasesh Mody /** 300d411a2b5SRasesh Mody * @brief ecore_consq_setup - Reset the ConsQ to its start state. 301ec94dbc5SRasesh Mody * 302ec94dbc5SRasesh Mody * @param p_hwfn 303ec94dbc5SRasesh Mody */ 304d411a2b5SRasesh Mody void ecore_consq_setup(struct ecore_hwfn *p_hwfn); 305ec94dbc5SRasesh Mody 306ec94dbc5SRasesh Mody /** 307ec94dbc5SRasesh Mody * @brief ecore_consq_free - deallocates the given ConsQ struct. 308ec94dbc5SRasesh Mody * 309ec94dbc5SRasesh Mody * @param p_hwfn 310ec94dbc5SRasesh Mody */ 311d411a2b5SRasesh Mody void ecore_consq_free(struct ecore_hwfn *p_hwfn); 312ec94dbc5SRasesh Mody 313ec94dbc5SRasesh Mody #endif /* __ECORE_SPQ_H__ */ 314