1 1.1 jdolecek /*- 2 1.1 jdolecek * BSD LICENSE 3 1.1 jdolecek * 4 1.1 jdolecek * Copyright (c) 2015-2017 Amazon.com, Inc. or its affiliates. 5 1.1 jdolecek * All rights reserved. 6 1.1 jdolecek * 7 1.1 jdolecek * Redistribution and use in source and binary forms, with or without 8 1.1 jdolecek * modification, are permitted provided that the following conditions 9 1.1 jdolecek * are met: 10 1.1 jdolecek * 11 1.1 jdolecek * * Redistributions of source code must retain the above copyright 12 1.1 jdolecek * notice, this list of conditions and the following disclaimer. 13 1.1 jdolecek * * Redistributions in binary form must reproduce the above copyright 14 1.1 jdolecek * notice, this list of conditions and the following disclaimer in 15 1.1 jdolecek * the documentation and/or other materials provided with the 16 1.1 jdolecek * distribution. 17 1.1 jdolecek * * Neither the name of copyright holder nor the names of its 18 1.1 jdolecek * contributors may be used to endorse or promote products derived 19 1.1 jdolecek * from this software without specific prior written permission. 20 1.1 jdolecek * 21 1.1 jdolecek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 1.1 jdolecek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 1.1 jdolecek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 1.1 jdolecek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 1.1 jdolecek * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 1.1 jdolecek * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 1.1 jdolecek * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 1.1 jdolecek * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 1.1 jdolecek * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 1.1 jdolecek * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 1.1 jdolecek * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 1.1 jdolecek */ 33 1.1 jdolecek 34 1.1 jdolecek #ifndef ENA_COM 35 1.1 jdolecek #define ENA_COM 36 1.1 jdolecek 37 1.1 jdolecek #ifndef ENA_INTERNAL 38 1.1 jdolecek #include "ena_plat.h" 39 1.1 jdolecek #else 40 1.1 jdolecek #include "ena_plat.h" 41 1.1 jdolecek #include "ena_includes.h" 42 1.1 jdolecek #endif 43 1.1 jdolecek 44 1.1 jdolecek #define ENA_MAX_NUM_IO_QUEUES 128U 45 1.1 jdolecek /* We need to queues for each IO (on for Tx and one for Rx) */ 46 1.1 jdolecek #define ENA_TOTAL_NUM_QUEUES (2 * (ENA_MAX_NUM_IO_QUEUES)) 47 1.1 jdolecek 48 1.1 jdolecek #define ENA_MAX_HANDLERS 256 49 1.1 jdolecek 50 1.1 jdolecek #define ENA_MAX_PHYS_ADDR_SIZE_BITS 48 51 1.1 jdolecek 52 1.1 jdolecek /* Unit in usec */ 53 1.1 jdolecek #define ENA_REG_READ_TIMEOUT 200000 54 1.1 jdolecek 55 1.1 jdolecek #define ADMIN_SQ_SIZE(depth) ((depth) * sizeof(struct ena_admin_aq_entry)) 56 1.1 jdolecek #define ADMIN_CQ_SIZE(depth) ((depth) * sizeof(struct ena_admin_acq_entry)) 57 1.1 jdolecek #define ADMIN_AENQ_SIZE(depth) ((depth) * sizeof(struct ena_admin_aenq_entry)) 58 1.1 jdolecek 59 1.1 jdolecek /*****************************************************************************/ 60 1.1 jdolecek /*****************************************************************************/ 61 1.1 jdolecek /* ENA adaptive interrupt moderation settings */ 62 1.1 jdolecek 63 1.1 jdolecek #define ENA_INTR_LOWEST_USECS (0) 64 1.1 jdolecek #define ENA_INTR_LOWEST_PKTS (3) 65 1.1 jdolecek #define ENA_INTR_LOWEST_BYTES (2 * 1524) 66 1.1 jdolecek 67 1.1 jdolecek #define ENA_INTR_LOW_USECS (32) 68 1.1 jdolecek #define ENA_INTR_LOW_PKTS (12) 69 1.1 jdolecek #define ENA_INTR_LOW_BYTES (16 * 1024) 70 1.1 jdolecek 71 1.1 jdolecek #define ENA_INTR_MID_USECS (80) 72 1.1 jdolecek #define ENA_INTR_MID_PKTS (48) 73 1.1 jdolecek #define ENA_INTR_MID_BYTES (64 * 1024) 74 1.1 jdolecek 75 1.1 jdolecek #define ENA_INTR_HIGH_USECS (128) 76 1.1 jdolecek #define ENA_INTR_HIGH_PKTS (96) 77 1.1 jdolecek #define ENA_INTR_HIGH_BYTES (128 * 1024) 78 1.1 jdolecek 79 1.1 jdolecek #define ENA_INTR_HIGHEST_USECS (192) 80 1.1 jdolecek #define ENA_INTR_HIGHEST_PKTS (128) 81 1.1 jdolecek #define ENA_INTR_HIGHEST_BYTES (192 * 1024) 82 1.1 jdolecek 83 1.1 jdolecek #define ENA_INTR_INITIAL_TX_INTERVAL_USECS 196 84 1.1 jdolecek #define ENA_INTR_INITIAL_RX_INTERVAL_USECS 4 85 1.1 jdolecek #define ENA_INTR_DELAY_OLD_VALUE_WEIGHT 6 86 1.1 jdolecek #define ENA_INTR_DELAY_NEW_VALUE_WEIGHT 4 87 1.1 jdolecek #define ENA_INTR_MODER_LEVEL_STRIDE 1 88 1.1 jdolecek #define ENA_INTR_BYTE_COUNT_NOT_SUPPORTED 0xFFFFFF 89 1.1 jdolecek 90 1.1 jdolecek #define ENA_HW_HINTS_NO_TIMEOUT 0xFFFF 91 1.1 jdolecek 92 1.1 jdolecek enum ena_intr_moder_level { 93 1.1 jdolecek ENA_INTR_MODER_LOWEST = 0, 94 1.1 jdolecek ENA_INTR_MODER_LOW, 95 1.1 jdolecek ENA_INTR_MODER_MID, 96 1.1 jdolecek ENA_INTR_MODER_HIGH, 97 1.1 jdolecek ENA_INTR_MODER_HIGHEST, 98 1.1 jdolecek ENA_INTR_MAX_NUM_OF_LEVELS, 99 1.1 jdolecek }; 100 1.1 jdolecek 101 1.1 jdolecek struct ena_intr_moder_entry { 102 1.1 jdolecek unsigned int intr_moder_interval; 103 1.1 jdolecek unsigned int pkts_per_interval; 104 1.1 jdolecek unsigned int bytes_per_interval; 105 1.1 jdolecek }; 106 1.1 jdolecek 107 1.1 jdolecek enum queue_direction { 108 1.1 jdolecek ENA_COM_IO_QUEUE_DIRECTION_TX, 109 1.1 jdolecek ENA_COM_IO_QUEUE_DIRECTION_RX 110 1.1 jdolecek }; 111 1.1 jdolecek 112 1.1 jdolecek struct ena_com_buf { 113 1.1 jdolecek dma_addr_t paddr; /**< Buffer physical address */ 114 1.1 jdolecek u16 len; /**< Buffer length in bytes */ 115 1.1 jdolecek }; 116 1.1 jdolecek 117 1.1 jdolecek struct ena_com_rx_buf_info { 118 1.1 jdolecek u16 len; 119 1.1 jdolecek u16 req_id; 120 1.1 jdolecek }; 121 1.1 jdolecek 122 1.1 jdolecek struct ena_com_io_desc_addr { 123 1.1 jdolecek u8 __iomem *pbuf_dev_addr; /* LLQ address */ 124 1.1 jdolecek u8 *virt_addr; 125 1.1 jdolecek dma_addr_t phys_addr; 126 1.1 jdolecek ena_mem_handle_t mem_handle; 127 1.1 jdolecek }; 128 1.1 jdolecek 129 1.1 jdolecek struct ena_com_tx_meta { 130 1.1 jdolecek u16 mss; 131 1.1 jdolecek u16 l3_hdr_len; 132 1.1 jdolecek u16 l3_hdr_offset; 133 1.1 jdolecek u16 l4_hdr_len; /* In words */ 134 1.1 jdolecek }; 135 1.1 jdolecek 136 1.1 jdolecek struct ena_com_llq_info { 137 1.1 jdolecek bool inline_header; 138 1.1 jdolecek u16 desc_stride_ctrl; 139 1.1 jdolecek 140 1.1 jdolecek u16 desc_list_entry_size; 141 1.1 jdolecek u16 descs_num_before_header; 142 1.1 jdolecek u16 descs_per_entry; 143 1.1 jdolecek }; 144 1.1 jdolecek 145 1.1 jdolecek struct ena_com_io_cq { 146 1.1 jdolecek struct ena_com_io_desc_addr cdesc_addr; 147 1.1 jdolecek void *bus; 148 1.1 jdolecek 149 1.1 jdolecek /* Interrupt unmask register */ 150 1.1 jdolecek u32 __iomem *unmask_reg; 151 1.1 jdolecek 152 1.1 jdolecek /* The completion queue head doorbell register */ 153 1.1 jdolecek u32 __iomem *cq_head_db_reg; 154 1.1 jdolecek 155 1.1 jdolecek /* numa configuration register (for TPH) */ 156 1.1 jdolecek u32 __iomem *numa_node_cfg_reg; 157 1.1 jdolecek 158 1.1 jdolecek /* The value to write to the above register to unmask 159 1.1 jdolecek * the interrupt of this queue 160 1.1 jdolecek */ 161 1.1 jdolecek u32 msix_vector; 162 1.1 jdolecek 163 1.1 jdolecek enum queue_direction direction; 164 1.1 jdolecek 165 1.1 jdolecek /* holds the number of cdesc of the current packet */ 166 1.1 jdolecek u16 cur_rx_pkt_cdesc_count; 167 1.1 jdolecek /* save the firt cdesc idx of the current packet */ 168 1.1 jdolecek u16 cur_rx_pkt_cdesc_start_idx; 169 1.1 jdolecek 170 1.1 jdolecek u16 q_depth; 171 1.1 jdolecek /* Caller qid */ 172 1.1 jdolecek u16 qid; 173 1.1 jdolecek 174 1.1 jdolecek /* Device queue index */ 175 1.1 jdolecek u16 idx; 176 1.1 jdolecek u16 head; 177 1.1 jdolecek u16 last_head_update; 178 1.1 jdolecek u8 phase; 179 1.1 jdolecek u8 cdesc_entry_size_in_bytes; 180 1.1 jdolecek 181 1.1 jdolecek } ____cacheline_aligned; 182 1.1 jdolecek 183 1.1 jdolecek struct ena_com_io_bounce_buffer_control { 184 1.1 jdolecek u8 *base_buffer; 185 1.1 jdolecek u16 next_to_use; 186 1.1 jdolecek u16 buffer_size; 187 1.1 jdolecek u16 buffers_num; /* Must be a power of 2 */ 188 1.1 jdolecek }; 189 1.1 jdolecek 190 1.1 jdolecek /* This struct is to keep tracking the current location of the next llq entry */ 191 1.1 jdolecek struct ena_com_llq_pkt_ctrl { 192 1.1 jdolecek u8 *curr_bounce_buf; 193 1.1 jdolecek u16 idx; 194 1.1 jdolecek u16 descs_left_in_line; 195 1.1 jdolecek }; 196 1.1 jdolecek 197 1.1 jdolecek struct ena_com_io_sq { 198 1.1 jdolecek struct ena_com_io_desc_addr desc_addr; 199 1.1 jdolecek void *bus; 200 1.1 jdolecek 201 1.1 jdolecek u32 __iomem *db_addr; 202 1.1 jdolecek u8 __iomem *header_addr; 203 1.1 jdolecek 204 1.1 jdolecek enum queue_direction direction; 205 1.1 jdolecek enum ena_admin_placement_policy_type mem_queue_type; 206 1.1 jdolecek 207 1.1 jdolecek u32 msix_vector; 208 1.1 jdolecek struct ena_com_tx_meta cached_tx_meta; 209 1.1 jdolecek struct ena_com_llq_info llq_info; 210 1.1 jdolecek struct ena_com_llq_pkt_ctrl llq_buf_ctrl; 211 1.1 jdolecek struct ena_com_io_bounce_buffer_control bounce_buf_ctrl; 212 1.1 jdolecek 213 1.1 jdolecek u16 q_depth; 214 1.1 jdolecek u16 qid; 215 1.1 jdolecek 216 1.1 jdolecek u16 idx; 217 1.1 jdolecek u16 tail; 218 1.1 jdolecek u16 next_to_comp; 219 1.1 jdolecek u16 llq_last_copy_tail; 220 1.1 jdolecek u32 tx_max_header_size; 221 1.1 jdolecek u8 phase; 222 1.1 jdolecek u8 desc_entry_size; 223 1.1 jdolecek u8 dma_addr_bits; 224 1.1 jdolecek } ____cacheline_aligned; 225 1.1 jdolecek 226 1.1 jdolecek struct ena_com_admin_cq { 227 1.1 jdolecek struct ena_admin_acq_entry *entries; 228 1.1 jdolecek ena_mem_handle_t mem_handle; 229 1.1 jdolecek dma_addr_t dma_addr; 230 1.1 jdolecek 231 1.1 jdolecek u16 head; 232 1.1 jdolecek u8 phase; 233 1.1 jdolecek }; 234 1.1 jdolecek 235 1.1 jdolecek struct ena_com_admin_sq { 236 1.1 jdolecek struct ena_admin_aq_entry *entries; 237 1.1 jdolecek ena_mem_handle_t mem_handle; 238 1.1 jdolecek dma_addr_t dma_addr; 239 1.1 jdolecek 240 1.1 jdolecek u32 __iomem *db_addr; 241 1.1 jdolecek 242 1.1 jdolecek u16 head; 243 1.1 jdolecek u16 tail; 244 1.1 jdolecek u8 phase; 245 1.1 jdolecek 246 1.1 jdolecek }; 247 1.1 jdolecek 248 1.1 jdolecek struct ena_com_stats_admin { 249 1.1 jdolecek u32 aborted_cmd; 250 1.1 jdolecek u32 submitted_cmd; 251 1.1 jdolecek u32 completed_cmd; 252 1.1 jdolecek u32 out_of_space; 253 1.1 jdolecek u32 no_completion; 254 1.1 jdolecek }; 255 1.1 jdolecek 256 1.1 jdolecek struct ena_com_admin_queue { 257 1.1 jdolecek void *q_dmadev; 258 1.1 jdolecek void *bus; 259 1.1 jdolecek ena_spinlock_t q_lock; /* spinlock for the admin queue */ 260 1.1 jdolecek 261 1.1 jdolecek struct ena_comp_ctx *comp_ctx; 262 1.1 jdolecek u32 completion_timeout; 263 1.1 jdolecek u16 q_depth; 264 1.1 jdolecek struct ena_com_admin_cq cq; 265 1.1 jdolecek struct ena_com_admin_sq sq; 266 1.1 jdolecek 267 1.1 jdolecek /* Indicate if the admin queue should poll for completion */ 268 1.1 jdolecek bool polling; 269 1.1 jdolecek 270 1.1 jdolecek u16 curr_cmd_id; 271 1.1 jdolecek 272 1.1 jdolecek /* Indicate that the ena was initialized and can 273 1.1 jdolecek * process new admin commands 274 1.1 jdolecek */ 275 1.1 jdolecek bool running_state; 276 1.1 jdolecek 277 1.1 jdolecek /* Count the number of outstanding admin commands */ 278 1.1 jdolecek ena_atomic32_t outstanding_cmds; 279 1.1 jdolecek 280 1.1 jdolecek struct ena_com_stats_admin stats; 281 1.1 jdolecek }; 282 1.1 jdolecek 283 1.1 jdolecek struct ena_aenq_handlers; 284 1.1 jdolecek 285 1.1 jdolecek struct ena_com_aenq { 286 1.1 jdolecek u16 head; 287 1.1 jdolecek u8 phase; 288 1.1 jdolecek struct ena_admin_aenq_entry *entries; 289 1.1 jdolecek dma_addr_t dma_addr; 290 1.1 jdolecek ena_mem_handle_t mem_handle; 291 1.1 jdolecek u16 q_depth; 292 1.1 jdolecek struct ena_aenq_handlers *aenq_handlers; 293 1.1 jdolecek }; 294 1.1 jdolecek 295 1.1 jdolecek struct ena_com_mmio_read { 296 1.1 jdolecek struct ena_admin_ena_mmio_req_read_less_resp *read_resp; 297 1.1 jdolecek dma_addr_t read_resp_dma_addr; 298 1.1 jdolecek ena_mem_handle_t read_resp_mem_handle; 299 1.1 jdolecek u32 reg_read_to; /* in us */ 300 1.1 jdolecek u16 seq_num; 301 1.1 jdolecek bool readless_supported; 302 1.1 jdolecek /* spin lock to ensure a single outstanding read */ 303 1.1 jdolecek ena_spinlock_t lock; 304 1.1 jdolecek }; 305 1.1 jdolecek 306 1.1 jdolecek struct ena_rss { 307 1.1 jdolecek /* Indirect table */ 308 1.1 jdolecek u16 *host_rss_ind_tbl; 309 1.2 jdolecek size_t host_rss_ind_tbl_size; 310 1.1 jdolecek struct ena_admin_rss_ind_table_entry *rss_ind_tbl; 311 1.1 jdolecek dma_addr_t rss_ind_tbl_dma_addr; 312 1.1 jdolecek ena_mem_handle_t rss_ind_tbl_mem_handle; 313 1.1 jdolecek u16 tbl_log_size; 314 1.1 jdolecek 315 1.1 jdolecek /* Hash key */ 316 1.1 jdolecek enum ena_admin_hash_functions hash_func; 317 1.1 jdolecek struct ena_admin_feature_rss_flow_hash_control *hash_key; 318 1.1 jdolecek dma_addr_t hash_key_dma_addr; 319 1.1 jdolecek ena_mem_handle_t hash_key_mem_handle; 320 1.1 jdolecek u32 hash_init_val; 321 1.1 jdolecek 322 1.1 jdolecek /* Flow Control */ 323 1.1 jdolecek struct ena_admin_feature_rss_hash_control *hash_ctrl; 324 1.1 jdolecek dma_addr_t hash_ctrl_dma_addr; 325 1.1 jdolecek ena_mem_handle_t hash_ctrl_mem_handle; 326 1.1 jdolecek 327 1.1 jdolecek }; 328 1.1 jdolecek 329 1.1 jdolecek struct ena_host_attribute { 330 1.1 jdolecek /* Debug area */ 331 1.1 jdolecek u8 *debug_area_virt_addr; 332 1.1 jdolecek dma_addr_t debug_area_dma_addr; 333 1.1 jdolecek ena_mem_handle_t debug_area_dma_handle; 334 1.1 jdolecek u32 debug_area_size; 335 1.1 jdolecek 336 1.1 jdolecek /* Host information */ 337 1.1 jdolecek struct ena_admin_host_info *host_info; 338 1.1 jdolecek dma_addr_t host_info_dma_addr; 339 1.1 jdolecek ena_mem_handle_t host_info_dma_handle; 340 1.1 jdolecek }; 341 1.1 jdolecek 342 1.1 jdolecek /* Each ena_dev is a PCI function. */ 343 1.1 jdolecek struct ena_com_dev { 344 1.1 jdolecek struct ena_com_admin_queue admin_queue; 345 1.1 jdolecek struct ena_com_aenq aenq; 346 1.1 jdolecek struct ena_com_io_cq io_cq_queues[ENA_TOTAL_NUM_QUEUES]; 347 1.1 jdolecek struct ena_com_io_sq io_sq_queues[ENA_TOTAL_NUM_QUEUES]; 348 1.1 jdolecek u8 __iomem *reg_bar; 349 1.1 jdolecek void __iomem *mem_bar; 350 1.1 jdolecek void *dmadev; 351 1.1 jdolecek void *bus; 352 1.1 jdolecek 353 1.1 jdolecek enum ena_admin_placement_policy_type tx_mem_queue_type; 354 1.1 jdolecek u32 tx_max_header_size; 355 1.1 jdolecek u16 stats_func; /* Selected function for extended statistic dump */ 356 1.1 jdolecek u16 stats_queue; /* Selected queue for extended statistic dump */ 357 1.1 jdolecek 358 1.1 jdolecek struct ena_com_mmio_read mmio_read; 359 1.1 jdolecek 360 1.1 jdolecek struct ena_rss rss; 361 1.1 jdolecek u32 supported_features; 362 1.1 jdolecek u32 dma_addr_bits; 363 1.1 jdolecek 364 1.1 jdolecek struct ena_host_attribute host_attr; 365 1.1 jdolecek bool adaptive_coalescing; 366 1.1 jdolecek u16 intr_delay_resolution; 367 1.1 jdolecek u32 intr_moder_tx_interval; 368 1.1 jdolecek struct ena_intr_moder_entry *intr_moder_tbl; 369 1.1 jdolecek 370 1.1 jdolecek struct ena_com_llq_info llq_info; 371 1.1 jdolecek }; 372 1.1 jdolecek 373 1.1 jdolecek struct ena_com_dev_get_features_ctx { 374 1.1 jdolecek struct ena_admin_queue_feature_desc max_queues; 375 1.1 jdolecek struct ena_admin_device_attr_feature_desc dev_attr; 376 1.1 jdolecek struct ena_admin_feature_aenq_desc aenq; 377 1.1 jdolecek struct ena_admin_feature_offload_desc offload; 378 1.1 jdolecek struct ena_admin_ena_hw_hints hw_hints; 379 1.1 jdolecek struct ena_admin_feature_llq_desc llq; 380 1.1 jdolecek }; 381 1.1 jdolecek 382 1.1 jdolecek struct ena_com_create_io_ctx { 383 1.1 jdolecek enum ena_admin_placement_policy_type mem_queue_type; 384 1.1 jdolecek enum queue_direction direction; 385 1.1 jdolecek int numa_node; 386 1.1 jdolecek u32 msix_vector; 387 1.1 jdolecek u16 queue_size; 388 1.1 jdolecek u16 qid; 389 1.1 jdolecek }; 390 1.1 jdolecek 391 1.1 jdolecek typedef void (*ena_aenq_handler)(void *data, 392 1.1 jdolecek struct ena_admin_aenq_entry *aenq_e); 393 1.1 jdolecek 394 1.1 jdolecek /* Holds aenq handlers. Indexed by AENQ event group */ 395 1.1 jdolecek struct ena_aenq_handlers { 396 1.1 jdolecek ena_aenq_handler handlers[ENA_MAX_HANDLERS]; 397 1.1 jdolecek ena_aenq_handler unimplemented_handler; 398 1.1 jdolecek }; 399 1.1 jdolecek 400 1.1 jdolecek /*****************************************************************************/ 401 1.1 jdolecek /*****************************************************************************/ 402 1.1 jdolecek #if defined(__cplusplus) 403 1.1 jdolecek extern "C" { 404 1.1 jdolecek #endif 405 1.1 jdolecek 406 1.1 jdolecek /* ena_com_mmio_reg_read_request_init - Init the mmio reg read mechanism 407 1.1 jdolecek * @ena_dev: ENA communication layer struct 408 1.1 jdolecek * 409 1.1 jdolecek * Initialize the register read mechanism. 410 1.1 jdolecek * 411 1.1 jdolecek * @note: This method must be the first stage in the initialization sequence. 412 1.1 jdolecek * 413 1.1 jdolecek * @return - 0 on success, negative value on failure. 414 1.1 jdolecek */ 415 1.1 jdolecek int ena_com_mmio_reg_read_request_init(struct ena_com_dev *ena_dev); 416 1.1 jdolecek 417 1.1 jdolecek /* ena_com_set_mmio_read_mode - Enable/disable the mmio reg read mechanism 418 1.1 jdolecek * @ena_dev: ENA communication layer struct 419 1.1 jdolecek * @readless_supported: readless mode (enable/disable) 420 1.1 jdolecek */ 421 1.1 jdolecek void ena_com_set_mmio_read_mode(struct ena_com_dev *ena_dev, 422 1.1 jdolecek bool readless_supported); 423 1.1 jdolecek 424 1.1 jdolecek /* ena_com_mmio_reg_read_request_write_dev_addr - Write the mmio reg read return 425 1.1 jdolecek * value physical address. 426 1.1 jdolecek * @ena_dev: ENA communication layer struct 427 1.1 jdolecek */ 428 1.1 jdolecek void ena_com_mmio_reg_read_request_write_dev_addr(struct ena_com_dev *ena_dev); 429 1.1 jdolecek 430 1.1 jdolecek /* ena_com_mmio_reg_read_request_destroy - Destroy the mmio reg read mechanism 431 1.1 jdolecek * @ena_dev: ENA communication layer struct 432 1.1 jdolecek */ 433 1.1 jdolecek void ena_com_mmio_reg_read_request_destroy(struct ena_com_dev *ena_dev); 434 1.1 jdolecek 435 1.1 jdolecek /* ena_com_admin_init - Init the admin and the async queues 436 1.1 jdolecek * @ena_dev: ENA communication layer struct 437 1.1 jdolecek * @aenq_handlers: Those handlers to be called upon event. 438 1.1 jdolecek * @init_spinlock: Indicate if this method should init the admin spinlock or 439 1.1 jdolecek * the spinlock was init before (for example, in a case of FLR). 440 1.1 jdolecek * 441 1.1 jdolecek * Initialize the admin submission and completion queues. 442 1.1 jdolecek * Initialize the asynchronous events notification queues. 443 1.1 jdolecek * 444 1.1 jdolecek * @return - 0 on success, negative value on failure. 445 1.1 jdolecek */ 446 1.1 jdolecek int ena_com_admin_init(struct ena_com_dev *ena_dev, 447 1.1 jdolecek struct ena_aenq_handlers *aenq_handlers, 448 1.1 jdolecek bool init_spinlock); 449 1.1 jdolecek 450 1.1 jdolecek /* ena_com_admin_destroy - Destroy the admin and the async events queues. 451 1.1 jdolecek * @ena_dev: ENA communication layer struct 452 1.1 jdolecek * 453 1.1 jdolecek * @note: Before calling this method, the caller must validate that the device 454 1.1 jdolecek * won't send any additional admin completions/aenq. 455 1.1 jdolecek * To achieve that, a FLR is recommended. 456 1.1 jdolecek */ 457 1.1 jdolecek void ena_com_admin_destroy(struct ena_com_dev *ena_dev); 458 1.1 jdolecek 459 1.1 jdolecek /* ena_com_dev_reset - Perform device FLR to the device. 460 1.1 jdolecek * @ena_dev: ENA communication layer struct 461 1.1 jdolecek * @reset_reason: Specify what is the trigger for the reset in case of an error. 462 1.1 jdolecek * 463 1.1 jdolecek * @return - 0 on success, negative value on failure. 464 1.1 jdolecek */ 465 1.1 jdolecek int ena_com_dev_reset(struct ena_com_dev *ena_dev, 466 1.1 jdolecek enum ena_regs_reset_reason_types reset_reason); 467 1.1 jdolecek 468 1.1 jdolecek /* ena_com_create_io_queue - Create io queue. 469 1.1 jdolecek * @ena_dev: ENA communication layer struct 470 1.1 jdolecek * @ctx - create context structure 471 1.1 jdolecek * 472 1.1 jdolecek * Create the submission and the completion queues. 473 1.1 jdolecek * 474 1.1 jdolecek * @return - 0 on success, negative value on failure. 475 1.1 jdolecek */ 476 1.1 jdolecek int ena_com_create_io_queue(struct ena_com_dev *ena_dev, 477 1.1 jdolecek struct ena_com_create_io_ctx *ctx); 478 1.1 jdolecek 479 1.1 jdolecek /* ena_com_destroy_io_queue - Destroy IO queue with the queue id - qid. 480 1.1 jdolecek * @ena_dev: ENA communication layer struct 481 1.1 jdolecek * @qid - the caller virtual queue id. 482 1.1 jdolecek */ 483 1.1 jdolecek void ena_com_destroy_io_queue(struct ena_com_dev *ena_dev, u16 qid); 484 1.1 jdolecek 485 1.1 jdolecek /* ena_com_get_io_handlers - Return the io queue handlers 486 1.1 jdolecek * @ena_dev: ENA communication layer struct 487 1.1 jdolecek * @qid - the caller virtual queue id. 488 1.1 jdolecek * @io_sq - IO submission queue handler 489 1.1 jdolecek * @io_cq - IO completion queue handler. 490 1.1 jdolecek * 491 1.1 jdolecek * @return - 0 on success, negative value on failure. 492 1.1 jdolecek */ 493 1.1 jdolecek int ena_com_get_io_handlers(struct ena_com_dev *ena_dev, u16 qid, 494 1.1 jdolecek struct ena_com_io_sq **io_sq, 495 1.1 jdolecek struct ena_com_io_cq **io_cq); 496 1.1 jdolecek 497 1.1 jdolecek /* ena_com_admin_aenq_enable - ENAble asynchronous event notifications 498 1.1 jdolecek * @ena_dev: ENA communication layer struct 499 1.1 jdolecek * 500 1.1 jdolecek * After this method, aenq event can be received via AENQ. 501 1.1 jdolecek */ 502 1.1 jdolecek void ena_com_admin_aenq_enable(struct ena_com_dev *ena_dev); 503 1.1 jdolecek 504 1.1 jdolecek /* ena_com_set_admin_running_state - Set the state of the admin queue 505 1.1 jdolecek * @ena_dev: ENA communication layer struct 506 1.1 jdolecek * 507 1.1 jdolecek * Change the state of the admin queue (enable/disable) 508 1.1 jdolecek */ 509 1.1 jdolecek void ena_com_set_admin_running_state(struct ena_com_dev *ena_dev, bool state); 510 1.1 jdolecek 511 1.1 jdolecek /* ena_com_get_admin_running_state - Get the admin queue state 512 1.1 jdolecek * @ena_dev: ENA communication layer struct 513 1.1 jdolecek * 514 1.1 jdolecek * Retrieve the state of the admin queue (enable/disable) 515 1.1 jdolecek * 516 1.1 jdolecek * @return - current polling mode (enable/disable) 517 1.1 jdolecek */ 518 1.1 jdolecek bool ena_com_get_admin_running_state(struct ena_com_dev *ena_dev); 519 1.1 jdolecek 520 1.1 jdolecek /* ena_com_set_admin_polling_mode - Set the admin completion queue polling mode 521 1.1 jdolecek * @ena_dev: ENA communication layer struct 522 1.1 jdolecek * @polling: ENAble/Disable polling mode 523 1.1 jdolecek * 524 1.1 jdolecek * Set the admin completion mode. 525 1.1 jdolecek */ 526 1.1 jdolecek void ena_com_set_admin_polling_mode(struct ena_com_dev *ena_dev, bool polling); 527 1.1 jdolecek 528 1.1 jdolecek /* ena_com_set_admin_polling_mode - Get the admin completion queue polling mode 529 1.1 jdolecek * @ena_dev: ENA communication layer struct 530 1.1 jdolecek * 531 1.1 jdolecek * Get the admin completion mode. 532 1.1 jdolecek * If polling mode is on, ena_com_execute_admin_command will perform a 533 1.1 jdolecek * polling on the admin completion queue for the commands completion, 534 1.1 jdolecek * otherwise it will wait on wait event. 535 1.1 jdolecek * 536 1.1 jdolecek * @return state 537 1.1 jdolecek */ 538 1.1 jdolecek bool ena_com_get_ena_admin_polling_mode(struct ena_com_dev *ena_dev); 539 1.1 jdolecek 540 1.1 jdolecek /* ena_com_admin_q_comp_intr_handler - admin queue interrupt handler 541 1.1 jdolecek * @ena_dev: ENA communication layer struct 542 1.1 jdolecek * 543 1.1 jdolecek * This method go over the admin completion queue and wake up all the pending 544 1.1 jdolecek * threads that wait on the commands wait event. 545 1.1 jdolecek * 546 1.1 jdolecek * @note: Should be called after MSI-X interrupt. 547 1.1 jdolecek */ 548 1.1 jdolecek void ena_com_admin_q_comp_intr_handler(struct ena_com_dev *ena_dev); 549 1.1 jdolecek 550 1.1 jdolecek /* ena_com_aenq_intr_handler - AENQ interrupt handler 551 1.1 jdolecek * @ena_dev: ENA communication layer struct 552 1.1 jdolecek * 553 1.1 jdolecek * This method go over the async event notification queue and call the proper 554 1.1 jdolecek * aenq handler. 555 1.1 jdolecek */ 556 1.1 jdolecek void ena_com_aenq_intr_handler(struct ena_com_dev *dev, void *data); 557 1.1 jdolecek 558 1.1 jdolecek /* ena_com_abort_admin_commands - Abort all the outstanding admin commands. 559 1.1 jdolecek * @ena_dev: ENA communication layer struct 560 1.1 jdolecek * 561 1.1 jdolecek * This method aborts all the outstanding admin commands. 562 1.1 jdolecek * The caller should then call ena_com_wait_for_abort_completion to make sure 563 1.1 jdolecek * all the commands were completed. 564 1.1 jdolecek */ 565 1.1 jdolecek void ena_com_abort_admin_commands(struct ena_com_dev *ena_dev); 566 1.1 jdolecek 567 1.1 jdolecek /* ena_com_wait_for_abort_completion - Wait for admin commands abort. 568 1.1 jdolecek * @ena_dev: ENA communication layer struct 569 1.1 jdolecek * 570 1.1 jdolecek * This method wait until all the outstanding admin commands will be completed. 571 1.1 jdolecek */ 572 1.1 jdolecek void ena_com_wait_for_abort_completion(struct ena_com_dev *ena_dev); 573 1.1 jdolecek 574 1.1 jdolecek /* ena_com_validate_version - Validate the device parameters 575 1.1 jdolecek * @ena_dev: ENA communication layer struct 576 1.1 jdolecek * 577 1.1 jdolecek * This method validate the device parameters are the same as the saved 578 1.1 jdolecek * parameters in ena_dev. 579 1.1 jdolecek * This method is useful after device reset, to validate the device mac address 580 1.1 jdolecek * and the device offloads are the same as before the reset. 581 1.1 jdolecek * 582 1.1 jdolecek * @return - 0 on success negative value otherwise. 583 1.1 jdolecek */ 584 1.1 jdolecek int ena_com_validate_version(struct ena_com_dev *ena_dev); 585 1.1 jdolecek 586 1.1 jdolecek /* ena_com_get_link_params - Retrieve physical link parameters. 587 1.1 jdolecek * @ena_dev: ENA communication layer struct 588 1.1 jdolecek * @resp: Link parameters 589 1.1 jdolecek * 590 1.1 jdolecek * Retrieve the physical link parameters, 591 1.1 jdolecek * like speed, auto-negotiation and full duplex support. 592 1.1 jdolecek * 593 1.1 jdolecek * @return - 0 on Success negative value otherwise. 594 1.1 jdolecek */ 595 1.1 jdolecek int ena_com_get_link_params(struct ena_com_dev *ena_dev, 596 1.1 jdolecek struct ena_admin_get_feat_resp *resp); 597 1.1 jdolecek 598 1.1 jdolecek /* ena_com_get_dma_width - Retrieve physical dma address width the device 599 1.1 jdolecek * supports. 600 1.1 jdolecek * @ena_dev: ENA communication layer struct 601 1.1 jdolecek * 602 1.1 jdolecek * Retrieve the maximum physical address bits the device can handle. 603 1.1 jdolecek * 604 1.1 jdolecek * @return: > 0 on Success and negative value otherwise. 605 1.1 jdolecek */ 606 1.1 jdolecek int ena_com_get_dma_width(struct ena_com_dev *ena_dev); 607 1.1 jdolecek 608 1.1 jdolecek /* ena_com_set_aenq_config - Set aenq groups configurations 609 1.1 jdolecek * @ena_dev: ENA communication layer struct 610 1.1 jdolecek * @groups flag: bit fields flags of enum ena_admin_aenq_group. 611 1.1 jdolecek * 612 1.1 jdolecek * Configure which aenq event group the driver would like to receive. 613 1.1 jdolecek * 614 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 615 1.1 jdolecek */ 616 1.1 jdolecek int ena_com_set_aenq_config(struct ena_com_dev *ena_dev, u32 groups_flag); 617 1.1 jdolecek 618 1.1 jdolecek /* ena_com_get_dev_attr_feat - Get device features 619 1.1 jdolecek * @ena_dev: ENA communication layer struct 620 1.1 jdolecek * @get_feat_ctx: returned context that contain the get features. 621 1.1 jdolecek * 622 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 623 1.1 jdolecek */ 624 1.1 jdolecek int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev, 625 1.1 jdolecek struct ena_com_dev_get_features_ctx *get_feat_ctx); 626 1.1 jdolecek 627 1.1 jdolecek /* ena_com_get_dev_basic_stats - Get device basic statistics 628 1.1 jdolecek * @ena_dev: ENA communication layer struct 629 1.1 jdolecek * @stats: stats return value 630 1.1 jdolecek * 631 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 632 1.1 jdolecek */ 633 1.1 jdolecek int ena_com_get_dev_basic_stats(struct ena_com_dev *ena_dev, 634 1.1 jdolecek struct ena_admin_basic_stats *stats); 635 1.1 jdolecek 636 1.1 jdolecek /* ena_com_set_dev_mtu - Configure the device mtu. 637 1.1 jdolecek * @ena_dev: ENA communication layer struct 638 1.1 jdolecek * @mtu: mtu value 639 1.1 jdolecek * 640 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 641 1.1 jdolecek */ 642 1.1 jdolecek int ena_com_set_dev_mtu(struct ena_com_dev *ena_dev, int mtu); 643 1.1 jdolecek 644 1.1 jdolecek /* ena_com_get_offload_settings - Retrieve the device offloads capabilities 645 1.1 jdolecek * @ena_dev: ENA communication layer struct 646 1.1 jdolecek * @offlad: offload return value 647 1.1 jdolecek * 648 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 649 1.1 jdolecek */ 650 1.1 jdolecek int ena_com_get_offload_settings(struct ena_com_dev *ena_dev, 651 1.1 jdolecek struct ena_admin_feature_offload_desc *offload); 652 1.1 jdolecek 653 1.1 jdolecek /* ena_com_rss_init - Init RSS 654 1.1 jdolecek * @ena_dev: ENA communication layer struct 655 1.1 jdolecek * @log_size: indirection log size 656 1.1 jdolecek * 657 1.1 jdolecek * Allocate RSS/RFS resources. 658 1.1 jdolecek * The caller then can configure rss using ena_com_set_hash_function, 659 1.1 jdolecek * ena_com_set_hash_ctrl and ena_com_indirect_table_set. 660 1.1 jdolecek * 661 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 662 1.1 jdolecek */ 663 1.1 jdolecek int ena_com_rss_init(struct ena_com_dev *ena_dev, u16 log_size); 664 1.1 jdolecek 665 1.1 jdolecek /* ena_com_rss_destroy - Destroy rss 666 1.1 jdolecek * @ena_dev: ENA communication layer struct 667 1.1 jdolecek * 668 1.1 jdolecek * Free all the RSS/RFS resources. 669 1.1 jdolecek */ 670 1.1 jdolecek void ena_com_rss_destroy(struct ena_com_dev *ena_dev); 671 1.1 jdolecek 672 1.1 jdolecek /* ena_com_fill_hash_function - Fill RSS hash function 673 1.1 jdolecek * @ena_dev: ENA communication layer struct 674 1.1 jdolecek * @func: The hash function (Toeplitz or crc) 675 1.1 jdolecek * @key: Hash key (for toeplitz hash) 676 1.1 jdolecek * @key_len: key length (max length 10 DW) 677 1.1 jdolecek * @init_val: initial value for the hash function 678 1.1 jdolecek * 679 1.1 jdolecek * Fill the ena_dev resources with the desire hash function, hash key, key_len 680 1.1 jdolecek * and key initial value (if needed by the hash function). 681 1.1 jdolecek * To flush the key into the device the caller should call 682 1.1 jdolecek * ena_com_set_hash_function. 683 1.1 jdolecek * 684 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 685 1.1 jdolecek */ 686 1.1 jdolecek int ena_com_fill_hash_function(struct ena_com_dev *ena_dev, 687 1.1 jdolecek enum ena_admin_hash_functions func, 688 1.1 jdolecek const u8 *key, u16 key_len, u32 init_val); 689 1.1 jdolecek 690 1.1 jdolecek /* ena_com_set_hash_function - Flush the hash function and it dependencies to 691 1.1 jdolecek * the device. 692 1.1 jdolecek * @ena_dev: ENA communication layer struct 693 1.1 jdolecek * 694 1.1 jdolecek * Flush the hash function and it dependencies (key, key length and 695 1.1 jdolecek * initial value) if needed. 696 1.1 jdolecek * 697 1.1 jdolecek * @note: Prior to this method the caller should call ena_com_fill_hash_function 698 1.1 jdolecek * 699 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 700 1.1 jdolecek */ 701 1.1 jdolecek int ena_com_set_hash_function(struct ena_com_dev *ena_dev); 702 1.1 jdolecek 703 1.1 jdolecek /* ena_com_get_hash_function - Retrieve the hash function and the hash key 704 1.1 jdolecek * from the device. 705 1.1 jdolecek * @ena_dev: ENA communication layer struct 706 1.1 jdolecek * @func: hash function 707 1.1 jdolecek * @key: hash key 708 1.1 jdolecek * 709 1.1 jdolecek * Retrieve the hash function and the hash key from the device. 710 1.1 jdolecek * 711 1.1 jdolecek * @note: If the caller called ena_com_fill_hash_function but didn't flash 712 1.1 jdolecek * it to the device, the new configuration will be lost. 713 1.1 jdolecek * 714 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 715 1.1 jdolecek */ 716 1.1 jdolecek int ena_com_get_hash_function(struct ena_com_dev *ena_dev, 717 1.1 jdolecek enum ena_admin_hash_functions *func, 718 1.1 jdolecek u8 *key); 719 1.1 jdolecek 720 1.1 jdolecek /* ena_com_fill_hash_ctrl - Fill RSS hash control 721 1.1 jdolecek * @ena_dev: ENA communication layer struct. 722 1.1 jdolecek * @proto: The protocol to configure. 723 1.1 jdolecek * @hash_fields: bit mask of ena_admin_flow_hash_fields 724 1.1 jdolecek * 725 1.1 jdolecek * Fill the ena_dev resources with the desire hash control (the ethernet 726 1.1 jdolecek * fields that take part of the hash) for a specific protocol. 727 1.1 jdolecek * To flush the hash control to the device, the caller should call 728 1.1 jdolecek * ena_com_set_hash_ctrl. 729 1.1 jdolecek * 730 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 731 1.1 jdolecek */ 732 1.1 jdolecek int ena_com_fill_hash_ctrl(struct ena_com_dev *ena_dev, 733 1.1 jdolecek enum ena_admin_flow_hash_proto proto, 734 1.1 jdolecek u16 hash_fields); 735 1.1 jdolecek 736 1.1 jdolecek /* ena_com_set_hash_ctrl - Flush the hash control resources to the device. 737 1.1 jdolecek * @ena_dev: ENA communication layer struct 738 1.1 jdolecek * 739 1.1 jdolecek * Flush the hash control (the ethernet fields that take part of the hash) 740 1.1 jdolecek * 741 1.1 jdolecek * @note: Prior to this method the caller should call ena_com_fill_hash_ctrl. 742 1.1 jdolecek * 743 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 744 1.1 jdolecek */ 745 1.1 jdolecek int ena_com_set_hash_ctrl(struct ena_com_dev *ena_dev); 746 1.1 jdolecek 747 1.1 jdolecek /* ena_com_get_hash_ctrl - Retrieve the hash control from the device. 748 1.1 jdolecek * @ena_dev: ENA communication layer struct 749 1.1 jdolecek * @proto: The protocol to retrieve. 750 1.1 jdolecek * @fields: bit mask of ena_admin_flow_hash_fields. 751 1.1 jdolecek * 752 1.1 jdolecek * Retrieve the hash control from the device. 753 1.1 jdolecek * 754 1.1 jdolecek * @note, If the caller called ena_com_fill_hash_ctrl but didn't flash 755 1.1 jdolecek * it to the device, the new configuration will be lost. 756 1.1 jdolecek * 757 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 758 1.1 jdolecek */ 759 1.1 jdolecek int ena_com_get_hash_ctrl(struct ena_com_dev *ena_dev, 760 1.1 jdolecek enum ena_admin_flow_hash_proto proto, 761 1.1 jdolecek u16 *fields); 762 1.1 jdolecek 763 1.1 jdolecek /* ena_com_set_default_hash_ctrl - Set the hash control to a default 764 1.1 jdolecek * configuration. 765 1.1 jdolecek * @ena_dev: ENA communication layer struct 766 1.1 jdolecek * 767 1.1 jdolecek * Fill the ena_dev resources with the default hash control configuration. 768 1.1 jdolecek * To flush the hash control to the device, the caller should call 769 1.1 jdolecek * ena_com_set_hash_ctrl. 770 1.1 jdolecek * 771 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 772 1.1 jdolecek */ 773 1.1 jdolecek int ena_com_set_default_hash_ctrl(struct ena_com_dev *ena_dev); 774 1.1 jdolecek 775 1.1 jdolecek /* ena_com_indirect_table_fill_entry - Fill a single entry in the RSS 776 1.1 jdolecek * indirection table 777 1.1 jdolecek * @ena_dev: ENA communication layer struct. 778 1.1 jdolecek * @entry_idx - indirection table entry. 779 1.1 jdolecek * @entry_value - redirection value 780 1.1 jdolecek * 781 1.1 jdolecek * Fill a single entry of the RSS indirection table in the ena_dev resources. 782 1.1 jdolecek * To flush the indirection table to the device, the called should call 783 1.1 jdolecek * ena_com_indirect_table_set. 784 1.1 jdolecek * 785 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 786 1.1 jdolecek */ 787 1.1 jdolecek int ena_com_indirect_table_fill_entry(struct ena_com_dev *ena_dev, 788 1.1 jdolecek u16 entry_idx, u16 entry_value); 789 1.1 jdolecek 790 1.1 jdolecek /* ena_com_indirect_table_set - Flush the indirection table to the device. 791 1.1 jdolecek * @ena_dev: ENA communication layer struct 792 1.1 jdolecek * 793 1.1 jdolecek * Flush the indirection hash control to the device. 794 1.1 jdolecek * Prior to this method the caller should call ena_com_indirect_table_fill_entry 795 1.1 jdolecek * 796 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 797 1.1 jdolecek */ 798 1.1 jdolecek int ena_com_indirect_table_set(struct ena_com_dev *ena_dev); 799 1.1 jdolecek 800 1.1 jdolecek /* ena_com_indirect_table_get - Retrieve the indirection table from the device. 801 1.1 jdolecek * @ena_dev: ENA communication layer struct 802 1.1 jdolecek * @ind_tbl: indirection table 803 1.1 jdolecek * 804 1.1 jdolecek * Retrieve the RSS indirection table from the device. 805 1.1 jdolecek * 806 1.1 jdolecek * @note: If the caller called ena_com_indirect_table_fill_entry but didn't flash 807 1.1 jdolecek * it to the device, the new configuration will be lost. 808 1.1 jdolecek * 809 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 810 1.1 jdolecek */ 811 1.1 jdolecek int ena_com_indirect_table_get(struct ena_com_dev *ena_dev, u32 *ind_tbl); 812 1.1 jdolecek 813 1.1 jdolecek /* ena_com_allocate_host_info - Allocate host info resources. 814 1.1 jdolecek * @ena_dev: ENA communication layer struct 815 1.1 jdolecek * 816 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 817 1.1 jdolecek */ 818 1.1 jdolecek int ena_com_allocate_host_info(struct ena_com_dev *ena_dev); 819 1.1 jdolecek 820 1.1 jdolecek /* ena_com_allocate_debug_area - Allocate debug area. 821 1.1 jdolecek * @ena_dev: ENA communication layer struct 822 1.1 jdolecek * @debug_area_size - debug area size. 823 1.1 jdolecek * 824 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 825 1.1 jdolecek */ 826 1.1 jdolecek int ena_com_allocate_debug_area(struct ena_com_dev *ena_dev, 827 1.1 jdolecek u32 debug_area_size); 828 1.1 jdolecek 829 1.1 jdolecek /* ena_com_delete_debug_area - Free the debug area resources. 830 1.1 jdolecek * @ena_dev: ENA communication layer struct 831 1.1 jdolecek * 832 1.1 jdolecek * Free the allocate debug area. 833 1.1 jdolecek */ 834 1.1 jdolecek void ena_com_delete_debug_area(struct ena_com_dev *ena_dev); 835 1.1 jdolecek 836 1.1 jdolecek /* ena_com_delete_host_info - Free the host info resources. 837 1.1 jdolecek * @ena_dev: ENA communication layer struct 838 1.1 jdolecek * 839 1.1 jdolecek * Free the allocate host info. 840 1.1 jdolecek */ 841 1.1 jdolecek void ena_com_delete_host_info(struct ena_com_dev *ena_dev); 842 1.1 jdolecek 843 1.1 jdolecek /* ena_com_set_host_attributes - Update the device with the host 844 1.1 jdolecek * attributes (debug area and host info) base address. 845 1.1 jdolecek * @ena_dev: ENA communication layer struct 846 1.1 jdolecek * 847 1.1 jdolecek * @return: 0 on Success and negative value otherwise. 848 1.1 jdolecek */ 849 1.1 jdolecek int ena_com_set_host_attributes(struct ena_com_dev *ena_dev); 850 1.1 jdolecek 851 1.1 jdolecek /* ena_com_create_io_cq - Create io completion queue. 852 1.1 jdolecek * @ena_dev: ENA communication layer struct 853 1.1 jdolecek * @io_cq - io completion queue handler 854 1.1 jdolecek 855 1.1 jdolecek * Create IO completion queue. 856 1.1 jdolecek * 857 1.1 jdolecek * @return - 0 on success, negative value on failure. 858 1.1 jdolecek */ 859 1.1 jdolecek int ena_com_create_io_cq(struct ena_com_dev *ena_dev, 860 1.1 jdolecek struct ena_com_io_cq *io_cq); 861 1.1 jdolecek 862 1.1 jdolecek /* ena_com_destroy_io_cq - Destroy io completion queue. 863 1.1 jdolecek * @ena_dev: ENA communication layer struct 864 1.1 jdolecek * @io_cq - io completion queue handler 865 1.1 jdolecek 866 1.1 jdolecek * Destroy IO completion queue. 867 1.1 jdolecek * 868 1.1 jdolecek * @return - 0 on success, negative value on failure. 869 1.1 jdolecek */ 870 1.1 jdolecek int ena_com_destroy_io_cq(struct ena_com_dev *ena_dev, 871 1.1 jdolecek struct ena_com_io_cq *io_cq); 872 1.1 jdolecek 873 1.1 jdolecek /* ena_com_execute_admin_command - Execute admin command 874 1.1 jdolecek * @admin_queue: admin queue. 875 1.1 jdolecek * @cmd: the admin command to execute. 876 1.1 jdolecek * @cmd_size: the command size. 877 1.1 jdolecek * @cmd_completion: command completion return value. 878 1.1 jdolecek * @cmd_comp_size: command completion size. 879 1.1 jdolecek 880 1.1 jdolecek * Submit an admin command and then wait until the device will return a 881 1.1 jdolecek * completion. 882 1.1 jdolecek * The completion will be copyed into cmd_comp. 883 1.1 jdolecek * 884 1.1 jdolecek * @return - 0 on success, negative value on failure. 885 1.1 jdolecek */ 886 1.1 jdolecek int ena_com_execute_admin_command(struct ena_com_admin_queue *admin_queue, 887 1.1 jdolecek struct ena_admin_aq_entry *cmd, 888 1.1 jdolecek size_t cmd_size, 889 1.1 jdolecek struct ena_admin_acq_entry *cmd_comp, 890 1.1 jdolecek size_t cmd_comp_size); 891 1.1 jdolecek 892 1.1 jdolecek /* ena_com_init_interrupt_moderation - Init interrupt moderation 893 1.1 jdolecek * @ena_dev: ENA communication layer struct 894 1.1 jdolecek * 895 1.1 jdolecek * @return - 0 on success, negative value on failure. 896 1.1 jdolecek */ 897 1.1 jdolecek int ena_com_init_interrupt_moderation(struct ena_com_dev *ena_dev); 898 1.1 jdolecek 899 1.1 jdolecek /* ena_com_destroy_interrupt_moderation - Destroy interrupt moderation resources 900 1.1 jdolecek * @ena_dev: ENA communication layer struct 901 1.1 jdolecek */ 902 1.1 jdolecek void ena_com_destroy_interrupt_moderation(struct ena_com_dev *ena_dev); 903 1.1 jdolecek 904 1.1 jdolecek /* ena_com_interrupt_moderation_supported - Return if interrupt moderation 905 1.1 jdolecek * capability is supported by the device. 906 1.1 jdolecek * 907 1.1 jdolecek * @return - supported or not. 908 1.1 jdolecek */ 909 1.1 jdolecek bool ena_com_interrupt_moderation_supported(struct ena_com_dev *ena_dev); 910 1.1 jdolecek 911 1.1 jdolecek /* ena_com_config_default_interrupt_moderation_table - Restore the interrupt 912 1.1 jdolecek * moderation table back to the default parameters. 913 1.1 jdolecek * @ena_dev: ENA communication layer struct 914 1.1 jdolecek */ 915 1.1 jdolecek void ena_com_config_default_interrupt_moderation_table(struct ena_com_dev *ena_dev); 916 1.1 jdolecek 917 1.1 jdolecek /* ena_com_update_nonadaptive_moderation_interval_tx - Update the 918 1.1 jdolecek * non-adaptive interval in Tx direction. 919 1.1 jdolecek * @ena_dev: ENA communication layer struct 920 1.1 jdolecek * @tx_coalesce_usecs: Interval in usec. 921 1.1 jdolecek * 922 1.1 jdolecek * @return - 0 on success, negative value on failure. 923 1.1 jdolecek */ 924 1.1 jdolecek int ena_com_update_nonadaptive_moderation_interval_tx(struct ena_com_dev *ena_dev, 925 1.1 jdolecek u32 tx_coalesce_usecs); 926 1.1 jdolecek 927 1.1 jdolecek /* ena_com_update_nonadaptive_moderation_interval_rx - Update the 928 1.1 jdolecek * non-adaptive interval in Rx direction. 929 1.1 jdolecek * @ena_dev: ENA communication layer struct 930 1.1 jdolecek * @rx_coalesce_usecs: Interval in usec. 931 1.1 jdolecek * 932 1.1 jdolecek * @return - 0 on success, negative value on failure. 933 1.1 jdolecek */ 934 1.1 jdolecek int ena_com_update_nonadaptive_moderation_interval_rx(struct ena_com_dev *ena_dev, 935 1.1 jdolecek u32 rx_coalesce_usecs); 936 1.1 jdolecek 937 1.1 jdolecek /* ena_com_get_nonadaptive_moderation_interval_tx - Retrieve the 938 1.1 jdolecek * non-adaptive interval in Tx direction. 939 1.1 jdolecek * @ena_dev: ENA communication layer struct 940 1.1 jdolecek * 941 1.1 jdolecek * @return - interval in usec 942 1.1 jdolecek */ 943 1.1 jdolecek unsigned int ena_com_get_nonadaptive_moderation_interval_tx(struct ena_com_dev *ena_dev); 944 1.1 jdolecek 945 1.1 jdolecek /* ena_com_get_nonadaptive_moderation_interval_rx - Retrieve the 946 1.1 jdolecek * non-adaptive interval in Rx direction. 947 1.1 jdolecek * @ena_dev: ENA communication layer struct 948 1.1 jdolecek * 949 1.1 jdolecek * @return - interval in usec 950 1.1 jdolecek */ 951 1.1 jdolecek unsigned int ena_com_get_nonadaptive_moderation_interval_rx(struct ena_com_dev *ena_dev); 952 1.1 jdolecek 953 1.1 jdolecek /* ena_com_init_intr_moderation_entry - Update a single entry in the interrupt 954 1.1 jdolecek * moderation table. 955 1.1 jdolecek * @ena_dev: ENA communication layer struct 956 1.1 jdolecek * @level: Interrupt moderation table level 957 1.1 jdolecek * @entry: Entry value 958 1.1 jdolecek * 959 1.1 jdolecek * Update a single entry in the interrupt moderation table. 960 1.1 jdolecek */ 961 1.1 jdolecek void ena_com_init_intr_moderation_entry(struct ena_com_dev *ena_dev, 962 1.1 jdolecek enum ena_intr_moder_level level, 963 1.1 jdolecek struct ena_intr_moder_entry *entry); 964 1.1 jdolecek 965 1.1 jdolecek /* ena_com_get_intr_moderation_entry - Init ena_intr_moder_entry. 966 1.1 jdolecek * @ena_dev: ENA communication layer struct 967 1.1 jdolecek * @level: Interrupt moderation table level 968 1.1 jdolecek * @entry: Entry to fill. 969 1.1 jdolecek * 970 1.1 jdolecek * Initialize the entry according to the adaptive interrupt moderation table. 971 1.1 jdolecek */ 972 1.1 jdolecek void ena_com_get_intr_moderation_entry(struct ena_com_dev *ena_dev, 973 1.1 jdolecek enum ena_intr_moder_level level, 974 1.1 jdolecek struct ena_intr_moder_entry *entry); 975 1.1 jdolecek 976 1.1 jdolecek 977 1.1 jdolecek /* ena_com_config_dev_mode - Configure the placement policy of the device. 978 1.1 jdolecek * @ena_dev: ENA communication layer struct 979 1.1 jdolecek * @llq: LLQ feature descriptor, retrieve via ena_com_get_dev_attr_feat. 980 1.1 jdolecek * 981 1.1 jdolecek */ 982 1.1 jdolecek int ena_com_config_dev_mode(struct ena_com_dev *ena_dev, 983 1.1 jdolecek struct ena_admin_feature_llq_desc *llq); 984 1.1 jdolecek 985 1.1 jdolecek static inline bool ena_com_get_adaptive_moderation_enabled(struct ena_com_dev *ena_dev) 986 1.1 jdolecek { 987 1.1 jdolecek return ena_dev->adaptive_coalescing; 988 1.1 jdolecek } 989 1.1 jdolecek 990 1.1 jdolecek static inline void ena_com_enable_adaptive_moderation(struct ena_com_dev *ena_dev) 991 1.1 jdolecek { 992 1.1 jdolecek ena_dev->adaptive_coalescing = true; 993 1.1 jdolecek } 994 1.1 jdolecek 995 1.1 jdolecek static inline void ena_com_disable_adaptive_moderation(struct ena_com_dev *ena_dev) 996 1.1 jdolecek { 997 1.1 jdolecek ena_dev->adaptive_coalescing = false; 998 1.1 jdolecek } 999 1.1 jdolecek 1000 1.1 jdolecek /* ena_com_calculate_interrupt_delay - Calculate new interrupt delay 1001 1.1 jdolecek * @ena_dev: ENA communication layer struct 1002 1.1 jdolecek * @pkts: Number of packets since the last update 1003 1.1 jdolecek * @bytes: Number of bytes received since the last update. 1004 1.1 jdolecek * @smoothed_interval: Returned interval 1005 1.1 jdolecek * @moder_tbl_idx: Current table level as input update new level as return 1006 1.1 jdolecek * value. 1007 1.1 jdolecek */ 1008 1.1 jdolecek static inline void ena_com_calculate_interrupt_delay(struct ena_com_dev *ena_dev, 1009 1.1 jdolecek unsigned int pkts, 1010 1.1 jdolecek unsigned int bytes, 1011 1.1 jdolecek unsigned int *smoothed_interval, 1012 1.1 jdolecek unsigned int *moder_tbl_idx) 1013 1.1 jdolecek { 1014 1.1 jdolecek enum ena_intr_moder_level curr_moder_idx, new_moder_idx; 1015 1.1 jdolecek struct ena_intr_moder_entry *curr_moder_entry; 1016 1.1 jdolecek struct ena_intr_moder_entry *pred_moder_entry; 1017 1.1 jdolecek struct ena_intr_moder_entry *new_moder_entry; 1018 1.1 jdolecek struct ena_intr_moder_entry *intr_moder_tbl = ena_dev->intr_moder_tbl; 1019 1.1 jdolecek unsigned int interval; 1020 1.1 jdolecek 1021 1.1 jdolecek /* We apply adaptive moderation on Rx path only. 1022 1.1 jdolecek * Tx uses static interrupt moderation. 1023 1.1 jdolecek */ 1024 1.1 jdolecek if (!pkts || !bytes) 1025 1.1 jdolecek /* Tx interrupt, or spurious interrupt, 1026 1.1 jdolecek * in both cases we just use same delay values 1027 1.1 jdolecek */ 1028 1.1 jdolecek return; 1029 1.1 jdolecek 1030 1.1 jdolecek curr_moder_idx = (enum ena_intr_moder_level)(*moder_tbl_idx); 1031 1.1 jdolecek if (unlikely(curr_moder_idx >= ENA_INTR_MAX_NUM_OF_LEVELS)) { 1032 1.1 jdolecek ena_trc_err("Wrong moderation index %u\n", curr_moder_idx); 1033 1.1 jdolecek return; 1034 1.1 jdolecek } 1035 1.1 jdolecek 1036 1.1 jdolecek curr_moder_entry = &intr_moder_tbl[curr_moder_idx]; 1037 1.1 jdolecek new_moder_idx = curr_moder_idx; 1038 1.1 jdolecek 1039 1.1 jdolecek if (curr_moder_idx == ENA_INTR_MODER_LOWEST) { 1040 1.1 jdolecek if ((pkts > curr_moder_entry->pkts_per_interval) || 1041 1.1 jdolecek (bytes > curr_moder_entry->bytes_per_interval)) 1042 1.1 jdolecek new_moder_idx = 1043 1.1 jdolecek (enum ena_intr_moder_level)(curr_moder_idx + ENA_INTR_MODER_LEVEL_STRIDE); 1044 1.1 jdolecek } else { 1045 1.1 jdolecek pred_moder_entry = &intr_moder_tbl[curr_moder_idx - ENA_INTR_MODER_LEVEL_STRIDE]; 1046 1.1 jdolecek 1047 1.1 jdolecek if ((pkts <= pred_moder_entry->pkts_per_interval) || 1048 1.1 jdolecek (bytes <= pred_moder_entry->bytes_per_interval)) 1049 1.1 jdolecek new_moder_idx = 1050 1.1 jdolecek (enum ena_intr_moder_level)(curr_moder_idx - ENA_INTR_MODER_LEVEL_STRIDE); 1051 1.1 jdolecek else if ((pkts > curr_moder_entry->pkts_per_interval) || 1052 1.1 jdolecek (bytes > curr_moder_entry->bytes_per_interval)) { 1053 1.1 jdolecek if (curr_moder_idx != ENA_INTR_MODER_HIGHEST) 1054 1.1 jdolecek new_moder_idx = 1055 1.1 jdolecek (enum ena_intr_moder_level)(curr_moder_idx + ENA_INTR_MODER_LEVEL_STRIDE); 1056 1.1 jdolecek } 1057 1.1 jdolecek } 1058 1.1 jdolecek new_moder_entry = &intr_moder_tbl[new_moder_idx]; 1059 1.1 jdolecek 1060 1.1 jdolecek interval = new_moder_entry->intr_moder_interval; 1061 1.1 jdolecek *smoothed_interval = ( 1062 1.1 jdolecek (interval * ENA_INTR_DELAY_NEW_VALUE_WEIGHT + 1063 1.1 jdolecek ENA_INTR_DELAY_OLD_VALUE_WEIGHT * (*smoothed_interval)) + 5) / 1064 1.1 jdolecek 10; 1065 1.1 jdolecek 1066 1.1 jdolecek *moder_tbl_idx = new_moder_idx; 1067 1.1 jdolecek } 1068 1.1 jdolecek 1069 1.1 jdolecek /* ena_com_update_intr_reg - Prepare interrupt register 1070 1.1 jdolecek * @intr_reg: interrupt register to update. 1071 1.1 jdolecek * @rx_delay_interval: Rx interval in usecs 1072 1.1 jdolecek * @tx_delay_interval: Tx interval in usecs 1073 1.1 jdolecek * @unmask: unask enable/disable 1074 1.1 jdolecek * 1075 1.1 jdolecek * Prepare interrupt update register with the supplied parameters. 1076 1.1 jdolecek */ 1077 1.1 jdolecek static inline void ena_com_update_intr_reg(struct ena_eth_io_intr_reg *intr_reg, 1078 1.1 jdolecek u32 rx_delay_interval, 1079 1.1 jdolecek u32 tx_delay_interval, 1080 1.1 jdolecek bool unmask) 1081 1.1 jdolecek { 1082 1.1 jdolecek intr_reg->intr_control = 0; 1083 1.1 jdolecek intr_reg->intr_control |= rx_delay_interval & 1084 1.1 jdolecek ENA_ETH_IO_INTR_REG_RX_INTR_DELAY_MASK; 1085 1.1 jdolecek 1086 1.1 jdolecek intr_reg->intr_control |= 1087 1.1 jdolecek (tx_delay_interval << ENA_ETH_IO_INTR_REG_TX_INTR_DELAY_SHIFT) 1088 1.1 jdolecek & ENA_ETH_IO_INTR_REG_TX_INTR_DELAY_MASK; 1089 1.1 jdolecek 1090 1.1 jdolecek if (unmask) 1091 1.1 jdolecek intr_reg->intr_control |= ENA_ETH_IO_INTR_REG_INTR_UNMASK_MASK; 1092 1.1 jdolecek } 1093 1.1 jdolecek 1094 1.1 jdolecek static inline u8 *ena_com_get_next_bounce_buffer(struct ena_com_io_bounce_buffer_control *bounce_buf_ctrl) 1095 1.1 jdolecek { 1096 1.1 jdolecek u16 size, buffers_num; 1097 1.1 jdolecek u8 *buf; 1098 1.1 jdolecek 1099 1.1 jdolecek size = bounce_buf_ctrl->buffer_size; 1100 1.1 jdolecek buffers_num = bounce_buf_ctrl->buffers_num; 1101 1.1 jdolecek 1102 1.1 jdolecek buf = bounce_buf_ctrl->base_buffer + 1103 1.1 jdolecek (bounce_buf_ctrl->next_to_use++ & (buffers_num - 1)) * size; 1104 1.1 jdolecek 1105 1.1 jdolecek prefetch(bounce_buf_ctrl->base_buffer + 1106 1.1 jdolecek (bounce_buf_ctrl->next_to_use & (buffers_num - 1)) * size); 1107 1.1 jdolecek 1108 1.1 jdolecek return buf; 1109 1.1 jdolecek } 1110 1.1 jdolecek 1111 1.1 jdolecek #ifdef ENA_EXTENDED_STATS 1112 1.1 jdolecek int ena_com_get_dev_extended_stats(struct ena_com_dev *ena_dev, char *buff, 1113 1.1 jdolecek u32 len); 1114 1.1 jdolecek 1115 1.1 jdolecek int ena_com_extended_stats_set_func_queue(struct ena_com_dev *ena_dev, 1116 1.1 jdolecek u32 funct_queue); 1117 1.1 jdolecek #endif 1118 1.1 jdolecek #if defined(__cplusplus) 1119 1.1 jdolecek } 1120 1.1 jdolecek #endif /* __cplusplus */ 1121 1.1 jdolecek #endif /* !(ENA_COM) */ 1122