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