12246cbc2SShay Agroskin /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
21738cd3eSNetanel Belgazal /*
32246cbc2SShay Agroskin  * Copyright 2015-2020 Amazon.com, Inc. or its affiliates. All rights reserved.
41738cd3eSNetanel Belgazal  */
51738cd3eSNetanel Belgazal 
61738cd3eSNetanel Belgazal #ifndef ENA_COM
71738cd3eSNetanel Belgazal #define ENA_COM
81738cd3eSNetanel Belgazal 
9a8496eb8SNetanel Belgazal #include <linux/compiler.h>
101738cd3eSNetanel Belgazal #include <linux/delay.h>
111738cd3eSNetanel Belgazal #include <linux/dma-mapping.h>
121738cd3eSNetanel Belgazal #include <linux/gfp.h>
13689b2bdaSArthur Kiyanovski #include <linux/io.h>
1400f17a82SArthur Kiyanovski #include <linux/prefetch.h>
151738cd3eSNetanel Belgazal #include <linux/sched.h>
161738cd3eSNetanel Belgazal #include <linux/sizes.h>
171738cd3eSNetanel Belgazal #include <linux/spinlock.h>
181738cd3eSNetanel Belgazal #include <linux/types.h>
191738cd3eSNetanel Belgazal #include <linux/wait.h>
200d1c3de7SArthur Kiyanovski #include <linux/netdevice.h>
211738cd3eSNetanel Belgazal 
221738cd3eSNetanel Belgazal #include "ena_common_defs.h"
231738cd3eSNetanel Belgazal #include "ena_admin_defs.h"
241738cd3eSNetanel Belgazal #include "ena_eth_io_defs.h"
251738cd3eSNetanel Belgazal #include "ena_regs_defs.h"
261738cd3eSNetanel Belgazal 
271738cd3eSNetanel Belgazal #undef pr_fmt
281738cd3eSNetanel Belgazal #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
291738cd3eSNetanel Belgazal 
301738cd3eSNetanel Belgazal #define ENA_MAX_NUM_IO_QUEUES 128U
311738cd3eSNetanel Belgazal /* We need to queues for each IO (on for Tx and one for Rx) */
321738cd3eSNetanel Belgazal #define ENA_TOTAL_NUM_QUEUES (2 * (ENA_MAX_NUM_IO_QUEUES))
331738cd3eSNetanel Belgazal 
341738cd3eSNetanel Belgazal #define ENA_MAX_HANDLERS 256
351738cd3eSNetanel Belgazal 
361738cd3eSNetanel Belgazal #define ENA_MAX_PHYS_ADDR_SIZE_BITS 48
371738cd3eSNetanel Belgazal 
381738cd3eSNetanel Belgazal /* Unit in usec */
391738cd3eSNetanel Belgazal #define ENA_REG_READ_TIMEOUT 200000
401738cd3eSNetanel Belgazal 
411738cd3eSNetanel Belgazal #define ADMIN_SQ_SIZE(depth)	((depth) * sizeof(struct ena_admin_aq_entry))
421738cd3eSNetanel Belgazal #define ADMIN_CQ_SIZE(depth)	((depth) * sizeof(struct ena_admin_acq_entry))
431738cd3eSNetanel Belgazal #define ADMIN_AENQ_SIZE(depth)	((depth) * sizeof(struct ena_admin_aenq_entry))
441738cd3eSNetanel Belgazal 
451738cd3eSNetanel Belgazal /*****************************************************************************/
461738cd3eSNetanel Belgazal /*****************************************************************************/
471738cd3eSNetanel Belgazal /* ENA adaptive interrupt moderation settings */
481738cd3eSNetanel Belgazal 
4905785adfSArthur Kiyanovski #define ENA_INTR_INITIAL_TX_INTERVAL_USECS 64
5015619e72SArthur Kiyanovski #define ENA_INTR_INITIAL_RX_INTERVAL_USECS 0
5179226ceaSArthur Kiyanovski #define ENA_DEFAULT_INTR_DELAY_RESOLUTION 1
521738cd3eSNetanel Belgazal 
53b0ae3ac4SArthur Kiyanovski #define ENA_HASH_KEY_SIZE 40
54b0ae3ac4SArthur Kiyanovski 
5582ef30f1SNetanel Belgazal #define ENA_HW_HINTS_NO_TIMEOUT	0xFFFF
5682ef30f1SNetanel Belgazal 
57ba8ef506SArthur Kiyanovski #define ENA_FEATURE_MAX_QUEUE_EXT_VER 1
58ba8ef506SArthur Kiyanovski 
59a7982b8eSArthur Kiyanovski struct ena_llq_configurations {
60a7982b8eSArthur Kiyanovski 	enum ena_admin_llq_header_location llq_header_location;
61a7982b8eSArthur Kiyanovski 	enum ena_admin_llq_ring_entry_size llq_ring_entry_size;
62a7982b8eSArthur Kiyanovski 	enum ena_admin_llq_stride_ctrl  llq_stride_ctrl;
63a7982b8eSArthur Kiyanovski 	enum ena_admin_llq_num_descs_before_header llq_num_decs_before_header;
64a7982b8eSArthur Kiyanovski 	u16 llq_ring_entry_size_value;
65a7982b8eSArthur Kiyanovski };
66a7982b8eSArthur Kiyanovski 
671738cd3eSNetanel Belgazal enum queue_direction {
681738cd3eSNetanel Belgazal 	ENA_COM_IO_QUEUE_DIRECTION_TX,
691738cd3eSNetanel Belgazal 	ENA_COM_IO_QUEUE_DIRECTION_RX
701738cd3eSNetanel Belgazal };
711738cd3eSNetanel Belgazal 
721738cd3eSNetanel Belgazal struct ena_com_buf {
731738cd3eSNetanel Belgazal 	dma_addr_t paddr; /**< Buffer physical address */
741738cd3eSNetanel Belgazal 	u16 len; /**< Buffer length in bytes */
751738cd3eSNetanel Belgazal };
761738cd3eSNetanel Belgazal 
771738cd3eSNetanel Belgazal struct ena_com_rx_buf_info {
781738cd3eSNetanel Belgazal 	u16 len;
791738cd3eSNetanel Belgazal 	u16 req_id;
801738cd3eSNetanel Belgazal };
811738cd3eSNetanel Belgazal 
821738cd3eSNetanel Belgazal struct ena_com_io_desc_addr {
831738cd3eSNetanel Belgazal 	u8 __iomem *pbuf_dev_addr; /* LLQ address */
841738cd3eSNetanel Belgazal 	u8 *virt_addr;
851738cd3eSNetanel Belgazal 	dma_addr_t phys_addr;
861738cd3eSNetanel Belgazal };
871738cd3eSNetanel Belgazal 
881738cd3eSNetanel Belgazal struct ena_com_tx_meta {
891738cd3eSNetanel Belgazal 	u16 mss;
901738cd3eSNetanel Belgazal 	u16 l3_hdr_len;
911738cd3eSNetanel Belgazal 	u16 l3_hdr_offset;
921738cd3eSNetanel Belgazal 	u16 l4_hdr_len; /* In words */
931738cd3eSNetanel Belgazal };
941738cd3eSNetanel Belgazal 
95a7982b8eSArthur Kiyanovski struct ena_com_llq_info {
96a7982b8eSArthur Kiyanovski 	u16 header_location_ctrl;
97a7982b8eSArthur Kiyanovski 	u16 desc_stride_ctrl;
98a7982b8eSArthur Kiyanovski 	u16 desc_list_entry_size_ctrl;
99a7982b8eSArthur Kiyanovski 	u16 desc_list_entry_size;
100a7982b8eSArthur Kiyanovski 	u16 descs_num_before_header;
101a7982b8eSArthur Kiyanovski 	u16 descs_per_entry;
10205d62ca2SSameeh Jubran 	u16 max_entries_in_tx_burst;
1030e3a3f6dSArthur Kiyanovski 	bool disable_meta_caching;
104a7982b8eSArthur Kiyanovski };
105a7982b8eSArthur Kiyanovski 
1061738cd3eSNetanel Belgazal struct ena_com_io_cq {
1071738cd3eSNetanel Belgazal 	struct ena_com_io_desc_addr cdesc_addr;
1081738cd3eSNetanel Belgazal 
1091738cd3eSNetanel Belgazal 	/* Interrupt unmask register */
1101738cd3eSNetanel Belgazal 	u32 __iomem *unmask_reg;
1111738cd3eSNetanel Belgazal 
1121738cd3eSNetanel Belgazal 	/* The completion queue head doorbell register */
1131738cd3eSNetanel Belgazal 	u32 __iomem *cq_head_db_reg;
1141738cd3eSNetanel Belgazal 
1151738cd3eSNetanel Belgazal 	/* numa configuration register (for TPH) */
1161738cd3eSNetanel Belgazal 	u32 __iomem *numa_node_cfg_reg;
1171738cd3eSNetanel Belgazal 
1181738cd3eSNetanel Belgazal 	/* The value to write to the above register to unmask
1191738cd3eSNetanel Belgazal 	 * the interrupt of this queue
1201738cd3eSNetanel Belgazal 	 */
1211738cd3eSNetanel Belgazal 	u32 msix_vector;
1221738cd3eSNetanel Belgazal 
1231738cd3eSNetanel Belgazal 	enum queue_direction direction;
1241738cd3eSNetanel Belgazal 
1251738cd3eSNetanel Belgazal 	/* holds the number of cdesc of the current packet */
1261738cd3eSNetanel Belgazal 	u16 cur_rx_pkt_cdesc_count;
127a7dde236SBhaskar Chowdhury 	/* save the first cdesc idx of the current packet */
1281738cd3eSNetanel Belgazal 	u16 cur_rx_pkt_cdesc_start_idx;
1291738cd3eSNetanel Belgazal 
1301738cd3eSNetanel Belgazal 	u16 q_depth;
1311738cd3eSNetanel Belgazal 	/* Caller qid */
1321738cd3eSNetanel Belgazal 	u16 qid;
1331738cd3eSNetanel Belgazal 
1341738cd3eSNetanel Belgazal 	/* Device queue index */
1351738cd3eSNetanel Belgazal 	u16 idx;
1361738cd3eSNetanel Belgazal 	u16 head;
1371738cd3eSNetanel Belgazal 	u16 last_head_update;
1381738cd3eSNetanel Belgazal 	u8 phase;
1391738cd3eSNetanel Belgazal 	u8 cdesc_entry_size_in_bytes;
1401738cd3eSNetanel Belgazal 
1411738cd3eSNetanel Belgazal } ____cacheline_aligned;
1421738cd3eSNetanel Belgazal 
143a7982b8eSArthur Kiyanovski struct ena_com_io_bounce_buffer_control {
144a7982b8eSArthur Kiyanovski 	u8 *base_buffer;
145a7982b8eSArthur Kiyanovski 	u16 next_to_use;
146a7982b8eSArthur Kiyanovski 	u16 buffer_size;
147a7982b8eSArthur Kiyanovski 	u16 buffers_num;  /* Must be a power of 2 */
148a7982b8eSArthur Kiyanovski };
149a7982b8eSArthur Kiyanovski 
150a7982b8eSArthur Kiyanovski /* This struct is to keep tracking the current location of the next llq entry */
151a7982b8eSArthur Kiyanovski struct ena_com_llq_pkt_ctrl {
152a7982b8eSArthur Kiyanovski 	u8 *curr_bounce_buf;
153a7982b8eSArthur Kiyanovski 	u16 idx;
154a7982b8eSArthur Kiyanovski 	u16 descs_left_in_line;
155a7982b8eSArthur Kiyanovski };
156a7982b8eSArthur Kiyanovski 
1571738cd3eSNetanel Belgazal struct ena_com_io_sq {
1581738cd3eSNetanel Belgazal 	struct ena_com_io_desc_addr desc_addr;
1591738cd3eSNetanel Belgazal 
1601738cd3eSNetanel Belgazal 	u32 __iomem *db_addr;
1611738cd3eSNetanel Belgazal 	u8 __iomem *header_addr;
1621738cd3eSNetanel Belgazal 
1631738cd3eSNetanel Belgazal 	enum queue_direction direction;
1641738cd3eSNetanel Belgazal 	enum ena_admin_placement_policy_type mem_queue_type;
1651738cd3eSNetanel Belgazal 
1660e3a3f6dSArthur Kiyanovski 	bool disable_meta_caching;
1670e3a3f6dSArthur Kiyanovski 
1681738cd3eSNetanel Belgazal 	u32 msix_vector;
1691738cd3eSNetanel Belgazal 	struct ena_com_tx_meta cached_tx_meta;
170a7982b8eSArthur Kiyanovski 	struct ena_com_llq_info llq_info;
171a7982b8eSArthur Kiyanovski 	struct ena_com_llq_pkt_ctrl llq_buf_ctrl;
172a7982b8eSArthur Kiyanovski 	struct ena_com_io_bounce_buffer_control bounce_buf_ctrl;
1731738cd3eSNetanel Belgazal 
1741738cd3eSNetanel Belgazal 	u16 q_depth;
1751738cd3eSNetanel Belgazal 	u16 qid;
1761738cd3eSNetanel Belgazal 
1771738cd3eSNetanel Belgazal 	u16 idx;
1781738cd3eSNetanel Belgazal 	u16 tail;
1791738cd3eSNetanel Belgazal 	u16 next_to_comp;
180a7982b8eSArthur Kiyanovski 	u16 llq_last_copy_tail;
1811738cd3eSNetanel Belgazal 	u32 tx_max_header_size;
1821738cd3eSNetanel Belgazal 	u8 phase;
1831738cd3eSNetanel Belgazal 	u8 desc_entry_size;
1841738cd3eSNetanel Belgazal 	u8 dma_addr_bits;
18505d62ca2SSameeh Jubran 	u16 entries_in_tx_burst_left;
1861738cd3eSNetanel Belgazal } ____cacheline_aligned;
1871738cd3eSNetanel Belgazal 
1881738cd3eSNetanel Belgazal struct ena_com_admin_cq {
1891738cd3eSNetanel Belgazal 	struct ena_admin_acq_entry *entries;
1901738cd3eSNetanel Belgazal 	dma_addr_t dma_addr;
1911738cd3eSNetanel Belgazal 
1921738cd3eSNetanel Belgazal 	u16 head;
1931738cd3eSNetanel Belgazal 	u8 phase;
1941738cd3eSNetanel Belgazal };
1951738cd3eSNetanel Belgazal 
1961738cd3eSNetanel Belgazal struct ena_com_admin_sq {
1971738cd3eSNetanel Belgazal 	struct ena_admin_aq_entry *entries;
1981738cd3eSNetanel Belgazal 	dma_addr_t dma_addr;
1991738cd3eSNetanel Belgazal 
2001738cd3eSNetanel Belgazal 	u32 __iomem *db_addr;
2011738cd3eSNetanel Belgazal 
2021738cd3eSNetanel Belgazal 	u16 head;
2031738cd3eSNetanel Belgazal 	u16 tail;
2041738cd3eSNetanel Belgazal 	u8 phase;
2051738cd3eSNetanel Belgazal 
2061738cd3eSNetanel Belgazal };
2071738cd3eSNetanel Belgazal 
2081738cd3eSNetanel Belgazal struct ena_com_stats_admin {
2090dcec686SArthur Kiyanovski 	u64 aborted_cmd;
2100dcec686SArthur Kiyanovski 	u64 submitted_cmd;
2110dcec686SArthur Kiyanovski 	u64 completed_cmd;
2120dcec686SArthur Kiyanovski 	u64 out_of_space;
2130dcec686SArthur Kiyanovski 	u64 no_completion;
2141738cd3eSNetanel Belgazal };
2151738cd3eSNetanel Belgazal 
2161738cd3eSNetanel Belgazal struct ena_com_admin_queue {
2171738cd3eSNetanel Belgazal 	void *q_dmadev;
2184bb7f4cfSArthur Kiyanovski 	struct ena_com_dev *ena_dev;
2191738cd3eSNetanel Belgazal 	spinlock_t q_lock; /* spinlock for the admin queue */
22082ef30f1SNetanel Belgazal 
2211738cd3eSNetanel Belgazal 	struct ena_comp_ctx *comp_ctx;
22282ef30f1SNetanel Belgazal 	u32 completion_timeout;
2231738cd3eSNetanel Belgazal 	u16 q_depth;
2241738cd3eSNetanel Belgazal 	struct ena_com_admin_cq cq;
2251738cd3eSNetanel Belgazal 	struct ena_com_admin_sq sq;
2261738cd3eSNetanel Belgazal 
2271738cd3eSNetanel Belgazal 	/* Indicate if the admin queue should poll for completion */
2281738cd3eSNetanel Belgazal 	bool polling;
2291738cd3eSNetanel Belgazal 
230a4e262cdSSameeh Jubran 	/* Define if fallback to polling mode should occur */
231a4e262cdSSameeh Jubran 	bool auto_polling;
232a4e262cdSSameeh Jubran 
2331738cd3eSNetanel Belgazal 	u16 curr_cmd_id;
2341738cd3eSNetanel Belgazal 
2351738cd3eSNetanel Belgazal 	/* Indicate that the ena was initialized and can
2361738cd3eSNetanel Belgazal 	 * process new admin commands
2371738cd3eSNetanel Belgazal 	 */
2381738cd3eSNetanel Belgazal 	bool running_state;
2391738cd3eSNetanel Belgazal 
2401738cd3eSNetanel Belgazal 	/* Count the number of outstanding admin commands */
2411738cd3eSNetanel Belgazal 	atomic_t outstanding_cmds;
2421738cd3eSNetanel Belgazal 
2431738cd3eSNetanel Belgazal 	struct ena_com_stats_admin stats;
2441738cd3eSNetanel Belgazal };
2451738cd3eSNetanel Belgazal 
2461738cd3eSNetanel Belgazal struct ena_aenq_handlers;
2471738cd3eSNetanel Belgazal 
2481738cd3eSNetanel Belgazal struct ena_com_aenq {
2491738cd3eSNetanel Belgazal 	u16 head;
2501738cd3eSNetanel Belgazal 	u8 phase;
2511738cd3eSNetanel Belgazal 	struct ena_admin_aenq_entry *entries;
2521738cd3eSNetanel Belgazal 	dma_addr_t dma_addr;
2531738cd3eSNetanel Belgazal 	u16 q_depth;
2541738cd3eSNetanel Belgazal 	struct ena_aenq_handlers *aenq_handlers;
2551738cd3eSNetanel Belgazal };
2561738cd3eSNetanel Belgazal 
2571738cd3eSNetanel Belgazal struct ena_com_mmio_read {
2581738cd3eSNetanel Belgazal 	struct ena_admin_ena_mmio_req_read_less_resp *read_resp;
2591738cd3eSNetanel Belgazal 	dma_addr_t read_resp_dma_addr;
26082ef30f1SNetanel Belgazal 	u32 reg_read_to; /* in us */
2611738cd3eSNetanel Belgazal 	u16 seq_num;
2621738cd3eSNetanel Belgazal 	bool readless_supported;
2631738cd3eSNetanel Belgazal 	/* spin lock to ensure a single outstanding read */
2641738cd3eSNetanel Belgazal 	spinlock_t lock;
2651738cd3eSNetanel Belgazal };
2661738cd3eSNetanel Belgazal 
2671738cd3eSNetanel Belgazal struct ena_rss {
2681738cd3eSNetanel Belgazal 	/* Indirect table */
2691738cd3eSNetanel Belgazal 	u16 *host_rss_ind_tbl;
2701738cd3eSNetanel Belgazal 	struct ena_admin_rss_ind_table_entry *rss_ind_tbl;
2711738cd3eSNetanel Belgazal 	dma_addr_t rss_ind_tbl_dma_addr;
2721738cd3eSNetanel Belgazal 	u16 tbl_log_size;
2731738cd3eSNetanel Belgazal 
2741738cd3eSNetanel Belgazal 	/* Hash key */
2751738cd3eSNetanel Belgazal 	enum ena_admin_hash_functions hash_func;
2761738cd3eSNetanel Belgazal 	struct ena_admin_feature_rss_flow_hash_control *hash_key;
2771738cd3eSNetanel Belgazal 	dma_addr_t hash_key_dma_addr;
2781738cd3eSNetanel Belgazal 	u32 hash_init_val;
2791738cd3eSNetanel Belgazal 
2801738cd3eSNetanel Belgazal 	/* Flow Control */
2811738cd3eSNetanel Belgazal 	struct ena_admin_feature_rss_hash_control *hash_ctrl;
2821738cd3eSNetanel Belgazal 	dma_addr_t hash_ctrl_dma_addr;
2831738cd3eSNetanel Belgazal 
2841738cd3eSNetanel Belgazal };
2851738cd3eSNetanel Belgazal 
2861738cd3eSNetanel Belgazal struct ena_host_attribute {
2871738cd3eSNetanel Belgazal 	/* Debug area */
2881738cd3eSNetanel Belgazal 	u8 *debug_area_virt_addr;
2891738cd3eSNetanel Belgazal 	dma_addr_t debug_area_dma_addr;
2901738cd3eSNetanel Belgazal 	u32 debug_area_size;
2911738cd3eSNetanel Belgazal 
2921738cd3eSNetanel Belgazal 	/* Host information */
2931738cd3eSNetanel Belgazal 	struct ena_admin_host_info *host_info;
2941738cd3eSNetanel Belgazal 	dma_addr_t host_info_dma_addr;
2951738cd3eSNetanel Belgazal };
2961738cd3eSNetanel Belgazal 
2971738cd3eSNetanel Belgazal /* Each ena_dev is a PCI function. */
2981738cd3eSNetanel Belgazal struct ena_com_dev {
2991738cd3eSNetanel Belgazal 	struct ena_com_admin_queue admin_queue;
3001738cd3eSNetanel Belgazal 	struct ena_com_aenq aenq;
3011738cd3eSNetanel Belgazal 	struct ena_com_io_cq io_cq_queues[ENA_TOTAL_NUM_QUEUES];
3021738cd3eSNetanel Belgazal 	struct ena_com_io_sq io_sq_queues[ENA_TOTAL_NUM_QUEUES];
3031738cd3eSNetanel Belgazal 	u8 __iomem *reg_bar;
3041738cd3eSNetanel Belgazal 	void __iomem *mem_bar;
3051738cd3eSNetanel Belgazal 	void *dmadev;
306da580ca8SShay Agroskin 	struct net_device *net_device;
3071738cd3eSNetanel Belgazal 
3081738cd3eSNetanel Belgazal 	enum ena_admin_placement_policy_type tx_mem_queue_type;
3091738cd3eSNetanel Belgazal 	u32 tx_max_header_size;
3101738cd3eSNetanel Belgazal 	u16 stats_func; /* Selected function for extended statistic dump */
3111738cd3eSNetanel Belgazal 	u16 stats_queue; /* Selected queue for extended statistic dump */
3121738cd3eSNetanel Belgazal 
3131738cd3eSNetanel Belgazal 	struct ena_com_mmio_read mmio_read;
3141738cd3eSNetanel Belgazal 
3151738cd3eSNetanel Belgazal 	struct ena_rss rss;
3161738cd3eSNetanel Belgazal 	u32 supported_features;
317*a2d5d6a7SArthur Kiyanovski 	u32 capabilities;
3181738cd3eSNetanel Belgazal 	u32 dma_addr_bits;
3191738cd3eSNetanel Belgazal 
3201738cd3eSNetanel Belgazal 	struct ena_host_attribute host_attr;
3211738cd3eSNetanel Belgazal 	bool adaptive_coalescing;
3221738cd3eSNetanel Belgazal 	u16 intr_delay_resolution;
32315619e72SArthur Kiyanovski 
32415619e72SArthur Kiyanovski 	/* interrupt moderation intervals are in usec divided by
32515619e72SArthur Kiyanovski 	 * intr_delay_resolution, which is supplied by the device.
32615619e72SArthur Kiyanovski 	 */
3271738cd3eSNetanel Belgazal 	u32 intr_moder_tx_interval;
32815619e72SArthur Kiyanovski 	u32 intr_moder_rx_interval;
32915619e72SArthur Kiyanovski 
3301738cd3eSNetanel Belgazal 	struct ena_intr_moder_entry *intr_moder_tbl;
331a7982b8eSArthur Kiyanovski 
332a7982b8eSArthur Kiyanovski 	struct ena_com_llq_info llq_info;
3334bb7f4cfSArthur Kiyanovski 
3344bb7f4cfSArthur Kiyanovski 	u32 ena_min_poll_delay_us;
3351738cd3eSNetanel Belgazal };
3361738cd3eSNetanel Belgazal 
3371738cd3eSNetanel Belgazal struct ena_com_dev_get_features_ctx {
3381738cd3eSNetanel Belgazal 	struct ena_admin_queue_feature_desc max_queues;
339ba8ef506SArthur Kiyanovski 	struct ena_admin_queue_ext_feature_desc max_queue_ext;
3401738cd3eSNetanel Belgazal 	struct ena_admin_device_attr_feature_desc dev_attr;
3411738cd3eSNetanel Belgazal 	struct ena_admin_feature_aenq_desc aenq;
3421738cd3eSNetanel Belgazal 	struct ena_admin_feature_offload_desc offload;
34382ef30f1SNetanel Belgazal 	struct ena_admin_ena_hw_hints hw_hints;
344a7982b8eSArthur Kiyanovski 	struct ena_admin_feature_llq_desc llq;
3451738cd3eSNetanel Belgazal };
3461738cd3eSNetanel Belgazal 
3471738cd3eSNetanel Belgazal struct ena_com_create_io_ctx {
3481738cd3eSNetanel Belgazal 	enum ena_admin_placement_policy_type mem_queue_type;
3491738cd3eSNetanel Belgazal 	enum queue_direction direction;
3501738cd3eSNetanel Belgazal 	int numa_node;
3511738cd3eSNetanel Belgazal 	u32 msix_vector;
3521738cd3eSNetanel Belgazal 	u16 queue_size;
3531738cd3eSNetanel Belgazal 	u16 qid;
3541738cd3eSNetanel Belgazal };
3551738cd3eSNetanel Belgazal 
3561738cd3eSNetanel Belgazal typedef void (*ena_aenq_handler)(void *data,
3571738cd3eSNetanel Belgazal 	struct ena_admin_aenq_entry *aenq_e);
3581738cd3eSNetanel Belgazal 
3591738cd3eSNetanel Belgazal /* Holds aenq handlers. Indexed by AENQ event group */
3601738cd3eSNetanel Belgazal struct ena_aenq_handlers {
3611738cd3eSNetanel Belgazal 	ena_aenq_handler handlers[ENA_MAX_HANDLERS];
3621738cd3eSNetanel Belgazal 	ena_aenq_handler unimplemented_handler;
3631738cd3eSNetanel Belgazal };
3641738cd3eSNetanel Belgazal 
3651738cd3eSNetanel Belgazal /*****************************************************************************/
3661738cd3eSNetanel Belgazal /*****************************************************************************/
3671738cd3eSNetanel Belgazal 
3681738cd3eSNetanel Belgazal /* ena_com_mmio_reg_read_request_init - Init the mmio reg read mechanism
3691738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
3701738cd3eSNetanel Belgazal  *
3711738cd3eSNetanel Belgazal  * Initialize the register read mechanism.
3721738cd3eSNetanel Belgazal  *
3731738cd3eSNetanel Belgazal  * @note: This method must be the first stage in the initialization sequence.
3741738cd3eSNetanel Belgazal  *
3751738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
3761738cd3eSNetanel Belgazal  */
3771738cd3eSNetanel Belgazal int ena_com_mmio_reg_read_request_init(struct ena_com_dev *ena_dev);
3781738cd3eSNetanel Belgazal 
37913830937SArthur Kiyanovski /* ena_com_set_mmio_read_mode - Enable/disable the indirect mmio reg read mechanism
3801738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
3811738cd3eSNetanel Belgazal  * @readless_supported: readless mode (enable/disable)
3821738cd3eSNetanel Belgazal  */
3831738cd3eSNetanel Belgazal void ena_com_set_mmio_read_mode(struct ena_com_dev *ena_dev,
3841738cd3eSNetanel Belgazal 				bool readless_supported);
3851738cd3eSNetanel Belgazal 
3861738cd3eSNetanel Belgazal /* ena_com_mmio_reg_read_request_write_dev_addr - Write the mmio reg read return
3871738cd3eSNetanel Belgazal  * value physical address.
3881738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
3891738cd3eSNetanel Belgazal  */
3901738cd3eSNetanel Belgazal void ena_com_mmio_reg_read_request_write_dev_addr(struct ena_com_dev *ena_dev);
3911738cd3eSNetanel Belgazal 
3921738cd3eSNetanel Belgazal /* ena_com_mmio_reg_read_request_destroy - Destroy the mmio reg read mechanism
3931738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
3941738cd3eSNetanel Belgazal  */
3951738cd3eSNetanel Belgazal void ena_com_mmio_reg_read_request_destroy(struct ena_com_dev *ena_dev);
3961738cd3eSNetanel Belgazal 
3971738cd3eSNetanel Belgazal /* ena_com_admin_init - Init the admin and the async queues
3981738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
3991738cd3eSNetanel Belgazal  * @aenq_handlers: Those handlers to be called upon event.
4001738cd3eSNetanel Belgazal  *
4011738cd3eSNetanel Belgazal  * Initialize the admin submission and completion queues.
4021738cd3eSNetanel Belgazal  * Initialize the asynchronous events notification queues.
4031738cd3eSNetanel Belgazal  *
4041738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
4051738cd3eSNetanel Belgazal  */
4061738cd3eSNetanel Belgazal int ena_com_admin_init(struct ena_com_dev *ena_dev,
407f1e90f6eSArthur Kiyanovski 		       struct ena_aenq_handlers *aenq_handlers);
4081738cd3eSNetanel Belgazal 
4091738cd3eSNetanel Belgazal /* ena_com_admin_destroy - Destroy the admin and the async events queues.
4101738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4111738cd3eSNetanel Belgazal  *
4121738cd3eSNetanel Belgazal  * @note: Before calling this method, the caller must validate that the device
4131738cd3eSNetanel Belgazal  * won't send any additional admin completions/aenq.
4141738cd3eSNetanel Belgazal  * To achieve that, a FLR is recommended.
4151738cd3eSNetanel Belgazal  */
4161738cd3eSNetanel Belgazal void ena_com_admin_destroy(struct ena_com_dev *ena_dev);
4171738cd3eSNetanel Belgazal 
4181738cd3eSNetanel Belgazal /* ena_com_dev_reset - Perform device FLR to the device.
4191738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
420e2eed0e3SNetanel Belgazal  * @reset_reason: Specify what is the trigger for the reset in case of an error.
4211738cd3eSNetanel Belgazal  *
4221738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
4231738cd3eSNetanel Belgazal  */
424e2eed0e3SNetanel Belgazal int ena_com_dev_reset(struct ena_com_dev *ena_dev,
425e2eed0e3SNetanel Belgazal 		      enum ena_regs_reset_reason_types reset_reason);
4261738cd3eSNetanel Belgazal 
4271738cd3eSNetanel Belgazal /* ena_com_create_io_queue - Create io queue.
4281738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4291738cd3eSNetanel Belgazal  * @ctx - create context structure
4301738cd3eSNetanel Belgazal  *
4311738cd3eSNetanel Belgazal  * Create the submission and the completion queues.
4321738cd3eSNetanel Belgazal  *
4331738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
4341738cd3eSNetanel Belgazal  */
4351738cd3eSNetanel Belgazal int ena_com_create_io_queue(struct ena_com_dev *ena_dev,
4361738cd3eSNetanel Belgazal 			    struct ena_com_create_io_ctx *ctx);
4371738cd3eSNetanel Belgazal 
4381738cd3eSNetanel Belgazal /* ena_com_destroy_io_queue - Destroy IO queue with the queue id - qid.
4391738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4401738cd3eSNetanel Belgazal  * @qid - the caller virtual queue id.
4411738cd3eSNetanel Belgazal  */
4421738cd3eSNetanel Belgazal void ena_com_destroy_io_queue(struct ena_com_dev *ena_dev, u16 qid);
4431738cd3eSNetanel Belgazal 
4441738cd3eSNetanel Belgazal /* ena_com_get_io_handlers - Return the io queue handlers
4451738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4461738cd3eSNetanel Belgazal  * @qid - the caller virtual queue id.
4471738cd3eSNetanel Belgazal  * @io_sq - IO submission queue handler
4481738cd3eSNetanel Belgazal  * @io_cq - IO completion queue handler.
4491738cd3eSNetanel Belgazal  *
4501738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
4511738cd3eSNetanel Belgazal  */
4521738cd3eSNetanel Belgazal int ena_com_get_io_handlers(struct ena_com_dev *ena_dev, u16 qid,
4531738cd3eSNetanel Belgazal 			    struct ena_com_io_sq **io_sq,
4541738cd3eSNetanel Belgazal 			    struct ena_com_io_cq **io_cq);
4551738cd3eSNetanel Belgazal 
4561738cd3eSNetanel Belgazal /* ena_com_admin_aenq_enable - ENAble asynchronous event notifications
4571738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4581738cd3eSNetanel Belgazal  *
4591738cd3eSNetanel Belgazal  * After this method, aenq event can be received via AENQ.
4601738cd3eSNetanel Belgazal  */
4611738cd3eSNetanel Belgazal void ena_com_admin_aenq_enable(struct ena_com_dev *ena_dev);
4621738cd3eSNetanel Belgazal 
4631738cd3eSNetanel Belgazal /* ena_com_set_admin_running_state - Set the state of the admin queue
4641738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4651738cd3eSNetanel Belgazal  *
4661738cd3eSNetanel Belgazal  * Change the state of the admin queue (enable/disable)
4671738cd3eSNetanel Belgazal  */
4681738cd3eSNetanel Belgazal void ena_com_set_admin_running_state(struct ena_com_dev *ena_dev, bool state);
4691738cd3eSNetanel Belgazal 
4701738cd3eSNetanel Belgazal /* ena_com_get_admin_running_state - Get the admin queue state
4711738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4721738cd3eSNetanel Belgazal  *
4731738cd3eSNetanel Belgazal  * Retrieve the state of the admin queue (enable/disable)
4741738cd3eSNetanel Belgazal  *
4751738cd3eSNetanel Belgazal  * @return - current polling mode (enable/disable)
4761738cd3eSNetanel Belgazal  */
4771738cd3eSNetanel Belgazal bool ena_com_get_admin_running_state(struct ena_com_dev *ena_dev);
4781738cd3eSNetanel Belgazal 
4791738cd3eSNetanel Belgazal /* ena_com_set_admin_polling_mode - Set the admin completion queue polling mode
4801738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4811738cd3eSNetanel Belgazal  * @polling: ENAble/Disable polling mode
4821738cd3eSNetanel Belgazal  *
4831738cd3eSNetanel Belgazal  * Set the admin completion mode.
4841738cd3eSNetanel Belgazal  */
4851738cd3eSNetanel Belgazal void ena_com_set_admin_polling_mode(struct ena_com_dev *ena_dev, bool polling);
4861738cd3eSNetanel Belgazal 
487a4e262cdSSameeh Jubran /* ena_com_set_admin_auto_polling_mode - Enable autoswitch to polling mode
488a4e262cdSSameeh Jubran  * @ena_dev: ENA communication layer struct
489a4e262cdSSameeh Jubran  * @polling: Enable/Disable polling mode
490a4e262cdSSameeh Jubran  *
491a4e262cdSSameeh Jubran  * Set the autopolling mode.
492a4e262cdSSameeh Jubran  * If autopolling is on:
493a4e262cdSSameeh Jubran  * In case of missing interrupt when data is available switch to polling.
494a4e262cdSSameeh Jubran  */
495a4e262cdSSameeh Jubran void ena_com_set_admin_auto_polling_mode(struct ena_com_dev *ena_dev,
496a4e262cdSSameeh Jubran 					 bool polling);
497a4e262cdSSameeh Jubran 
4981738cd3eSNetanel Belgazal /* ena_com_admin_q_comp_intr_handler - admin queue interrupt handler
4991738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5001738cd3eSNetanel Belgazal  *
50113830937SArthur Kiyanovski  * This method goes over the admin completion queue and wakes up all the pending
5021738cd3eSNetanel Belgazal  * threads that wait on the commands wait event.
5031738cd3eSNetanel Belgazal  *
5041738cd3eSNetanel Belgazal  * @note: Should be called after MSI-X interrupt.
5051738cd3eSNetanel Belgazal  */
5061738cd3eSNetanel Belgazal void ena_com_admin_q_comp_intr_handler(struct ena_com_dev *ena_dev);
5071738cd3eSNetanel Belgazal 
5081738cd3eSNetanel Belgazal /* ena_com_aenq_intr_handler - AENQ interrupt handler
5091738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5101738cd3eSNetanel Belgazal  *
51113830937SArthur Kiyanovski  * This method goes over the async event notification queue and calls the proper
5121738cd3eSNetanel Belgazal  * aenq handler.
5131738cd3eSNetanel Belgazal  */
514bf2746e8SShay Agroskin void ena_com_aenq_intr_handler(struct ena_com_dev *ena_dev, void *data);
5151738cd3eSNetanel Belgazal 
5161738cd3eSNetanel Belgazal /* ena_com_abort_admin_commands - Abort all the outstanding admin commands.
5171738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5181738cd3eSNetanel Belgazal  *
5191738cd3eSNetanel Belgazal  * This method aborts all the outstanding admin commands.
5201738cd3eSNetanel Belgazal  * The caller should then call ena_com_wait_for_abort_completion to make sure
5211738cd3eSNetanel Belgazal  * all the commands were completed.
5221738cd3eSNetanel Belgazal  */
5231738cd3eSNetanel Belgazal void ena_com_abort_admin_commands(struct ena_com_dev *ena_dev);
5241738cd3eSNetanel Belgazal 
5251738cd3eSNetanel Belgazal /* ena_com_wait_for_abort_completion - Wait for admin commands abort.
5261738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5271738cd3eSNetanel Belgazal  *
52813830937SArthur Kiyanovski  * This method waits until all the outstanding admin commands are completed.
5291738cd3eSNetanel Belgazal  */
5301738cd3eSNetanel Belgazal void ena_com_wait_for_abort_completion(struct ena_com_dev *ena_dev);
5311738cd3eSNetanel Belgazal 
5321738cd3eSNetanel Belgazal /* ena_com_validate_version - Validate the device parameters
5331738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5341738cd3eSNetanel Belgazal  *
53513830937SArthur Kiyanovski  * This method verifies the device parameters are the same as the saved
5361738cd3eSNetanel Belgazal  * parameters in ena_dev.
5371738cd3eSNetanel Belgazal  * This method is useful after device reset, to validate the device mac address
5381738cd3eSNetanel Belgazal  * and the device offloads are the same as before the reset.
5391738cd3eSNetanel Belgazal  *
5401738cd3eSNetanel Belgazal  * @return - 0 on success negative value otherwise.
5411738cd3eSNetanel Belgazal  */
5421738cd3eSNetanel Belgazal int ena_com_validate_version(struct ena_com_dev *ena_dev);
5431738cd3eSNetanel Belgazal 
5441738cd3eSNetanel Belgazal /* ena_com_get_link_params - Retrieve physical link parameters.
5451738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5461738cd3eSNetanel Belgazal  * @resp: Link parameters
5471738cd3eSNetanel Belgazal  *
5481738cd3eSNetanel Belgazal  * Retrieve the physical link parameters,
5491738cd3eSNetanel Belgazal  * like speed, auto-negotiation and full duplex support.
5501738cd3eSNetanel Belgazal  *
5511738cd3eSNetanel Belgazal  * @return - 0 on Success negative value otherwise.
5521738cd3eSNetanel Belgazal  */
5531738cd3eSNetanel Belgazal int ena_com_get_link_params(struct ena_com_dev *ena_dev,
5541738cd3eSNetanel Belgazal 			    struct ena_admin_get_feat_resp *resp);
5551738cd3eSNetanel Belgazal 
5561738cd3eSNetanel Belgazal /* ena_com_get_dma_width - Retrieve physical dma address width the device
5571738cd3eSNetanel Belgazal  * supports.
5581738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5591738cd3eSNetanel Belgazal  *
5601738cd3eSNetanel Belgazal  * Retrieve the maximum physical address bits the device can handle.
5611738cd3eSNetanel Belgazal  *
5621738cd3eSNetanel Belgazal  * @return: > 0 on Success and negative value otherwise.
5631738cd3eSNetanel Belgazal  */
5641738cd3eSNetanel Belgazal int ena_com_get_dma_width(struct ena_com_dev *ena_dev);
5651738cd3eSNetanel Belgazal 
5661738cd3eSNetanel Belgazal /* ena_com_set_aenq_config - Set aenq groups configurations
5671738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5681738cd3eSNetanel Belgazal  * @groups flag: bit fields flags of enum ena_admin_aenq_group.
5691738cd3eSNetanel Belgazal  *
5701738cd3eSNetanel Belgazal  * Configure which aenq event group the driver would like to receive.
5711738cd3eSNetanel Belgazal  *
5721738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
5731738cd3eSNetanel Belgazal  */
5741738cd3eSNetanel Belgazal int ena_com_set_aenq_config(struct ena_com_dev *ena_dev, u32 groups_flag);
5751738cd3eSNetanel Belgazal 
5761738cd3eSNetanel Belgazal /* ena_com_get_dev_attr_feat - Get device features
5771738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5781738cd3eSNetanel Belgazal  * @get_feat_ctx: returned context that contain the get features.
5791738cd3eSNetanel Belgazal  *
5801738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
5811738cd3eSNetanel Belgazal  */
5821738cd3eSNetanel Belgazal int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
5831738cd3eSNetanel Belgazal 			      struct ena_com_dev_get_features_ctx *get_feat_ctx);
5841738cd3eSNetanel Belgazal 
5851738cd3eSNetanel Belgazal /* ena_com_get_dev_basic_stats - Get device basic statistics
5861738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5871738cd3eSNetanel Belgazal  * @stats: stats return value
5881738cd3eSNetanel Belgazal  *
5891738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
5901738cd3eSNetanel Belgazal  */
5911738cd3eSNetanel Belgazal int ena_com_get_dev_basic_stats(struct ena_com_dev *ena_dev,
5921738cd3eSNetanel Belgazal 				struct ena_admin_basic_stats *stats);
5931738cd3eSNetanel Belgazal 
594713865daSSameeh Jubran /* ena_com_get_eni_stats - Get extended network interface statistics
595713865daSSameeh Jubran  * @ena_dev: ENA communication layer struct
596713865daSSameeh Jubran  * @stats: stats return value
597713865daSSameeh Jubran  *
598713865daSSameeh Jubran  * @return: 0 on Success and negative value otherwise.
599713865daSSameeh Jubran  */
600713865daSSameeh Jubran int ena_com_get_eni_stats(struct ena_com_dev *ena_dev,
601713865daSSameeh Jubran 			  struct ena_admin_eni_stats *stats);
602713865daSSameeh Jubran 
6031738cd3eSNetanel Belgazal /* ena_com_set_dev_mtu - Configure the device mtu.
6041738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6051738cd3eSNetanel Belgazal  * @mtu: mtu value
6061738cd3eSNetanel Belgazal  *
6071738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6081738cd3eSNetanel Belgazal  */
609e9548fdfSShay Agroskin int ena_com_set_dev_mtu(struct ena_com_dev *ena_dev, u32 mtu);
6101738cd3eSNetanel Belgazal 
6111738cd3eSNetanel Belgazal /* ena_com_get_offload_settings - Retrieve the device offloads capabilities
6121738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6131738cd3eSNetanel Belgazal  * @offlad: offload return value
6141738cd3eSNetanel Belgazal  *
6151738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6161738cd3eSNetanel Belgazal  */
6171738cd3eSNetanel Belgazal int ena_com_get_offload_settings(struct ena_com_dev *ena_dev,
6181738cd3eSNetanel Belgazal 				 struct ena_admin_feature_offload_desc *offload);
6191738cd3eSNetanel Belgazal 
6201738cd3eSNetanel Belgazal /* ena_com_rss_init - Init RSS
6211738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6221738cd3eSNetanel Belgazal  * @log_size: indirection log size
6231738cd3eSNetanel Belgazal  *
6241738cd3eSNetanel Belgazal  * Allocate RSS/RFS resources.
6251738cd3eSNetanel Belgazal  * The caller then can configure rss using ena_com_set_hash_function,
6261738cd3eSNetanel Belgazal  * ena_com_set_hash_ctrl and ena_com_indirect_table_set.
6271738cd3eSNetanel Belgazal  *
6281738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6291738cd3eSNetanel Belgazal  */
6301738cd3eSNetanel Belgazal int ena_com_rss_init(struct ena_com_dev *ena_dev, u16 log_size);
6311738cd3eSNetanel Belgazal 
6321738cd3eSNetanel Belgazal /* ena_com_rss_destroy - Destroy rss
6331738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6341738cd3eSNetanel Belgazal  *
6351738cd3eSNetanel Belgazal  * Free all the RSS/RFS resources.
6361738cd3eSNetanel Belgazal  */
6371738cd3eSNetanel Belgazal void ena_com_rss_destroy(struct ena_com_dev *ena_dev);
6381738cd3eSNetanel Belgazal 
639470793a7SArthur Kiyanovski /* ena_com_get_current_hash_function - Get RSS hash function
640470793a7SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
641470793a7SArthur Kiyanovski  *
642470793a7SArthur Kiyanovski  * Return the current hash function.
643470793a7SArthur Kiyanovski  * @return: 0 or one of the ena_admin_hash_functions values.
644470793a7SArthur Kiyanovski  */
645470793a7SArthur Kiyanovski int ena_com_get_current_hash_function(struct ena_com_dev *ena_dev);
646470793a7SArthur Kiyanovski 
6471738cd3eSNetanel Belgazal /* ena_com_fill_hash_function - Fill RSS hash function
6481738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6491738cd3eSNetanel Belgazal  * @func: The hash function (Toeplitz or crc)
6501738cd3eSNetanel Belgazal  * @key: Hash key (for toeplitz hash)
6511738cd3eSNetanel Belgazal  * @key_len: key length (max length 10 DW)
6521738cd3eSNetanel Belgazal  * @init_val: initial value for the hash function
6531738cd3eSNetanel Belgazal  *
6541738cd3eSNetanel Belgazal  * Fill the ena_dev resources with the desire hash function, hash key, key_len
6551738cd3eSNetanel Belgazal  * and key initial value (if needed by the hash function).
6561738cd3eSNetanel Belgazal  * To flush the key into the device the caller should call
6571738cd3eSNetanel Belgazal  * ena_com_set_hash_function.
6581738cd3eSNetanel Belgazal  *
6591738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6601738cd3eSNetanel Belgazal  */
6611738cd3eSNetanel Belgazal int ena_com_fill_hash_function(struct ena_com_dev *ena_dev,
6621738cd3eSNetanel Belgazal 			       enum ena_admin_hash_functions func,
6631738cd3eSNetanel Belgazal 			       const u8 *key, u16 key_len, u32 init_val);
6641738cd3eSNetanel Belgazal 
6651738cd3eSNetanel Belgazal /* ena_com_set_hash_function - Flush the hash function and it dependencies to
6661738cd3eSNetanel Belgazal  * the device.
6671738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6681738cd3eSNetanel Belgazal  *
6691738cd3eSNetanel Belgazal  * Flush the hash function and it dependencies (key, key length and
6701738cd3eSNetanel Belgazal  * initial value) if needed.
6711738cd3eSNetanel Belgazal  *
6721738cd3eSNetanel Belgazal  * @note: Prior to this method the caller should call ena_com_fill_hash_function
6731738cd3eSNetanel Belgazal  *
6741738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6751738cd3eSNetanel Belgazal  */
6761738cd3eSNetanel Belgazal int ena_com_set_hash_function(struct ena_com_dev *ena_dev);
6771738cd3eSNetanel Belgazal 
678f66c2ea3SSameeh Jubran /* ena_com_get_hash_function - Retrieve the hash function from the device.
6791738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6801738cd3eSNetanel Belgazal  * @func: hash function
6811738cd3eSNetanel Belgazal  *
682f66c2ea3SSameeh Jubran  * Retrieve the hash function from the device.
6831738cd3eSNetanel Belgazal  *
68413830937SArthur Kiyanovski  * @note: If the caller called ena_com_fill_hash_function but didn't flush
6851738cd3eSNetanel Belgazal  * it to the device, the new configuration will be lost.
6861738cd3eSNetanel Belgazal  *
6871738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6881738cd3eSNetanel Belgazal  */
6891738cd3eSNetanel Belgazal int ena_com_get_hash_function(struct ena_com_dev *ena_dev,
690f66c2ea3SSameeh Jubran 			      enum ena_admin_hash_functions *func);
6911738cd3eSNetanel Belgazal 
692f66c2ea3SSameeh Jubran /* ena_com_get_hash_key - Retrieve the hash key
693f66c2ea3SSameeh Jubran  * @ena_dev: ENA communication layer struct
694f66c2ea3SSameeh Jubran  * @key: hash key
695f66c2ea3SSameeh Jubran  *
696f66c2ea3SSameeh Jubran  * Retrieve the hash key.
697f66c2ea3SSameeh Jubran  *
69813830937SArthur Kiyanovski  * @note: If the caller called ena_com_fill_hash_key but didn't flush
699f66c2ea3SSameeh Jubran  * it to the device, the new configuration will be lost.
700f66c2ea3SSameeh Jubran  *
701f66c2ea3SSameeh Jubran  * @return: 0 on Success and negative value otherwise.
702f66c2ea3SSameeh Jubran  */
703f66c2ea3SSameeh Jubran int ena_com_get_hash_key(struct ena_com_dev *ena_dev, u8 *key);
7041738cd3eSNetanel Belgazal /* ena_com_fill_hash_ctrl - Fill RSS hash control
7051738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct.
7061738cd3eSNetanel Belgazal  * @proto: The protocol to configure.
7071738cd3eSNetanel Belgazal  * @hash_fields: bit mask of ena_admin_flow_hash_fields
7081738cd3eSNetanel Belgazal  *
7091738cd3eSNetanel Belgazal  * Fill the ena_dev resources with the desire hash control (the ethernet
7101738cd3eSNetanel Belgazal  * fields that take part of the hash) for a specific protocol.
7111738cd3eSNetanel Belgazal  * To flush the hash control to the device, the caller should call
7121738cd3eSNetanel Belgazal  * ena_com_set_hash_ctrl.
7131738cd3eSNetanel Belgazal  *
7141738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7151738cd3eSNetanel Belgazal  */
7161738cd3eSNetanel Belgazal int ena_com_fill_hash_ctrl(struct ena_com_dev *ena_dev,
7171738cd3eSNetanel Belgazal 			   enum ena_admin_flow_hash_proto proto,
7181738cd3eSNetanel Belgazal 			   u16 hash_fields);
7191738cd3eSNetanel Belgazal 
7201738cd3eSNetanel Belgazal /* ena_com_set_hash_ctrl - Flush the hash control resources to the device.
7211738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
7221738cd3eSNetanel Belgazal  *
7231738cd3eSNetanel Belgazal  * Flush the hash control (the ethernet fields that take part of the hash)
7241738cd3eSNetanel Belgazal  *
7251738cd3eSNetanel Belgazal  * @note: Prior to this method the caller should call ena_com_fill_hash_ctrl.
7261738cd3eSNetanel Belgazal  *
7271738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7281738cd3eSNetanel Belgazal  */
7291738cd3eSNetanel Belgazal int ena_com_set_hash_ctrl(struct ena_com_dev *ena_dev);
7301738cd3eSNetanel Belgazal 
7311738cd3eSNetanel Belgazal /* ena_com_get_hash_ctrl - Retrieve the hash control from the device.
7321738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
7331738cd3eSNetanel Belgazal  * @proto: The protocol to retrieve.
7341738cd3eSNetanel Belgazal  * @fields: bit mask of ena_admin_flow_hash_fields.
7351738cd3eSNetanel Belgazal  *
7361738cd3eSNetanel Belgazal  * Retrieve the hash control from the device.
7371738cd3eSNetanel Belgazal  *
73813830937SArthur Kiyanovski  * @note: If the caller called ena_com_fill_hash_ctrl but didn't flush
7391738cd3eSNetanel Belgazal  * it to the device, the new configuration will be lost.
7401738cd3eSNetanel Belgazal  *
7411738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7421738cd3eSNetanel Belgazal  */
7431738cd3eSNetanel Belgazal int ena_com_get_hash_ctrl(struct ena_com_dev *ena_dev,
7441738cd3eSNetanel Belgazal 			  enum ena_admin_flow_hash_proto proto,
7451738cd3eSNetanel Belgazal 			  u16 *fields);
7461738cd3eSNetanel Belgazal 
7471738cd3eSNetanel Belgazal /* ena_com_set_default_hash_ctrl - Set the hash control to a default
7481738cd3eSNetanel Belgazal  * configuration.
7491738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
7501738cd3eSNetanel Belgazal  *
7511738cd3eSNetanel Belgazal  * Fill the ena_dev resources with the default hash control configuration.
7521738cd3eSNetanel Belgazal  * To flush the hash control to the device, the caller should call
7531738cd3eSNetanel Belgazal  * ena_com_set_hash_ctrl.
7541738cd3eSNetanel Belgazal  *
7551738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7561738cd3eSNetanel Belgazal  */
7571738cd3eSNetanel Belgazal int ena_com_set_default_hash_ctrl(struct ena_com_dev *ena_dev);
7581738cd3eSNetanel Belgazal 
7591738cd3eSNetanel Belgazal /* ena_com_indirect_table_fill_entry - Fill a single entry in the RSS
7601738cd3eSNetanel Belgazal  * indirection table
7611738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct.
7621738cd3eSNetanel Belgazal  * @entry_idx - indirection table entry.
7631738cd3eSNetanel Belgazal  * @entry_value - redirection value
7641738cd3eSNetanel Belgazal  *
7651738cd3eSNetanel Belgazal  * Fill a single entry of the RSS indirection table in the ena_dev resources.
7661738cd3eSNetanel Belgazal  * To flush the indirection table to the device, the called should call
7671738cd3eSNetanel Belgazal  * ena_com_indirect_table_set.
7681738cd3eSNetanel Belgazal  *
7691738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7701738cd3eSNetanel Belgazal  */
7711738cd3eSNetanel Belgazal int ena_com_indirect_table_fill_entry(struct ena_com_dev *ena_dev,
7721738cd3eSNetanel Belgazal 				      u16 entry_idx, u16 entry_value);
7731738cd3eSNetanel Belgazal 
7741738cd3eSNetanel Belgazal /* ena_com_indirect_table_set - Flush the indirection table to the device.
7751738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
7761738cd3eSNetanel Belgazal  *
7771738cd3eSNetanel Belgazal  * Flush the indirection hash control to the device.
7781738cd3eSNetanel Belgazal  * Prior to this method the caller should call ena_com_indirect_table_fill_entry
7791738cd3eSNetanel Belgazal  *
7801738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7811738cd3eSNetanel Belgazal  */
7821738cd3eSNetanel Belgazal int ena_com_indirect_table_set(struct ena_com_dev *ena_dev);
7831738cd3eSNetanel Belgazal 
7841738cd3eSNetanel Belgazal /* ena_com_indirect_table_get - Retrieve the indirection table from the device.
7851738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
7861738cd3eSNetanel Belgazal  * @ind_tbl: indirection table
7871738cd3eSNetanel Belgazal  *
7881738cd3eSNetanel Belgazal  * Retrieve the RSS indirection table from the device.
7891738cd3eSNetanel Belgazal  *
79013830937SArthur Kiyanovski  * @note: If the caller called ena_com_indirect_table_fill_entry but didn't flush
7911738cd3eSNetanel Belgazal  * it to the device, the new configuration will be lost.
7921738cd3eSNetanel Belgazal  *
7931738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7941738cd3eSNetanel Belgazal  */
7951738cd3eSNetanel Belgazal int ena_com_indirect_table_get(struct ena_com_dev *ena_dev, u32 *ind_tbl);
7961738cd3eSNetanel Belgazal 
7971738cd3eSNetanel Belgazal /* ena_com_allocate_host_info - Allocate host info resources.
7981738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
7991738cd3eSNetanel Belgazal  *
8001738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
8011738cd3eSNetanel Belgazal  */
8021738cd3eSNetanel Belgazal int ena_com_allocate_host_info(struct ena_com_dev *ena_dev);
8031738cd3eSNetanel Belgazal 
8041738cd3eSNetanel Belgazal /* ena_com_allocate_debug_area - Allocate debug area.
8051738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8061738cd3eSNetanel Belgazal  * @debug_area_size - debug area size.
8071738cd3eSNetanel Belgazal  *
8081738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
8091738cd3eSNetanel Belgazal  */
8101738cd3eSNetanel Belgazal int ena_com_allocate_debug_area(struct ena_com_dev *ena_dev,
8111738cd3eSNetanel Belgazal 				u32 debug_area_size);
8121738cd3eSNetanel Belgazal 
8131738cd3eSNetanel Belgazal /* ena_com_delete_debug_area - Free the debug area resources.
8141738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8151738cd3eSNetanel Belgazal  *
81613830937SArthur Kiyanovski  * Free the allocated debug area.
8171738cd3eSNetanel Belgazal  */
8181738cd3eSNetanel Belgazal void ena_com_delete_debug_area(struct ena_com_dev *ena_dev);
8191738cd3eSNetanel Belgazal 
8201738cd3eSNetanel Belgazal /* ena_com_delete_host_info - Free the host info resources.
8211738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8221738cd3eSNetanel Belgazal  *
82313830937SArthur Kiyanovski  * Free the allocated host info.
8241738cd3eSNetanel Belgazal  */
8251738cd3eSNetanel Belgazal void ena_com_delete_host_info(struct ena_com_dev *ena_dev);
8261738cd3eSNetanel Belgazal 
8271738cd3eSNetanel Belgazal /* ena_com_set_host_attributes - Update the device with the host
8281738cd3eSNetanel Belgazal  * attributes (debug area and host info) base address.
8291738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8301738cd3eSNetanel Belgazal  *
8311738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
8321738cd3eSNetanel Belgazal  */
8331738cd3eSNetanel Belgazal int ena_com_set_host_attributes(struct ena_com_dev *ena_dev);
8341738cd3eSNetanel Belgazal 
8351738cd3eSNetanel Belgazal /* ena_com_create_io_cq - Create io completion queue.
8361738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8371738cd3eSNetanel Belgazal  * @io_cq - io completion queue handler
8381738cd3eSNetanel Belgazal 
8391738cd3eSNetanel Belgazal  * Create IO completion queue.
8401738cd3eSNetanel Belgazal  *
8411738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
8421738cd3eSNetanel Belgazal  */
8431738cd3eSNetanel Belgazal int ena_com_create_io_cq(struct ena_com_dev *ena_dev,
8441738cd3eSNetanel Belgazal 			 struct ena_com_io_cq *io_cq);
8451738cd3eSNetanel Belgazal 
8461738cd3eSNetanel Belgazal /* ena_com_destroy_io_cq - Destroy io completion queue.
8471738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8481738cd3eSNetanel Belgazal  * @io_cq - io completion queue handler
8491738cd3eSNetanel Belgazal 
8501738cd3eSNetanel Belgazal  * Destroy IO completion queue.
8511738cd3eSNetanel Belgazal  *
8521738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
8531738cd3eSNetanel Belgazal  */
8541738cd3eSNetanel Belgazal int ena_com_destroy_io_cq(struct ena_com_dev *ena_dev,
8551738cd3eSNetanel Belgazal 			  struct ena_com_io_cq *io_cq);
8561738cd3eSNetanel Belgazal 
8571738cd3eSNetanel Belgazal /* ena_com_execute_admin_command - Execute admin command
8581738cd3eSNetanel Belgazal  * @admin_queue: admin queue.
8591738cd3eSNetanel Belgazal  * @cmd: the admin command to execute.
8601738cd3eSNetanel Belgazal  * @cmd_size: the command size.
8611738cd3eSNetanel Belgazal  * @cmd_completion: command completion return value.
8621738cd3eSNetanel Belgazal  * @cmd_comp_size: command completion size.
8631738cd3eSNetanel Belgazal 
86413830937SArthur Kiyanovski  * Submit an admin command and then wait until the device returns a
8651738cd3eSNetanel Belgazal  * completion.
86613830937SArthur Kiyanovski  * The completion will be copied into cmd_comp.
8671738cd3eSNetanel Belgazal  *
8681738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
8691738cd3eSNetanel Belgazal  */
8701738cd3eSNetanel Belgazal int ena_com_execute_admin_command(struct ena_com_admin_queue *admin_queue,
8711738cd3eSNetanel Belgazal 				  struct ena_admin_aq_entry *cmd,
8721738cd3eSNetanel Belgazal 				  size_t cmd_size,
8731738cd3eSNetanel Belgazal 				  struct ena_admin_acq_entry *cmd_comp,
8741738cd3eSNetanel Belgazal 				  size_t cmd_comp_size);
8751738cd3eSNetanel Belgazal 
8761738cd3eSNetanel Belgazal /* ena_com_init_interrupt_moderation - Init interrupt moderation
8771738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8781738cd3eSNetanel Belgazal  *
8791738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
8801738cd3eSNetanel Belgazal  */
8811738cd3eSNetanel Belgazal int ena_com_init_interrupt_moderation(struct ena_com_dev *ena_dev);
8821738cd3eSNetanel Belgazal 
8831738cd3eSNetanel Belgazal /* ena_com_interrupt_moderation_supported - Return if interrupt moderation
8841738cd3eSNetanel Belgazal  * capability is supported by the device.
8851738cd3eSNetanel Belgazal  *
8861738cd3eSNetanel Belgazal  * @return - supported or not.
8871738cd3eSNetanel Belgazal  */
8881738cd3eSNetanel Belgazal bool ena_com_interrupt_moderation_supported(struct ena_com_dev *ena_dev);
8891738cd3eSNetanel Belgazal 
8901738cd3eSNetanel Belgazal /* ena_com_update_nonadaptive_moderation_interval_tx - Update the
8911738cd3eSNetanel Belgazal  * non-adaptive interval in Tx direction.
8921738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8931738cd3eSNetanel Belgazal  * @tx_coalesce_usecs: Interval in usec.
8941738cd3eSNetanel Belgazal  *
8951738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
8961738cd3eSNetanel Belgazal  */
8971738cd3eSNetanel Belgazal int ena_com_update_nonadaptive_moderation_interval_tx(struct ena_com_dev *ena_dev,
8981738cd3eSNetanel Belgazal 						      u32 tx_coalesce_usecs);
8991738cd3eSNetanel Belgazal 
9001738cd3eSNetanel Belgazal /* ena_com_update_nonadaptive_moderation_interval_rx - Update the
9011738cd3eSNetanel Belgazal  * non-adaptive interval in Rx direction.
9021738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9031738cd3eSNetanel Belgazal  * @rx_coalesce_usecs: Interval in usec.
9041738cd3eSNetanel Belgazal  *
9051738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
9061738cd3eSNetanel Belgazal  */
9071738cd3eSNetanel Belgazal int ena_com_update_nonadaptive_moderation_interval_rx(struct ena_com_dev *ena_dev,
9081738cd3eSNetanel Belgazal 						      u32 rx_coalesce_usecs);
9091738cd3eSNetanel Belgazal 
9101738cd3eSNetanel Belgazal /* ena_com_get_nonadaptive_moderation_interval_tx - Retrieve the
9111738cd3eSNetanel Belgazal  * non-adaptive interval in Tx direction.
9121738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9131738cd3eSNetanel Belgazal  *
9141738cd3eSNetanel Belgazal  * @return - interval in usec
9151738cd3eSNetanel Belgazal  */
9161738cd3eSNetanel Belgazal unsigned int ena_com_get_nonadaptive_moderation_interval_tx(struct ena_com_dev *ena_dev);
9171738cd3eSNetanel Belgazal 
9181738cd3eSNetanel Belgazal /* ena_com_get_nonadaptive_moderation_interval_rx - Retrieve the
9191738cd3eSNetanel Belgazal  * non-adaptive interval in Rx direction.
9201738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9211738cd3eSNetanel Belgazal  *
9221738cd3eSNetanel Belgazal  * @return - interval in usec
9231738cd3eSNetanel Belgazal  */
9241738cd3eSNetanel Belgazal unsigned int ena_com_get_nonadaptive_moderation_interval_rx(struct ena_com_dev *ena_dev);
9251738cd3eSNetanel Belgazal 
926689b2bdaSArthur Kiyanovski /* ena_com_config_dev_mode - Configure the placement policy of the device.
927689b2bdaSArthur Kiyanovski  * @ena_dev: ENA communication layer struct
928689b2bdaSArthur Kiyanovski  * @llq_features: LLQ feature descriptor, retrieve via
929689b2bdaSArthur Kiyanovski  *		   ena_com_get_dev_attr_feat.
930689b2bdaSArthur Kiyanovski  * @ena_llq_config: The default driver LLQ parameters configurations
931689b2bdaSArthur Kiyanovski  */
932689b2bdaSArthur Kiyanovski int ena_com_config_dev_mode(struct ena_com_dev *ena_dev,
933689b2bdaSArthur Kiyanovski 			    struct ena_admin_feature_llq_desc *llq_features,
934689b2bdaSArthur Kiyanovski 			    struct ena_llq_configurations *llq_default_config);
935689b2bdaSArthur Kiyanovski 
936da580ca8SShay Agroskin /* ena_com_io_sq_to_ena_dev - Extract ena_com_dev using contained field io_sq.
937da580ca8SShay Agroskin  * @io_sq: IO submit queue struct
938da580ca8SShay Agroskin  *
939da580ca8SShay Agroskin  * @return - ena_com_dev struct extracted from io_sq
940da580ca8SShay Agroskin  */
ena_com_io_sq_to_ena_dev(struct ena_com_io_sq * io_sq)941da580ca8SShay Agroskin static inline struct ena_com_dev *ena_com_io_sq_to_ena_dev(struct ena_com_io_sq *io_sq)
942da580ca8SShay Agroskin {
943da580ca8SShay Agroskin 	return container_of(io_sq, struct ena_com_dev, io_sq_queues[io_sq->qid]);
944da580ca8SShay Agroskin }
945da580ca8SShay Agroskin 
946da580ca8SShay Agroskin /* ena_com_io_cq_to_ena_dev - Extract ena_com_dev using contained field io_cq.
947da580ca8SShay Agroskin  * @io_sq: IO submit queue struct
948da580ca8SShay Agroskin  *
949da580ca8SShay Agroskin  * @return - ena_com_dev struct extracted from io_sq
950da580ca8SShay Agroskin  */
ena_com_io_cq_to_ena_dev(struct ena_com_io_cq * io_cq)951da580ca8SShay Agroskin static inline struct ena_com_dev *ena_com_io_cq_to_ena_dev(struct ena_com_io_cq *io_cq)
952da580ca8SShay Agroskin {
953da580ca8SShay Agroskin 	return container_of(io_cq, struct ena_com_dev, io_cq_queues[io_cq->qid]);
954da580ca8SShay Agroskin }
955da580ca8SShay Agroskin 
ena_com_get_adaptive_moderation_enabled(struct ena_com_dev * ena_dev)9561738cd3eSNetanel Belgazal static inline bool ena_com_get_adaptive_moderation_enabled(struct ena_com_dev *ena_dev)
9571738cd3eSNetanel Belgazal {
9581738cd3eSNetanel Belgazal 	return ena_dev->adaptive_coalescing;
9591738cd3eSNetanel Belgazal }
9601738cd3eSNetanel Belgazal 
ena_com_enable_adaptive_moderation(struct ena_com_dev * ena_dev)9611738cd3eSNetanel Belgazal static inline void ena_com_enable_adaptive_moderation(struct ena_com_dev *ena_dev)
9621738cd3eSNetanel Belgazal {
9631738cd3eSNetanel Belgazal 	ena_dev->adaptive_coalescing = true;
9641738cd3eSNetanel Belgazal }
9651738cd3eSNetanel Belgazal 
ena_com_disable_adaptive_moderation(struct ena_com_dev * ena_dev)9661738cd3eSNetanel Belgazal static inline void ena_com_disable_adaptive_moderation(struct ena_com_dev *ena_dev)
9671738cd3eSNetanel Belgazal {
9681738cd3eSNetanel Belgazal 	ena_dev->adaptive_coalescing = false;
9691738cd3eSNetanel Belgazal }
9701738cd3eSNetanel Belgazal 
971*a2d5d6a7SArthur Kiyanovski /* ena_com_get_cap - query whether device supports a capability.
972*a2d5d6a7SArthur Kiyanovski  * @ena_dev: ENA communication layer struct
973*a2d5d6a7SArthur Kiyanovski  * @cap_id: enum value representing the capability
974*a2d5d6a7SArthur Kiyanovski  *
975*a2d5d6a7SArthur Kiyanovski  * @return - true if capability is supported or false otherwise
976*a2d5d6a7SArthur Kiyanovski  */
ena_com_get_cap(struct ena_com_dev * ena_dev,enum ena_admin_aq_caps_id cap_id)977*a2d5d6a7SArthur Kiyanovski static inline bool ena_com_get_cap(struct ena_com_dev *ena_dev,
978*a2d5d6a7SArthur Kiyanovski 				   enum ena_admin_aq_caps_id cap_id)
979*a2d5d6a7SArthur Kiyanovski {
980*a2d5d6a7SArthur Kiyanovski 	return !!(ena_dev->capabilities & BIT(cap_id));
981*a2d5d6a7SArthur Kiyanovski }
982*a2d5d6a7SArthur Kiyanovski 
9831738cd3eSNetanel Belgazal /* ena_com_update_intr_reg - Prepare interrupt register
9841738cd3eSNetanel Belgazal  * @intr_reg: interrupt register to update.
9851738cd3eSNetanel Belgazal  * @rx_delay_interval: Rx interval in usecs
9861738cd3eSNetanel Belgazal  * @tx_delay_interval: Tx interval in usecs
98713830937SArthur Kiyanovski  * @unmask: unmask enable/disable
9881738cd3eSNetanel Belgazal  *
9891738cd3eSNetanel Belgazal  * Prepare interrupt update register with the supplied parameters.
9901738cd3eSNetanel Belgazal  */
ena_com_update_intr_reg(struct ena_eth_io_intr_reg * intr_reg,u32 rx_delay_interval,u32 tx_delay_interval,bool unmask)9911738cd3eSNetanel Belgazal static inline void ena_com_update_intr_reg(struct ena_eth_io_intr_reg *intr_reg,
9921738cd3eSNetanel Belgazal 					   u32 rx_delay_interval,
9931738cd3eSNetanel Belgazal 					   u32 tx_delay_interval,
9941738cd3eSNetanel Belgazal 					   bool unmask)
9951738cd3eSNetanel Belgazal {
9961738cd3eSNetanel Belgazal 	intr_reg->intr_control = 0;
9971738cd3eSNetanel Belgazal 	intr_reg->intr_control |= rx_delay_interval &
9981738cd3eSNetanel Belgazal 		ENA_ETH_IO_INTR_REG_RX_INTR_DELAY_MASK;
9991738cd3eSNetanel Belgazal 
10001738cd3eSNetanel Belgazal 	intr_reg->intr_control |=
10011738cd3eSNetanel Belgazal 		(tx_delay_interval << ENA_ETH_IO_INTR_REG_TX_INTR_DELAY_SHIFT)
10021738cd3eSNetanel Belgazal 		& ENA_ETH_IO_INTR_REG_TX_INTR_DELAY_MASK;
10031738cd3eSNetanel Belgazal 
10041738cd3eSNetanel Belgazal 	if (unmask)
10051738cd3eSNetanel Belgazal 		intr_reg->intr_control |= ENA_ETH_IO_INTR_REG_INTR_UNMASK_MASK;
10061738cd3eSNetanel Belgazal }
10071738cd3eSNetanel Belgazal 
ena_com_get_next_bounce_buffer(struct ena_com_io_bounce_buffer_control * bounce_buf_ctrl)1008689b2bdaSArthur Kiyanovski static inline u8 *ena_com_get_next_bounce_buffer(struct ena_com_io_bounce_buffer_control *bounce_buf_ctrl)
1009689b2bdaSArthur Kiyanovski {
1010689b2bdaSArthur Kiyanovski 	u16 size, buffers_num;
1011689b2bdaSArthur Kiyanovski 	u8 *buf;
1012689b2bdaSArthur Kiyanovski 
1013689b2bdaSArthur Kiyanovski 	size = bounce_buf_ctrl->buffer_size;
1014689b2bdaSArthur Kiyanovski 	buffers_num = bounce_buf_ctrl->buffers_num;
1015689b2bdaSArthur Kiyanovski 
1016689b2bdaSArthur Kiyanovski 	buf = bounce_buf_ctrl->base_buffer +
1017689b2bdaSArthur Kiyanovski 		(bounce_buf_ctrl->next_to_use++ & (buffers_num - 1)) * size;
1018689b2bdaSArthur Kiyanovski 
1019689b2bdaSArthur Kiyanovski 	prefetchw(bounce_buf_ctrl->base_buffer +
1020689b2bdaSArthur Kiyanovski 		(bounce_buf_ctrl->next_to_use & (buffers_num - 1)) * size);
1021689b2bdaSArthur Kiyanovski 
1022689b2bdaSArthur Kiyanovski 	return buf;
1023689b2bdaSArthur Kiyanovski }
1024689b2bdaSArthur Kiyanovski 
10251738cd3eSNetanel Belgazal #endif /* !(ENA_COM) */
1026