xref: /freebsd/sys/contrib/ena-com/ena_com.h (revision adfed2d8)
145c98dacSZbigniew Bodek /*-
29eb1615fSMarcin Wojtas  * SPDX-License-Identifier: BSD-3-Clause
345c98dacSZbigniew Bodek  *
4*adfed2d8SArthur Kiyanovski  * Copyright (c) 2015-2023 Amazon.com, Inc. or its affiliates.
545c98dacSZbigniew Bodek  * All rights reserved.
645c98dacSZbigniew Bodek  *
745c98dacSZbigniew Bodek  * Redistribution and use in source and binary forms, with or without
845c98dacSZbigniew Bodek  * modification, are permitted provided that the following conditions
945c98dacSZbigniew Bodek  * are met:
1045c98dacSZbigniew Bodek  *
1145c98dacSZbigniew Bodek  * * Redistributions of source code must retain the above copyright
1245c98dacSZbigniew Bodek  * notice, this list of conditions and the following disclaimer.
1345c98dacSZbigniew Bodek  * * Redistributions in binary form must reproduce the above copyright
1445c98dacSZbigniew Bodek  * notice, this list of conditions and the following disclaimer in
1545c98dacSZbigniew Bodek  * the documentation and/or other materials provided with the
1645c98dacSZbigniew Bodek  * distribution.
1745c98dacSZbigniew Bodek  * * Neither the name of copyright holder nor the names of its
1845c98dacSZbigniew Bodek  * contributors may be used to endorse or promote products derived
1945c98dacSZbigniew Bodek  * from this software without specific prior written permission.
2045c98dacSZbigniew Bodek  *
2145c98dacSZbigniew Bodek  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2245c98dacSZbigniew Bodek  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2345c98dacSZbigniew Bodek  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2445c98dacSZbigniew Bodek  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2545c98dacSZbigniew Bodek  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2645c98dacSZbigniew Bodek  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2745c98dacSZbigniew Bodek  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2845c98dacSZbigniew Bodek  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2945c98dacSZbigniew Bodek  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3045c98dacSZbigniew Bodek  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3145c98dacSZbigniew Bodek  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3245c98dacSZbigniew Bodek  */
3345c98dacSZbigniew Bodek 
3445c98dacSZbigniew Bodek #ifndef ENA_COM
3545c98dacSZbigniew Bodek #define ENA_COM
3645c98dacSZbigniew Bodek 
3745c98dacSZbigniew Bodek #include "ena_plat.h"
3845c98dacSZbigniew Bodek 
3945c98dacSZbigniew Bodek #define ENA_MAX_NUM_IO_QUEUES 128U
4045c98dacSZbigniew Bodek /* We need to queues for each IO (on for Tx and one for Rx) */
4145c98dacSZbigniew Bodek #define ENA_TOTAL_NUM_QUEUES (2 * (ENA_MAX_NUM_IO_QUEUES))
4245c98dacSZbigniew Bodek 
4345c98dacSZbigniew Bodek #define ENA_MAX_HANDLERS 256
4445c98dacSZbigniew Bodek 
4545c98dacSZbigniew Bodek #define ENA_MAX_PHYS_ADDR_SIZE_BITS 48
4645c98dacSZbigniew Bodek 
4745c98dacSZbigniew Bodek /* Unit in usec */
4845c98dacSZbigniew Bodek #define ENA_REG_READ_TIMEOUT 200000
4945c98dacSZbigniew Bodek 
5045c98dacSZbigniew Bodek #define ADMIN_SQ_SIZE(depth)	((depth) * sizeof(struct ena_admin_aq_entry))
5145c98dacSZbigniew Bodek #define ADMIN_CQ_SIZE(depth)	((depth) * sizeof(struct ena_admin_acq_entry))
5245c98dacSZbigniew Bodek #define ADMIN_AENQ_SIZE(depth)	((depth) * sizeof(struct ena_admin_aenq_entry))
5345c98dacSZbigniew Bodek 
54*adfed2d8SArthur Kiyanovski #define ENA_CUSTOMER_METRICS_BUFFER_SIZE 512
55*adfed2d8SArthur Kiyanovski 
5645c98dacSZbigniew Bodek /*****************************************************************************/
5745c98dacSZbigniew Bodek /*****************************************************************************/
5845c98dacSZbigniew Bodek /* ENA adaptive interrupt moderation settings */
5945c98dacSZbigniew Bodek 
608483b844SMarcin Wojtas #define ENA_INTR_INITIAL_TX_INTERVAL_USECS ENA_INTR_INITIAL_TX_INTERVAL_USECS_PLAT
61*adfed2d8SArthur Kiyanovski #define ENA_INTR_INITIAL_RX_INTERVAL_USECS ENA_INTR_INITIAL_RX_INTERVAL_USECS_PLAT
628483b844SMarcin Wojtas #define ENA_DEFAULT_INTR_DELAY_RESOLUTION 1
6345c98dacSZbigniew Bodek 
648483b844SMarcin Wojtas #define ENA_HASH_KEY_SIZE 40
6545c98dacSZbigniew Bodek 
6645c98dacSZbigniew Bodek #define ENA_HW_HINTS_NO_TIMEOUT	0xFFFF
6745c98dacSZbigniew Bodek 
6867ec48bbSMarcin Wojtas #define ENA_FEATURE_MAX_QUEUE_EXT_VER 1
6967ec48bbSMarcin Wojtas 
7067ec48bbSMarcin Wojtas struct ena_llq_configurations {
7167ec48bbSMarcin Wojtas 	enum ena_admin_llq_header_location llq_header_location;
7267ec48bbSMarcin Wojtas 	enum ena_admin_llq_ring_entry_size llq_ring_entry_size;
7367ec48bbSMarcin Wojtas 	enum ena_admin_llq_stride_ctrl  llq_stride_ctrl;
7467ec48bbSMarcin Wojtas 	enum ena_admin_llq_num_descs_before_header llq_num_decs_before_header;
7567ec48bbSMarcin Wojtas 	u16 llq_ring_entry_size_value;
7667ec48bbSMarcin Wojtas };
7767ec48bbSMarcin Wojtas 
7845c98dacSZbigniew Bodek enum queue_direction {
7945c98dacSZbigniew Bodek 	ENA_COM_IO_QUEUE_DIRECTION_TX,
8045c98dacSZbigniew Bodek 	ENA_COM_IO_QUEUE_DIRECTION_RX
8145c98dacSZbigniew Bodek };
8245c98dacSZbigniew Bodek 
8345c98dacSZbigniew Bodek struct ena_com_buf {
8445c98dacSZbigniew Bodek 	dma_addr_t paddr; /**< Buffer physical address */
8545c98dacSZbigniew Bodek 	u16 len; /**< Buffer length in bytes */
8645c98dacSZbigniew Bodek };
8745c98dacSZbigniew Bodek 
8845c98dacSZbigniew Bodek struct ena_com_rx_buf_info {
8945c98dacSZbigniew Bodek 	u16 len;
9045c98dacSZbigniew Bodek 	u16 req_id;
9145c98dacSZbigniew Bodek };
9245c98dacSZbigniew Bodek 
9345c98dacSZbigniew Bodek struct ena_com_io_desc_addr {
9445c98dacSZbigniew Bodek 	u8 __iomem *pbuf_dev_addr; /* LLQ address */
9545c98dacSZbigniew Bodek 	u8 *virt_addr;
9645c98dacSZbigniew Bodek 	dma_addr_t phys_addr;
9745c98dacSZbigniew Bodek 	ena_mem_handle_t mem_handle;
9845c98dacSZbigniew Bodek };
9945c98dacSZbigniew Bodek 
10045c98dacSZbigniew Bodek struct ena_com_tx_meta {
10145c98dacSZbigniew Bodek 	u16 mss;
10245c98dacSZbigniew Bodek 	u16 l3_hdr_len;
10345c98dacSZbigniew Bodek 	u16 l3_hdr_offset;
10445c98dacSZbigniew Bodek 	u16 l4_hdr_len; /* In words */
10545c98dacSZbigniew Bodek };
10645c98dacSZbigniew Bodek 
107a195fab0SMarcin Wojtas struct ena_com_llq_info {
10867ec48bbSMarcin Wojtas 	u16 header_location_ctrl;
109a195fab0SMarcin Wojtas 	u16 desc_stride_ctrl;
11067ec48bbSMarcin Wojtas 	u16 desc_list_entry_size_ctrl;
111a195fab0SMarcin Wojtas 	u16 desc_list_entry_size;
112a195fab0SMarcin Wojtas 	u16 descs_num_before_header;
113a195fab0SMarcin Wojtas 	u16 descs_per_entry;
11467ec48bbSMarcin Wojtas 	u16 max_entries_in_tx_burst;
1158483b844SMarcin Wojtas 	bool disable_meta_caching;
116a195fab0SMarcin Wojtas };
117a195fab0SMarcin Wojtas 
11845c98dacSZbigniew Bodek struct ena_com_io_cq {
11945c98dacSZbigniew Bodek 	struct ena_com_io_desc_addr cdesc_addr;
12045c98dacSZbigniew Bodek 	void *bus;
12145c98dacSZbigniew Bodek 
12245c98dacSZbigniew Bodek 	/* Interrupt unmask register */
12345c98dacSZbigniew Bodek 	u32 __iomem *unmask_reg;
12445c98dacSZbigniew Bodek 
12545c98dacSZbigniew Bodek 
12645c98dacSZbigniew Bodek 	/* numa configuration register (for TPH) */
12745c98dacSZbigniew Bodek 	u32 __iomem *numa_node_cfg_reg;
12845c98dacSZbigniew Bodek 
12945c98dacSZbigniew Bodek 	/* The value to write to the above register to unmask
13045c98dacSZbigniew Bodek 	 * the interrupt of this queue
13145c98dacSZbigniew Bodek 	 */
132*adfed2d8SArthur Kiyanovski 	u32 msix_vector ____cacheline_aligned;
13345c98dacSZbigniew Bodek 
13445c98dacSZbigniew Bodek 	enum queue_direction direction;
13545c98dacSZbigniew Bodek 
13645c98dacSZbigniew Bodek 	/* holds the number of cdesc of the current packet */
13745c98dacSZbigniew Bodek 	u16 cur_rx_pkt_cdesc_count;
138*adfed2d8SArthur Kiyanovski 	/* save the first cdesc idx of the current packet */
13945c98dacSZbigniew Bodek 	u16 cur_rx_pkt_cdesc_start_idx;
14045c98dacSZbigniew Bodek 
14145c98dacSZbigniew Bodek 	u16 q_depth;
14245c98dacSZbigniew Bodek 	/* Caller qid */
14345c98dacSZbigniew Bodek 	u16 qid;
14445c98dacSZbigniew Bodek 
14545c98dacSZbigniew Bodek 	/* Device queue index */
14645c98dacSZbigniew Bodek 	u16 idx;
14745c98dacSZbigniew Bodek 	u16 head;
14845c98dacSZbigniew Bodek 	u8 phase;
14945c98dacSZbigniew Bodek 	u8 cdesc_entry_size_in_bytes;
15045c98dacSZbigniew Bodek 
15145c98dacSZbigniew Bodek } ____cacheline_aligned;
15245c98dacSZbigniew Bodek 
153a195fab0SMarcin Wojtas struct ena_com_io_bounce_buffer_control {
154a195fab0SMarcin Wojtas 	u8 *base_buffer;
155a195fab0SMarcin Wojtas 	u16 next_to_use;
156a195fab0SMarcin Wojtas 	u16 buffer_size;
157a195fab0SMarcin Wojtas 	u16 buffers_num;  /* Must be a power of 2 */
158a195fab0SMarcin Wojtas };
159a195fab0SMarcin Wojtas 
160a195fab0SMarcin Wojtas /* This struct is to keep tracking the current location of the next llq entry */
161a195fab0SMarcin Wojtas struct ena_com_llq_pkt_ctrl {
162a195fab0SMarcin Wojtas 	u8 *curr_bounce_buf;
163a195fab0SMarcin Wojtas 	u16 idx;
164a195fab0SMarcin Wojtas 	u16 descs_left_in_line;
165a195fab0SMarcin Wojtas };
166a195fab0SMarcin Wojtas 
16745c98dacSZbigniew Bodek struct ena_com_io_sq {
16845c98dacSZbigniew Bodek 	struct ena_com_io_desc_addr desc_addr;
16945c98dacSZbigniew Bodek 	void *bus;
17045c98dacSZbigniew Bodek 
17145c98dacSZbigniew Bodek 	u32 __iomem *db_addr;
17245c98dacSZbigniew Bodek 
17345c98dacSZbigniew Bodek 	enum queue_direction direction;
17445c98dacSZbigniew Bodek 	enum ena_admin_placement_policy_type mem_queue_type;
17545c98dacSZbigniew Bodek 
1768483b844SMarcin Wojtas 	bool disable_meta_caching;
1778483b844SMarcin Wojtas 
17845c98dacSZbigniew Bodek 	u32 msix_vector;
17945c98dacSZbigniew Bodek 	struct ena_com_tx_meta cached_tx_meta;
180a195fab0SMarcin Wojtas 	struct ena_com_llq_info llq_info;
181a195fab0SMarcin Wojtas 	struct ena_com_llq_pkt_ctrl llq_buf_ctrl;
182a195fab0SMarcin Wojtas 	struct ena_com_io_bounce_buffer_control bounce_buf_ctrl;
18345c98dacSZbigniew Bodek 
18445c98dacSZbigniew Bodek 	u16 q_depth;
18545c98dacSZbigniew Bodek 	u16 qid;
18645c98dacSZbigniew Bodek 
18745c98dacSZbigniew Bodek 	u16 idx;
18845c98dacSZbigniew Bodek 	u16 tail;
18945c98dacSZbigniew Bodek 	u16 next_to_comp;
190a195fab0SMarcin Wojtas 	u16 llq_last_copy_tail;
19145c98dacSZbigniew Bodek 	u32 tx_max_header_size;
19245c98dacSZbigniew Bodek 	u8 phase;
19345c98dacSZbigniew Bodek 	u8 desc_entry_size;
19445c98dacSZbigniew Bodek 	u8 dma_addr_bits;
19567ec48bbSMarcin Wojtas 	u16 entries_in_tx_burst_left;
19645c98dacSZbigniew Bodek } ____cacheline_aligned;
19745c98dacSZbigniew Bodek 
19845c98dacSZbigniew Bodek struct ena_com_admin_cq {
19945c98dacSZbigniew Bodek 	struct ena_admin_acq_entry *entries;
20045c98dacSZbigniew Bodek 	ena_mem_handle_t mem_handle;
20145c98dacSZbigniew Bodek 	dma_addr_t dma_addr;
20245c98dacSZbigniew Bodek 
20345c98dacSZbigniew Bodek 	u16 head;
20445c98dacSZbigniew Bodek 	u8 phase;
20545c98dacSZbigniew Bodek };
20645c98dacSZbigniew Bodek 
20745c98dacSZbigniew Bodek struct ena_com_admin_sq {
20845c98dacSZbigniew Bodek 	struct ena_admin_aq_entry *entries;
20945c98dacSZbigniew Bodek 	ena_mem_handle_t mem_handle;
21045c98dacSZbigniew Bodek 	dma_addr_t dma_addr;
21145c98dacSZbigniew Bodek 
21245c98dacSZbigniew Bodek 	u32 __iomem *db_addr;
21345c98dacSZbigniew Bodek 
21445c98dacSZbigniew Bodek 	u16 head;
21545c98dacSZbigniew Bodek 	u16 tail;
21645c98dacSZbigniew Bodek 	u8 phase;
21745c98dacSZbigniew Bodek 
21845c98dacSZbigniew Bodek };
21945c98dacSZbigniew Bodek 
22045c98dacSZbigniew Bodek struct ena_com_stats_admin {
2218483b844SMarcin Wojtas 	u64 aborted_cmd;
2228483b844SMarcin Wojtas 	u64 submitted_cmd;
2238483b844SMarcin Wojtas 	u64 completed_cmd;
2248483b844SMarcin Wojtas 	u64 out_of_space;
2258483b844SMarcin Wojtas 	u64 no_completion;
22645c98dacSZbigniew Bodek };
22745c98dacSZbigniew Bodek 
228*adfed2d8SArthur Kiyanovski struct ena_com_stats_phc {
229*adfed2d8SArthur Kiyanovski 	u64 phc_cnt;
230*adfed2d8SArthur Kiyanovski 	u64 phc_exp;
231*adfed2d8SArthur Kiyanovski 	u64 phc_skp;
232*adfed2d8SArthur Kiyanovski 	u64 phc_err;
233*adfed2d8SArthur Kiyanovski };
234*adfed2d8SArthur Kiyanovski 
23545c98dacSZbigniew Bodek struct ena_com_admin_queue {
23645c98dacSZbigniew Bodek 	void *q_dmadev;
23745c98dacSZbigniew Bodek 	void *bus;
2388483b844SMarcin Wojtas 	struct ena_com_dev *ena_dev;
23945c98dacSZbigniew Bodek 	ena_spinlock_t q_lock; /* spinlock for the admin queue */
24045c98dacSZbigniew Bodek 
24145c98dacSZbigniew Bodek 	struct ena_comp_ctx *comp_ctx;
24245c98dacSZbigniew Bodek 	u32 completion_timeout;
24345c98dacSZbigniew Bodek 	u16 q_depth;
24445c98dacSZbigniew Bodek 	struct ena_com_admin_cq cq;
24545c98dacSZbigniew Bodek 	struct ena_com_admin_sq sq;
24645c98dacSZbigniew Bodek 
24745c98dacSZbigniew Bodek 	/* Indicate if the admin queue should poll for completion */
24845c98dacSZbigniew Bodek 	bool polling;
24945c98dacSZbigniew Bodek 
2508483b844SMarcin Wojtas 	/* Define if fallback to polling mode should occur */
2518483b844SMarcin Wojtas 	bool auto_polling;
2528483b844SMarcin Wojtas 
25345c98dacSZbigniew Bodek 	u16 curr_cmd_id;
25445c98dacSZbigniew Bodek 
25545c98dacSZbigniew Bodek 	/* Indicate that the ena was initialized and can
25645c98dacSZbigniew Bodek 	 * process new admin commands
25745c98dacSZbigniew Bodek 	 */
25845c98dacSZbigniew Bodek 	bool running_state;
25945c98dacSZbigniew Bodek 
26045c98dacSZbigniew Bodek 	/* Count the number of outstanding admin commands */
26145c98dacSZbigniew Bodek 	ena_atomic32_t outstanding_cmds;
26245c98dacSZbigniew Bodek 
26345c98dacSZbigniew Bodek 	struct ena_com_stats_admin stats;
26445c98dacSZbigniew Bodek };
26545c98dacSZbigniew Bodek 
26645c98dacSZbigniew Bodek struct ena_aenq_handlers;
26745c98dacSZbigniew Bodek 
26845c98dacSZbigniew Bodek struct ena_com_aenq {
26945c98dacSZbigniew Bodek 	u16 head;
27045c98dacSZbigniew Bodek 	u8 phase;
27145c98dacSZbigniew Bodek 	struct ena_admin_aenq_entry *entries;
27245c98dacSZbigniew Bodek 	dma_addr_t dma_addr;
27345c98dacSZbigniew Bodek 	ena_mem_handle_t mem_handle;
27445c98dacSZbigniew Bodek 	u16 q_depth;
27545c98dacSZbigniew Bodek 	struct ena_aenq_handlers *aenq_handlers;
27645c98dacSZbigniew Bodek };
27745c98dacSZbigniew Bodek 
27845c98dacSZbigniew Bodek struct ena_com_mmio_read {
27945c98dacSZbigniew Bodek 	struct ena_admin_ena_mmio_req_read_less_resp *read_resp;
28045c98dacSZbigniew Bodek 	dma_addr_t read_resp_dma_addr;
28145c98dacSZbigniew Bodek 	ena_mem_handle_t read_resp_mem_handle;
28245c98dacSZbigniew Bodek 	u32 reg_read_to; /* in us */
28345c98dacSZbigniew Bodek 	u16 seq_num;
28445c98dacSZbigniew Bodek 	bool readless_supported;
28545c98dacSZbigniew Bodek 	/* spin lock to ensure a single outstanding read */
28645c98dacSZbigniew Bodek 	ena_spinlock_t lock;
28745c98dacSZbigniew Bodek };
28845c98dacSZbigniew Bodek 
289*adfed2d8SArthur Kiyanovski /* PTP hardware clock (PHC) MMIO read data info */
290*adfed2d8SArthur Kiyanovski struct ena_com_phc_info {
291*adfed2d8SArthur Kiyanovski 	/* Internal PHC statistics */
292*adfed2d8SArthur Kiyanovski 	struct ena_com_stats_phc stats;
293*adfed2d8SArthur Kiyanovski 
294*adfed2d8SArthur Kiyanovski 	/* PHC shared memory - virtual address */
295*adfed2d8SArthur Kiyanovski 	struct ena_admin_phc_resp *virt_addr;
296*adfed2d8SArthur Kiyanovski 
297*adfed2d8SArthur Kiyanovski 	/* Spin lock to ensure a single outstanding PHC read */
298*adfed2d8SArthur Kiyanovski 	ena_spinlock_t lock;
299*adfed2d8SArthur Kiyanovski 
300*adfed2d8SArthur Kiyanovski 	/* PHC doorbell address as an offset to PCIe MMIO REG BAR */
301*adfed2d8SArthur Kiyanovski 	u32 doorbell_offset;
302*adfed2d8SArthur Kiyanovski 
303*adfed2d8SArthur Kiyanovski 	/* Shared memory read expire timeout (usec)
304*adfed2d8SArthur Kiyanovski 	 * Max time for valid PHC retrieval, passing this threshold will fail the get time request
305*adfed2d8SArthur Kiyanovski 	 * and block new PHC requests for block_timeout_usec in order to prevent floods on busy
306*adfed2d8SArthur Kiyanovski 	 * device
307*adfed2d8SArthur Kiyanovski 	 */
308*adfed2d8SArthur Kiyanovski 	u32 expire_timeout_usec;
309*adfed2d8SArthur Kiyanovski 
310*adfed2d8SArthur Kiyanovski 	/* Shared memory read abort timeout (usec)
311*adfed2d8SArthur Kiyanovski 	 * PHC requests block period, blocking starts once PHC request expired in order to prevent
312*adfed2d8SArthur Kiyanovski 	 * floods on busy device, any PHC requests during block period will be skipped
313*adfed2d8SArthur Kiyanovski 	 */
314*adfed2d8SArthur Kiyanovski 	u32 block_timeout_usec;
315*adfed2d8SArthur Kiyanovski 
316*adfed2d8SArthur Kiyanovski 	/* Request id sent to the device */
317*adfed2d8SArthur Kiyanovski 	u16 req_id;
318*adfed2d8SArthur Kiyanovski 
319*adfed2d8SArthur Kiyanovski 	/* True if PHC is active in the device */
320*adfed2d8SArthur Kiyanovski 	bool active;
321*adfed2d8SArthur Kiyanovski 
322*adfed2d8SArthur Kiyanovski 	/* PHC shared memory - memory handle */
323*adfed2d8SArthur Kiyanovski 	ena_mem_handle_t mem_handle;
324*adfed2d8SArthur Kiyanovski 
325*adfed2d8SArthur Kiyanovski 	/* PHC shared memory - physical address */
326*adfed2d8SArthur Kiyanovski 	dma_addr_t phys_addr;
327*adfed2d8SArthur Kiyanovski };
328*adfed2d8SArthur Kiyanovski 
32945c98dacSZbigniew Bodek struct ena_rss {
33045c98dacSZbigniew Bodek 	/* Indirect table */
33145c98dacSZbigniew Bodek 	u16 *host_rss_ind_tbl;
33245c98dacSZbigniew Bodek 	struct ena_admin_rss_ind_table_entry *rss_ind_tbl;
33345c98dacSZbigniew Bodek 	dma_addr_t rss_ind_tbl_dma_addr;
33445c98dacSZbigniew Bodek 	ena_mem_handle_t rss_ind_tbl_mem_handle;
33545c98dacSZbigniew Bodek 	u16 tbl_log_size;
33645c98dacSZbigniew Bodek 
33745c98dacSZbigniew Bodek 	/* Hash key */
33845c98dacSZbigniew Bodek 	enum ena_admin_hash_functions hash_func;
33945c98dacSZbigniew Bodek 	struct ena_admin_feature_rss_flow_hash_control *hash_key;
34045c98dacSZbigniew Bodek 	dma_addr_t hash_key_dma_addr;
34145c98dacSZbigniew Bodek 	ena_mem_handle_t hash_key_mem_handle;
34245c98dacSZbigniew Bodek 	u32 hash_init_val;
34345c98dacSZbigniew Bodek 
34445c98dacSZbigniew Bodek 	/* Flow Control */
34545c98dacSZbigniew Bodek 	struct ena_admin_feature_rss_hash_control *hash_ctrl;
34645c98dacSZbigniew Bodek 	dma_addr_t hash_ctrl_dma_addr;
34745c98dacSZbigniew Bodek 	ena_mem_handle_t hash_ctrl_mem_handle;
34845c98dacSZbigniew Bodek 
34945c98dacSZbigniew Bodek };
35045c98dacSZbigniew Bodek 
351*adfed2d8SArthur Kiyanovski struct ena_customer_metrics {
352*adfed2d8SArthur Kiyanovski 	/* in correlation with ENA_ADMIN_CUSTOMER_METRICS_SUPPORT_MASK
353*adfed2d8SArthur Kiyanovski 	 * and ena_admin_customer_metrics_id
354*adfed2d8SArthur Kiyanovski 	 */
355*adfed2d8SArthur Kiyanovski 	uint64_t supported_metrics;
356*adfed2d8SArthur Kiyanovski 	dma_addr_t buffer_dma_addr;
357*adfed2d8SArthur Kiyanovski 	void *buffer_virt_addr;
358*adfed2d8SArthur Kiyanovski 	ena_mem_handle_t buffer_dma_handle;
359*adfed2d8SArthur Kiyanovski 	u32 buffer_len;
360*adfed2d8SArthur Kiyanovski };
361*adfed2d8SArthur Kiyanovski 
36245c98dacSZbigniew Bodek struct ena_host_attribute {
36345c98dacSZbigniew Bodek 	/* Debug area */
36445c98dacSZbigniew Bodek 	u8 *debug_area_virt_addr;
36545c98dacSZbigniew Bodek 	dma_addr_t debug_area_dma_addr;
36645c98dacSZbigniew Bodek 	ena_mem_handle_t debug_area_dma_handle;
36745c98dacSZbigniew Bodek 	u32 debug_area_size;
36845c98dacSZbigniew Bodek 
36945c98dacSZbigniew Bodek 	/* Host information */
37045c98dacSZbigniew Bodek 	struct ena_admin_host_info *host_info;
37145c98dacSZbigniew Bodek 	dma_addr_t host_info_dma_addr;
37245c98dacSZbigniew Bodek 	ena_mem_handle_t host_info_dma_handle;
37345c98dacSZbigniew Bodek };
37445c98dacSZbigniew Bodek 
37545c98dacSZbigniew Bodek /* Each ena_dev is a PCI function. */
37645c98dacSZbigniew Bodek struct ena_com_dev {
37745c98dacSZbigniew Bodek 	struct ena_com_admin_queue admin_queue;
37845c98dacSZbigniew Bodek 	struct ena_com_aenq aenq;
37945c98dacSZbigniew Bodek 	struct ena_com_io_cq io_cq_queues[ENA_TOTAL_NUM_QUEUES];
38045c98dacSZbigniew Bodek 	struct ena_com_io_sq io_sq_queues[ENA_TOTAL_NUM_QUEUES];
38145c98dacSZbigniew Bodek 	u8 __iomem *reg_bar;
38245c98dacSZbigniew Bodek 	void __iomem *mem_bar;
38345c98dacSZbigniew Bodek 	void *dmadev;
38445c98dacSZbigniew Bodek 	void *bus;
3859eb1615fSMarcin Wojtas 	ena_netdev *net_device;
386a195fab0SMarcin Wojtas 
38745c98dacSZbigniew Bodek 	enum ena_admin_placement_policy_type tx_mem_queue_type;
38845c98dacSZbigniew Bodek 	u32 tx_max_header_size;
38945c98dacSZbigniew Bodek 	u16 stats_func; /* Selected function for extended statistic dump */
39045c98dacSZbigniew Bodek 	u16 stats_queue; /* Selected queue for extended statistic dump */
39145c98dacSZbigniew Bodek 
392*adfed2d8SArthur Kiyanovski 	u32 ena_min_poll_delay_us;
393*adfed2d8SArthur Kiyanovski 
39445c98dacSZbigniew Bodek 	struct ena_com_mmio_read mmio_read;
395*adfed2d8SArthur Kiyanovski 	struct ena_com_phc_info phc;
39645c98dacSZbigniew Bodek 
39745c98dacSZbigniew Bodek 	struct ena_rss rss;
39845c98dacSZbigniew Bodek 	u32 supported_features;
399*adfed2d8SArthur Kiyanovski 	u32 capabilities;
40045c98dacSZbigniew Bodek 	u32 dma_addr_bits;
40145c98dacSZbigniew Bodek 
40245c98dacSZbigniew Bodek 	struct ena_host_attribute host_attr;
40345c98dacSZbigniew Bodek 	bool adaptive_coalescing;
40445c98dacSZbigniew Bodek 	u16 intr_delay_resolution;
4058483b844SMarcin Wojtas 
4068483b844SMarcin Wojtas 	/* interrupt moderation intervals are in usec divided by
4078483b844SMarcin Wojtas 	 * intr_delay_resolution, which is supplied by the device.
4088483b844SMarcin Wojtas 	 */
40945c98dacSZbigniew Bodek 	u32 intr_moder_tx_interval;
4108483b844SMarcin Wojtas 	u32 intr_moder_rx_interval;
4118483b844SMarcin Wojtas 
41245c98dacSZbigniew Bodek 	struct ena_intr_moder_entry *intr_moder_tbl;
413a195fab0SMarcin Wojtas 
414a195fab0SMarcin Wojtas 	struct ena_com_llq_info llq_info;
4158483b844SMarcin Wojtas 
416*adfed2d8SArthur Kiyanovski 	struct ena_customer_metrics customer_metrics;
41745c98dacSZbigniew Bodek };
41845c98dacSZbigniew Bodek 
41945c98dacSZbigniew Bodek struct ena_com_dev_get_features_ctx {
42045c98dacSZbigniew Bodek 	struct ena_admin_queue_feature_desc max_queues;
42167ec48bbSMarcin Wojtas 	struct ena_admin_queue_ext_feature_desc max_queue_ext;
42245c98dacSZbigniew Bodek 	struct ena_admin_device_attr_feature_desc dev_attr;
42345c98dacSZbigniew Bodek 	struct ena_admin_feature_aenq_desc aenq;
42445c98dacSZbigniew Bodek 	struct ena_admin_feature_offload_desc offload;
42545c98dacSZbigniew Bodek 	struct ena_admin_ena_hw_hints hw_hints;
426a195fab0SMarcin Wojtas 	struct ena_admin_feature_llq_desc llq;
42745c98dacSZbigniew Bodek };
42845c98dacSZbigniew Bodek 
42945c98dacSZbigniew Bodek struct ena_com_create_io_ctx {
43045c98dacSZbigniew Bodek 	enum ena_admin_placement_policy_type mem_queue_type;
43145c98dacSZbigniew Bodek 	enum queue_direction direction;
43245c98dacSZbigniew Bodek 	int numa_node;
43345c98dacSZbigniew Bodek 	u32 msix_vector;
43445c98dacSZbigniew Bodek 	u16 queue_size;
43545c98dacSZbigniew Bodek 	u16 qid;
43645c98dacSZbigniew Bodek };
43745c98dacSZbigniew Bodek 
43845c98dacSZbigniew Bodek typedef void (*ena_aenq_handler)(void *data,
43945c98dacSZbigniew Bodek 	struct ena_admin_aenq_entry *aenq_e);
44045c98dacSZbigniew Bodek 
44145c98dacSZbigniew Bodek /* Holds aenq handlers. Indexed by AENQ event group */
44245c98dacSZbigniew Bodek struct ena_aenq_handlers {
44345c98dacSZbigniew Bodek 	ena_aenq_handler handlers[ENA_MAX_HANDLERS];
44445c98dacSZbigniew Bodek 	ena_aenq_handler unimplemented_handler;
44545c98dacSZbigniew Bodek };
44645c98dacSZbigniew Bodek 
44745c98dacSZbigniew Bodek /*****************************************************************************/
44845c98dacSZbigniew Bodek /*****************************************************************************/
44945c98dacSZbigniew Bodek #if defined(__cplusplus)
45045c98dacSZbigniew Bodek extern "C" {
45145c98dacSZbigniew Bodek #endif
45245c98dacSZbigniew Bodek 
45345c98dacSZbigniew Bodek /* ena_com_mmio_reg_read_request_init - Init the mmio reg read mechanism
45445c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
45545c98dacSZbigniew Bodek  *
45645c98dacSZbigniew Bodek  * Initialize the register read mechanism.
45745c98dacSZbigniew Bodek  *
45845c98dacSZbigniew Bodek  * @note: This method must be the first stage in the initialization sequence.
45945c98dacSZbigniew Bodek  *
46045c98dacSZbigniew Bodek  * @return - 0 on success, negative value on failure.
46145c98dacSZbigniew Bodek  */
46245c98dacSZbigniew Bodek int ena_com_mmio_reg_read_request_init(struct ena_com_dev *ena_dev);
46345c98dacSZbigniew Bodek 
464*adfed2d8SArthur Kiyanovski /* ena_com_phc_init - Allocate and initialize PHC feature
465*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
466*adfed2d8SArthur Kiyanovski  * @note: This method assumes PHC is supported by the device
467*adfed2d8SArthur Kiyanovski  * @return - 0 on success, negative value on failure
468*adfed2d8SArthur Kiyanovski  */
469*adfed2d8SArthur Kiyanovski int ena_com_phc_init(struct ena_com_dev *ena_dev);
470*adfed2d8SArthur Kiyanovski 
471*adfed2d8SArthur Kiyanovski /* ena_com_phc_supported - Return if PHC feature is supported by the device
472*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
473*adfed2d8SArthur Kiyanovski  * @note: This method must be called after getting supported features
474*adfed2d8SArthur Kiyanovski  * @return - supported or not
475*adfed2d8SArthur Kiyanovski  */
476*adfed2d8SArthur Kiyanovski bool ena_com_phc_supported(struct ena_com_dev *ena_dev);
477*adfed2d8SArthur Kiyanovski 
478*adfed2d8SArthur Kiyanovski /* ena_com_phc_config - Configure PHC feature
479*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
480*adfed2d8SArthur Kiyanovski  * Configure PHC feature in driver and device
481*adfed2d8SArthur Kiyanovski  * @note: This method assumes PHC is supported by the device
482*adfed2d8SArthur Kiyanovski  * @return - 0 on success, negative value on failure
483*adfed2d8SArthur Kiyanovski  */
484*adfed2d8SArthur Kiyanovski int ena_com_phc_config(struct ena_com_dev *ena_dev);
485*adfed2d8SArthur Kiyanovski 
486*adfed2d8SArthur Kiyanovski /* ena_com_phc_destroy - Destroy PHC feature
487*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
488*adfed2d8SArthur Kiyanovski  */
489*adfed2d8SArthur Kiyanovski void ena_com_phc_destroy(struct ena_com_dev *ena_dev);
490*adfed2d8SArthur Kiyanovski 
491*adfed2d8SArthur Kiyanovski /* ena_com_phc_get - Retrieve PHC timestamp
492*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
493*adfed2d8SArthur Kiyanovski  * @timestamp: Retrieve PHC timestamp
494*adfed2d8SArthur Kiyanovski  * @return - 0 on success, negative value on failure
495*adfed2d8SArthur Kiyanovski  */
496*adfed2d8SArthur Kiyanovski int ena_com_phc_get(struct ena_com_dev *ena_dev, u64 *timestamp);
497*adfed2d8SArthur Kiyanovski 
4988483b844SMarcin Wojtas /* ena_com_set_mmio_read_mode - Enable/disable the indirect mmio reg read mechanism
49945c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
50045c98dacSZbigniew Bodek  * @readless_supported: readless mode (enable/disable)
50145c98dacSZbigniew Bodek  */
50245c98dacSZbigniew Bodek void ena_com_set_mmio_read_mode(struct ena_com_dev *ena_dev,
50345c98dacSZbigniew Bodek 				bool readless_supported);
50445c98dacSZbigniew Bodek 
50545c98dacSZbigniew Bodek /* ena_com_mmio_reg_read_request_write_dev_addr - Write the mmio reg read return
50645c98dacSZbigniew Bodek  * value physical address.
50745c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
50845c98dacSZbigniew Bodek  */
50945c98dacSZbigniew Bodek void ena_com_mmio_reg_read_request_write_dev_addr(struct ena_com_dev *ena_dev);
51045c98dacSZbigniew Bodek 
51145c98dacSZbigniew Bodek /* ena_com_mmio_reg_read_request_destroy - Destroy the mmio reg read mechanism
51245c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
51345c98dacSZbigniew Bodek  */
51445c98dacSZbigniew Bodek void ena_com_mmio_reg_read_request_destroy(struct ena_com_dev *ena_dev);
51545c98dacSZbigniew Bodek 
51645c98dacSZbigniew Bodek /* ena_com_admin_init - Init the admin and the async queues
51745c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
51845c98dacSZbigniew Bodek  * @aenq_handlers: Those handlers to be called upon event.
51945c98dacSZbigniew Bodek  *
52045c98dacSZbigniew Bodek  * Initialize the admin submission and completion queues.
52145c98dacSZbigniew Bodek  * Initialize the asynchronous events notification queues.
52245c98dacSZbigniew Bodek  *
52345c98dacSZbigniew Bodek  * @return - 0 on success, negative value on failure.
52445c98dacSZbigniew Bodek  */
52545c98dacSZbigniew Bodek int ena_com_admin_init(struct ena_com_dev *ena_dev,
52667ec48bbSMarcin Wojtas 		       struct ena_aenq_handlers *aenq_handlers);
52745c98dacSZbigniew Bodek 
52845c98dacSZbigniew Bodek /* ena_com_admin_destroy - Destroy the admin and the async events queues.
52945c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
53045c98dacSZbigniew Bodek  *
53145c98dacSZbigniew Bodek  * @note: Before calling this method, the caller must validate that the device
53245c98dacSZbigniew Bodek  * won't send any additional admin completions/aenq.
53345c98dacSZbigniew Bodek  * To achieve that, a FLR is recommended.
53445c98dacSZbigniew Bodek  */
53545c98dacSZbigniew Bodek void ena_com_admin_destroy(struct ena_com_dev *ena_dev);
53645c98dacSZbigniew Bodek 
53745c98dacSZbigniew Bodek /* ena_com_dev_reset - Perform device FLR to the device.
53845c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
539a195fab0SMarcin Wojtas  * @reset_reason: Specify what is the trigger for the reset in case of an error.
54045c98dacSZbigniew Bodek  *
54145c98dacSZbigniew Bodek  * @return - 0 on success, negative value on failure.
54245c98dacSZbigniew Bodek  */
543a195fab0SMarcin Wojtas int ena_com_dev_reset(struct ena_com_dev *ena_dev,
544a195fab0SMarcin Wojtas 		      enum ena_regs_reset_reason_types reset_reason);
54545c98dacSZbigniew Bodek 
54645c98dacSZbigniew Bodek /* ena_com_create_io_queue - Create io queue.
54745c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
54845c98dacSZbigniew Bodek  * @ctx - create context structure
54945c98dacSZbigniew Bodek  *
55045c98dacSZbigniew Bodek  * Create the submission and the completion queues.
55145c98dacSZbigniew Bodek  *
55245c98dacSZbigniew Bodek  * @return - 0 on success, negative value on failure.
55345c98dacSZbigniew Bodek  */
55445c98dacSZbigniew Bodek int ena_com_create_io_queue(struct ena_com_dev *ena_dev,
55545c98dacSZbigniew Bodek 			    struct ena_com_create_io_ctx *ctx);
55645c98dacSZbigniew Bodek 
55745c98dacSZbigniew Bodek /* ena_com_destroy_io_queue - Destroy IO queue with the queue id - qid.
55845c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
55945c98dacSZbigniew Bodek  * @qid - the caller virtual queue id.
56045c98dacSZbigniew Bodek  */
56145c98dacSZbigniew Bodek void ena_com_destroy_io_queue(struct ena_com_dev *ena_dev, u16 qid);
56245c98dacSZbigniew Bodek 
56345c98dacSZbigniew Bodek /* ena_com_get_io_handlers - Return the io queue handlers
56445c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
56545c98dacSZbigniew Bodek  * @qid - the caller virtual queue id.
56645c98dacSZbigniew Bodek  * @io_sq - IO submission queue handler
56745c98dacSZbigniew Bodek  * @io_cq - IO completion queue handler.
56845c98dacSZbigniew Bodek  *
56945c98dacSZbigniew Bodek  * @return - 0 on success, negative value on failure.
57045c98dacSZbigniew Bodek  */
57145c98dacSZbigniew Bodek int ena_com_get_io_handlers(struct ena_com_dev *ena_dev, u16 qid,
57245c98dacSZbigniew Bodek 			    struct ena_com_io_sq **io_sq,
57345c98dacSZbigniew Bodek 			    struct ena_com_io_cq **io_cq);
57445c98dacSZbigniew Bodek 
57545c98dacSZbigniew Bodek /* ena_com_admin_aenq_enable - ENAble asynchronous event notifications
57645c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
57745c98dacSZbigniew Bodek  *
57845c98dacSZbigniew Bodek  * After this method, aenq event can be received via AENQ.
57945c98dacSZbigniew Bodek  */
58045c98dacSZbigniew Bodek void ena_com_admin_aenq_enable(struct ena_com_dev *ena_dev);
58145c98dacSZbigniew Bodek 
58245c98dacSZbigniew Bodek /* ena_com_set_admin_running_state - Set the state of the admin queue
58345c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
58445c98dacSZbigniew Bodek  *
58545c98dacSZbigniew Bodek  * Change the state of the admin queue (enable/disable)
58645c98dacSZbigniew Bodek  */
58745c98dacSZbigniew Bodek void ena_com_set_admin_running_state(struct ena_com_dev *ena_dev, bool state);
58845c98dacSZbigniew Bodek 
58945c98dacSZbigniew Bodek /* ena_com_get_admin_running_state - Get the admin queue state
59045c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
59145c98dacSZbigniew Bodek  *
59245c98dacSZbigniew Bodek  * Retrieve the state of the admin queue (enable/disable)
59345c98dacSZbigniew Bodek  *
59445c98dacSZbigniew Bodek  * @return - current polling mode (enable/disable)
59545c98dacSZbigniew Bodek  */
59645c98dacSZbigniew Bodek bool ena_com_get_admin_running_state(struct ena_com_dev *ena_dev);
59745c98dacSZbigniew Bodek 
59845c98dacSZbigniew Bodek /* ena_com_set_admin_polling_mode - Set the admin completion queue polling mode
59945c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
60045c98dacSZbigniew Bodek  * @polling: ENAble/Disable polling mode
60145c98dacSZbigniew Bodek  *
60245c98dacSZbigniew Bodek  * Set the admin completion mode.
60345c98dacSZbigniew Bodek  */
60445c98dacSZbigniew Bodek void ena_com_set_admin_polling_mode(struct ena_com_dev *ena_dev, bool polling);
60545c98dacSZbigniew Bodek 
6068483b844SMarcin Wojtas /* ena_com_get_admin_polling_mode - Get the admin completion queue polling mode
60745c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
60845c98dacSZbigniew Bodek  *
60945c98dacSZbigniew Bodek  * Get the admin completion mode.
61045c98dacSZbigniew Bodek  * If polling mode is on, ena_com_execute_admin_command will perform a
61145c98dacSZbigniew Bodek  * polling on the admin completion queue for the commands completion,
61245c98dacSZbigniew Bodek  * otherwise it will wait on wait event.
61345c98dacSZbigniew Bodek  *
61445c98dacSZbigniew Bodek  * @return state
61545c98dacSZbigniew Bodek  */
6168483b844SMarcin Wojtas bool ena_com_get_admin_polling_mode(struct ena_com_dev *ena_dev);
6178483b844SMarcin Wojtas 
6188483b844SMarcin Wojtas /* ena_com_set_admin_auto_polling_mode - Enable autoswitch to polling mode
6198483b844SMarcin Wojtas  * @ena_dev: ENA communication layer struct
6208483b844SMarcin Wojtas  * @polling: Enable/Disable polling mode
6218483b844SMarcin Wojtas  *
6228483b844SMarcin Wojtas  * Set the autopolling mode.
6238483b844SMarcin Wojtas  * If autopolling is on:
6248483b844SMarcin Wojtas  * In case of missing interrupt when data is available switch to polling.
6258483b844SMarcin Wojtas  */
6268483b844SMarcin Wojtas void ena_com_set_admin_auto_polling_mode(struct ena_com_dev *ena_dev,
6278483b844SMarcin Wojtas 					 bool polling);
62845c98dacSZbigniew Bodek 
62945c98dacSZbigniew Bodek /* ena_com_admin_q_comp_intr_handler - admin queue interrupt handler
63045c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
63145c98dacSZbigniew Bodek  *
6328483b844SMarcin Wojtas  * This method goes over the admin completion queue and wakes up all the pending
63345c98dacSZbigniew Bodek  * threads that wait on the commands wait event.
63445c98dacSZbigniew Bodek  *
63545c98dacSZbigniew Bodek  * @note: Should be called after MSI-X interrupt.
63645c98dacSZbigniew Bodek  */
63745c98dacSZbigniew Bodek void ena_com_admin_q_comp_intr_handler(struct ena_com_dev *ena_dev);
63845c98dacSZbigniew Bodek 
63945c98dacSZbigniew Bodek /* ena_com_aenq_intr_handler - AENQ interrupt handler
64045c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
64145c98dacSZbigniew Bodek  *
6428483b844SMarcin Wojtas  * This method goes over the async event notification queue and calls the proper
64345c98dacSZbigniew Bodek  * aenq handler.
64445c98dacSZbigniew Bodek  */
6459eb1615fSMarcin Wojtas void ena_com_aenq_intr_handler(struct ena_com_dev *ena_dev, void *data);
64645c98dacSZbigniew Bodek 
64745c98dacSZbigniew Bodek /* ena_com_abort_admin_commands - Abort all the outstanding admin commands.
64845c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
64945c98dacSZbigniew Bodek  *
65045c98dacSZbigniew Bodek  * This method aborts all the outstanding admin commands.
65145c98dacSZbigniew Bodek  * The caller should then call ena_com_wait_for_abort_completion to make sure
65245c98dacSZbigniew Bodek  * all the commands were completed.
65345c98dacSZbigniew Bodek  */
65445c98dacSZbigniew Bodek void ena_com_abort_admin_commands(struct ena_com_dev *ena_dev);
65545c98dacSZbigniew Bodek 
65645c98dacSZbigniew Bodek /* ena_com_wait_for_abort_completion - Wait for admin commands abort.
65745c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
65845c98dacSZbigniew Bodek  *
6598483b844SMarcin Wojtas  * This method waits until all the outstanding admin commands are completed.
66045c98dacSZbigniew Bodek  */
66145c98dacSZbigniew Bodek void ena_com_wait_for_abort_completion(struct ena_com_dev *ena_dev);
66245c98dacSZbigniew Bodek 
66345c98dacSZbigniew Bodek /* ena_com_validate_version - Validate the device parameters
66445c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
66545c98dacSZbigniew Bodek  *
6668483b844SMarcin Wojtas  * This method verifies the device parameters are the same as the saved
66745c98dacSZbigniew Bodek  * parameters in ena_dev.
66845c98dacSZbigniew Bodek  * This method is useful after device reset, to validate the device mac address
66945c98dacSZbigniew Bodek  * and the device offloads are the same as before the reset.
67045c98dacSZbigniew Bodek  *
67145c98dacSZbigniew Bodek  * @return - 0 on success negative value otherwise.
67245c98dacSZbigniew Bodek  */
67345c98dacSZbigniew Bodek int ena_com_validate_version(struct ena_com_dev *ena_dev);
67445c98dacSZbigniew Bodek 
67545c98dacSZbigniew Bodek /* ena_com_get_link_params - Retrieve physical link parameters.
67645c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
67745c98dacSZbigniew Bodek  * @resp: Link parameters
67845c98dacSZbigniew Bodek  *
67945c98dacSZbigniew Bodek  * Retrieve the physical link parameters,
68045c98dacSZbigniew Bodek  * like speed, auto-negotiation and full duplex support.
68145c98dacSZbigniew Bodek  *
68245c98dacSZbigniew Bodek  * @return - 0 on Success negative value otherwise.
68345c98dacSZbigniew Bodek  */
68445c98dacSZbigniew Bodek int ena_com_get_link_params(struct ena_com_dev *ena_dev,
68545c98dacSZbigniew Bodek 			    struct ena_admin_get_feat_resp *resp);
68645c98dacSZbigniew Bodek 
68745c98dacSZbigniew Bodek /* ena_com_get_dma_width - Retrieve physical dma address width the device
68845c98dacSZbigniew Bodek  * supports.
68945c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
69045c98dacSZbigniew Bodek  *
69145c98dacSZbigniew Bodek  * Retrieve the maximum physical address bits the device can handle.
69245c98dacSZbigniew Bodek  *
69345c98dacSZbigniew Bodek  * @return: > 0 on Success and negative value otherwise.
69445c98dacSZbigniew Bodek  */
69545c98dacSZbigniew Bodek int ena_com_get_dma_width(struct ena_com_dev *ena_dev);
69645c98dacSZbigniew Bodek 
69745c98dacSZbigniew Bodek /* ena_com_set_aenq_config - Set aenq groups configurations
69845c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
69945c98dacSZbigniew Bodek  * @groups flag: bit fields flags of enum ena_admin_aenq_group.
70045c98dacSZbigniew Bodek  *
70145c98dacSZbigniew Bodek  * Configure which aenq event group the driver would like to receive.
70245c98dacSZbigniew Bodek  *
70345c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
70445c98dacSZbigniew Bodek  */
70545c98dacSZbigniew Bodek int ena_com_set_aenq_config(struct ena_com_dev *ena_dev, u32 groups_flag);
70645c98dacSZbigniew Bodek 
70745c98dacSZbigniew Bodek /* ena_com_get_dev_attr_feat - Get device features
70845c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
70945c98dacSZbigniew Bodek  * @get_feat_ctx: returned context that contain the get features.
71045c98dacSZbigniew Bodek  *
71145c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
71245c98dacSZbigniew Bodek  */
71345c98dacSZbigniew Bodek int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
71445c98dacSZbigniew Bodek 			      struct ena_com_dev_get_features_ctx *get_feat_ctx);
71545c98dacSZbigniew Bodek 
71645c98dacSZbigniew Bodek /* ena_com_get_dev_basic_stats - Get device basic statistics
71745c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
71845c98dacSZbigniew Bodek  * @stats: stats return value
71945c98dacSZbigniew Bodek  *
72045c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
72145c98dacSZbigniew Bodek  */
72245c98dacSZbigniew Bodek int ena_com_get_dev_basic_stats(struct ena_com_dev *ena_dev,
72345c98dacSZbigniew Bodek 				struct ena_admin_basic_stats *stats);
72445c98dacSZbigniew Bodek 
7259eb1615fSMarcin Wojtas /* ena_com_get_eni_stats - Get extended network interface statistics
7269eb1615fSMarcin Wojtas  * @ena_dev: ENA communication layer struct
7279eb1615fSMarcin Wojtas  * @stats: stats return value
7289eb1615fSMarcin Wojtas  *
7299eb1615fSMarcin Wojtas  * @return: 0 on Success and negative value otherwise.
7309eb1615fSMarcin Wojtas  */
7319eb1615fSMarcin Wojtas int ena_com_get_eni_stats(struct ena_com_dev *ena_dev,
7329eb1615fSMarcin Wojtas 			  struct ena_admin_eni_stats *stats);
7339eb1615fSMarcin Wojtas 
734*adfed2d8SArthur Kiyanovski /* ena_com_get_ena_srd_info - Get ENA SRD network interface statistics
735*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
736*adfed2d8SArthur Kiyanovski  * @info: ena srd stats and flags
737*adfed2d8SArthur Kiyanovski  *
738*adfed2d8SArthur Kiyanovski  * @return: 0 on Success and negative value otherwise.
739*adfed2d8SArthur Kiyanovski  */
740*adfed2d8SArthur Kiyanovski int ena_com_get_ena_srd_info(struct ena_com_dev *ena_dev,
741*adfed2d8SArthur Kiyanovski 			     struct ena_admin_ena_srd_info *info);
742*adfed2d8SArthur Kiyanovski 
743*adfed2d8SArthur Kiyanovski /* ena_com_get_customer_metrics - Get customer metrics for network interface
744*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
745*adfed2d8SArthur Kiyanovski  * @buffer: buffer for returned customer metrics
746*adfed2d8SArthur Kiyanovski  * @len: size of the buffer
747*adfed2d8SArthur Kiyanovski  *
748*adfed2d8SArthur Kiyanovski  * @return: 0 on Success and negative value otherwise.
749*adfed2d8SArthur Kiyanovski  */
750*adfed2d8SArthur Kiyanovski int ena_com_get_customer_metrics(struct ena_com_dev *ena_dev, char *buffer, u32 len);
751*adfed2d8SArthur Kiyanovski 
75245c98dacSZbigniew Bodek /* ena_com_set_dev_mtu - Configure the device mtu.
75345c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
75445c98dacSZbigniew Bodek  * @mtu: mtu value
75545c98dacSZbigniew Bodek  *
75645c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
75745c98dacSZbigniew Bodek  */
7583fc5d816SMarcin Wojtas int ena_com_set_dev_mtu(struct ena_com_dev *ena_dev, u32 mtu);
75945c98dacSZbigniew Bodek 
76045c98dacSZbigniew Bodek /* ena_com_get_offload_settings - Retrieve the device offloads capabilities
76145c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
76245c98dacSZbigniew Bodek  * @offlad: offload return value
76345c98dacSZbigniew Bodek  *
76445c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
76545c98dacSZbigniew Bodek  */
76645c98dacSZbigniew Bodek int ena_com_get_offload_settings(struct ena_com_dev *ena_dev,
76745c98dacSZbigniew Bodek 				 struct ena_admin_feature_offload_desc *offload);
76845c98dacSZbigniew Bodek 
76945c98dacSZbigniew Bodek /* ena_com_rss_init - Init RSS
77045c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
77145c98dacSZbigniew Bodek  * @log_size: indirection log size
77245c98dacSZbigniew Bodek  *
77345c98dacSZbigniew Bodek  * Allocate RSS/RFS resources.
77445c98dacSZbigniew Bodek  * The caller then can configure rss using ena_com_set_hash_function,
77545c98dacSZbigniew Bodek  * ena_com_set_hash_ctrl and ena_com_indirect_table_set.
77645c98dacSZbigniew Bodek  *
77745c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
77845c98dacSZbigniew Bodek  */
77945c98dacSZbigniew Bodek int ena_com_rss_init(struct ena_com_dev *ena_dev, u16 log_size);
78045c98dacSZbigniew Bodek 
78145c98dacSZbigniew Bodek /* ena_com_rss_destroy - Destroy rss
78245c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
78345c98dacSZbigniew Bodek  *
78445c98dacSZbigniew Bodek  * Free all the RSS/RFS resources.
78545c98dacSZbigniew Bodek  */
78645c98dacSZbigniew Bodek void ena_com_rss_destroy(struct ena_com_dev *ena_dev);
78745c98dacSZbigniew Bodek 
7888483b844SMarcin Wojtas /* ena_com_get_current_hash_function - Get RSS hash function
7898483b844SMarcin Wojtas  * @ena_dev: ENA communication layer struct
7908483b844SMarcin Wojtas  *
7918483b844SMarcin Wojtas  * Return the current hash function.
7928483b844SMarcin Wojtas  * @return: 0 or one of the ena_admin_hash_functions values.
7938483b844SMarcin Wojtas  */
7948483b844SMarcin Wojtas int ena_com_get_current_hash_function(struct ena_com_dev *ena_dev);
7958483b844SMarcin Wojtas 
79645c98dacSZbigniew Bodek /* ena_com_fill_hash_function - Fill RSS hash function
79745c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
79845c98dacSZbigniew Bodek  * @func: The hash function (Toeplitz or crc)
79945c98dacSZbigniew Bodek  * @key: Hash key (for toeplitz hash)
80045c98dacSZbigniew Bodek  * @key_len: key length (max length 10 DW)
80145c98dacSZbigniew Bodek  * @init_val: initial value for the hash function
80245c98dacSZbigniew Bodek  *
80345c98dacSZbigniew Bodek  * Fill the ena_dev resources with the desire hash function, hash key, key_len
80445c98dacSZbigniew Bodek  * and key initial value (if needed by the hash function).
80545c98dacSZbigniew Bodek  * To flush the key into the device the caller should call
80645c98dacSZbigniew Bodek  * ena_com_set_hash_function.
80745c98dacSZbigniew Bodek  *
80845c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
80945c98dacSZbigniew Bodek  */
81045c98dacSZbigniew Bodek int ena_com_fill_hash_function(struct ena_com_dev *ena_dev,
81145c98dacSZbigniew Bodek 			       enum ena_admin_hash_functions func,
81245c98dacSZbigniew Bodek 			       const u8 *key, u16 key_len, u32 init_val);
81345c98dacSZbigniew Bodek 
81445c98dacSZbigniew Bodek /* ena_com_set_hash_function - Flush the hash function and it dependencies to
81545c98dacSZbigniew Bodek  * the device.
81645c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
81745c98dacSZbigniew Bodek  *
81845c98dacSZbigniew Bodek  * Flush the hash function and it dependencies (key, key length and
81945c98dacSZbigniew Bodek  * initial value) if needed.
82045c98dacSZbigniew Bodek  *
82145c98dacSZbigniew Bodek  * @note: Prior to this method the caller should call ena_com_fill_hash_function
82245c98dacSZbigniew Bodek  *
82345c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
82445c98dacSZbigniew Bodek  */
82545c98dacSZbigniew Bodek int ena_com_set_hash_function(struct ena_com_dev *ena_dev);
82645c98dacSZbigniew Bodek 
8278483b844SMarcin Wojtas /* ena_com_get_hash_function - Retrieve the hash function from the device.
82845c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
82945c98dacSZbigniew Bodek  * @func: hash function
83045c98dacSZbigniew Bodek  *
8318483b844SMarcin Wojtas  * Retrieve the hash function from the device.
83245c98dacSZbigniew Bodek  *
8338483b844SMarcin Wojtas  * @note: If the caller called ena_com_fill_hash_function but didn't flush
83445c98dacSZbigniew Bodek  * it to the device, the new configuration will be lost.
83545c98dacSZbigniew Bodek  *
83645c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
83745c98dacSZbigniew Bodek  */
83845c98dacSZbigniew Bodek int ena_com_get_hash_function(struct ena_com_dev *ena_dev,
8398483b844SMarcin Wojtas 			      enum ena_admin_hash_functions *func);
84045c98dacSZbigniew Bodek 
8418483b844SMarcin Wojtas /* ena_com_get_hash_key - Retrieve the hash key
8428483b844SMarcin Wojtas  * @ena_dev: ENA communication layer struct
8438483b844SMarcin Wojtas  * @key: hash key
8448483b844SMarcin Wojtas  *
8458483b844SMarcin Wojtas  * Retrieve the hash key.
8468483b844SMarcin Wojtas  *
8478483b844SMarcin Wojtas  * @note: If the caller called ena_com_fill_hash_key but didn't flush
8488483b844SMarcin Wojtas  * it to the device, the new configuration will be lost.
8498483b844SMarcin Wojtas  *
8508483b844SMarcin Wojtas  * @return: 0 on Success and negative value otherwise.
8518483b844SMarcin Wojtas  */
8528483b844SMarcin Wojtas int ena_com_get_hash_key(struct ena_com_dev *ena_dev, u8 *key);
85345c98dacSZbigniew Bodek /* ena_com_fill_hash_ctrl - Fill RSS hash control
85445c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct.
85545c98dacSZbigniew Bodek  * @proto: The protocol to configure.
85645c98dacSZbigniew Bodek  * @hash_fields: bit mask of ena_admin_flow_hash_fields
85745c98dacSZbigniew Bodek  *
85845c98dacSZbigniew Bodek  * Fill the ena_dev resources with the desire hash control (the ethernet
85945c98dacSZbigniew Bodek  * fields that take part of the hash) for a specific protocol.
86045c98dacSZbigniew Bodek  * To flush the hash control to the device, the caller should call
86145c98dacSZbigniew Bodek  * ena_com_set_hash_ctrl.
86245c98dacSZbigniew Bodek  *
86345c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
86445c98dacSZbigniew Bodek  */
86545c98dacSZbigniew Bodek int ena_com_fill_hash_ctrl(struct ena_com_dev *ena_dev,
86645c98dacSZbigniew Bodek 			   enum ena_admin_flow_hash_proto proto,
86745c98dacSZbigniew Bodek 			   u16 hash_fields);
86845c98dacSZbigniew Bodek 
86945c98dacSZbigniew Bodek /* ena_com_set_hash_ctrl - Flush the hash control resources to the device.
87045c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
87145c98dacSZbigniew Bodek  *
87245c98dacSZbigniew Bodek  * Flush the hash control (the ethernet fields that take part of the hash)
87345c98dacSZbigniew Bodek  *
87445c98dacSZbigniew Bodek  * @note: Prior to this method the caller should call ena_com_fill_hash_ctrl.
87545c98dacSZbigniew Bodek  *
87645c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
87745c98dacSZbigniew Bodek  */
87845c98dacSZbigniew Bodek int ena_com_set_hash_ctrl(struct ena_com_dev *ena_dev);
87945c98dacSZbigniew Bodek 
88045c98dacSZbigniew Bodek /* ena_com_get_hash_ctrl - Retrieve the hash control from the device.
88145c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
88245c98dacSZbigniew Bodek  * @proto: The protocol to retrieve.
88345c98dacSZbigniew Bodek  * @fields: bit mask of ena_admin_flow_hash_fields.
88445c98dacSZbigniew Bodek  *
88545c98dacSZbigniew Bodek  * Retrieve the hash control from the device.
88645c98dacSZbigniew Bodek  *
8878483b844SMarcin Wojtas  * @note: If the caller called ena_com_fill_hash_ctrl but didn't flush
88845c98dacSZbigniew Bodek  * it to the device, the new configuration will be lost.
88945c98dacSZbigniew Bodek  *
89045c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
89145c98dacSZbigniew Bodek  */
89245c98dacSZbigniew Bodek int ena_com_get_hash_ctrl(struct ena_com_dev *ena_dev,
89345c98dacSZbigniew Bodek 			  enum ena_admin_flow_hash_proto proto,
89445c98dacSZbigniew Bodek 			  u16 *fields);
89545c98dacSZbigniew Bodek 
89645c98dacSZbigniew Bodek /* ena_com_set_default_hash_ctrl - Set the hash control to a default
89745c98dacSZbigniew Bodek  * configuration.
89845c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
89945c98dacSZbigniew Bodek  *
90045c98dacSZbigniew Bodek  * Fill the ena_dev resources with the default hash control configuration.
90145c98dacSZbigniew Bodek  * To flush the hash control to the device, the caller should call
90245c98dacSZbigniew Bodek  * ena_com_set_hash_ctrl.
90345c98dacSZbigniew Bodek  *
90445c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
90545c98dacSZbigniew Bodek  */
90645c98dacSZbigniew Bodek int ena_com_set_default_hash_ctrl(struct ena_com_dev *ena_dev);
90745c98dacSZbigniew Bodek 
90845c98dacSZbigniew Bodek /* ena_com_indirect_table_fill_entry - Fill a single entry in the RSS
90945c98dacSZbigniew Bodek  * indirection table
91045c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct.
91145c98dacSZbigniew Bodek  * @entry_idx - indirection table entry.
91245c98dacSZbigniew Bodek  * @entry_value - redirection value
91345c98dacSZbigniew Bodek  *
91445c98dacSZbigniew Bodek  * Fill a single entry of the RSS indirection table in the ena_dev resources.
91545c98dacSZbigniew Bodek  * To flush the indirection table to the device, the called should call
91645c98dacSZbigniew Bodek  * ena_com_indirect_table_set.
91745c98dacSZbigniew Bodek  *
91845c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
91945c98dacSZbigniew Bodek  */
92045c98dacSZbigniew Bodek int ena_com_indirect_table_fill_entry(struct ena_com_dev *ena_dev,
92145c98dacSZbigniew Bodek 				      u16 entry_idx, u16 entry_value);
92245c98dacSZbigniew Bodek 
92345c98dacSZbigniew Bodek /* ena_com_indirect_table_set - Flush the indirection table to the device.
92445c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
92545c98dacSZbigniew Bodek  *
92645c98dacSZbigniew Bodek  * Flush the indirection hash control to the device.
92745c98dacSZbigniew Bodek  * Prior to this method the caller should call ena_com_indirect_table_fill_entry
92845c98dacSZbigniew Bodek  *
92945c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
93045c98dacSZbigniew Bodek  */
93145c98dacSZbigniew Bodek int ena_com_indirect_table_set(struct ena_com_dev *ena_dev);
93245c98dacSZbigniew Bodek 
93345c98dacSZbigniew Bodek /* ena_com_indirect_table_get - Retrieve the indirection table from the device.
93445c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
93545c98dacSZbigniew Bodek  * @ind_tbl: indirection table
93645c98dacSZbigniew Bodek  *
93745c98dacSZbigniew Bodek  * Retrieve the RSS indirection table from the device.
93845c98dacSZbigniew Bodek  *
9398483b844SMarcin Wojtas  * @note: If the caller called ena_com_indirect_table_fill_entry but didn't flush
94045c98dacSZbigniew Bodek  * it to the device, the new configuration will be lost.
94145c98dacSZbigniew Bodek  *
94245c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
94345c98dacSZbigniew Bodek  */
94445c98dacSZbigniew Bodek int ena_com_indirect_table_get(struct ena_com_dev *ena_dev, u32 *ind_tbl);
94545c98dacSZbigniew Bodek 
94645c98dacSZbigniew Bodek /* ena_com_allocate_host_info - Allocate host info resources.
94745c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
94845c98dacSZbigniew Bodek  *
94945c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
95045c98dacSZbigniew Bodek  */
95145c98dacSZbigniew Bodek int ena_com_allocate_host_info(struct ena_com_dev *ena_dev);
95245c98dacSZbigniew Bodek 
95345c98dacSZbigniew Bodek /* ena_com_allocate_debug_area - Allocate debug area.
95445c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
95545c98dacSZbigniew Bodek  * @debug_area_size - debug area size.
95645c98dacSZbigniew Bodek  *
95745c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
95845c98dacSZbigniew Bodek  */
95945c98dacSZbigniew Bodek int ena_com_allocate_debug_area(struct ena_com_dev *ena_dev,
96045c98dacSZbigniew Bodek 				u32 debug_area_size);
96145c98dacSZbigniew Bodek 
962*adfed2d8SArthur Kiyanovski /* ena_com_allocate_customer_metrics_buffer - Allocate customer metrics resources.
963*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
964*adfed2d8SArthur Kiyanovski  *
965*adfed2d8SArthur Kiyanovski  * @return: 0 on Success and negative value otherwise.
966*adfed2d8SArthur Kiyanovski  */
967*adfed2d8SArthur Kiyanovski int ena_com_allocate_customer_metrics_buffer(struct ena_com_dev *ena_dev);
968*adfed2d8SArthur Kiyanovski 
96945c98dacSZbigniew Bodek /* ena_com_delete_debug_area - Free the debug area resources.
97045c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
97145c98dacSZbigniew Bodek  *
9728483b844SMarcin Wojtas  * Free the allocated debug area.
97345c98dacSZbigniew Bodek  */
97445c98dacSZbigniew Bodek void ena_com_delete_debug_area(struct ena_com_dev *ena_dev);
97545c98dacSZbigniew Bodek 
97645c98dacSZbigniew Bodek /* ena_com_delete_host_info - Free the host info resources.
97745c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
97845c98dacSZbigniew Bodek  *
9798483b844SMarcin Wojtas  * Free the allocated host info.
98045c98dacSZbigniew Bodek  */
98145c98dacSZbigniew Bodek void ena_com_delete_host_info(struct ena_com_dev *ena_dev);
98245c98dacSZbigniew Bodek 
983*adfed2d8SArthur Kiyanovski /* ena_com_delete_customer_metrics_buffer - Free the customer metrics resources.
984*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
985*adfed2d8SArthur Kiyanovski  *
986*adfed2d8SArthur Kiyanovski  * Free the allocated customer metrics area.
987*adfed2d8SArthur Kiyanovski  */
988*adfed2d8SArthur Kiyanovski void ena_com_delete_customer_metrics_buffer(struct ena_com_dev *ena_dev);
989*adfed2d8SArthur Kiyanovski 
99045c98dacSZbigniew Bodek /* ena_com_set_host_attributes - Update the device with the host
99145c98dacSZbigniew Bodek  * attributes (debug area and host info) base address.
99245c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
99345c98dacSZbigniew Bodek  *
99445c98dacSZbigniew Bodek  * @return: 0 on Success and negative value otherwise.
99545c98dacSZbigniew Bodek  */
99645c98dacSZbigniew Bodek int ena_com_set_host_attributes(struct ena_com_dev *ena_dev);
99745c98dacSZbigniew Bodek 
99845c98dacSZbigniew Bodek /* ena_com_create_io_cq - Create io completion queue.
99945c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
100045c98dacSZbigniew Bodek  * @io_cq - io completion queue handler
100145c98dacSZbigniew Bodek 
100245c98dacSZbigniew Bodek  * Create IO completion queue.
100345c98dacSZbigniew Bodek  *
100445c98dacSZbigniew Bodek  * @return - 0 on success, negative value on failure.
100545c98dacSZbigniew Bodek  */
100645c98dacSZbigniew Bodek int ena_com_create_io_cq(struct ena_com_dev *ena_dev,
100745c98dacSZbigniew Bodek 			 struct ena_com_io_cq *io_cq);
100845c98dacSZbigniew Bodek 
100945c98dacSZbigniew Bodek /* ena_com_destroy_io_cq - Destroy io completion queue.
101045c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
101145c98dacSZbigniew Bodek  * @io_cq - io completion queue handler
101245c98dacSZbigniew Bodek 
101345c98dacSZbigniew Bodek  * Destroy IO completion queue.
101445c98dacSZbigniew Bodek  *
101545c98dacSZbigniew Bodek  * @return - 0 on success, negative value on failure.
101645c98dacSZbigniew Bodek  */
101745c98dacSZbigniew Bodek int ena_com_destroy_io_cq(struct ena_com_dev *ena_dev,
101845c98dacSZbigniew Bodek 			  struct ena_com_io_cq *io_cq);
101945c98dacSZbigniew Bodek 
102045c98dacSZbigniew Bodek /* ena_com_execute_admin_command - Execute admin command
102145c98dacSZbigniew Bodek  * @admin_queue: admin queue.
102245c98dacSZbigniew Bodek  * @cmd: the admin command to execute.
102345c98dacSZbigniew Bodek  * @cmd_size: the command size.
102445c98dacSZbigniew Bodek  * @cmd_completion: command completion return value.
102545c98dacSZbigniew Bodek  * @cmd_comp_size: command completion size.
102645c98dacSZbigniew Bodek 
10278483b844SMarcin Wojtas  * Submit an admin command and then wait until the device returns a
102845c98dacSZbigniew Bodek  * completion.
10298483b844SMarcin Wojtas  * The completion will be copied into cmd_comp.
103045c98dacSZbigniew Bodek  *
103145c98dacSZbigniew Bodek  * @return - 0 on success, negative value on failure.
103245c98dacSZbigniew Bodek  */
103345c98dacSZbigniew Bodek int ena_com_execute_admin_command(struct ena_com_admin_queue *admin_queue,
103445c98dacSZbigniew Bodek 				  struct ena_admin_aq_entry *cmd,
103545c98dacSZbigniew Bodek 				  size_t cmd_size,
103645c98dacSZbigniew Bodek 				  struct ena_admin_acq_entry *cmd_comp,
103745c98dacSZbigniew Bodek 				  size_t cmd_comp_size);
103845c98dacSZbigniew Bodek 
103945c98dacSZbigniew Bodek /* ena_com_init_interrupt_moderation - Init interrupt moderation
104045c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
104145c98dacSZbigniew Bodek  *
104245c98dacSZbigniew Bodek  * @return - 0 on success, negative value on failure.
104345c98dacSZbigniew Bodek  */
104445c98dacSZbigniew Bodek int ena_com_init_interrupt_moderation(struct ena_com_dev *ena_dev);
104545c98dacSZbigniew Bodek 
104645c98dacSZbigniew Bodek /* ena_com_interrupt_moderation_supported - Return if interrupt moderation
104745c98dacSZbigniew Bodek  * capability is supported by the device.
104845c98dacSZbigniew Bodek  *
104945c98dacSZbigniew Bodek  * @return - supported or not.
105045c98dacSZbigniew Bodek  */
105145c98dacSZbigniew Bodek bool ena_com_interrupt_moderation_supported(struct ena_com_dev *ena_dev);
105245c98dacSZbigniew Bodek 
105345c98dacSZbigniew Bodek /* ena_com_update_nonadaptive_moderation_interval_tx - Update the
105445c98dacSZbigniew Bodek  * non-adaptive interval in Tx direction.
105545c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
105645c98dacSZbigniew Bodek  * @tx_coalesce_usecs: Interval in usec.
105745c98dacSZbigniew Bodek  *
105845c98dacSZbigniew Bodek  * @return - 0 on success, negative value on failure.
105945c98dacSZbigniew Bodek  */
106045c98dacSZbigniew Bodek int ena_com_update_nonadaptive_moderation_interval_tx(struct ena_com_dev *ena_dev,
106145c98dacSZbigniew Bodek 						      u32 tx_coalesce_usecs);
106245c98dacSZbigniew Bodek 
106345c98dacSZbigniew Bodek /* ena_com_update_nonadaptive_moderation_interval_rx - Update the
106445c98dacSZbigniew Bodek  * non-adaptive interval in Rx direction.
106545c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
106645c98dacSZbigniew Bodek  * @rx_coalesce_usecs: Interval in usec.
106745c98dacSZbigniew Bodek  *
106845c98dacSZbigniew Bodek  * @return - 0 on success, negative value on failure.
106945c98dacSZbigniew Bodek  */
107045c98dacSZbigniew Bodek int ena_com_update_nonadaptive_moderation_interval_rx(struct ena_com_dev *ena_dev,
107145c98dacSZbigniew Bodek 						      u32 rx_coalesce_usecs);
107245c98dacSZbigniew Bodek 
107345c98dacSZbigniew Bodek /* ena_com_get_nonadaptive_moderation_interval_tx - Retrieve the
107445c98dacSZbigniew Bodek  * non-adaptive interval in Tx direction.
107545c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
107645c98dacSZbigniew Bodek  *
107745c98dacSZbigniew Bodek  * @return - interval in usec
107845c98dacSZbigniew Bodek  */
107945c98dacSZbigniew Bodek unsigned int ena_com_get_nonadaptive_moderation_interval_tx(struct ena_com_dev *ena_dev);
108045c98dacSZbigniew Bodek 
108145c98dacSZbigniew Bodek /* ena_com_get_nonadaptive_moderation_interval_rx - Retrieve the
108245c98dacSZbigniew Bodek  * non-adaptive interval in Rx direction.
108345c98dacSZbigniew Bodek  * @ena_dev: ENA communication layer struct
108445c98dacSZbigniew Bodek  *
108545c98dacSZbigniew Bodek  * @return - interval in usec
108645c98dacSZbigniew Bodek  */
108745c98dacSZbigniew Bodek unsigned int ena_com_get_nonadaptive_moderation_interval_rx(struct ena_com_dev *ena_dev);
108845c98dacSZbigniew Bodek 
1089a195fab0SMarcin Wojtas /* ena_com_config_dev_mode - Configure the placement policy of the device.
1090a195fab0SMarcin Wojtas  * @ena_dev: ENA communication layer struct
109167ec48bbSMarcin Wojtas  * @llq_features: LLQ feature descriptor, retrieve via
109267ec48bbSMarcin Wojtas  *		   ena_com_get_dev_attr_feat.
109367ec48bbSMarcin Wojtas  * @ena_llq_config: The default driver LLQ parameters configurations
1094a195fab0SMarcin Wojtas  */
1095a195fab0SMarcin Wojtas int ena_com_config_dev_mode(struct ena_com_dev *ena_dev,
109667ec48bbSMarcin Wojtas 			    struct ena_admin_feature_llq_desc *llq_features,
109767ec48bbSMarcin Wojtas 			    struct ena_llq_configurations *llq_default_config);
1098a195fab0SMarcin Wojtas 
10999eb1615fSMarcin Wojtas /* ena_com_io_sq_to_ena_dev - Extract ena_com_dev using contained field io_sq.
11009eb1615fSMarcin Wojtas  * @io_sq: IO submit queue struct
11019eb1615fSMarcin Wojtas  *
11029eb1615fSMarcin Wojtas  * @return - ena_com_dev struct extracted from io_sq
11039eb1615fSMarcin Wojtas  */
ena_com_io_sq_to_ena_dev(struct ena_com_io_sq * io_sq)11049eb1615fSMarcin Wojtas static inline struct ena_com_dev *ena_com_io_sq_to_ena_dev(struct ena_com_io_sq *io_sq)
11059eb1615fSMarcin Wojtas {
11069eb1615fSMarcin Wojtas 	return container_of(io_sq, struct ena_com_dev, io_sq_queues[io_sq->qid]);
11079eb1615fSMarcin Wojtas }
11089eb1615fSMarcin Wojtas 
11099eb1615fSMarcin Wojtas /* ena_com_io_cq_to_ena_dev - Extract ena_com_dev using contained field io_cq.
11109eb1615fSMarcin Wojtas  * @io_sq: IO submit queue struct
11119eb1615fSMarcin Wojtas  *
11129eb1615fSMarcin Wojtas  * @return - ena_com_dev struct extracted from io_sq
11139eb1615fSMarcin Wojtas  */
ena_com_io_cq_to_ena_dev(struct ena_com_io_cq * io_cq)11149eb1615fSMarcin Wojtas static inline struct ena_com_dev *ena_com_io_cq_to_ena_dev(struct ena_com_io_cq *io_cq)
11159eb1615fSMarcin Wojtas {
11169eb1615fSMarcin Wojtas 	return container_of(io_cq, struct ena_com_dev, io_cq_queues[io_cq->qid]);
11179eb1615fSMarcin Wojtas }
11189eb1615fSMarcin Wojtas 
ena_com_get_adaptive_moderation_enabled(struct ena_com_dev * ena_dev)111945c98dacSZbigniew Bodek static inline bool ena_com_get_adaptive_moderation_enabled(struct ena_com_dev *ena_dev)
112045c98dacSZbigniew Bodek {
112145c98dacSZbigniew Bodek 	return ena_dev->adaptive_coalescing;
112245c98dacSZbigniew Bodek }
112345c98dacSZbigniew Bodek 
ena_com_enable_adaptive_moderation(struct ena_com_dev * ena_dev)112445c98dacSZbigniew Bodek static inline void ena_com_enable_adaptive_moderation(struct ena_com_dev *ena_dev)
112545c98dacSZbigniew Bodek {
112645c98dacSZbigniew Bodek 	ena_dev->adaptive_coalescing = true;
112745c98dacSZbigniew Bodek }
112845c98dacSZbigniew Bodek 
ena_com_disable_adaptive_moderation(struct ena_com_dev * ena_dev)112945c98dacSZbigniew Bodek static inline void ena_com_disable_adaptive_moderation(struct ena_com_dev *ena_dev)
113045c98dacSZbigniew Bodek {
113145c98dacSZbigniew Bodek 	ena_dev->adaptive_coalescing = false;
113245c98dacSZbigniew Bodek }
113345c98dacSZbigniew Bodek 
1134*adfed2d8SArthur Kiyanovski /* ena_com_get_cap - query whether device supports a capability.
1135*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
1136*adfed2d8SArthur Kiyanovski  * @cap_id: enum value representing the capability
1137*adfed2d8SArthur Kiyanovski  *
1138*adfed2d8SArthur Kiyanovski  * @return - true if capability is supported or false otherwise
1139*adfed2d8SArthur Kiyanovski  */
ena_com_get_cap(struct ena_com_dev * ena_dev,enum ena_admin_aq_caps_id cap_id)1140*adfed2d8SArthur Kiyanovski static inline bool ena_com_get_cap(struct ena_com_dev *ena_dev,
1141*adfed2d8SArthur Kiyanovski 				   enum ena_admin_aq_caps_id cap_id)
1142*adfed2d8SArthur Kiyanovski {
1143*adfed2d8SArthur Kiyanovski 	return !!(ena_dev->capabilities & BIT(cap_id));
1144*adfed2d8SArthur Kiyanovski }
1145*adfed2d8SArthur Kiyanovski 
1146*adfed2d8SArthur Kiyanovski /* ena_com_get_customer_metric_support - query whether device supports a given customer metric.
1147*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
1148*adfed2d8SArthur Kiyanovski  * @metric_id: enum value representing the customer metric
1149*adfed2d8SArthur Kiyanovski  *
1150*adfed2d8SArthur Kiyanovski  * @return - true if customer metric is supported or false otherwise
1151*adfed2d8SArthur Kiyanovski  */
ena_com_get_customer_metric_support(struct ena_com_dev * ena_dev,enum ena_admin_customer_metrics_id metric_id)1152*adfed2d8SArthur Kiyanovski static inline bool ena_com_get_customer_metric_support(struct ena_com_dev *ena_dev,
1153*adfed2d8SArthur Kiyanovski 						       enum ena_admin_customer_metrics_id metric_id)
1154*adfed2d8SArthur Kiyanovski {
1155*adfed2d8SArthur Kiyanovski 	return !!(ena_dev->customer_metrics.supported_metrics & BIT64(metric_id));
1156*adfed2d8SArthur Kiyanovski }
1157*adfed2d8SArthur Kiyanovski 
1158*adfed2d8SArthur Kiyanovski /* ena_com_get_customer_metric_count - return the number of supported customer metrics.
1159*adfed2d8SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
1160*adfed2d8SArthur Kiyanovski  *
1161*adfed2d8SArthur Kiyanovski  * @return - the number of supported customer metrics
1162*adfed2d8SArthur Kiyanovski  */
ena_com_get_customer_metric_count(struct ena_com_dev * ena_dev)1163*adfed2d8SArthur Kiyanovski static inline int ena_com_get_customer_metric_count(struct ena_com_dev *ena_dev)
1164*adfed2d8SArthur Kiyanovski {
1165*adfed2d8SArthur Kiyanovski 	return ENA_BITS_PER_U64(ena_dev->customer_metrics.supported_metrics);
1166*adfed2d8SArthur Kiyanovski }
1167*adfed2d8SArthur Kiyanovski 
116845c98dacSZbigniew Bodek /* ena_com_update_intr_reg - Prepare interrupt register
116945c98dacSZbigniew Bodek  * @intr_reg: interrupt register to update.
117045c98dacSZbigniew Bodek  * @rx_delay_interval: Rx interval in usecs
117145c98dacSZbigniew Bodek  * @tx_delay_interval: Tx interval in usecs
11728483b844SMarcin Wojtas  * @unmask: unmask enable/disable
1173*adfed2d8SArthur Kiyanovski  * @no_moderation_update: 0 - Indicates that any of the TX/RX intervals was
1174*adfed2d8SArthur Kiyanovski  *                        updated, 1 - otherwise
117545c98dacSZbigniew Bodek  *
117645c98dacSZbigniew Bodek  * Prepare interrupt update register with the supplied parameters.
117745c98dacSZbigniew Bodek  */
ena_com_update_intr_reg(struct ena_eth_io_intr_reg * intr_reg,u32 rx_delay_interval,u32 tx_delay_interval,bool unmask,bool no_moderation_update)117845c98dacSZbigniew Bodek static inline void ena_com_update_intr_reg(struct ena_eth_io_intr_reg *intr_reg,
117945c98dacSZbigniew Bodek 					   u32 rx_delay_interval,
118045c98dacSZbigniew Bodek 					   u32 tx_delay_interval,
1181*adfed2d8SArthur Kiyanovski 					   bool unmask,
1182*adfed2d8SArthur Kiyanovski 					   bool no_moderation_update)
118345c98dacSZbigniew Bodek {
118445c98dacSZbigniew Bodek 	intr_reg->intr_control = 0;
118545c98dacSZbigniew Bodek 	intr_reg->intr_control |= rx_delay_interval &
118645c98dacSZbigniew Bodek 		ENA_ETH_IO_INTR_REG_RX_INTR_DELAY_MASK;
118745c98dacSZbigniew Bodek 
118845c98dacSZbigniew Bodek 	intr_reg->intr_control |=
118945c98dacSZbigniew Bodek 		(tx_delay_interval << ENA_ETH_IO_INTR_REG_TX_INTR_DELAY_SHIFT)
119045c98dacSZbigniew Bodek 		& ENA_ETH_IO_INTR_REG_TX_INTR_DELAY_MASK;
119145c98dacSZbigniew Bodek 
119245c98dacSZbigniew Bodek 	if (unmask)
119345c98dacSZbigniew Bodek 		intr_reg->intr_control |= ENA_ETH_IO_INTR_REG_INTR_UNMASK_MASK;
1194*adfed2d8SArthur Kiyanovski 
1195*adfed2d8SArthur Kiyanovski 	intr_reg->intr_control |=
1196*adfed2d8SArthur Kiyanovski 		(((u32)no_moderation_update) << ENA_ETH_IO_INTR_REG_NO_MODERATION_UPDATE_SHIFT) &
1197*adfed2d8SArthur Kiyanovski 			ENA_ETH_IO_INTR_REG_NO_MODERATION_UPDATE_MASK;
119845c98dacSZbigniew Bodek }
119945c98dacSZbigniew Bodek 
ena_com_get_next_bounce_buffer(struct ena_com_io_bounce_buffer_control * bounce_buf_ctrl)1200a195fab0SMarcin Wojtas static inline u8 *ena_com_get_next_bounce_buffer(struct ena_com_io_bounce_buffer_control *bounce_buf_ctrl)
1201a195fab0SMarcin Wojtas {
1202a195fab0SMarcin Wojtas 	u16 size, buffers_num;
1203a195fab0SMarcin Wojtas 	u8 *buf;
1204a195fab0SMarcin Wojtas 
1205a195fab0SMarcin Wojtas 	size = bounce_buf_ctrl->buffer_size;
1206a195fab0SMarcin Wojtas 	buffers_num = bounce_buf_ctrl->buffers_num;
1207a195fab0SMarcin Wojtas 
1208a195fab0SMarcin Wojtas 	buf = bounce_buf_ctrl->base_buffer +
1209a195fab0SMarcin Wojtas 		(bounce_buf_ctrl->next_to_use++ & (buffers_num - 1)) * size;
1210a195fab0SMarcin Wojtas 
121167ec48bbSMarcin Wojtas 	prefetchw(bounce_buf_ctrl->base_buffer +
1212a195fab0SMarcin Wojtas 		(bounce_buf_ctrl->next_to_use & (buffers_num - 1)) * size);
1213a195fab0SMarcin Wojtas 
1214a195fab0SMarcin Wojtas 	return buf;
1215a195fab0SMarcin Wojtas }
1216a195fab0SMarcin Wojtas 
1217a195fab0SMarcin Wojtas #ifdef ENA_EXTENDED_STATS
1218a195fab0SMarcin Wojtas int ena_com_get_dev_extended_stats(struct ena_com_dev *ena_dev, char *buff,
1219a195fab0SMarcin Wojtas 				   u32 len);
1220a195fab0SMarcin Wojtas 
1221a195fab0SMarcin Wojtas int ena_com_extended_stats_set_func_queue(struct ena_com_dev *ena_dev,
1222a195fab0SMarcin Wojtas 					  u32 funct_queue);
1223a195fab0SMarcin Wojtas #endif
122445c98dacSZbigniew Bodek #if defined(__cplusplus)
122545c98dacSZbigniew Bodek }
122645c98dacSZbigniew Bodek #endif /* __cplusplus */
122745c98dacSZbigniew Bodek #endif /* !(ENA_COM) */
1228