11738cd3eSNetanel Belgazal /*
21738cd3eSNetanel Belgazal  * Copyright 2015 Amazon.com, Inc. or its affiliates.
31738cd3eSNetanel Belgazal  *
41738cd3eSNetanel Belgazal  * This software is available to you under a choice of one of two
51738cd3eSNetanel Belgazal  * licenses.  You may choose to be licensed under the terms of the GNU
61738cd3eSNetanel Belgazal  * General Public License (GPL) Version 2, available from the file
71738cd3eSNetanel Belgazal  * COPYING in the main directory of this source tree, or the
81738cd3eSNetanel Belgazal  * BSD license below:
91738cd3eSNetanel Belgazal  *
101738cd3eSNetanel Belgazal  *     Redistribution and use in source and binary forms, with or
111738cd3eSNetanel Belgazal  *     without modification, are permitted provided that the following
121738cd3eSNetanel Belgazal  *     conditions are met:
131738cd3eSNetanel Belgazal  *
141738cd3eSNetanel Belgazal  *      - Redistributions of source code must retain the above
151738cd3eSNetanel Belgazal  *        copyright notice, this list of conditions and the following
161738cd3eSNetanel Belgazal  *        disclaimer.
171738cd3eSNetanel Belgazal  *
181738cd3eSNetanel Belgazal  *      - Redistributions in binary form must reproduce the above
191738cd3eSNetanel Belgazal  *        copyright notice, this list of conditions and the following
201738cd3eSNetanel Belgazal  *        disclaimer in the documentation and/or other materials
211738cd3eSNetanel Belgazal  *        provided with the distribution.
221738cd3eSNetanel Belgazal  *
231738cd3eSNetanel Belgazal  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
241738cd3eSNetanel Belgazal  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
251738cd3eSNetanel Belgazal  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
261738cd3eSNetanel Belgazal  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
271738cd3eSNetanel Belgazal  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
281738cd3eSNetanel Belgazal  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
291738cd3eSNetanel Belgazal  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
301738cd3eSNetanel Belgazal  * SOFTWARE.
311738cd3eSNetanel Belgazal  */
321738cd3eSNetanel Belgazal 
331738cd3eSNetanel Belgazal #ifndef ENA_COM
341738cd3eSNetanel Belgazal #define ENA_COM
351738cd3eSNetanel Belgazal 
36a8496eb8SNetanel Belgazal #include <linux/compiler.h>
371738cd3eSNetanel Belgazal #include <linux/delay.h>
381738cd3eSNetanel Belgazal #include <linux/dma-mapping.h>
391738cd3eSNetanel Belgazal #include <linux/gfp.h>
40689b2bdaSArthur Kiyanovski #include <linux/io.h>
4100f17a82SArthur Kiyanovski #include <linux/prefetch.h>
421738cd3eSNetanel Belgazal #include <linux/sched.h>
431738cd3eSNetanel Belgazal #include <linux/sizes.h>
441738cd3eSNetanel Belgazal #include <linux/spinlock.h>
451738cd3eSNetanel Belgazal #include <linux/types.h>
461738cd3eSNetanel Belgazal #include <linux/wait.h>
471738cd3eSNetanel Belgazal 
481738cd3eSNetanel Belgazal #include "ena_common_defs.h"
491738cd3eSNetanel Belgazal #include "ena_admin_defs.h"
501738cd3eSNetanel Belgazal #include "ena_eth_io_defs.h"
511738cd3eSNetanel Belgazal #include "ena_regs_defs.h"
521738cd3eSNetanel Belgazal 
531738cd3eSNetanel Belgazal #undef pr_fmt
541738cd3eSNetanel Belgazal #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
551738cd3eSNetanel Belgazal 
561738cd3eSNetanel Belgazal #define ENA_MAX_NUM_IO_QUEUES		128U
571738cd3eSNetanel Belgazal /* We need to queues for each IO (on for Tx and one for Rx) */
581738cd3eSNetanel Belgazal #define ENA_TOTAL_NUM_QUEUES		(2 * (ENA_MAX_NUM_IO_QUEUES))
591738cd3eSNetanel Belgazal 
601738cd3eSNetanel Belgazal #define ENA_MAX_HANDLERS 256
611738cd3eSNetanel Belgazal 
621738cd3eSNetanel Belgazal #define ENA_MAX_PHYS_ADDR_SIZE_BITS 48
631738cd3eSNetanel Belgazal 
641738cd3eSNetanel Belgazal /* Unit in usec */
651738cd3eSNetanel Belgazal #define ENA_REG_READ_TIMEOUT 200000
661738cd3eSNetanel Belgazal 
671738cd3eSNetanel Belgazal #define ADMIN_SQ_SIZE(depth)	((depth) * sizeof(struct ena_admin_aq_entry))
681738cd3eSNetanel Belgazal #define ADMIN_CQ_SIZE(depth)	((depth) * sizeof(struct ena_admin_acq_entry))
691738cd3eSNetanel Belgazal #define ADMIN_AENQ_SIZE(depth)	((depth) * sizeof(struct ena_admin_aenq_entry))
701738cd3eSNetanel Belgazal 
711738cd3eSNetanel Belgazal /*****************************************************************************/
721738cd3eSNetanel Belgazal /*****************************************************************************/
731738cd3eSNetanel Belgazal /* ENA adaptive interrupt moderation settings */
741738cd3eSNetanel Belgazal 
751738cd3eSNetanel Belgazal #define ENA_INTR_LOWEST_USECS           (0)
761738cd3eSNetanel Belgazal #define ENA_INTR_LOWEST_PKTS            (3)
771738cd3eSNetanel Belgazal #define ENA_INTR_LOWEST_BYTES           (2 * 1524)
781738cd3eSNetanel Belgazal 
791738cd3eSNetanel Belgazal #define ENA_INTR_LOW_USECS              (32)
801738cd3eSNetanel Belgazal #define ENA_INTR_LOW_PKTS               (12)
811738cd3eSNetanel Belgazal #define ENA_INTR_LOW_BYTES              (16 * 1024)
821738cd3eSNetanel Belgazal 
831738cd3eSNetanel Belgazal #define ENA_INTR_MID_USECS              (80)
841738cd3eSNetanel Belgazal #define ENA_INTR_MID_PKTS               (48)
851738cd3eSNetanel Belgazal #define ENA_INTR_MID_BYTES              (64 * 1024)
861738cd3eSNetanel Belgazal 
871738cd3eSNetanel Belgazal #define ENA_INTR_HIGH_USECS             (128)
881738cd3eSNetanel Belgazal #define ENA_INTR_HIGH_PKTS              (96)
891738cd3eSNetanel Belgazal #define ENA_INTR_HIGH_BYTES             (128 * 1024)
901738cd3eSNetanel Belgazal 
911738cd3eSNetanel Belgazal #define ENA_INTR_HIGHEST_USECS          (192)
921738cd3eSNetanel Belgazal #define ENA_INTR_HIGHEST_PKTS           (128)
931738cd3eSNetanel Belgazal #define ENA_INTR_HIGHEST_BYTES          (192 * 1024)
941738cd3eSNetanel Belgazal 
951738cd3eSNetanel Belgazal #define ENA_INTR_INITIAL_TX_INTERVAL_USECS		196
9615619e72SArthur Kiyanovski #define ENA_INTR_INITIAL_RX_INTERVAL_USECS		0
971738cd3eSNetanel Belgazal #define ENA_INTR_DELAY_OLD_VALUE_WEIGHT			6
981738cd3eSNetanel Belgazal #define ENA_INTR_DELAY_NEW_VALUE_WEIGHT			4
991738cd3eSNetanel Belgazal #define ENA_INTR_MODER_LEVEL_STRIDE			2
1001738cd3eSNetanel Belgazal #define ENA_INTR_BYTE_COUNT_NOT_SUPPORTED		0xFFFFFF
1011738cd3eSNetanel Belgazal 
10282ef30f1SNetanel Belgazal #define ENA_HW_HINTS_NO_TIMEOUT				0xFFFF
10382ef30f1SNetanel Belgazal 
104ba8ef506SArthur Kiyanovski #define ENA_FEATURE_MAX_QUEUE_EXT_VER	1
105ba8ef506SArthur Kiyanovski 
1061738cd3eSNetanel Belgazal enum ena_intr_moder_level {
1071738cd3eSNetanel Belgazal 	ENA_INTR_MODER_LOWEST = 0,
1081738cd3eSNetanel Belgazal 	ENA_INTR_MODER_LOW,
1091738cd3eSNetanel Belgazal 	ENA_INTR_MODER_MID,
1101738cd3eSNetanel Belgazal 	ENA_INTR_MODER_HIGH,
1111738cd3eSNetanel Belgazal 	ENA_INTR_MODER_HIGHEST,
1121738cd3eSNetanel Belgazal 	ENA_INTR_MAX_NUM_OF_LEVELS,
1131738cd3eSNetanel Belgazal };
1141738cd3eSNetanel Belgazal 
115a7982b8eSArthur Kiyanovski struct ena_llq_configurations {
116a7982b8eSArthur Kiyanovski 	enum ena_admin_llq_header_location llq_header_location;
117a7982b8eSArthur Kiyanovski 	enum ena_admin_llq_ring_entry_size llq_ring_entry_size;
118a7982b8eSArthur Kiyanovski 	enum ena_admin_llq_stride_ctrl  llq_stride_ctrl;
119a7982b8eSArthur Kiyanovski 	enum ena_admin_llq_num_descs_before_header llq_num_decs_before_header;
120a7982b8eSArthur Kiyanovski 	u16 llq_ring_entry_size_value;
121a7982b8eSArthur Kiyanovski };
122a7982b8eSArthur Kiyanovski 
1231738cd3eSNetanel Belgazal struct ena_intr_moder_entry {
1241738cd3eSNetanel Belgazal 	unsigned int intr_moder_interval;
1251738cd3eSNetanel Belgazal 	unsigned int pkts_per_interval;
1261738cd3eSNetanel Belgazal 	unsigned int bytes_per_interval;
1271738cd3eSNetanel Belgazal };
1281738cd3eSNetanel Belgazal 
1291738cd3eSNetanel Belgazal enum queue_direction {
1301738cd3eSNetanel Belgazal 	ENA_COM_IO_QUEUE_DIRECTION_TX,
1311738cd3eSNetanel Belgazal 	ENA_COM_IO_QUEUE_DIRECTION_RX
1321738cd3eSNetanel Belgazal };
1331738cd3eSNetanel Belgazal 
1341738cd3eSNetanel Belgazal struct ena_com_buf {
1351738cd3eSNetanel Belgazal 	dma_addr_t paddr; /**< Buffer physical address */
1361738cd3eSNetanel Belgazal 	u16 len; /**< Buffer length in bytes */
1371738cd3eSNetanel Belgazal };
1381738cd3eSNetanel Belgazal 
1391738cd3eSNetanel Belgazal struct ena_com_rx_buf_info {
1401738cd3eSNetanel Belgazal 	u16 len;
1411738cd3eSNetanel Belgazal 	u16 req_id;
1421738cd3eSNetanel Belgazal };
1431738cd3eSNetanel Belgazal 
1441738cd3eSNetanel Belgazal struct ena_com_io_desc_addr {
1451738cd3eSNetanel Belgazal 	u8 __iomem *pbuf_dev_addr; /* LLQ address */
1461738cd3eSNetanel Belgazal 	u8 *virt_addr;
1471738cd3eSNetanel Belgazal 	dma_addr_t phys_addr;
1481738cd3eSNetanel Belgazal };
1491738cd3eSNetanel Belgazal 
1501738cd3eSNetanel Belgazal struct ena_com_tx_meta {
1511738cd3eSNetanel Belgazal 	u16 mss;
1521738cd3eSNetanel Belgazal 	u16 l3_hdr_len;
1531738cd3eSNetanel Belgazal 	u16 l3_hdr_offset;
1541738cd3eSNetanel Belgazal 	u16 l4_hdr_len; /* In words */
1551738cd3eSNetanel Belgazal };
1561738cd3eSNetanel Belgazal 
157a7982b8eSArthur Kiyanovski struct ena_com_llq_info {
158a7982b8eSArthur Kiyanovski 	u16 header_location_ctrl;
159a7982b8eSArthur Kiyanovski 	u16 desc_stride_ctrl;
160a7982b8eSArthur Kiyanovski 	u16 desc_list_entry_size_ctrl;
161a7982b8eSArthur Kiyanovski 	u16 desc_list_entry_size;
162a7982b8eSArthur Kiyanovski 	u16 descs_num_before_header;
163a7982b8eSArthur Kiyanovski 	u16 descs_per_entry;
16405d62ca2SSameeh Jubran 	u16 max_entries_in_tx_burst;
165a7982b8eSArthur Kiyanovski };
166a7982b8eSArthur Kiyanovski 
1671738cd3eSNetanel Belgazal struct ena_com_io_cq {
1681738cd3eSNetanel Belgazal 	struct ena_com_io_desc_addr cdesc_addr;
1691738cd3eSNetanel Belgazal 
1701738cd3eSNetanel Belgazal 	/* Interrupt unmask register */
1711738cd3eSNetanel Belgazal 	u32 __iomem *unmask_reg;
1721738cd3eSNetanel Belgazal 
1731738cd3eSNetanel Belgazal 	/* The completion queue head doorbell register */
1741738cd3eSNetanel Belgazal 	u32 __iomem *cq_head_db_reg;
1751738cd3eSNetanel Belgazal 
1761738cd3eSNetanel Belgazal 	/* numa configuration register (for TPH) */
1771738cd3eSNetanel Belgazal 	u32 __iomem *numa_node_cfg_reg;
1781738cd3eSNetanel Belgazal 
1791738cd3eSNetanel Belgazal 	/* The value to write to the above register to unmask
1801738cd3eSNetanel Belgazal 	 * the interrupt of this queue
1811738cd3eSNetanel Belgazal 	 */
1821738cd3eSNetanel Belgazal 	u32 msix_vector;
1831738cd3eSNetanel Belgazal 
1841738cd3eSNetanel Belgazal 	enum queue_direction direction;
1851738cd3eSNetanel Belgazal 
1861738cd3eSNetanel Belgazal 	/* holds the number of cdesc of the current packet */
1871738cd3eSNetanel Belgazal 	u16 cur_rx_pkt_cdesc_count;
1881738cd3eSNetanel Belgazal 	/* save the firt cdesc idx of the current packet */
1891738cd3eSNetanel Belgazal 	u16 cur_rx_pkt_cdesc_start_idx;
1901738cd3eSNetanel Belgazal 
1911738cd3eSNetanel Belgazal 	u16 q_depth;
1921738cd3eSNetanel Belgazal 	/* Caller qid */
1931738cd3eSNetanel Belgazal 	u16 qid;
1941738cd3eSNetanel Belgazal 
1951738cd3eSNetanel Belgazal 	/* Device queue index */
1961738cd3eSNetanel Belgazal 	u16 idx;
1971738cd3eSNetanel Belgazal 	u16 head;
1981738cd3eSNetanel Belgazal 	u16 last_head_update;
1991738cd3eSNetanel Belgazal 	u8 phase;
2001738cd3eSNetanel Belgazal 	u8 cdesc_entry_size_in_bytes;
2011738cd3eSNetanel Belgazal 
2021738cd3eSNetanel Belgazal } ____cacheline_aligned;
2031738cd3eSNetanel Belgazal 
204a7982b8eSArthur Kiyanovski struct ena_com_io_bounce_buffer_control {
205a7982b8eSArthur Kiyanovski 	u8 *base_buffer;
206a7982b8eSArthur Kiyanovski 	u16 next_to_use;
207a7982b8eSArthur Kiyanovski 	u16 buffer_size;
208a7982b8eSArthur Kiyanovski 	u16 buffers_num;  /* Must be a power of 2 */
209a7982b8eSArthur Kiyanovski };
210a7982b8eSArthur Kiyanovski 
211a7982b8eSArthur Kiyanovski /* This struct is to keep tracking the current location of the next llq entry */
212a7982b8eSArthur Kiyanovski struct ena_com_llq_pkt_ctrl {
213a7982b8eSArthur Kiyanovski 	u8 *curr_bounce_buf;
214a7982b8eSArthur Kiyanovski 	u16 idx;
215a7982b8eSArthur Kiyanovski 	u16 descs_left_in_line;
216a7982b8eSArthur Kiyanovski };
217a7982b8eSArthur Kiyanovski 
2181738cd3eSNetanel Belgazal struct ena_com_io_sq {
2191738cd3eSNetanel Belgazal 	struct ena_com_io_desc_addr desc_addr;
2201738cd3eSNetanel Belgazal 
2211738cd3eSNetanel Belgazal 	u32 __iomem *db_addr;
2221738cd3eSNetanel Belgazal 	u8 __iomem *header_addr;
2231738cd3eSNetanel Belgazal 
2241738cd3eSNetanel Belgazal 	enum queue_direction direction;
2251738cd3eSNetanel Belgazal 	enum ena_admin_placement_policy_type mem_queue_type;
2261738cd3eSNetanel Belgazal 
2271738cd3eSNetanel Belgazal 	u32 msix_vector;
2281738cd3eSNetanel Belgazal 	struct ena_com_tx_meta cached_tx_meta;
229a7982b8eSArthur Kiyanovski 	struct ena_com_llq_info llq_info;
230a7982b8eSArthur Kiyanovski 	struct ena_com_llq_pkt_ctrl llq_buf_ctrl;
231a7982b8eSArthur Kiyanovski 	struct ena_com_io_bounce_buffer_control bounce_buf_ctrl;
2321738cd3eSNetanel Belgazal 
2331738cd3eSNetanel Belgazal 	u16 q_depth;
2341738cd3eSNetanel Belgazal 	u16 qid;
2351738cd3eSNetanel Belgazal 
2361738cd3eSNetanel Belgazal 	u16 idx;
2371738cd3eSNetanel Belgazal 	u16 tail;
2381738cd3eSNetanel Belgazal 	u16 next_to_comp;
239a7982b8eSArthur Kiyanovski 	u16 llq_last_copy_tail;
2401738cd3eSNetanel Belgazal 	u32 tx_max_header_size;
2411738cd3eSNetanel Belgazal 	u8 phase;
2421738cd3eSNetanel Belgazal 	u8 desc_entry_size;
2431738cd3eSNetanel Belgazal 	u8 dma_addr_bits;
24405d62ca2SSameeh Jubran 	u16 entries_in_tx_burst_left;
2451738cd3eSNetanel Belgazal } ____cacheline_aligned;
2461738cd3eSNetanel Belgazal 
2471738cd3eSNetanel Belgazal struct ena_com_admin_cq {
2481738cd3eSNetanel Belgazal 	struct ena_admin_acq_entry *entries;
2491738cd3eSNetanel Belgazal 	dma_addr_t dma_addr;
2501738cd3eSNetanel Belgazal 
2511738cd3eSNetanel Belgazal 	u16 head;
2521738cd3eSNetanel Belgazal 	u8 phase;
2531738cd3eSNetanel Belgazal };
2541738cd3eSNetanel Belgazal 
2551738cd3eSNetanel Belgazal struct ena_com_admin_sq {
2561738cd3eSNetanel Belgazal 	struct ena_admin_aq_entry *entries;
2571738cd3eSNetanel Belgazal 	dma_addr_t dma_addr;
2581738cd3eSNetanel Belgazal 
2591738cd3eSNetanel Belgazal 	u32 __iomem *db_addr;
2601738cd3eSNetanel Belgazal 
2611738cd3eSNetanel Belgazal 	u16 head;
2621738cd3eSNetanel Belgazal 	u16 tail;
2631738cd3eSNetanel Belgazal 	u8 phase;
2641738cd3eSNetanel Belgazal 
2651738cd3eSNetanel Belgazal };
2661738cd3eSNetanel Belgazal 
2671738cd3eSNetanel Belgazal struct ena_com_stats_admin {
2681738cd3eSNetanel Belgazal 	u32 aborted_cmd;
2691738cd3eSNetanel Belgazal 	u32 submitted_cmd;
2701738cd3eSNetanel Belgazal 	u32 completed_cmd;
2711738cd3eSNetanel Belgazal 	u32 out_of_space;
2721738cd3eSNetanel Belgazal 	u32 no_completion;
2731738cd3eSNetanel Belgazal };
2741738cd3eSNetanel Belgazal 
2751738cd3eSNetanel Belgazal struct ena_com_admin_queue {
2761738cd3eSNetanel Belgazal 	void *q_dmadev;
2771738cd3eSNetanel Belgazal 	spinlock_t q_lock; /* spinlock for the admin queue */
27882ef30f1SNetanel Belgazal 
2791738cd3eSNetanel Belgazal 	struct ena_comp_ctx *comp_ctx;
28082ef30f1SNetanel Belgazal 	u32 completion_timeout;
2811738cd3eSNetanel Belgazal 	u16 q_depth;
2821738cd3eSNetanel Belgazal 	struct ena_com_admin_cq cq;
2831738cd3eSNetanel Belgazal 	struct ena_com_admin_sq sq;
2841738cd3eSNetanel Belgazal 
2851738cd3eSNetanel Belgazal 	/* Indicate if the admin queue should poll for completion */
2861738cd3eSNetanel Belgazal 	bool polling;
2871738cd3eSNetanel Belgazal 
288a4e262cdSSameeh Jubran 	/* Define if fallback to polling mode should occur */
289a4e262cdSSameeh Jubran 	bool auto_polling;
290a4e262cdSSameeh Jubran 
2911738cd3eSNetanel Belgazal 	u16 curr_cmd_id;
2921738cd3eSNetanel Belgazal 
2931738cd3eSNetanel Belgazal 	/* Indicate that the ena was initialized and can
2941738cd3eSNetanel Belgazal 	 * process new admin commands
2951738cd3eSNetanel Belgazal 	 */
2961738cd3eSNetanel Belgazal 	bool running_state;
2971738cd3eSNetanel Belgazal 
2981738cd3eSNetanel Belgazal 	/* Count the number of outstanding admin commands */
2991738cd3eSNetanel Belgazal 	atomic_t outstanding_cmds;
3001738cd3eSNetanel Belgazal 
3011738cd3eSNetanel Belgazal 	struct ena_com_stats_admin stats;
3021738cd3eSNetanel Belgazal };
3031738cd3eSNetanel Belgazal 
3041738cd3eSNetanel Belgazal struct ena_aenq_handlers;
3051738cd3eSNetanel Belgazal 
3061738cd3eSNetanel Belgazal struct ena_com_aenq {
3071738cd3eSNetanel Belgazal 	u16 head;
3081738cd3eSNetanel Belgazal 	u8 phase;
3091738cd3eSNetanel Belgazal 	struct ena_admin_aenq_entry *entries;
3101738cd3eSNetanel Belgazal 	dma_addr_t dma_addr;
3111738cd3eSNetanel Belgazal 	u16 q_depth;
3121738cd3eSNetanel Belgazal 	struct ena_aenq_handlers *aenq_handlers;
3131738cd3eSNetanel Belgazal };
3141738cd3eSNetanel Belgazal 
3151738cd3eSNetanel Belgazal struct ena_com_mmio_read {
3161738cd3eSNetanel Belgazal 	struct ena_admin_ena_mmio_req_read_less_resp *read_resp;
3171738cd3eSNetanel Belgazal 	dma_addr_t read_resp_dma_addr;
31882ef30f1SNetanel Belgazal 	u32 reg_read_to; /* in us */
3191738cd3eSNetanel Belgazal 	u16 seq_num;
3201738cd3eSNetanel Belgazal 	bool readless_supported;
3211738cd3eSNetanel Belgazal 	/* spin lock to ensure a single outstanding read */
3221738cd3eSNetanel Belgazal 	spinlock_t lock;
3231738cd3eSNetanel Belgazal };
3241738cd3eSNetanel Belgazal 
3251738cd3eSNetanel Belgazal struct ena_rss {
3261738cd3eSNetanel Belgazal 	/* Indirect table */
3271738cd3eSNetanel Belgazal 	u16 *host_rss_ind_tbl;
3281738cd3eSNetanel Belgazal 	struct ena_admin_rss_ind_table_entry *rss_ind_tbl;
3291738cd3eSNetanel Belgazal 	dma_addr_t rss_ind_tbl_dma_addr;
3301738cd3eSNetanel Belgazal 	u16 tbl_log_size;
3311738cd3eSNetanel Belgazal 
3321738cd3eSNetanel Belgazal 	/* Hash key */
3331738cd3eSNetanel Belgazal 	enum ena_admin_hash_functions hash_func;
3341738cd3eSNetanel Belgazal 	struct ena_admin_feature_rss_flow_hash_control *hash_key;
3351738cd3eSNetanel Belgazal 	dma_addr_t hash_key_dma_addr;
3361738cd3eSNetanel Belgazal 	u32 hash_init_val;
3371738cd3eSNetanel Belgazal 
3381738cd3eSNetanel Belgazal 	/* Flow Control */
3391738cd3eSNetanel Belgazal 	struct ena_admin_feature_rss_hash_control *hash_ctrl;
3401738cd3eSNetanel Belgazal 	dma_addr_t hash_ctrl_dma_addr;
3411738cd3eSNetanel Belgazal 
3421738cd3eSNetanel Belgazal };
3431738cd3eSNetanel Belgazal 
3441738cd3eSNetanel Belgazal struct ena_host_attribute {
3451738cd3eSNetanel Belgazal 	/* Debug area */
3461738cd3eSNetanel Belgazal 	u8 *debug_area_virt_addr;
3471738cd3eSNetanel Belgazal 	dma_addr_t debug_area_dma_addr;
3481738cd3eSNetanel Belgazal 	u32 debug_area_size;
3491738cd3eSNetanel Belgazal 
3501738cd3eSNetanel Belgazal 	/* Host information */
3511738cd3eSNetanel Belgazal 	struct ena_admin_host_info *host_info;
3521738cd3eSNetanel Belgazal 	dma_addr_t host_info_dma_addr;
3531738cd3eSNetanel Belgazal };
3541738cd3eSNetanel Belgazal 
3551738cd3eSNetanel Belgazal /* Each ena_dev is a PCI function. */
3561738cd3eSNetanel Belgazal struct ena_com_dev {
3571738cd3eSNetanel Belgazal 	struct ena_com_admin_queue admin_queue;
3581738cd3eSNetanel Belgazal 	struct ena_com_aenq aenq;
3591738cd3eSNetanel Belgazal 	struct ena_com_io_cq io_cq_queues[ENA_TOTAL_NUM_QUEUES];
3601738cd3eSNetanel Belgazal 	struct ena_com_io_sq io_sq_queues[ENA_TOTAL_NUM_QUEUES];
3611738cd3eSNetanel Belgazal 	u8 __iomem *reg_bar;
3621738cd3eSNetanel Belgazal 	void __iomem *mem_bar;
3631738cd3eSNetanel Belgazal 	void *dmadev;
3641738cd3eSNetanel Belgazal 
3651738cd3eSNetanel Belgazal 	enum ena_admin_placement_policy_type tx_mem_queue_type;
3661738cd3eSNetanel Belgazal 	u32 tx_max_header_size;
3671738cd3eSNetanel Belgazal 	u16 stats_func; /* Selected function for extended statistic dump */
3681738cd3eSNetanel Belgazal 	u16 stats_queue; /* Selected queue for extended statistic dump */
3691738cd3eSNetanel Belgazal 
3701738cd3eSNetanel Belgazal 	struct ena_com_mmio_read mmio_read;
3711738cd3eSNetanel Belgazal 
3721738cd3eSNetanel Belgazal 	struct ena_rss rss;
3731738cd3eSNetanel Belgazal 	u32 supported_features;
3741738cd3eSNetanel Belgazal 	u32 dma_addr_bits;
3751738cd3eSNetanel Belgazal 
3761738cd3eSNetanel Belgazal 	struct ena_host_attribute host_attr;
3771738cd3eSNetanel Belgazal 	bool adaptive_coalescing;
3781738cd3eSNetanel Belgazal 	u16 intr_delay_resolution;
37915619e72SArthur Kiyanovski 
38015619e72SArthur Kiyanovski 	/* interrupt moderation intervals are in usec divided by
38115619e72SArthur Kiyanovski 	 * intr_delay_resolution, which is supplied by the device.
38215619e72SArthur Kiyanovski 	 */
3831738cd3eSNetanel Belgazal 	u32 intr_moder_tx_interval;
38415619e72SArthur Kiyanovski 	u32 intr_moder_rx_interval;
38515619e72SArthur Kiyanovski 
3861738cd3eSNetanel Belgazal 	struct ena_intr_moder_entry *intr_moder_tbl;
387a7982b8eSArthur Kiyanovski 
388a7982b8eSArthur Kiyanovski 	struct ena_com_llq_info llq_info;
3891738cd3eSNetanel Belgazal };
3901738cd3eSNetanel Belgazal 
3911738cd3eSNetanel Belgazal struct ena_com_dev_get_features_ctx {
3921738cd3eSNetanel Belgazal 	struct ena_admin_queue_feature_desc max_queues;
393ba8ef506SArthur Kiyanovski 	struct ena_admin_queue_ext_feature_desc max_queue_ext;
3941738cd3eSNetanel Belgazal 	struct ena_admin_device_attr_feature_desc dev_attr;
3951738cd3eSNetanel Belgazal 	struct ena_admin_feature_aenq_desc aenq;
3961738cd3eSNetanel Belgazal 	struct ena_admin_feature_offload_desc offload;
39782ef30f1SNetanel Belgazal 	struct ena_admin_ena_hw_hints hw_hints;
398a7982b8eSArthur Kiyanovski 	struct ena_admin_feature_llq_desc llq;
3991738cd3eSNetanel Belgazal };
4001738cd3eSNetanel Belgazal 
4011738cd3eSNetanel Belgazal struct ena_com_create_io_ctx {
4021738cd3eSNetanel Belgazal 	enum ena_admin_placement_policy_type mem_queue_type;
4031738cd3eSNetanel Belgazal 	enum queue_direction direction;
4041738cd3eSNetanel Belgazal 	int numa_node;
4051738cd3eSNetanel Belgazal 	u32 msix_vector;
4061738cd3eSNetanel Belgazal 	u16 queue_size;
4071738cd3eSNetanel Belgazal 	u16 qid;
4081738cd3eSNetanel Belgazal };
4091738cd3eSNetanel Belgazal 
4101738cd3eSNetanel Belgazal typedef void (*ena_aenq_handler)(void *data,
4111738cd3eSNetanel Belgazal 	struct ena_admin_aenq_entry *aenq_e);
4121738cd3eSNetanel Belgazal 
4131738cd3eSNetanel Belgazal /* Holds aenq handlers. Indexed by AENQ event group */
4141738cd3eSNetanel Belgazal struct ena_aenq_handlers {
4151738cd3eSNetanel Belgazal 	ena_aenq_handler handlers[ENA_MAX_HANDLERS];
4161738cd3eSNetanel Belgazal 	ena_aenq_handler unimplemented_handler;
4171738cd3eSNetanel Belgazal };
4181738cd3eSNetanel Belgazal 
4191738cd3eSNetanel Belgazal /*****************************************************************************/
4201738cd3eSNetanel Belgazal /*****************************************************************************/
4211738cd3eSNetanel Belgazal 
4221738cd3eSNetanel Belgazal /* ena_com_mmio_reg_read_request_init - Init the mmio reg read mechanism
4231738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4241738cd3eSNetanel Belgazal  *
4251738cd3eSNetanel Belgazal  * Initialize the register read mechanism.
4261738cd3eSNetanel Belgazal  *
4271738cd3eSNetanel Belgazal  * @note: This method must be the first stage in the initialization sequence.
4281738cd3eSNetanel Belgazal  *
4291738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
4301738cd3eSNetanel Belgazal  */
4311738cd3eSNetanel Belgazal int ena_com_mmio_reg_read_request_init(struct ena_com_dev *ena_dev);
4321738cd3eSNetanel Belgazal 
4331738cd3eSNetanel Belgazal /* ena_com_set_mmio_read_mode - Enable/disable the mmio reg read mechanism
4341738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4351738cd3eSNetanel Belgazal  * @readless_supported: readless mode (enable/disable)
4361738cd3eSNetanel Belgazal  */
4371738cd3eSNetanel Belgazal void ena_com_set_mmio_read_mode(struct ena_com_dev *ena_dev,
4381738cd3eSNetanel Belgazal 				bool readless_supported);
4391738cd3eSNetanel Belgazal 
4401738cd3eSNetanel Belgazal /* ena_com_mmio_reg_read_request_write_dev_addr - Write the mmio reg read return
4411738cd3eSNetanel Belgazal  * value physical address.
4421738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4431738cd3eSNetanel Belgazal  */
4441738cd3eSNetanel Belgazal void ena_com_mmio_reg_read_request_write_dev_addr(struct ena_com_dev *ena_dev);
4451738cd3eSNetanel Belgazal 
4461738cd3eSNetanel Belgazal /* ena_com_mmio_reg_read_request_destroy - Destroy the mmio reg read mechanism
4471738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4481738cd3eSNetanel Belgazal  */
4491738cd3eSNetanel Belgazal void ena_com_mmio_reg_read_request_destroy(struct ena_com_dev *ena_dev);
4501738cd3eSNetanel Belgazal 
4511738cd3eSNetanel Belgazal /* ena_com_admin_init - Init the admin and the async queues
4521738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4531738cd3eSNetanel Belgazal  * @aenq_handlers: Those handlers to be called upon event.
4541738cd3eSNetanel Belgazal  *
4551738cd3eSNetanel Belgazal  * Initialize the admin submission and completion queues.
4561738cd3eSNetanel Belgazal  * Initialize the asynchronous events notification queues.
4571738cd3eSNetanel Belgazal  *
4581738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
4591738cd3eSNetanel Belgazal  */
4601738cd3eSNetanel Belgazal int ena_com_admin_init(struct ena_com_dev *ena_dev,
461f1e90f6eSArthur Kiyanovski 		       struct ena_aenq_handlers *aenq_handlers);
4621738cd3eSNetanel Belgazal 
4631738cd3eSNetanel Belgazal /* ena_com_admin_destroy - Destroy the admin and the async events queues.
4641738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4651738cd3eSNetanel Belgazal  *
4661738cd3eSNetanel Belgazal  * @note: Before calling this method, the caller must validate that the device
4671738cd3eSNetanel Belgazal  * won't send any additional admin completions/aenq.
4681738cd3eSNetanel Belgazal  * To achieve that, a FLR is recommended.
4691738cd3eSNetanel Belgazal  */
4701738cd3eSNetanel Belgazal void ena_com_admin_destroy(struct ena_com_dev *ena_dev);
4711738cd3eSNetanel Belgazal 
4721738cd3eSNetanel Belgazal /* ena_com_dev_reset - Perform device FLR to the device.
4731738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
474e2eed0e3SNetanel Belgazal  * @reset_reason: Specify what is the trigger for the reset in case of an error.
4751738cd3eSNetanel Belgazal  *
4761738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
4771738cd3eSNetanel Belgazal  */
478e2eed0e3SNetanel Belgazal int ena_com_dev_reset(struct ena_com_dev *ena_dev,
479e2eed0e3SNetanel Belgazal 		      enum ena_regs_reset_reason_types reset_reason);
4801738cd3eSNetanel Belgazal 
4811738cd3eSNetanel Belgazal /* ena_com_create_io_queue - Create io queue.
4821738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4831738cd3eSNetanel Belgazal  * @ctx - create context structure
4841738cd3eSNetanel Belgazal  *
4851738cd3eSNetanel Belgazal  * Create the submission and the completion queues.
4861738cd3eSNetanel Belgazal  *
4871738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
4881738cd3eSNetanel Belgazal  */
4891738cd3eSNetanel Belgazal int ena_com_create_io_queue(struct ena_com_dev *ena_dev,
4901738cd3eSNetanel Belgazal 			    struct ena_com_create_io_ctx *ctx);
4911738cd3eSNetanel Belgazal 
4921738cd3eSNetanel Belgazal /* ena_com_destroy_io_queue - Destroy IO queue with the queue id - qid.
4931738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
4941738cd3eSNetanel Belgazal  * @qid - the caller virtual queue id.
4951738cd3eSNetanel Belgazal  */
4961738cd3eSNetanel Belgazal void ena_com_destroy_io_queue(struct ena_com_dev *ena_dev, u16 qid);
4971738cd3eSNetanel Belgazal 
4981738cd3eSNetanel Belgazal /* ena_com_get_io_handlers - Return the io queue handlers
4991738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5001738cd3eSNetanel Belgazal  * @qid - the caller virtual queue id.
5011738cd3eSNetanel Belgazal  * @io_sq - IO submission queue handler
5021738cd3eSNetanel Belgazal  * @io_cq - IO completion queue handler.
5031738cd3eSNetanel Belgazal  *
5041738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
5051738cd3eSNetanel Belgazal  */
5061738cd3eSNetanel Belgazal int ena_com_get_io_handlers(struct ena_com_dev *ena_dev, u16 qid,
5071738cd3eSNetanel Belgazal 			    struct ena_com_io_sq **io_sq,
5081738cd3eSNetanel Belgazal 			    struct ena_com_io_cq **io_cq);
5091738cd3eSNetanel Belgazal 
5101738cd3eSNetanel Belgazal /* ena_com_admin_aenq_enable - ENAble asynchronous event notifications
5111738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5121738cd3eSNetanel Belgazal  *
5131738cd3eSNetanel Belgazal  * After this method, aenq event can be received via AENQ.
5141738cd3eSNetanel Belgazal  */
5151738cd3eSNetanel Belgazal void ena_com_admin_aenq_enable(struct ena_com_dev *ena_dev);
5161738cd3eSNetanel Belgazal 
5171738cd3eSNetanel Belgazal /* ena_com_set_admin_running_state - Set the state of the admin queue
5181738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5191738cd3eSNetanel Belgazal  *
5201738cd3eSNetanel Belgazal  * Change the state of the admin queue (enable/disable)
5211738cd3eSNetanel Belgazal  */
5221738cd3eSNetanel Belgazal void ena_com_set_admin_running_state(struct ena_com_dev *ena_dev, bool state);
5231738cd3eSNetanel Belgazal 
5241738cd3eSNetanel Belgazal /* ena_com_get_admin_running_state - Get the admin queue state
5251738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5261738cd3eSNetanel Belgazal  *
5271738cd3eSNetanel Belgazal  * Retrieve the state of the admin queue (enable/disable)
5281738cd3eSNetanel Belgazal  *
5291738cd3eSNetanel Belgazal  * @return - current polling mode (enable/disable)
5301738cd3eSNetanel Belgazal  */
5311738cd3eSNetanel Belgazal bool ena_com_get_admin_running_state(struct ena_com_dev *ena_dev);
5321738cd3eSNetanel Belgazal 
5331738cd3eSNetanel Belgazal /* ena_com_set_admin_polling_mode - Set the admin completion queue polling mode
5341738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5351738cd3eSNetanel Belgazal  * @polling: ENAble/Disable polling mode
5361738cd3eSNetanel Belgazal  *
5371738cd3eSNetanel Belgazal  * Set the admin completion mode.
5381738cd3eSNetanel Belgazal  */
5391738cd3eSNetanel Belgazal void ena_com_set_admin_polling_mode(struct ena_com_dev *ena_dev, bool polling);
5401738cd3eSNetanel Belgazal 
5411738cd3eSNetanel Belgazal /* ena_com_set_admin_polling_mode - Get the admin completion queue polling mode
5421738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5431738cd3eSNetanel Belgazal  *
5441738cd3eSNetanel Belgazal  * Get the admin completion mode.
5451738cd3eSNetanel Belgazal  * If polling mode is on, ena_com_execute_admin_command will perform a
5461738cd3eSNetanel Belgazal  * polling on the admin completion queue for the commands completion,
5471738cd3eSNetanel Belgazal  * otherwise it will wait on wait event.
5481738cd3eSNetanel Belgazal  *
5491738cd3eSNetanel Belgazal  * @return state
5501738cd3eSNetanel Belgazal  */
5511738cd3eSNetanel Belgazal bool ena_com_get_ena_admin_polling_mode(struct ena_com_dev *ena_dev);
5521738cd3eSNetanel Belgazal 
553a4e262cdSSameeh Jubran /* ena_com_set_admin_auto_polling_mode - Enable autoswitch to polling mode
554a4e262cdSSameeh Jubran  * @ena_dev: ENA communication layer struct
555a4e262cdSSameeh Jubran  * @polling: Enable/Disable polling mode
556a4e262cdSSameeh Jubran  *
557a4e262cdSSameeh Jubran  * Set the autopolling mode.
558a4e262cdSSameeh Jubran  * If autopolling is on:
559a4e262cdSSameeh Jubran  * In case of missing interrupt when data is available switch to polling.
560a4e262cdSSameeh Jubran  */
561a4e262cdSSameeh Jubran void ena_com_set_admin_auto_polling_mode(struct ena_com_dev *ena_dev,
562a4e262cdSSameeh Jubran 					 bool polling);
563a4e262cdSSameeh Jubran 
5641738cd3eSNetanel Belgazal /* ena_com_admin_q_comp_intr_handler - admin queue interrupt handler
5651738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5661738cd3eSNetanel Belgazal  *
5671738cd3eSNetanel Belgazal  * This method go over the admin completion queue and wake up all the pending
5681738cd3eSNetanel Belgazal  * threads that wait on the commands wait event.
5691738cd3eSNetanel Belgazal  *
5701738cd3eSNetanel Belgazal  * @note: Should be called after MSI-X interrupt.
5711738cd3eSNetanel Belgazal  */
5721738cd3eSNetanel Belgazal void ena_com_admin_q_comp_intr_handler(struct ena_com_dev *ena_dev);
5731738cd3eSNetanel Belgazal 
5741738cd3eSNetanel Belgazal /* ena_com_aenq_intr_handler - AENQ interrupt handler
5751738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5761738cd3eSNetanel Belgazal  *
5771738cd3eSNetanel Belgazal  * This method go over the async event notification queue and call the proper
5781738cd3eSNetanel Belgazal  * aenq handler.
5791738cd3eSNetanel Belgazal  */
5801738cd3eSNetanel Belgazal void ena_com_aenq_intr_handler(struct ena_com_dev *dev, void *data);
5811738cd3eSNetanel Belgazal 
5821738cd3eSNetanel Belgazal /* ena_com_abort_admin_commands - Abort all the outstanding admin commands.
5831738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5841738cd3eSNetanel Belgazal  *
5851738cd3eSNetanel Belgazal  * This method aborts all the outstanding admin commands.
5861738cd3eSNetanel Belgazal  * The caller should then call ena_com_wait_for_abort_completion to make sure
5871738cd3eSNetanel Belgazal  * all the commands were completed.
5881738cd3eSNetanel Belgazal  */
5891738cd3eSNetanel Belgazal void ena_com_abort_admin_commands(struct ena_com_dev *ena_dev);
5901738cd3eSNetanel Belgazal 
5911738cd3eSNetanel Belgazal /* ena_com_wait_for_abort_completion - Wait for admin commands abort.
5921738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
5931738cd3eSNetanel Belgazal  *
5941738cd3eSNetanel Belgazal  * This method wait until all the outstanding admin commands will be completed.
5951738cd3eSNetanel Belgazal  */
5961738cd3eSNetanel Belgazal void ena_com_wait_for_abort_completion(struct ena_com_dev *ena_dev);
5971738cd3eSNetanel Belgazal 
5981738cd3eSNetanel Belgazal /* ena_com_validate_version - Validate the device parameters
5991738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6001738cd3eSNetanel Belgazal  *
6011738cd3eSNetanel Belgazal  * This method validate the device parameters are the same as the saved
6021738cd3eSNetanel Belgazal  * parameters in ena_dev.
6031738cd3eSNetanel Belgazal  * This method is useful after device reset, to validate the device mac address
6041738cd3eSNetanel Belgazal  * and the device offloads are the same as before the reset.
6051738cd3eSNetanel Belgazal  *
6061738cd3eSNetanel Belgazal  * @return - 0 on success negative value otherwise.
6071738cd3eSNetanel Belgazal  */
6081738cd3eSNetanel Belgazal int ena_com_validate_version(struct ena_com_dev *ena_dev);
6091738cd3eSNetanel Belgazal 
6101738cd3eSNetanel Belgazal /* ena_com_get_link_params - Retrieve physical link parameters.
6111738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6121738cd3eSNetanel Belgazal  * @resp: Link parameters
6131738cd3eSNetanel Belgazal  *
6141738cd3eSNetanel Belgazal  * Retrieve the physical link parameters,
6151738cd3eSNetanel Belgazal  * like speed, auto-negotiation and full duplex support.
6161738cd3eSNetanel Belgazal  *
6171738cd3eSNetanel Belgazal  * @return - 0 on Success negative value otherwise.
6181738cd3eSNetanel Belgazal  */
6191738cd3eSNetanel Belgazal int ena_com_get_link_params(struct ena_com_dev *ena_dev,
6201738cd3eSNetanel Belgazal 			    struct ena_admin_get_feat_resp *resp);
6211738cd3eSNetanel Belgazal 
6221738cd3eSNetanel Belgazal /* ena_com_get_dma_width - Retrieve physical dma address width the device
6231738cd3eSNetanel Belgazal  * supports.
6241738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6251738cd3eSNetanel Belgazal  *
6261738cd3eSNetanel Belgazal  * Retrieve the maximum physical address bits the device can handle.
6271738cd3eSNetanel Belgazal  *
6281738cd3eSNetanel Belgazal  * @return: > 0 on Success and negative value otherwise.
6291738cd3eSNetanel Belgazal  */
6301738cd3eSNetanel Belgazal int ena_com_get_dma_width(struct ena_com_dev *ena_dev);
6311738cd3eSNetanel Belgazal 
6321738cd3eSNetanel Belgazal /* ena_com_set_aenq_config - Set aenq groups configurations
6331738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6341738cd3eSNetanel Belgazal  * @groups flag: bit fields flags of enum ena_admin_aenq_group.
6351738cd3eSNetanel Belgazal  *
6361738cd3eSNetanel Belgazal  * Configure which aenq event group the driver would like to receive.
6371738cd3eSNetanel Belgazal  *
6381738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6391738cd3eSNetanel Belgazal  */
6401738cd3eSNetanel Belgazal int ena_com_set_aenq_config(struct ena_com_dev *ena_dev, u32 groups_flag);
6411738cd3eSNetanel Belgazal 
6421738cd3eSNetanel Belgazal /* ena_com_get_dev_attr_feat - Get device features
6431738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6441738cd3eSNetanel Belgazal  * @get_feat_ctx: returned context that contain the get features.
6451738cd3eSNetanel Belgazal  *
6461738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6471738cd3eSNetanel Belgazal  */
6481738cd3eSNetanel Belgazal int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
6491738cd3eSNetanel Belgazal 			      struct ena_com_dev_get_features_ctx *get_feat_ctx);
6501738cd3eSNetanel Belgazal 
6511738cd3eSNetanel Belgazal /* ena_com_get_dev_basic_stats - Get device basic statistics
6521738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6531738cd3eSNetanel Belgazal  * @stats: stats return value
6541738cd3eSNetanel Belgazal  *
6551738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6561738cd3eSNetanel Belgazal  */
6571738cd3eSNetanel Belgazal int ena_com_get_dev_basic_stats(struct ena_com_dev *ena_dev,
6581738cd3eSNetanel Belgazal 				struct ena_admin_basic_stats *stats);
6591738cd3eSNetanel Belgazal 
6601738cd3eSNetanel Belgazal /* ena_com_set_dev_mtu - Configure the device mtu.
6611738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6621738cd3eSNetanel Belgazal  * @mtu: mtu value
6631738cd3eSNetanel Belgazal  *
6641738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6651738cd3eSNetanel Belgazal  */
6661738cd3eSNetanel Belgazal int ena_com_set_dev_mtu(struct ena_com_dev *ena_dev, int mtu);
6671738cd3eSNetanel Belgazal 
6681738cd3eSNetanel Belgazal /* ena_com_get_offload_settings - Retrieve the device offloads capabilities
6691738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6701738cd3eSNetanel Belgazal  * @offlad: offload return value
6711738cd3eSNetanel Belgazal  *
6721738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6731738cd3eSNetanel Belgazal  */
6741738cd3eSNetanel Belgazal int ena_com_get_offload_settings(struct ena_com_dev *ena_dev,
6751738cd3eSNetanel Belgazal 				 struct ena_admin_feature_offload_desc *offload);
6761738cd3eSNetanel Belgazal 
6771738cd3eSNetanel Belgazal /* ena_com_rss_init - Init RSS
6781738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6791738cd3eSNetanel Belgazal  * @log_size: indirection log size
6801738cd3eSNetanel Belgazal  *
6811738cd3eSNetanel Belgazal  * Allocate RSS/RFS resources.
6821738cd3eSNetanel Belgazal  * The caller then can configure rss using ena_com_set_hash_function,
6831738cd3eSNetanel Belgazal  * ena_com_set_hash_ctrl and ena_com_indirect_table_set.
6841738cd3eSNetanel Belgazal  *
6851738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
6861738cd3eSNetanel Belgazal  */
6871738cd3eSNetanel Belgazal int ena_com_rss_init(struct ena_com_dev *ena_dev, u16 log_size);
6881738cd3eSNetanel Belgazal 
6891738cd3eSNetanel Belgazal /* ena_com_rss_destroy - Destroy rss
6901738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6911738cd3eSNetanel Belgazal  *
6921738cd3eSNetanel Belgazal  * Free all the RSS/RFS resources.
6931738cd3eSNetanel Belgazal  */
6941738cd3eSNetanel Belgazal void ena_com_rss_destroy(struct ena_com_dev *ena_dev);
6951738cd3eSNetanel Belgazal 
6961738cd3eSNetanel Belgazal /* ena_com_fill_hash_function - Fill RSS hash function
6971738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
6981738cd3eSNetanel Belgazal  * @func: The hash function (Toeplitz or crc)
6991738cd3eSNetanel Belgazal  * @key: Hash key (for toeplitz hash)
7001738cd3eSNetanel Belgazal  * @key_len: key length (max length 10 DW)
7011738cd3eSNetanel Belgazal  * @init_val: initial value for the hash function
7021738cd3eSNetanel Belgazal  *
7031738cd3eSNetanel Belgazal  * Fill the ena_dev resources with the desire hash function, hash key, key_len
7041738cd3eSNetanel Belgazal  * and key initial value (if needed by the hash function).
7051738cd3eSNetanel Belgazal  * To flush the key into the device the caller should call
7061738cd3eSNetanel Belgazal  * ena_com_set_hash_function.
7071738cd3eSNetanel Belgazal  *
7081738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7091738cd3eSNetanel Belgazal  */
7101738cd3eSNetanel Belgazal int ena_com_fill_hash_function(struct ena_com_dev *ena_dev,
7111738cd3eSNetanel Belgazal 			       enum ena_admin_hash_functions func,
7121738cd3eSNetanel Belgazal 			       const u8 *key, u16 key_len, u32 init_val);
7131738cd3eSNetanel Belgazal 
7141738cd3eSNetanel Belgazal /* ena_com_set_hash_function - Flush the hash function and it dependencies to
7151738cd3eSNetanel Belgazal  * the device.
7161738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
7171738cd3eSNetanel Belgazal  *
7181738cd3eSNetanel Belgazal  * Flush the hash function and it dependencies (key, key length and
7191738cd3eSNetanel Belgazal  * initial value) if needed.
7201738cd3eSNetanel Belgazal  *
7211738cd3eSNetanel Belgazal  * @note: Prior to this method the caller should call ena_com_fill_hash_function
7221738cd3eSNetanel Belgazal  *
7231738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7241738cd3eSNetanel Belgazal  */
7251738cd3eSNetanel Belgazal int ena_com_set_hash_function(struct ena_com_dev *ena_dev);
7261738cd3eSNetanel Belgazal 
7271738cd3eSNetanel Belgazal /* ena_com_get_hash_function - Retrieve the hash function and the hash key
7281738cd3eSNetanel Belgazal  * from the device.
7291738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
7301738cd3eSNetanel Belgazal  * @func: hash function
7311738cd3eSNetanel Belgazal  * @key: hash key
7321738cd3eSNetanel Belgazal  *
7331738cd3eSNetanel Belgazal  * Retrieve the hash function and the hash key from the device.
7341738cd3eSNetanel Belgazal  *
7351738cd3eSNetanel Belgazal  * @note: If the caller called ena_com_fill_hash_function but didn't flash
7361738cd3eSNetanel Belgazal  * it to the device, the new configuration will be lost.
7371738cd3eSNetanel Belgazal  *
7381738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7391738cd3eSNetanel Belgazal  */
7401738cd3eSNetanel Belgazal int ena_com_get_hash_function(struct ena_com_dev *ena_dev,
7411738cd3eSNetanel Belgazal 			      enum ena_admin_hash_functions *func,
7421738cd3eSNetanel Belgazal 			      u8 *key);
7431738cd3eSNetanel Belgazal 
7441738cd3eSNetanel Belgazal /* ena_com_fill_hash_ctrl - Fill RSS hash control
7451738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct.
7461738cd3eSNetanel Belgazal  * @proto: The protocol to configure.
7471738cd3eSNetanel Belgazal  * @hash_fields: bit mask of ena_admin_flow_hash_fields
7481738cd3eSNetanel Belgazal  *
7491738cd3eSNetanel Belgazal  * Fill the ena_dev resources with the desire hash control (the ethernet
7501738cd3eSNetanel Belgazal  * fields that take part of the hash) for a specific protocol.
7511738cd3eSNetanel Belgazal  * To flush the hash control to the device, the caller should call
7521738cd3eSNetanel Belgazal  * ena_com_set_hash_ctrl.
7531738cd3eSNetanel Belgazal  *
7541738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7551738cd3eSNetanel Belgazal  */
7561738cd3eSNetanel Belgazal int ena_com_fill_hash_ctrl(struct ena_com_dev *ena_dev,
7571738cd3eSNetanel Belgazal 			   enum ena_admin_flow_hash_proto proto,
7581738cd3eSNetanel Belgazal 			   u16 hash_fields);
7591738cd3eSNetanel Belgazal 
7601738cd3eSNetanel Belgazal /* ena_com_set_hash_ctrl - Flush the hash control resources to the device.
7611738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
7621738cd3eSNetanel Belgazal  *
7631738cd3eSNetanel Belgazal  * Flush the hash control (the ethernet fields that take part of the hash)
7641738cd3eSNetanel Belgazal  *
7651738cd3eSNetanel Belgazal  * @note: Prior to this method the caller should call ena_com_fill_hash_ctrl.
7661738cd3eSNetanel Belgazal  *
7671738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7681738cd3eSNetanel Belgazal  */
7691738cd3eSNetanel Belgazal int ena_com_set_hash_ctrl(struct ena_com_dev *ena_dev);
7701738cd3eSNetanel Belgazal 
7711738cd3eSNetanel Belgazal /* ena_com_get_hash_ctrl - Retrieve the hash control from the device.
7721738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
7731738cd3eSNetanel Belgazal  * @proto: The protocol to retrieve.
7741738cd3eSNetanel Belgazal  * @fields: bit mask of ena_admin_flow_hash_fields.
7751738cd3eSNetanel Belgazal  *
7761738cd3eSNetanel Belgazal  * Retrieve the hash control from the device.
7771738cd3eSNetanel Belgazal  *
7781738cd3eSNetanel Belgazal  * @note, If the caller called ena_com_fill_hash_ctrl but didn't flash
7791738cd3eSNetanel Belgazal  * it to the device, the new configuration will be lost.
7801738cd3eSNetanel Belgazal  *
7811738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7821738cd3eSNetanel Belgazal  */
7831738cd3eSNetanel Belgazal int ena_com_get_hash_ctrl(struct ena_com_dev *ena_dev,
7841738cd3eSNetanel Belgazal 			  enum ena_admin_flow_hash_proto proto,
7851738cd3eSNetanel Belgazal 			  u16 *fields);
7861738cd3eSNetanel Belgazal 
7871738cd3eSNetanel Belgazal /* ena_com_set_default_hash_ctrl - Set the hash control to a default
7881738cd3eSNetanel Belgazal  * configuration.
7891738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
7901738cd3eSNetanel Belgazal  *
7911738cd3eSNetanel Belgazal  * Fill the ena_dev resources with the default hash control configuration.
7921738cd3eSNetanel Belgazal  * To flush the hash control to the device, the caller should call
7931738cd3eSNetanel Belgazal  * ena_com_set_hash_ctrl.
7941738cd3eSNetanel Belgazal  *
7951738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
7961738cd3eSNetanel Belgazal  */
7971738cd3eSNetanel Belgazal int ena_com_set_default_hash_ctrl(struct ena_com_dev *ena_dev);
7981738cd3eSNetanel Belgazal 
7991738cd3eSNetanel Belgazal /* ena_com_indirect_table_fill_entry - Fill a single entry in the RSS
8001738cd3eSNetanel Belgazal  * indirection table
8011738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct.
8021738cd3eSNetanel Belgazal  * @entry_idx - indirection table entry.
8031738cd3eSNetanel Belgazal  * @entry_value - redirection value
8041738cd3eSNetanel Belgazal  *
8051738cd3eSNetanel Belgazal  * Fill a single entry of the RSS indirection table in the ena_dev resources.
8061738cd3eSNetanel Belgazal  * To flush the indirection table to the device, the called should call
8071738cd3eSNetanel Belgazal  * ena_com_indirect_table_set.
8081738cd3eSNetanel Belgazal  *
8091738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
8101738cd3eSNetanel Belgazal  */
8111738cd3eSNetanel Belgazal int ena_com_indirect_table_fill_entry(struct ena_com_dev *ena_dev,
8121738cd3eSNetanel Belgazal 				      u16 entry_idx, u16 entry_value);
8131738cd3eSNetanel Belgazal 
8141738cd3eSNetanel Belgazal /* ena_com_indirect_table_set - Flush the indirection table to the device.
8151738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8161738cd3eSNetanel Belgazal  *
8171738cd3eSNetanel Belgazal  * Flush the indirection hash control to the device.
8181738cd3eSNetanel Belgazal  * Prior to this method the caller should call ena_com_indirect_table_fill_entry
8191738cd3eSNetanel Belgazal  *
8201738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
8211738cd3eSNetanel Belgazal  */
8221738cd3eSNetanel Belgazal int ena_com_indirect_table_set(struct ena_com_dev *ena_dev);
8231738cd3eSNetanel Belgazal 
8241738cd3eSNetanel Belgazal /* ena_com_indirect_table_get - Retrieve the indirection table from the device.
8251738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8261738cd3eSNetanel Belgazal  * @ind_tbl: indirection table
8271738cd3eSNetanel Belgazal  *
8281738cd3eSNetanel Belgazal  * Retrieve the RSS indirection table from the device.
8291738cd3eSNetanel Belgazal  *
8301738cd3eSNetanel Belgazal  * @note: If the caller called ena_com_indirect_table_fill_entry but didn't flash
8311738cd3eSNetanel Belgazal  * it to the device, the new configuration will be lost.
8321738cd3eSNetanel Belgazal  *
8331738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
8341738cd3eSNetanel Belgazal  */
8351738cd3eSNetanel Belgazal int ena_com_indirect_table_get(struct ena_com_dev *ena_dev, u32 *ind_tbl);
8361738cd3eSNetanel Belgazal 
8371738cd3eSNetanel Belgazal /* ena_com_allocate_host_info - Allocate host info resources.
8381738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8391738cd3eSNetanel Belgazal  *
8401738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
8411738cd3eSNetanel Belgazal  */
8421738cd3eSNetanel Belgazal int ena_com_allocate_host_info(struct ena_com_dev *ena_dev);
8431738cd3eSNetanel Belgazal 
8441738cd3eSNetanel Belgazal /* ena_com_allocate_debug_area - Allocate debug area.
8451738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8461738cd3eSNetanel Belgazal  * @debug_area_size - debug area size.
8471738cd3eSNetanel Belgazal  *
8481738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
8491738cd3eSNetanel Belgazal  */
8501738cd3eSNetanel Belgazal int ena_com_allocate_debug_area(struct ena_com_dev *ena_dev,
8511738cd3eSNetanel Belgazal 				u32 debug_area_size);
8521738cd3eSNetanel Belgazal 
8531738cd3eSNetanel Belgazal /* ena_com_delete_debug_area - Free the debug area resources.
8541738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8551738cd3eSNetanel Belgazal  *
8561738cd3eSNetanel Belgazal  * Free the allocate debug area.
8571738cd3eSNetanel Belgazal  */
8581738cd3eSNetanel Belgazal void ena_com_delete_debug_area(struct ena_com_dev *ena_dev);
8591738cd3eSNetanel Belgazal 
8601738cd3eSNetanel Belgazal /* ena_com_delete_host_info - Free the host info resources.
8611738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8621738cd3eSNetanel Belgazal  *
8631738cd3eSNetanel Belgazal  * Free the allocate host info.
8641738cd3eSNetanel Belgazal  */
8651738cd3eSNetanel Belgazal void ena_com_delete_host_info(struct ena_com_dev *ena_dev);
8661738cd3eSNetanel Belgazal 
8671738cd3eSNetanel Belgazal /* ena_com_set_host_attributes - Update the device with the host
8681738cd3eSNetanel Belgazal  * attributes (debug area and host info) base address.
8691738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8701738cd3eSNetanel Belgazal  *
8711738cd3eSNetanel Belgazal  * @return: 0 on Success and negative value otherwise.
8721738cd3eSNetanel Belgazal  */
8731738cd3eSNetanel Belgazal int ena_com_set_host_attributes(struct ena_com_dev *ena_dev);
8741738cd3eSNetanel Belgazal 
8751738cd3eSNetanel Belgazal /* ena_com_create_io_cq - Create io completion queue.
8761738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8771738cd3eSNetanel Belgazal  * @io_cq - io completion queue handler
8781738cd3eSNetanel Belgazal 
8791738cd3eSNetanel Belgazal  * Create IO completion queue.
8801738cd3eSNetanel Belgazal  *
8811738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
8821738cd3eSNetanel Belgazal  */
8831738cd3eSNetanel Belgazal int ena_com_create_io_cq(struct ena_com_dev *ena_dev,
8841738cd3eSNetanel Belgazal 			 struct ena_com_io_cq *io_cq);
8851738cd3eSNetanel Belgazal 
8861738cd3eSNetanel Belgazal /* ena_com_destroy_io_cq - Destroy io completion queue.
8871738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
8881738cd3eSNetanel Belgazal  * @io_cq - io completion queue handler
8891738cd3eSNetanel Belgazal 
8901738cd3eSNetanel Belgazal  * Destroy IO completion queue.
8911738cd3eSNetanel Belgazal  *
8921738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
8931738cd3eSNetanel Belgazal  */
8941738cd3eSNetanel Belgazal int ena_com_destroy_io_cq(struct ena_com_dev *ena_dev,
8951738cd3eSNetanel Belgazal 			  struct ena_com_io_cq *io_cq);
8961738cd3eSNetanel Belgazal 
8971738cd3eSNetanel Belgazal /* ena_com_execute_admin_command - Execute admin command
8981738cd3eSNetanel Belgazal  * @admin_queue: admin queue.
8991738cd3eSNetanel Belgazal  * @cmd: the admin command to execute.
9001738cd3eSNetanel Belgazal  * @cmd_size: the command size.
9011738cd3eSNetanel Belgazal  * @cmd_completion: command completion return value.
9021738cd3eSNetanel Belgazal  * @cmd_comp_size: command completion size.
9031738cd3eSNetanel Belgazal 
9041738cd3eSNetanel Belgazal  * Submit an admin command and then wait until the device will return a
9051738cd3eSNetanel Belgazal  * completion.
9061738cd3eSNetanel Belgazal  * The completion will be copyed into cmd_comp.
9071738cd3eSNetanel Belgazal  *
9081738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
9091738cd3eSNetanel Belgazal  */
9101738cd3eSNetanel Belgazal int ena_com_execute_admin_command(struct ena_com_admin_queue *admin_queue,
9111738cd3eSNetanel Belgazal 				  struct ena_admin_aq_entry *cmd,
9121738cd3eSNetanel Belgazal 				  size_t cmd_size,
9131738cd3eSNetanel Belgazal 				  struct ena_admin_acq_entry *cmd_comp,
9141738cd3eSNetanel Belgazal 				  size_t cmd_comp_size);
9151738cd3eSNetanel Belgazal 
9161738cd3eSNetanel Belgazal /* ena_com_init_interrupt_moderation - Init interrupt moderation
9171738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9181738cd3eSNetanel Belgazal  *
9191738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
9201738cd3eSNetanel Belgazal  */
9211738cd3eSNetanel Belgazal int ena_com_init_interrupt_moderation(struct ena_com_dev *ena_dev);
9221738cd3eSNetanel Belgazal 
9231738cd3eSNetanel Belgazal /* ena_com_destroy_interrupt_moderation - Destroy interrupt moderation resources
9241738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9251738cd3eSNetanel Belgazal  */
9261738cd3eSNetanel Belgazal void ena_com_destroy_interrupt_moderation(struct ena_com_dev *ena_dev);
9271738cd3eSNetanel Belgazal 
9281738cd3eSNetanel Belgazal /* ena_com_interrupt_moderation_supported - Return if interrupt moderation
9291738cd3eSNetanel Belgazal  * capability is supported by the device.
9301738cd3eSNetanel Belgazal  *
9311738cd3eSNetanel Belgazal  * @return - supported or not.
9321738cd3eSNetanel Belgazal  */
9331738cd3eSNetanel Belgazal bool ena_com_interrupt_moderation_supported(struct ena_com_dev *ena_dev);
9341738cd3eSNetanel Belgazal 
9351738cd3eSNetanel Belgazal /* ena_com_config_default_interrupt_moderation_table - Restore the interrupt
9361738cd3eSNetanel Belgazal  * moderation table back to the default parameters.
9371738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9381738cd3eSNetanel Belgazal  */
9391738cd3eSNetanel Belgazal void ena_com_config_default_interrupt_moderation_table(struct ena_com_dev *ena_dev);
9401738cd3eSNetanel Belgazal 
9411738cd3eSNetanel Belgazal /* ena_com_update_nonadaptive_moderation_interval_tx - Update the
9421738cd3eSNetanel Belgazal  * non-adaptive interval in Tx direction.
9431738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9441738cd3eSNetanel Belgazal  * @tx_coalesce_usecs: Interval in usec.
9451738cd3eSNetanel Belgazal  *
9461738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
9471738cd3eSNetanel Belgazal  */
9481738cd3eSNetanel Belgazal int ena_com_update_nonadaptive_moderation_interval_tx(struct ena_com_dev *ena_dev,
9491738cd3eSNetanel Belgazal 						      u32 tx_coalesce_usecs);
9501738cd3eSNetanel Belgazal 
9511738cd3eSNetanel Belgazal /* ena_com_update_nonadaptive_moderation_interval_rx - Update the
9521738cd3eSNetanel Belgazal  * non-adaptive interval in Rx direction.
9531738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9541738cd3eSNetanel Belgazal  * @rx_coalesce_usecs: Interval in usec.
9551738cd3eSNetanel Belgazal  *
9561738cd3eSNetanel Belgazal  * @return - 0 on success, negative value on failure.
9571738cd3eSNetanel Belgazal  */
9581738cd3eSNetanel Belgazal int ena_com_update_nonadaptive_moderation_interval_rx(struct ena_com_dev *ena_dev,
9591738cd3eSNetanel Belgazal 						      u32 rx_coalesce_usecs);
9601738cd3eSNetanel Belgazal 
9611738cd3eSNetanel Belgazal /* ena_com_get_nonadaptive_moderation_interval_tx - Retrieve the
9621738cd3eSNetanel Belgazal  * non-adaptive interval in Tx direction.
9631738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9641738cd3eSNetanel Belgazal  *
9651738cd3eSNetanel Belgazal  * @return - interval in usec
9661738cd3eSNetanel Belgazal  */
9671738cd3eSNetanel Belgazal unsigned int ena_com_get_nonadaptive_moderation_interval_tx(struct ena_com_dev *ena_dev);
9681738cd3eSNetanel Belgazal 
9691738cd3eSNetanel Belgazal /* ena_com_get_nonadaptive_moderation_interval_rx - Retrieve the
9701738cd3eSNetanel Belgazal  * non-adaptive interval in Rx direction.
9711738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9721738cd3eSNetanel Belgazal  *
9731738cd3eSNetanel Belgazal  * @return - interval in usec
9741738cd3eSNetanel Belgazal  */
9751738cd3eSNetanel Belgazal unsigned int ena_com_get_nonadaptive_moderation_interval_rx(struct ena_com_dev *ena_dev);
9761738cd3eSNetanel Belgazal 
9771738cd3eSNetanel Belgazal /* ena_com_init_intr_moderation_entry - Update a single entry in the interrupt
9781738cd3eSNetanel Belgazal  * moderation table.
9791738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9801738cd3eSNetanel Belgazal  * @level: Interrupt moderation table level
9811738cd3eSNetanel Belgazal  * @entry: Entry value
9821738cd3eSNetanel Belgazal  *
9831738cd3eSNetanel Belgazal  * Update a single entry in the interrupt moderation table.
9841738cd3eSNetanel Belgazal  */
9851738cd3eSNetanel Belgazal void ena_com_init_intr_moderation_entry(struct ena_com_dev *ena_dev,
9861738cd3eSNetanel Belgazal 					enum ena_intr_moder_level level,
9871738cd3eSNetanel Belgazal 					struct ena_intr_moder_entry *entry);
9881738cd3eSNetanel Belgazal 
9891738cd3eSNetanel Belgazal /* ena_com_get_intr_moderation_entry - Init ena_intr_moder_entry.
9901738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
9911738cd3eSNetanel Belgazal  * @level: Interrupt moderation table level
9921738cd3eSNetanel Belgazal  * @entry: Entry to fill.
9931738cd3eSNetanel Belgazal  *
9941738cd3eSNetanel Belgazal  * Initialize the entry according to the adaptive interrupt moderation table.
9951738cd3eSNetanel Belgazal  */
9961738cd3eSNetanel Belgazal void ena_com_get_intr_moderation_entry(struct ena_com_dev *ena_dev,
9971738cd3eSNetanel Belgazal 				       enum ena_intr_moder_level level,
9981738cd3eSNetanel Belgazal 				       struct ena_intr_moder_entry *entry);
9991738cd3eSNetanel Belgazal 
1000689b2bdaSArthur Kiyanovski /* ena_com_config_dev_mode - Configure the placement policy of the device.
1001689b2bdaSArthur Kiyanovski  * @ena_dev: ENA communication layer struct
1002689b2bdaSArthur Kiyanovski  * @llq_features: LLQ feature descriptor, retrieve via
1003689b2bdaSArthur Kiyanovski  *                ena_com_get_dev_attr_feat.
1004689b2bdaSArthur Kiyanovski  * @ena_llq_config: The default driver LLQ parameters configurations
1005689b2bdaSArthur Kiyanovski  */
1006689b2bdaSArthur Kiyanovski int ena_com_config_dev_mode(struct ena_com_dev *ena_dev,
1007689b2bdaSArthur Kiyanovski 			    struct ena_admin_feature_llq_desc *llq_features,
1008689b2bdaSArthur Kiyanovski 			    struct ena_llq_configurations *llq_default_config);
1009689b2bdaSArthur Kiyanovski 
10101738cd3eSNetanel Belgazal static inline bool ena_com_get_adaptive_moderation_enabled(struct ena_com_dev *ena_dev)
10111738cd3eSNetanel Belgazal {
10121738cd3eSNetanel Belgazal 	return ena_dev->adaptive_coalescing;
10131738cd3eSNetanel Belgazal }
10141738cd3eSNetanel Belgazal 
10151738cd3eSNetanel Belgazal static inline void ena_com_enable_adaptive_moderation(struct ena_com_dev *ena_dev)
10161738cd3eSNetanel Belgazal {
10171738cd3eSNetanel Belgazal 	ena_dev->adaptive_coalescing = true;
10181738cd3eSNetanel Belgazal }
10191738cd3eSNetanel Belgazal 
10201738cd3eSNetanel Belgazal static inline void ena_com_disable_adaptive_moderation(struct ena_com_dev *ena_dev)
10211738cd3eSNetanel Belgazal {
10221738cd3eSNetanel Belgazal 	ena_dev->adaptive_coalescing = false;
10231738cd3eSNetanel Belgazal }
10241738cd3eSNetanel Belgazal 
10251738cd3eSNetanel Belgazal /* ena_com_calculate_interrupt_delay - Calculate new interrupt delay
10261738cd3eSNetanel Belgazal  * @ena_dev: ENA communication layer struct
10271738cd3eSNetanel Belgazal  * @pkts: Number of packets since the last update
10281738cd3eSNetanel Belgazal  * @bytes: Number of bytes received since the last update.
10291738cd3eSNetanel Belgazal  * @smoothed_interval: Returned interval
10301738cd3eSNetanel Belgazal  * @moder_tbl_idx: Current table level as input update new level as return
10311738cd3eSNetanel Belgazal  * value.
10321738cd3eSNetanel Belgazal  */
10331738cd3eSNetanel Belgazal static inline void ena_com_calculate_interrupt_delay(struct ena_com_dev *ena_dev,
10341738cd3eSNetanel Belgazal 						     unsigned int pkts,
10351738cd3eSNetanel Belgazal 						     unsigned int bytes,
10361738cd3eSNetanel Belgazal 						     unsigned int *smoothed_interval,
10371738cd3eSNetanel Belgazal 						     unsigned int *moder_tbl_idx)
10381738cd3eSNetanel Belgazal {
10391738cd3eSNetanel Belgazal 	enum ena_intr_moder_level curr_moder_idx, new_moder_idx;
10401738cd3eSNetanel Belgazal 	struct ena_intr_moder_entry *curr_moder_entry;
10411738cd3eSNetanel Belgazal 	struct ena_intr_moder_entry *pred_moder_entry;
10421738cd3eSNetanel Belgazal 	struct ena_intr_moder_entry *new_moder_entry;
10431738cd3eSNetanel Belgazal 	struct ena_intr_moder_entry *intr_moder_tbl = ena_dev->intr_moder_tbl;
10441738cd3eSNetanel Belgazal 	unsigned int interval;
10451738cd3eSNetanel Belgazal 
10461738cd3eSNetanel Belgazal 	/* We apply adaptive moderation on Rx path only.
10471738cd3eSNetanel Belgazal 	 * Tx uses static interrupt moderation.
10481738cd3eSNetanel Belgazal 	 */
10491738cd3eSNetanel Belgazal 	if (!pkts || !bytes)
10501738cd3eSNetanel Belgazal 		/* Tx interrupt, or spurious interrupt,
10511738cd3eSNetanel Belgazal 		 * in both cases we just use same delay values
10521738cd3eSNetanel Belgazal 		 */
10531738cd3eSNetanel Belgazal 		return;
10541738cd3eSNetanel Belgazal 
10551738cd3eSNetanel Belgazal 	curr_moder_idx = (enum ena_intr_moder_level)(*moder_tbl_idx);
10561738cd3eSNetanel Belgazal 	if (unlikely(curr_moder_idx >= ENA_INTR_MAX_NUM_OF_LEVELS)) {
10571738cd3eSNetanel Belgazal 		pr_err("Wrong moderation index %u\n", curr_moder_idx);
10581738cd3eSNetanel Belgazal 		return;
10591738cd3eSNetanel Belgazal 	}
10601738cd3eSNetanel Belgazal 
10611738cd3eSNetanel Belgazal 	curr_moder_entry = &intr_moder_tbl[curr_moder_idx];
10621738cd3eSNetanel Belgazal 	new_moder_idx = curr_moder_idx;
10631738cd3eSNetanel Belgazal 
10641738cd3eSNetanel Belgazal 	if (curr_moder_idx == ENA_INTR_MODER_LOWEST) {
10651738cd3eSNetanel Belgazal 		if ((pkts > curr_moder_entry->pkts_per_interval) ||
10661738cd3eSNetanel Belgazal 		    (bytes > curr_moder_entry->bytes_per_interval))
10671738cd3eSNetanel Belgazal 			new_moder_idx =
10681738cd3eSNetanel Belgazal 				(enum ena_intr_moder_level)(curr_moder_idx + ENA_INTR_MODER_LEVEL_STRIDE);
10691738cd3eSNetanel Belgazal 	} else {
10701738cd3eSNetanel Belgazal 		pred_moder_entry = &intr_moder_tbl[curr_moder_idx - ENA_INTR_MODER_LEVEL_STRIDE];
10711738cd3eSNetanel Belgazal 
10721738cd3eSNetanel Belgazal 		if ((pkts <= pred_moder_entry->pkts_per_interval) ||
10731738cd3eSNetanel Belgazal 		    (bytes <= pred_moder_entry->bytes_per_interval))
10741738cd3eSNetanel Belgazal 			new_moder_idx =
10751738cd3eSNetanel Belgazal 				(enum ena_intr_moder_level)(curr_moder_idx - ENA_INTR_MODER_LEVEL_STRIDE);
10761738cd3eSNetanel Belgazal 		else if ((pkts > curr_moder_entry->pkts_per_interval) ||
10771738cd3eSNetanel Belgazal 			 (bytes > curr_moder_entry->bytes_per_interval)) {
10781738cd3eSNetanel Belgazal 			if (curr_moder_idx != ENA_INTR_MODER_HIGHEST)
10791738cd3eSNetanel Belgazal 				new_moder_idx =
10801738cd3eSNetanel Belgazal 					(enum ena_intr_moder_level)(curr_moder_idx + ENA_INTR_MODER_LEVEL_STRIDE);
10811738cd3eSNetanel Belgazal 		}
10821738cd3eSNetanel Belgazal 	}
10831738cd3eSNetanel Belgazal 	new_moder_entry = &intr_moder_tbl[new_moder_idx];
10841738cd3eSNetanel Belgazal 
10851738cd3eSNetanel Belgazal 	interval = new_moder_entry->intr_moder_interval;
10861738cd3eSNetanel Belgazal 	*smoothed_interval = (
10871738cd3eSNetanel Belgazal 		(interval * ENA_INTR_DELAY_NEW_VALUE_WEIGHT +
10881738cd3eSNetanel Belgazal 		ENA_INTR_DELAY_OLD_VALUE_WEIGHT * (*smoothed_interval)) + 5) /
10891738cd3eSNetanel Belgazal 		10;
10901738cd3eSNetanel Belgazal 
10911738cd3eSNetanel Belgazal 	*moder_tbl_idx = new_moder_idx;
10921738cd3eSNetanel Belgazal }
10931738cd3eSNetanel Belgazal 
10941738cd3eSNetanel Belgazal /* ena_com_update_intr_reg - Prepare interrupt register
10951738cd3eSNetanel Belgazal  * @intr_reg: interrupt register to update.
10961738cd3eSNetanel Belgazal  * @rx_delay_interval: Rx interval in usecs
10971738cd3eSNetanel Belgazal  * @tx_delay_interval: Tx interval in usecs
10981738cd3eSNetanel Belgazal  * @unmask: unask enable/disable
10991738cd3eSNetanel Belgazal  *
11001738cd3eSNetanel Belgazal  * Prepare interrupt update register with the supplied parameters.
11011738cd3eSNetanel Belgazal  */
11021738cd3eSNetanel Belgazal static inline void ena_com_update_intr_reg(struct ena_eth_io_intr_reg *intr_reg,
11031738cd3eSNetanel Belgazal 					   u32 rx_delay_interval,
11041738cd3eSNetanel Belgazal 					   u32 tx_delay_interval,
11051738cd3eSNetanel Belgazal 					   bool unmask)
11061738cd3eSNetanel Belgazal {
11071738cd3eSNetanel Belgazal 	intr_reg->intr_control = 0;
11081738cd3eSNetanel Belgazal 	intr_reg->intr_control |= rx_delay_interval &
11091738cd3eSNetanel Belgazal 		ENA_ETH_IO_INTR_REG_RX_INTR_DELAY_MASK;
11101738cd3eSNetanel Belgazal 
11111738cd3eSNetanel Belgazal 	intr_reg->intr_control |=
11121738cd3eSNetanel Belgazal 		(tx_delay_interval << ENA_ETH_IO_INTR_REG_TX_INTR_DELAY_SHIFT)
11131738cd3eSNetanel Belgazal 		& ENA_ETH_IO_INTR_REG_TX_INTR_DELAY_MASK;
11141738cd3eSNetanel Belgazal 
11151738cd3eSNetanel Belgazal 	if (unmask)
11161738cd3eSNetanel Belgazal 		intr_reg->intr_control |= ENA_ETH_IO_INTR_REG_INTR_UNMASK_MASK;
11171738cd3eSNetanel Belgazal }
11181738cd3eSNetanel Belgazal 
1119689b2bdaSArthur Kiyanovski static inline u8 *ena_com_get_next_bounce_buffer(struct ena_com_io_bounce_buffer_control *bounce_buf_ctrl)
1120689b2bdaSArthur Kiyanovski {
1121689b2bdaSArthur Kiyanovski 	u16 size, buffers_num;
1122689b2bdaSArthur Kiyanovski 	u8 *buf;
1123689b2bdaSArthur Kiyanovski 
1124689b2bdaSArthur Kiyanovski 	size = bounce_buf_ctrl->buffer_size;
1125689b2bdaSArthur Kiyanovski 	buffers_num = bounce_buf_ctrl->buffers_num;
1126689b2bdaSArthur Kiyanovski 
1127689b2bdaSArthur Kiyanovski 	buf = bounce_buf_ctrl->base_buffer +
1128689b2bdaSArthur Kiyanovski 		(bounce_buf_ctrl->next_to_use++ & (buffers_num - 1)) * size;
1129689b2bdaSArthur Kiyanovski 
1130689b2bdaSArthur Kiyanovski 	prefetchw(bounce_buf_ctrl->base_buffer +
1131689b2bdaSArthur Kiyanovski 		(bounce_buf_ctrl->next_to_use & (buffers_num - 1)) * size);
1132689b2bdaSArthur Kiyanovski 
1133689b2bdaSArthur Kiyanovski 	return buf;
1134689b2bdaSArthur Kiyanovski }
1135689b2bdaSArthur Kiyanovski 
11361738cd3eSNetanel Belgazal #endif /* !(ENA_COM) */
1137