18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 28c2ecf20Sopenharmony_ci/* QLogic qed NIC Driver 38c2ecf20Sopenharmony_ci * Copyright (c) 2015-2017 QLogic Corporation 48c2ecf20Sopenharmony_ci * Copyright (c) 2019-2020 Marvell International Ltd. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef _QED_SP_H 88c2ecf20Sopenharmony_ci#define _QED_SP_H 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/types.h> 118c2ecf20Sopenharmony_ci#include <linux/kernel.h> 128c2ecf20Sopenharmony_ci#include <linux/list.h> 138c2ecf20Sopenharmony_ci#include <linux/slab.h> 148c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 158c2ecf20Sopenharmony_ci#include <linux/qed/qed_chain.h> 168c2ecf20Sopenharmony_ci#include "qed.h" 178c2ecf20Sopenharmony_ci#include "qed_hsi.h" 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cienum spq_mode { 208c2ecf20Sopenharmony_ci QED_SPQ_MODE_BLOCK, /* Client will poll a designated mem. address */ 218c2ecf20Sopenharmony_ci QED_SPQ_MODE_CB, /* Client supplies a callback */ 228c2ecf20Sopenharmony_ci QED_SPQ_MODE_EBLOCK, /* QED should block until completion */ 238c2ecf20Sopenharmony_ci}; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistruct qed_spq_comp_cb { 268c2ecf20Sopenharmony_ci void (*function)(struct qed_hwfn *, 278c2ecf20Sopenharmony_ci void *, 288c2ecf20Sopenharmony_ci union event_ring_data *, 298c2ecf20Sopenharmony_ci u8 fw_return_code); 308c2ecf20Sopenharmony_ci void *cookie; 318c2ecf20Sopenharmony_ci}; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci/** 348c2ecf20Sopenharmony_ci * @brief qed_eth_cqe_completion - handles the completion of a 358c2ecf20Sopenharmony_ci * ramrod on the cqe ring 368c2ecf20Sopenharmony_ci * 378c2ecf20Sopenharmony_ci * @param p_hwfn 388c2ecf20Sopenharmony_ci * @param cqe 398c2ecf20Sopenharmony_ci * 408c2ecf20Sopenharmony_ci * @return int 418c2ecf20Sopenharmony_ci */ 428c2ecf20Sopenharmony_ciint qed_eth_cqe_completion(struct qed_hwfn *p_hwfn, 438c2ecf20Sopenharmony_ci struct eth_slow_path_rx_cqe *cqe); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci/** 468c2ecf20Sopenharmony_ci * @file 478c2ecf20Sopenharmony_ci * 488c2ecf20Sopenharmony_ci * QED Slow-hwfn queue interface 498c2ecf20Sopenharmony_ci */ 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ciunion ramrod_data { 528c2ecf20Sopenharmony_ci struct pf_start_ramrod_data pf_start; 538c2ecf20Sopenharmony_ci struct pf_update_ramrod_data pf_update; 548c2ecf20Sopenharmony_ci struct rx_queue_start_ramrod_data rx_queue_start; 558c2ecf20Sopenharmony_ci struct rx_queue_update_ramrod_data rx_queue_update; 568c2ecf20Sopenharmony_ci struct rx_queue_stop_ramrod_data rx_queue_stop; 578c2ecf20Sopenharmony_ci struct tx_queue_start_ramrod_data tx_queue_start; 588c2ecf20Sopenharmony_ci struct tx_queue_stop_ramrod_data tx_queue_stop; 598c2ecf20Sopenharmony_ci struct vport_start_ramrod_data vport_start; 608c2ecf20Sopenharmony_ci struct vport_stop_ramrod_data vport_stop; 618c2ecf20Sopenharmony_ci struct rx_update_gft_filter_data rx_update_gft; 628c2ecf20Sopenharmony_ci struct vport_update_ramrod_data vport_update; 638c2ecf20Sopenharmony_ci struct core_rx_start_ramrod_data core_rx_queue_start; 648c2ecf20Sopenharmony_ci struct core_rx_stop_ramrod_data core_rx_queue_stop; 658c2ecf20Sopenharmony_ci struct core_tx_start_ramrod_data core_tx_queue_start; 668c2ecf20Sopenharmony_ci struct core_tx_stop_ramrod_data core_tx_queue_stop; 678c2ecf20Sopenharmony_ci struct vport_filter_update_ramrod_data vport_filter_update; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci struct rdma_init_func_ramrod_data rdma_init_func; 708c2ecf20Sopenharmony_ci struct rdma_close_func_ramrod_data rdma_close_func; 718c2ecf20Sopenharmony_ci struct rdma_register_tid_ramrod_data rdma_register_tid; 728c2ecf20Sopenharmony_ci struct rdma_deregister_tid_ramrod_data rdma_deregister_tid; 738c2ecf20Sopenharmony_ci struct roce_create_qp_resp_ramrod_data roce_create_qp_resp; 748c2ecf20Sopenharmony_ci struct roce_create_qp_req_ramrod_data roce_create_qp_req; 758c2ecf20Sopenharmony_ci struct roce_modify_qp_resp_ramrod_data roce_modify_qp_resp; 768c2ecf20Sopenharmony_ci struct roce_modify_qp_req_ramrod_data roce_modify_qp_req; 778c2ecf20Sopenharmony_ci struct roce_query_qp_resp_ramrod_data roce_query_qp_resp; 788c2ecf20Sopenharmony_ci struct roce_query_qp_req_ramrod_data roce_query_qp_req; 798c2ecf20Sopenharmony_ci struct roce_destroy_qp_resp_ramrod_data roce_destroy_qp_resp; 808c2ecf20Sopenharmony_ci struct roce_destroy_qp_req_ramrod_data roce_destroy_qp_req; 818c2ecf20Sopenharmony_ci struct roce_init_func_ramrod_data roce_init_func; 828c2ecf20Sopenharmony_ci struct rdma_create_cq_ramrod_data rdma_create_cq; 838c2ecf20Sopenharmony_ci struct rdma_destroy_cq_ramrod_data rdma_destroy_cq; 848c2ecf20Sopenharmony_ci struct rdma_srq_create_ramrod_data rdma_create_srq; 858c2ecf20Sopenharmony_ci struct rdma_srq_destroy_ramrod_data rdma_destroy_srq; 868c2ecf20Sopenharmony_ci struct rdma_srq_modify_ramrod_data rdma_modify_srq; 878c2ecf20Sopenharmony_ci struct iwarp_create_qp_ramrod_data iwarp_create_qp; 888c2ecf20Sopenharmony_ci struct iwarp_tcp_offload_ramrod_data iwarp_tcp_offload; 898c2ecf20Sopenharmony_ci struct iwarp_mpa_offload_ramrod_data iwarp_mpa_offload; 908c2ecf20Sopenharmony_ci struct iwarp_modify_qp_ramrod_data iwarp_modify_qp; 918c2ecf20Sopenharmony_ci struct iwarp_init_func_ramrod_data iwarp_init_func; 928c2ecf20Sopenharmony_ci struct fcoe_init_ramrod_params fcoe_init; 938c2ecf20Sopenharmony_ci struct fcoe_conn_offload_ramrod_params fcoe_conn_ofld; 948c2ecf20Sopenharmony_ci struct fcoe_conn_terminate_ramrod_params fcoe_conn_terminate; 958c2ecf20Sopenharmony_ci struct fcoe_stat_ramrod_params fcoe_stat; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci struct iscsi_init_ramrod_params iscsi_init; 988c2ecf20Sopenharmony_ci struct iscsi_spe_conn_offload iscsi_conn_offload; 998c2ecf20Sopenharmony_ci struct iscsi_conn_update_ramrod_params iscsi_conn_update; 1008c2ecf20Sopenharmony_ci struct iscsi_spe_conn_mac_update iscsi_conn_mac_update; 1018c2ecf20Sopenharmony_ci struct iscsi_spe_conn_termination iscsi_conn_terminate; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci struct vf_start_ramrod_data vf_start; 1048c2ecf20Sopenharmony_ci struct vf_stop_ramrod_data vf_stop; 1058c2ecf20Sopenharmony_ci}; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci#define EQ_MAX_CREDIT 0xffffffff 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_cienum spq_priority { 1108c2ecf20Sopenharmony_ci QED_SPQ_PRIORITY_NORMAL, 1118c2ecf20Sopenharmony_ci QED_SPQ_PRIORITY_HIGH, 1128c2ecf20Sopenharmony_ci}; 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ciunion qed_spq_req_comp { 1158c2ecf20Sopenharmony_ci struct qed_spq_comp_cb cb; 1168c2ecf20Sopenharmony_ci u64 *done_addr; 1178c2ecf20Sopenharmony_ci}; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistruct qed_spq_comp_done { 1208c2ecf20Sopenharmony_ci unsigned int done; 1218c2ecf20Sopenharmony_ci u8 fw_return_code; 1228c2ecf20Sopenharmony_ci}; 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_cistruct qed_spq_entry { 1258c2ecf20Sopenharmony_ci struct list_head list; 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci u8 flags; 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci /* HSI slow path element */ 1308c2ecf20Sopenharmony_ci struct slow_path_element elem; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci union ramrod_data ramrod; 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci enum spq_priority priority; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci /* pending queue for this entry */ 1378c2ecf20Sopenharmony_ci struct list_head *queue; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci enum spq_mode comp_mode; 1408c2ecf20Sopenharmony_ci struct qed_spq_comp_cb comp_cb; 1418c2ecf20Sopenharmony_ci struct qed_spq_comp_done comp_done; /* SPQ_MODE_EBLOCK */ 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci /* Posted entry for unlimited list entry in EBLOCK mode */ 1448c2ecf20Sopenharmony_ci struct qed_spq_entry *post_ent; 1458c2ecf20Sopenharmony_ci}; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_cistruct qed_eq { 1488c2ecf20Sopenharmony_ci struct qed_chain chain; 1498c2ecf20Sopenharmony_ci u8 eq_sb_index; /* index within the SB */ 1508c2ecf20Sopenharmony_ci __le16 *p_fw_cons; /* ptr to index value */ 1518c2ecf20Sopenharmony_ci}; 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_cistruct qed_consq { 1548c2ecf20Sopenharmony_ci struct qed_chain chain; 1558c2ecf20Sopenharmony_ci}; 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_citypedef int (*qed_spq_async_comp_cb)(struct qed_hwfn *p_hwfn, u8 opcode, 1588c2ecf20Sopenharmony_ci __le16 echo, union event_ring_data *data, 1598c2ecf20Sopenharmony_ci u8 fw_return_code); 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ciint 1628c2ecf20Sopenharmony_ciqed_spq_register_async_cb(struct qed_hwfn *p_hwfn, 1638c2ecf20Sopenharmony_ci enum protocol_type protocol_id, 1648c2ecf20Sopenharmony_ci qed_spq_async_comp_cb cb); 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_civoid 1678c2ecf20Sopenharmony_ciqed_spq_unregister_async_cb(struct qed_hwfn *p_hwfn, 1688c2ecf20Sopenharmony_ci enum protocol_type protocol_id); 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_cistruct qed_spq { 1718c2ecf20Sopenharmony_ci spinlock_t lock; /* SPQ lock */ 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci struct list_head unlimited_pending; 1748c2ecf20Sopenharmony_ci struct list_head pending; 1758c2ecf20Sopenharmony_ci struct list_head completion_pending; 1768c2ecf20Sopenharmony_ci struct list_head free_pool; 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci struct qed_chain chain; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci /* allocated dma-able memory for spq entries (+ramrod data) */ 1818c2ecf20Sopenharmony_ci dma_addr_t p_phys; 1828c2ecf20Sopenharmony_ci struct qed_spq_entry *p_virt; 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci#define SPQ_RING_SIZE \ 1858c2ecf20Sopenharmony_ci (CORE_SPQE_PAGE_SIZE_BYTES / sizeof(struct slow_path_element)) 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci /* Bitmap for handling out-of-order completions */ 1888c2ecf20Sopenharmony_ci DECLARE_BITMAP(p_comp_bitmap, SPQ_RING_SIZE); 1898c2ecf20Sopenharmony_ci u8 comp_bitmap_idx; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci /* Statistics */ 1928c2ecf20Sopenharmony_ci u32 unlimited_pending_count; 1938c2ecf20Sopenharmony_ci u32 normal_count; 1948c2ecf20Sopenharmony_ci u32 high_count; 1958c2ecf20Sopenharmony_ci u32 comp_sent_count; 1968c2ecf20Sopenharmony_ci u32 comp_count; 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci u32 cid; 1998c2ecf20Sopenharmony_ci u32 db_addr_offset; 2008c2ecf20Sopenharmony_ci struct core_db_data db_data; 2018c2ecf20Sopenharmony_ci qed_spq_async_comp_cb async_comp_cb[MAX_PROTOCOL_TYPE]; 2028c2ecf20Sopenharmony_ci}; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci/** 2058c2ecf20Sopenharmony_ci * @brief qed_spq_post - Posts a Slow hwfn request to FW, or lacking that 2068c2ecf20Sopenharmony_ci * Pends it to the future list. 2078c2ecf20Sopenharmony_ci * 2088c2ecf20Sopenharmony_ci * @param p_hwfn 2098c2ecf20Sopenharmony_ci * @param p_req 2108c2ecf20Sopenharmony_ci * 2118c2ecf20Sopenharmony_ci * @return int 2128c2ecf20Sopenharmony_ci */ 2138c2ecf20Sopenharmony_ciint qed_spq_post(struct qed_hwfn *p_hwfn, 2148c2ecf20Sopenharmony_ci struct qed_spq_entry *p_ent, 2158c2ecf20Sopenharmony_ci u8 *fw_return_code); 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci/** 2188c2ecf20Sopenharmony_ci * @brief qed_spq_allocate - Alloocates & initializes the SPQ and EQ. 2198c2ecf20Sopenharmony_ci * 2208c2ecf20Sopenharmony_ci * @param p_hwfn 2218c2ecf20Sopenharmony_ci * 2228c2ecf20Sopenharmony_ci * @return int 2238c2ecf20Sopenharmony_ci */ 2248c2ecf20Sopenharmony_ciint qed_spq_alloc(struct qed_hwfn *p_hwfn); 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci/** 2278c2ecf20Sopenharmony_ci * @brief qed_spq_setup - Reset the SPQ to its start state. 2288c2ecf20Sopenharmony_ci * 2298c2ecf20Sopenharmony_ci * @param p_hwfn 2308c2ecf20Sopenharmony_ci */ 2318c2ecf20Sopenharmony_civoid qed_spq_setup(struct qed_hwfn *p_hwfn); 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_ci/** 2348c2ecf20Sopenharmony_ci * @brief qed_spq_deallocate - Deallocates the given SPQ struct. 2358c2ecf20Sopenharmony_ci * 2368c2ecf20Sopenharmony_ci * @param p_hwfn 2378c2ecf20Sopenharmony_ci */ 2388c2ecf20Sopenharmony_civoid qed_spq_free(struct qed_hwfn *p_hwfn); 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci/** 2418c2ecf20Sopenharmony_ci * @brief qed_spq_get_entry - Obtain an entrry from the spq 2428c2ecf20Sopenharmony_ci * free pool list. 2438c2ecf20Sopenharmony_ci * 2448c2ecf20Sopenharmony_ci * 2458c2ecf20Sopenharmony_ci * 2468c2ecf20Sopenharmony_ci * @param p_hwfn 2478c2ecf20Sopenharmony_ci * @param pp_ent 2488c2ecf20Sopenharmony_ci * 2498c2ecf20Sopenharmony_ci * @return int 2508c2ecf20Sopenharmony_ci */ 2518c2ecf20Sopenharmony_ciint 2528c2ecf20Sopenharmony_ciqed_spq_get_entry(struct qed_hwfn *p_hwfn, 2538c2ecf20Sopenharmony_ci struct qed_spq_entry **pp_ent); 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci/** 2568c2ecf20Sopenharmony_ci * @brief qed_spq_return_entry - Return an entry to spq free 2578c2ecf20Sopenharmony_ci * pool list 2588c2ecf20Sopenharmony_ci * 2598c2ecf20Sopenharmony_ci * @param p_hwfn 2608c2ecf20Sopenharmony_ci * @param p_ent 2618c2ecf20Sopenharmony_ci */ 2628c2ecf20Sopenharmony_civoid qed_spq_return_entry(struct qed_hwfn *p_hwfn, 2638c2ecf20Sopenharmony_ci struct qed_spq_entry *p_ent); 2648c2ecf20Sopenharmony_ci/** 2658c2ecf20Sopenharmony_ci * @brief qed_eq_allocate - Allocates & initializes an EQ struct 2668c2ecf20Sopenharmony_ci * 2678c2ecf20Sopenharmony_ci * @param p_hwfn 2688c2ecf20Sopenharmony_ci * @param num_elem number of elements in the eq 2698c2ecf20Sopenharmony_ci * 2708c2ecf20Sopenharmony_ci * @return int 2718c2ecf20Sopenharmony_ci */ 2728c2ecf20Sopenharmony_ciint qed_eq_alloc(struct qed_hwfn *p_hwfn, u16 num_elem); 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci/** 2758c2ecf20Sopenharmony_ci * @brief qed_eq_setup - Reset the EQ to its start state. 2768c2ecf20Sopenharmony_ci * 2778c2ecf20Sopenharmony_ci * @param p_hwfn 2788c2ecf20Sopenharmony_ci */ 2798c2ecf20Sopenharmony_civoid qed_eq_setup(struct qed_hwfn *p_hwfn); 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci/** 2828c2ecf20Sopenharmony_ci * @brief qed_eq_free - deallocates the given EQ struct. 2838c2ecf20Sopenharmony_ci * 2848c2ecf20Sopenharmony_ci * @param p_hwfn 2858c2ecf20Sopenharmony_ci */ 2868c2ecf20Sopenharmony_civoid qed_eq_free(struct qed_hwfn *p_hwfn); 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci/** 2898c2ecf20Sopenharmony_ci * @brief qed_eq_prod_update - update the FW with default EQ producer 2908c2ecf20Sopenharmony_ci * 2918c2ecf20Sopenharmony_ci * @param p_hwfn 2928c2ecf20Sopenharmony_ci * @param prod 2938c2ecf20Sopenharmony_ci */ 2948c2ecf20Sopenharmony_civoid qed_eq_prod_update(struct qed_hwfn *p_hwfn, 2958c2ecf20Sopenharmony_ci u16 prod); 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci/** 2988c2ecf20Sopenharmony_ci * @brief qed_eq_completion - Completes currently pending EQ elements 2998c2ecf20Sopenharmony_ci * 3008c2ecf20Sopenharmony_ci * @param p_hwfn 3018c2ecf20Sopenharmony_ci * @param cookie 3028c2ecf20Sopenharmony_ci * 3038c2ecf20Sopenharmony_ci * @return int 3048c2ecf20Sopenharmony_ci */ 3058c2ecf20Sopenharmony_ciint qed_eq_completion(struct qed_hwfn *p_hwfn, 3068c2ecf20Sopenharmony_ci void *cookie); 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci/** 3098c2ecf20Sopenharmony_ci * @brief qed_spq_completion - Completes a single event 3108c2ecf20Sopenharmony_ci * 3118c2ecf20Sopenharmony_ci * @param p_hwfn 3128c2ecf20Sopenharmony_ci * @param echo - echo value from cookie (used for determining completion) 3138c2ecf20Sopenharmony_ci * @param p_data - data from cookie (used in callback function if applicable) 3148c2ecf20Sopenharmony_ci * 3158c2ecf20Sopenharmony_ci * @return int 3168c2ecf20Sopenharmony_ci */ 3178c2ecf20Sopenharmony_ciint qed_spq_completion(struct qed_hwfn *p_hwfn, 3188c2ecf20Sopenharmony_ci __le16 echo, 3198c2ecf20Sopenharmony_ci u8 fw_return_code, 3208c2ecf20Sopenharmony_ci union event_ring_data *p_data); 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ci/** 3238c2ecf20Sopenharmony_ci * @brief qed_spq_get_cid - Given p_hwfn, return cid for the hwfn's SPQ 3248c2ecf20Sopenharmony_ci * 3258c2ecf20Sopenharmony_ci * @param p_hwfn 3268c2ecf20Sopenharmony_ci * 3278c2ecf20Sopenharmony_ci * @return u32 - SPQ CID 3288c2ecf20Sopenharmony_ci */ 3298c2ecf20Sopenharmony_ciu32 qed_spq_get_cid(struct qed_hwfn *p_hwfn); 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci/** 3328c2ecf20Sopenharmony_ci * @brief qed_consq_alloc - Allocates & initializes an ConsQ 3338c2ecf20Sopenharmony_ci * struct 3348c2ecf20Sopenharmony_ci * 3358c2ecf20Sopenharmony_ci * @param p_hwfn 3368c2ecf20Sopenharmony_ci * 3378c2ecf20Sopenharmony_ci * @return int 3388c2ecf20Sopenharmony_ci */ 3398c2ecf20Sopenharmony_ciint qed_consq_alloc(struct qed_hwfn *p_hwfn); 3408c2ecf20Sopenharmony_ci 3418c2ecf20Sopenharmony_ci/** 3428c2ecf20Sopenharmony_ci * @brief qed_consq_setup - Reset the ConsQ to its start state. 3438c2ecf20Sopenharmony_ci * 3448c2ecf20Sopenharmony_ci * @param p_hwfn 3458c2ecf20Sopenharmony_ci */ 3468c2ecf20Sopenharmony_civoid qed_consq_setup(struct qed_hwfn *p_hwfn); 3478c2ecf20Sopenharmony_ci 3488c2ecf20Sopenharmony_ci/** 3498c2ecf20Sopenharmony_ci * @brief qed_consq_free - deallocates the given ConsQ struct. 3508c2ecf20Sopenharmony_ci * 3518c2ecf20Sopenharmony_ci * @param p_hwfn 3528c2ecf20Sopenharmony_ci */ 3538c2ecf20Sopenharmony_civoid qed_consq_free(struct qed_hwfn *p_hwfn); 3548c2ecf20Sopenharmony_ciint qed_spq_pend_post(struct qed_hwfn *p_hwfn); 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci/** 3578c2ecf20Sopenharmony_ci * @file 3588c2ecf20Sopenharmony_ci * 3598c2ecf20Sopenharmony_ci * @brief Slow-hwfn low-level commands (Ramrods) function definitions. 3608c2ecf20Sopenharmony_ci */ 3618c2ecf20Sopenharmony_ci 3628c2ecf20Sopenharmony_ci#define QED_SP_EQ_COMPLETION 0x01 3638c2ecf20Sopenharmony_ci#define QED_SP_CQE_COMPLETION 0x02 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_cistruct qed_sp_init_data { 3668c2ecf20Sopenharmony_ci u32 cid; 3678c2ecf20Sopenharmony_ci u16 opaque_fid; 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_ci /* Information regarding operation upon sending & completion */ 3708c2ecf20Sopenharmony_ci enum spq_mode comp_mode; 3718c2ecf20Sopenharmony_ci struct qed_spq_comp_cb *p_comp_data; 3728c2ecf20Sopenharmony_ci}; 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci/** 3758c2ecf20Sopenharmony_ci * @brief Returns a SPQ entry to the pool / frees the entry if allocated. 3768c2ecf20Sopenharmony_ci * Should be called on in error flows after initializing the SPQ entry 3778c2ecf20Sopenharmony_ci * and before posting it. 3788c2ecf20Sopenharmony_ci * 3798c2ecf20Sopenharmony_ci * @param p_hwfn 3808c2ecf20Sopenharmony_ci * @param p_ent 3818c2ecf20Sopenharmony_ci */ 3828c2ecf20Sopenharmony_civoid qed_sp_destroy_request(struct qed_hwfn *p_hwfn, 3838c2ecf20Sopenharmony_ci struct qed_spq_entry *p_ent); 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ciint qed_sp_init_request(struct qed_hwfn *p_hwfn, 3868c2ecf20Sopenharmony_ci struct qed_spq_entry **pp_ent, 3878c2ecf20Sopenharmony_ci u8 cmd, 3888c2ecf20Sopenharmony_ci u8 protocol, 3898c2ecf20Sopenharmony_ci struct qed_sp_init_data *p_data); 3908c2ecf20Sopenharmony_ci 3918c2ecf20Sopenharmony_ci/** 3928c2ecf20Sopenharmony_ci * @brief qed_sp_pf_start - PF Function Start Ramrod 3938c2ecf20Sopenharmony_ci * 3948c2ecf20Sopenharmony_ci * This ramrod is sent to initialize a physical function (PF). It will 3958c2ecf20Sopenharmony_ci * configure the function related parameters and write its completion to the 3968c2ecf20Sopenharmony_ci * event ring specified in the parameters. 3978c2ecf20Sopenharmony_ci * 3988c2ecf20Sopenharmony_ci * Ramrods complete on the common event ring for the PF. This ring is 3998c2ecf20Sopenharmony_ci * allocated by the driver on host memory and its parameters are written 4008c2ecf20Sopenharmony_ci * to the internal RAM of the UStorm by the Function Start Ramrod. 4018c2ecf20Sopenharmony_ci * 4028c2ecf20Sopenharmony_ci * @param p_hwfn 4038c2ecf20Sopenharmony_ci * @param p_ptt 4048c2ecf20Sopenharmony_ci * @param p_tunn 4058c2ecf20Sopenharmony_ci * @param allow_npar_tx_switch 4068c2ecf20Sopenharmony_ci * 4078c2ecf20Sopenharmony_ci * @return int 4088c2ecf20Sopenharmony_ci */ 4098c2ecf20Sopenharmony_ci 4108c2ecf20Sopenharmony_ciint qed_sp_pf_start(struct qed_hwfn *p_hwfn, 4118c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 4128c2ecf20Sopenharmony_ci struct qed_tunnel_info *p_tunn, 4138c2ecf20Sopenharmony_ci bool allow_npar_tx_switch); 4148c2ecf20Sopenharmony_ci 4158c2ecf20Sopenharmony_ci/** 4168c2ecf20Sopenharmony_ci * @brief qed_sp_pf_update - PF Function Update Ramrod 4178c2ecf20Sopenharmony_ci * 4188c2ecf20Sopenharmony_ci * This ramrod updates function-related parameters. Every parameter can be 4198c2ecf20Sopenharmony_ci * updated independently, according to configuration flags. 4208c2ecf20Sopenharmony_ci * 4218c2ecf20Sopenharmony_ci * @param p_hwfn 4228c2ecf20Sopenharmony_ci * 4238c2ecf20Sopenharmony_ci * @return int 4248c2ecf20Sopenharmony_ci */ 4258c2ecf20Sopenharmony_ci 4268c2ecf20Sopenharmony_ciint qed_sp_pf_update(struct qed_hwfn *p_hwfn); 4278c2ecf20Sopenharmony_ci 4288c2ecf20Sopenharmony_ci/** 4298c2ecf20Sopenharmony_ci * @brief qed_sp_pf_update_stag - Update firmware of new outer tag 4308c2ecf20Sopenharmony_ci * 4318c2ecf20Sopenharmony_ci * @param p_hwfn 4328c2ecf20Sopenharmony_ci * 4338c2ecf20Sopenharmony_ci * @return int 4348c2ecf20Sopenharmony_ci */ 4358c2ecf20Sopenharmony_ciint qed_sp_pf_update_stag(struct qed_hwfn *p_hwfn); 4368c2ecf20Sopenharmony_ci 4378c2ecf20Sopenharmony_ci/** 4388c2ecf20Sopenharmony_ci * @brief qed_sp_pf_stop - PF Function Stop Ramrod 4398c2ecf20Sopenharmony_ci * 4408c2ecf20Sopenharmony_ci * This ramrod is sent to close a Physical Function (PF). It is the last ramrod 4418c2ecf20Sopenharmony_ci * sent and the last completion written to the PFs Event Ring. This ramrod also 4428c2ecf20Sopenharmony_ci * deletes the context for the Slowhwfn connection on this PF. 4438c2ecf20Sopenharmony_ci * 4448c2ecf20Sopenharmony_ci * @note Not required for first packet. 4458c2ecf20Sopenharmony_ci * 4468c2ecf20Sopenharmony_ci * @param p_hwfn 4478c2ecf20Sopenharmony_ci * 4488c2ecf20Sopenharmony_ci * @return int 4498c2ecf20Sopenharmony_ci */ 4508c2ecf20Sopenharmony_ci 4518c2ecf20Sopenharmony_ci/** 4528c2ecf20Sopenharmony_ci * @brief qed_sp_pf_update_ufp - PF ufp update Ramrod 4538c2ecf20Sopenharmony_ci * 4548c2ecf20Sopenharmony_ci * @param p_hwfn 4558c2ecf20Sopenharmony_ci * 4568c2ecf20Sopenharmony_ci * @return int 4578c2ecf20Sopenharmony_ci */ 4588c2ecf20Sopenharmony_ciint qed_sp_pf_update_ufp(struct qed_hwfn *p_hwfn); 4598c2ecf20Sopenharmony_ci 4608c2ecf20Sopenharmony_ciint qed_sp_pf_stop(struct qed_hwfn *p_hwfn); 4618c2ecf20Sopenharmony_ci 4628c2ecf20Sopenharmony_ciint qed_sp_pf_update_tunn_cfg(struct qed_hwfn *p_hwfn, 4638c2ecf20Sopenharmony_ci struct qed_ptt *p_ptt, 4648c2ecf20Sopenharmony_ci struct qed_tunnel_info *p_tunn, 4658c2ecf20Sopenharmony_ci enum spq_mode comp_mode, 4668c2ecf20Sopenharmony_ci struct qed_spq_comp_cb *p_comp_data); 4678c2ecf20Sopenharmony_ci/** 4688c2ecf20Sopenharmony_ci * @brief qed_sp_heartbeat_ramrod - Send empty Ramrod 4698c2ecf20Sopenharmony_ci * 4708c2ecf20Sopenharmony_ci * @param p_hwfn 4718c2ecf20Sopenharmony_ci * 4728c2ecf20Sopenharmony_ci * @return int 4738c2ecf20Sopenharmony_ci */ 4748c2ecf20Sopenharmony_ci 4758c2ecf20Sopenharmony_ciint qed_sp_heartbeat_ramrod(struct qed_hwfn *p_hwfn); 4768c2ecf20Sopenharmony_ci 4778c2ecf20Sopenharmony_ci#endif 478