iPXE
ena.h
Go to the documentation of this file.
1 #ifndef _ENA_H
2 #define _ENA_H
3 
4 /** @file
5  *
6  * Amazon ENA network driver
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 
12 #include <stdint.h>
13 #include <ipxe/if_ether.h>
14 
15 /** Register BAR */
16 #define ENA_REGS_BAR PCI_BASE_ADDRESS_0
17 
18 /** Register BAR size */
19 #define ENA_REGS_SIZE 16384
20 
21 /** On-device memory BAR */
22 #define ENA_MEM_BAR PCI_BASE_ADDRESS_2
23 
24 /** Queue alignment */
25 #define ENA_ALIGN 4096
26 
27 /** Number of admin queue entries */
28 #define ENA_AQ_COUNT 2
29 
30 /** Number of admin completion queue entries */
31 #define ENA_ACQ_COUNT 2
32 
33 /** Number of async event notification queue entries */
34 #define ENA_AENQ_COUNT 2
35 
36 /** Number of transmit queue entries */
37 #define ENA_TX_COUNT 32
38 
39 /** Number of receive queue entries */
40 #define ENA_RX_COUNT 32
41 
42 /** Base address low register offset */
43 #define ENA_BASE_LO 0x0
44 
45 /** Base address high register offset */
46 #define ENA_BASE_HI 0x4
47 
48 /** Capability register value */
49 #define ENA_CAPS( count, size ) ( ( (size) << 16 ) | ( (count) << 0 ) )
50 
51 /** Admin queue base address register */
52 #define ENA_AQ_BASE 0x10
53 
54 /** Admin queue capabilities register */
55 #define ENA_AQ_CAPS 0x18
56 
57 /** Admin completion queue base address register */
58 #define ENA_ACQ_BASE 0x20
59 
60 /** Admin completion queue capabilities register */
61 #define ENA_ACQ_CAPS 0x28
62 
63 /** Admin queue doorbell register */
64 #define ENA_AQ_DB 0x2c
65 
66 /** Maximum time to wait for admin requests */
67 #define ENA_ADMIN_MAX_WAIT_MS 5000
68 
69 /** Async event notification queue capabilities register */
70 #define ENA_AENQ_CAPS 0x34
71 
72 /** Async event notification queue base address register */
73 #define ENA_AENQ_BASE 0x38
74 
75 /** Device control register */
76 #define ENA_CTRL 0x54
77 #define ENA_CTRL_RESET 0x00000001UL /**< Reset */
78 
79 /** Maximum time to wait for reset */
80 #define ENA_RESET_MAX_WAIT_MS 1000
81 
82 /** Device status register */
83 #define ENA_STAT 0x58
84 #define ENA_STAT_RESET 0x00000008UL /**< Reset in progress */
85 
86 /** Admin queue entry header */
87 struct ena_aq_header {
88  /** Request identifier */
90  /** Reserved */
92  /** Opcode */
94  /** Flags */
96 } __attribute__ (( packed ));
97 
98 /** Admin queue ownership phase flag */
99 #define ENA_AQ_PHASE 0x01
100 
101 /** Admin completion queue entry header */
103  /** Request identifier */
105  /** Reserved */
107  /** Status */
109  /** Flags */
111  /** Extended status */
113  /** Consumer index */
115 } __attribute__ (( packed ));
116 
117 /** Admin completion queue ownership phase flag */
118 #define ENA_ACQ_PHASE 0x01
119 
120 /** Device attributes */
121 #define ENA_DEVICE_ATTRIBUTES 1
122 
123 /** Device attributes */
125  /** Implementation */
127  /** Device version */
129  /** Supported features */
131  /** Reserved */
133  /** Physical address width */
135  /** Virtual address width */
136  uint32_t virtual;
137  /** MAC address */
139  /** Reserved */
141  /** Maximum MTU */
143 } __attribute__ (( packed ));
144 
145 /** Device supports low latency queues */
146 #define ENA_FEATURE_LLQ 0x00000010
147 
148 /** Low latency queue config */
149 #define ENA_LLQ_CONFIG 4
150 
151 /** A low latency queue option */
153  /** Bitmask of supported option values */
155  /** Single-entry bitmask of the enabled option value */
157 } __attribute__ (( packed ));
158 
159 /** Low latency queue config */
161  /** Maximum number of low latency queues */
163  /** Maximum queue depth */
165  /** Header locations */
167  /** Entry sizes */
169  /** Descriptor counts */
171  /** Descriptor strides */
173  /** Reserved */
175  /** Acceleration mode */
177  /** Maximum burst size */
179  /** Reserved */
181 } __attribute__ (( packed ));
182 
183 /** Low latency queue header locations */
185  /** Headers are placed inline immediately after descriptors */
187 };
188 
189 /** Low latency queue entry sizes */
191  /** Entries are 128 bytes */
193 };
194 
195 /** Low latency queue descriptor count */
197  /** Two descriptors before inline headers */
198  ENA_LLQ_DESC_2 = 0x0002,
199 };
200 
201 /** Async event notification queue config */
202 #define ENA_AENQ_CONFIG 26
203 
204 /** Async event notification queue config */
206  /** Bitmask of supported AENQ groups (device -> host) */
208  /** Bitmask of enabled AENQ groups (host -> device) */
210 } __attribute__ (( packed ));
211 
212 /** Host attributes */
213 #define ENA_HOST_ATTRIBUTES 28
214 
215 /** Host attributes */
217  /** Host info base address */
219  /** Debug area base address */
221  /** Debug area size */
223 } __attribute__ (( packed ));
224 
225 /** Host information */
227  /** Operating system type */
229  /** Operating system distribution (string) */
230  char dist_str[128];
231  /** Operating system distribution (numeric) */
233  /** Kernel version (string) */
234  char kernel_str[32];
235  /** Kernel version (numeric) */
237  /** Driver version */
239  /** Linux network device features */
241  /** ENA specification version */
243  /** PCI bus:dev.fn address */
245  /** Number of CPUs */
247  /** Reserved */
249  /** Supported features */
251 } __attribute__ (( packed ));
252 
253 /** Operating system type
254  *
255  * Some very broken older versions of the ENA firmware will refuse to
256  * allow a completion queue to be created if "iPXE" (type 5) is used,
257  * and require us to pretend that we are "Linux" (type 1) instead.
258  *
259  * The ENA team at AWS assures us that the entire AWS fleet has been
260  * upgraded to fix this bug, and that we are now safe to use the
261  * correct operating system type value.
262  */
263 #define ENA_HOST_INFO_TYPE_IPXE 5
264 
265 /** Driver version
266  *
267  * The driver version field is nominally used to report a version
268  * number outside of the VM for consumption by humans (and potentially
269  * by automated monitoring tools that could e.g. check for outdated
270  * versions with known security flaws).
271  *
272  * However, at some point in the development of the ENA firmware, some
273  * unknown person at AWS thought it would be sensible to apply a
274  * machine interpretation to this field and adjust the behaviour of
275  * the firmware based on its value, thereby creating a maintenance and
276  * debugging nightmare for all existing and future drivers.
277  *
278  * Hint to engineers: if you ever find yourself writing code of the
279  * form "if (version == SOME_MAGIC_NUMBER)" then something has gone
280  * very, very wrong. This *always* indicates that something is
281  * broken, either in your own code or in the code with which you are
282  * forced to interact.
283  */
284 #define ENA_HOST_INFO_VERSION_WTF 0x00000002UL
285 
286 /** ENA specification version */
287 #define ENA_HOST_INFO_SPEC_2_0 0x0200
288 
289 /** Feature */
290 union ena_feature {
291  /** Device attributes */
293  /** Low latency queue configuration */
295  /** Async event notification queue config */
297  /** Host attributes */
299 };
300 
301 /** Submission queue direction */
303  /** Transmit */
304  ENA_SQ_TX = 0x20,
305  /** Receive */
306  ENA_SQ_RX = 0x40,
307 };
308 
309 /** Create submission queue */
310 #define ENA_CREATE_SQ 1
311 
312 /** Create submission queue request */
314  /** Header */
316  /** Direction */
318  /** Reserved */
320  /** Policy */
322  /** Completion queue identifier */
324  /** Number of entries */
326  /** Base address */
328  /** Writeback address */
330  /** Reserved */
332 } __attribute__ (( packed ));
333 
334 /** Submission queue policy */
336  /** Use host memory */
338  /** Use on-device memory (must be used in addition to host memory) */
340  /** Memory is contiguous */
342 };
343 
344 /** Create submission queue response */
346  /** Header */
348  /** Submission queue identifier */
350  /** Reserved */
352  /** Doorbell register offset */
354  /** LLQ descriptor ring offset */
356  /** Reserved */
358 } __attribute__ (( packed ));
359 
360 /** Destroy submission queue */
361 #define ENA_DESTROY_SQ 2
362 
363 /** Destroy submission queue request */
365  /** Header */
367  /** Submission queue identifier */
369  /** Direction */
371  /** Reserved */
373 } __attribute__ (( packed ));
374 
375 /** Destroy submission queue response */
377  /** Header */
379 } __attribute__ (( packed ));
380 
381 /** Create completion queue */
382 #define ENA_CREATE_CQ 3
383 
384 /** Create completion queue request */
386  /** Header */
388  /** Interrupts enabled */
390  /** Entry size (in 32-bit words) */
392  /** Number of entries */
394  /** MSI-X vector */
396  /** Base address */
398 } __attribute__ (( packed ));
399 
400 /** Empty MSI-X vector
401  *
402  * Some versions of the ENA firmware will complain if the completion
403  * queue's MSI-X vector field is left empty, even though the queue
404  * configuration specifies that interrupts are not used.
405  */
406 #define ENA_MSIX_NONE 0xffffffffUL
407 
408 /** Create completion queue response */
410  /** Header */
412  /** Completion queue identifier */
414  /** Actual number of entries */
416  /** NUMA node register offset */
418  /** Doorbell register offset */
420  /** Interrupt unmask register offset */
422 } __attribute__ (( packed ));
423 
424 /** Destroy completion queue */
425 #define ENA_DESTROY_CQ 4
426 
427 /** Destroy completion queue request */
429  /** Header */
431  /** Completion queue identifier */
433  /** Reserved */
435 } __attribute__ (( packed ));
436 
437 /** Destroy completion queue response */
439  /** Header */
441 } __attribute__ (( packed ));
442 
443 /** Get feature */
444 #define ENA_GET_FEATURE 8
445 
446 /** Get feature request */
448  /** Header */
450  /** Length */
452  /** Address */
454  /** Flags */
456  /** Feature identifier */
458  /** Reserved */
460 } __attribute__ (( packed ));
461 
462 /** Get feature response */
464  /** Header */
466  /** Feature */
468 } __attribute__ (( packed ));
469 
470 /** Set feature */
471 #define ENA_SET_FEATURE 9
472 
473 /** Set feature request */
475  /** Header */
477  /** Length */
479  /** Address */
481  /** Flags */
483  /** Feature identifier */
485  /** Reserved */
487  /** Feature */
489 } __attribute__ (( packed ));
490 
491 /** Get statistics */
492 #define ENA_GET_STATS 11
493 
494 /** Get statistics request */
496  /** Header */
498  /** Reserved */
500  /** Type */
502  /** Scope */
504  /** Reserved */
506  /** Queue ID */
508  /** Device ID */
510 } __attribute__ (( packed ));
511 
512 /** Basic statistics */
513 #define ENA_STATS_TYPE_BASIC 0
514 
515 /** Ethernet statistics */
516 #define ENA_STATS_SCOPE_ETH 1
517 
518 /** My device */
519 #define ENA_DEVICE_MINE 0xffff
520 
521 /** Get statistics response */
523  /** Header */
525  /** Transmit byte count */
527  /** Transmit packet count */
529  /** Receive byte count */
531  /** Receive packet count */
533  /** Receive drop count */
535 } __attribute__ (( packed ));
536 
537 /** Admin queue request */
538 union ena_aq_req {
539  /** Header */
541  /** Create submission queue */
543  /** Destroy submission queue */
545  /** Create completion queue */
547  /** Destroy completion queue */
549  /** Get feature */
551  /** Set feature */
553  /** Get statistics */
555  /** Padding */
557 };
558 
559 /** Admin completion queue response */
560 union ena_acq_rsp {
561  /** Header */
563  /** Create submission queue */
565  /** Destroy submission queue */
567  /** Create completion queue */
569  /** Destroy completion queue */
571  /** Get feature */
573  /** Get statistics */
575  /** Padding */
577 };
578 
579 /** Admin queue */
580 struct ena_aq {
581  /** Requests */
582  union ena_aq_req *req;
583  /** Producer counter */
584  unsigned int prod;
585 };
586 
587 /** Admin completion queue */
588 struct ena_acq {
589  /** Responses */
590  union ena_acq_rsp *rsp;
591  /** Consumer counter */
592  unsigned int cons;
593  /** Phase */
594  unsigned int phase;
595 };
596 
597 /** Async event notification queue event */
599  /** Type of event */
601  /** ID of event */
603  /** Phase */
605  /** Reserved */
607  /** Timestamp */
609  /** Additional event data */
611 } __attribute__ (( packed ));
612 
613 /** Async event notification queue */
614 struct ena_aenq {
615  /** Events */
617 };
618 
619 /** Transmit submission queue entry */
620 struct ena_tx_sqe {
621  /** Length */
623  /** Metadata flags */
625  /** Flags */
627  /** Reserved */
629  /** Request identifier */
631  /** Address and inlined length */
632  union {
633  /** Address */
635  /** Inlined length */
636  struct {
637  /** Reserved */
639  /** Inlined length */
641  } __attribute__ (( packed ));
642  } __attribute__ (( packed ));
643 } __attribute__ (( packed ));
644 
645 /** This is a metadata entry */
646 #define ENA_TX_SQE_META 0x80
647 
648 /** Receive submission queue entry */
649 struct ena_rx_sqe {
650  /** Length */
652  /** Reserved */
654  /** Flags */
656  /** Request identifier */
658  /** Reserved */
660  /** Address */
662 } __attribute__ (( packed ));
663 
664 /** Submission queue ownership phase flag */
665 #define ENA_SQE_PHASE 0x01
666 
667 /** This is the first descriptor */
668 #define ENA_SQE_FIRST 0x04
669 
670 /** This is the last descriptor */
671 #define ENA_SQE_LAST 0x08
672 
673 /** Request completion */
674 #define ENA_SQE_CPL 0x10
675 
676 /** Transmit completion queue entry */
677 struct ena_tx_cqe {
678  /** Request identifier */
680  /** Status */
682  /** Flags */
684  /** Reserved */
686  /** Consumer index */
688 } __attribute__ (( packed ));
689 
690 /** Transmit completion request identifier */
691 #define ENA_TX_CQE_ID(id) ( (id) >> 2 )
692 
693 /** Receive completion queue entry */
694 struct ena_rx_cqe {
695  /** Reserved */
697  /** Flags */
699  /** Length */
701  /** Request identifier */
703  /** Reserved */
705 } __attribute__ (( packed ));
706 
707 /** Completion queue ownership phase flag */
708 #define ENA_CQE_PHASE 0x01
709 
710 /** Low latency transmit queue bounce buffer */
711 struct ena_tx_llqe {
712  /** Pointless metadata descriptor */
713  struct ena_tx_sqe meta;
714  /** Transmit descriptor */
715  struct ena_tx_sqe sqe;
716  /** Inlined header data */
718 } __attribute__ (( packed ));
719 
720 /** Submission queue */
721 struct ena_sq {
722  /** Entries */
723  union {
724  /** Transmit submission queue entries */
725  struct ena_tx_sqe *tx;
726  /** Receive submission queue entries */
727  struct ena_rx_sqe *rx;
728  /** Low latency queue bounce buffer */
729  struct ena_tx_llqe *llq;
730  /** Raw data */
731  void *raw;
732  } sqe;
733  /** Buffer IDs */
735  /** Low latency queue base */
736  void *llqe;
737  /** Doorbell register offset */
738  unsigned int doorbell;
739  /** Total length of entries */
740  size_t len;
741  /** Producer counter */
742  unsigned int prod;
743  /** Phase */
744  unsigned int phase;
745  /** Queue policy */
747  /** Submission queue identifier */
749  /** Direction */
751  /** Number of entries */
753  /** Fill level (limited to completion queue size) */
755  /** Maximum inline header length */
757 };
758 
759 /**
760  * Initialise submission queue
761  *
762  * @v sq Submission queue
763  * @v direction Direction
764  * @v count Number of entries
765  * @v size Size of each entry
766  * @v ids Buffer IDs
767  */
768 static inline __attribute__ (( always_inline )) void
769 ena_sq_init ( struct ena_sq *sq, unsigned int direction, unsigned int count,
770  size_t size, uint8_t *ids ) {
771 
772  sq->len = ( count * size );
774  sq->direction = direction;
775  sq->count = count;
776  sq->ids = ids;
777 }
778 
779 /** Completion queue */
780 struct ena_cq {
781  /** Entries */
782  union {
783  /** Transmit completion queue entries */
784  struct ena_tx_cqe *tx;
785  /** Receive completion queue entries */
786  struct ena_rx_cqe *rx;
787  /** Raw data */
788  void *raw;
789  } cqe;
790  /** Doorbell register offset */
791  unsigned int doorbell;
792  /** Total length of entries */
793  size_t len;
794  /** Consumer counter */
795  unsigned int cons;
796  /** Phase */
797  unsigned int phase;
798  /** Completion queue identifier */
800  /** Entry size (in 32-bit words) */
802  /** Requested number of entries */
804  /** Actual number of entries */
806  /** Actual number of entries minus one */
808 };
809 
810 /**
811  * Initialise completion queue
812  *
813  * @v cq Completion queue
814  * @v count Number of entries
815  * @v size Size of each entry
816  */
817 static inline __attribute__ (( always_inline )) void
818 ena_cq_init ( struct ena_cq *cq, unsigned int count, size_t size ) {
819 
820  cq->len = ( count * size );
821  cq->size = ( size / sizeof ( uint32_t ) );
823 }
824 
825 /** Queue pair */
826 struct ena_qp {
827  /** Submission queue */
828  struct ena_sq sq;
829  /** Completion queue */
830  struct ena_cq cq;
831 };
832 
833 /** An ENA network card */
834 struct ena_nic {
835  /** Registers */
836  void *regs;
837  /** On-device memory */
838  void *mem;
839  /** Device features */
841  /** Host info */
843  /** Admin queue */
844  struct ena_aq aq;
845  /** Admin completion queue */
846  struct ena_acq acq;
847  /** Async event notification queue */
848  struct ena_aenq aenq;
849  /** Transmit queue */
850  struct ena_qp tx;
851  /** Receive queue */
852  struct ena_qp rx;
853  /** Transmit buffer IDs */
855  /** Transmit I/O buffers, indexed by buffer ID */
857  /** Receive buffer IDs */
859  /** Receive I/O buffers, indexed by buffer ID */
861 };
862 
863 #endif /* _ENA_H */
uint8_t reserved_b[2]
Reserved.
Definition: ena.h:659
Destroy completion queue response.
Definition: ena.h:438
uint8_t reserved_a[12]
Reserved.
Definition: ena.h:499
struct ena_aq aq
Admin queue.
Definition: ena.h:844
Queue pair.
Definition: ena.h:826
uint16_t id
Completion queue identifier.
Definition: ena.h:413
uint32_t intr
Interrupt unmask register offset.
Definition: ena.h:421
struct ena_tx_sqe * tx
Transmit submission queue entries.
Definition: ena.h:725
uint8_t reserved[3]
Reserved.
Definition: ena.h:606
struct ena_qp rx
Receive queue.
Definition: ena.h:852
uint8_t type
Type.
Definition: ena.h:501
struct ena_acq_header header
Header.
Definition: ena.h:347
unsigned short uint16_t
Definition: stdint.h:11
void * raw
Raw data.
Definition: ena.h:788
struct ena_aq_header header
Header.
Definition: ena.h:387
uint64_t address
Address.
Definition: ena.h:453
Host information.
Definition: ena.h:226
uint8_t reserved[2]
Reserved.
Definition: ena.h:434
uint8_t mac[ETH_ALEN]
MAC address.
Definition: ena.h:138
#define ENA_RX_COUNT
Number of receive queue entries.
Definition: ena.h:40
uint64_t info
Host info base address.
Definition: ena.h:218
uint8_t rx_ids[ENA_RX_COUNT]
Receive buffer IDs.
Definition: ena.h:858
Create completion queue request.
Definition: ena.h:385
union ena_sq::@46 sqe
Entries.
uint8_t mask
Actual number of entries minus one.
Definition: ena.h:807
uint8_t reserved_a
Reserved.
Definition: ena.h:319
uint8_t reserved_b[8]
Reserved.
Definition: ena.h:331
size_t len
Total length of entries.
Definition: ena.h:740
uint8_t inlined
Maximum inline header length.
Definition: ena.h:756
static unsigned int unsigned int size_t uint8_t * ids
Definition: ena.h:770
unsigned int doorbell
Doorbell register offset.
Definition: ena.h:738
uint8_t count
Number of entries.
Definition: ena.h:752
A low latency queue option.
Definition: ena.h:152
struct ena_aq_header header
Header.
Definition: ena.h:449
uint8_t flags
Flags.
Definition: ena.h:455
uint8_t * ids
Buffer IDs.
Definition: ena.h:734
unsigned int prod
Producer counter.
Definition: ena.h:742
uint16_t id
Completion queue identifier.
Definition: ena.h:432
uint8_t reserved[2]
Reserved.
Definition: ena.h:486
uint64_t linux_features
Linux network device features.
Definition: ena.h:240
struct ena_tx_cqe * tx
Transmit completion queue entries.
Definition: ena.h:784
Create submission queue response.
Definition: ena.h:345
uint32_t doorbell
Doorbell register offset.
Definition: ena.h:353
uint8_t reserved_a[3]
Reserved.
Definition: ena.h:696
struct ena_get_stats_rsp get_stats
Get statistics.
Definition: ena.h:574
Transmit submission queue entry.
Definition: ena.h:620
struct ena_qp tx
Transmit queue.
Definition: ena.h:850
uint8_t reserved[2]
Reserved.
Definition: ena.h:685
struct ena_set_feature_req set_feature
Set feature.
Definition: ena.h:552
uint16_t count
Number of entries.
Definition: ena.h:325
struct ena_aenq aenq
Async event notification queue.
Definition: ena.h:848
Transmit completion queue entry.
Definition: ena.h:677
Get feature response.
Definition: ena.h:463
unsigned long long uint64_t
Definition: stdint.h:13
uint8_t id
Request identifier.
Definition: ena.h:630
Admin queue.
Definition: ena.h:580
uint32_t features
Supported features.
Definition: ena.h:130
uint16_t count
Number of entries.
Definition: ena.h:393
uint32_t mtu
Maximum MTU.
Definition: ena.h:142
uint8_t direction
Direction.
Definition: ena.h:14
struct ena_acq_header header
Header.
Definition: ena.h:465
uint64_t rx_drops
Receive drop count.
Definition: ena.h:534
uint32_t llqe
LLQ descriptor ring offset.
Definition: ena.h:355
uint8_t reserved_a[2]
Reserved.
Definition: ena.h:351
uint16_t len
Length.
Definition: ena.h:651
uint8_t size
Entry size (in 32-bit words)
Definition: ena.h:801
Destroy completion queue request.
Definition: ena.h:428
uint8_t reserved_a[4]
Reserved.
Definition: ena.h:132
struct ena_llq_config llq
Low latency queue configuration.
Definition: ena.h:294
uint16_t enabled
Single-entry bitmask of the enabled option value.
Definition: ena.h:156
uint32_t doorbell
Doorbell register offset.
Definition: ena.h:419
uint32_t features
Supported features.
Definition: ena.h:250
unsigned int phase
Phase.
Definition: ena.h:797
uint16_t spec
ENA specification version.
Definition: ena.h:242
struct ena_tx_sqe meta
Pointless metadata descriptor.
Definition: ena.h:713
uint64_t address
Address.
Definition: ena.h:661
struct ena_aq_header header
Header.
Definition: ena.h:430
struct ena_aq_header header
Header.
Definition: ena.h:315
struct ena_llq_option size
Entry sizes.
Definition: ena.h:18
uint8_t reserved[7]
Reserved.
Definition: ena.h:638
#define ENA_TX_COUNT
Number of transmit queue entries.
Definition: ena.h:37
uint64_t address
Base address.
Definition: ena.h:397
struct ena_llq_option header
Header locations.
Definition: ena.h:166
unsigned int doorbell
Doorbell register offset.
Definition: ena.h:791
struct ena_aq_header header
Header.
Definition: ena.h:476
uint8_t reserved_b[4]
Reserved.
Definition: ena.h:357
void * regs
Registers.
Definition: ena.h:836
uint32_t dist
Operating system distribution (numeric)
Definition: ena.h:232
uint8_t tx_ids[ENA_TX_COUNT]
Transmit buffer IDs.
Definition: ena.h:854
uint32_t debug_len
Debug area size.
Definition: ena.h:222
Completion queue.
Definition: ena.h:780
uint32_t enabled
Bitmask of enabled AENQ groups (host -> device)
Definition: ena.h:209
Submission queue.
Definition: ena.h:721
struct ena_destroy_sq_rsp destroy_sq
Destroy submission queue.
Definition: ena.h:566
uint32_t count
Maximum queue depth.
Definition: ena.h:14
Feature.
Definition: ena.h:290
uint8_t status
Status.
Definition: ena.h:108
size_t len
Total length of entries.
Definition: ena.h:793
struct ena_get_feature_rsp get_feature
Get feature.
Definition: ena.h:572
uint32_t features
Device features.
Definition: ena.h:840
uint16_t id
Request identifier.
Definition: ena.h:679
uint16_t group
Type of event.
Definition: ena.h:600
struct ena_acq_header header
Header.
Definition: ena.h:440
A hardware device.
Definition: device.h:76
uint64_t writeback
Writeback address.
Definition: ena.h:329
struct ena_tx_sqe sqe
Transmit descriptor.
Definition: ena.h:715
uint8_t reserved
Reserved.
Definition: ena.h:372
uint8_t reserved_a[2]
Reserved.
Definition: ena.h:248
uint64_t tx_packets
Transmit packet count.
Definition: ena.h:528
uint16_t id
Request identifier.
Definition: ena.h:657
uint8_t meta
Metadata flags.
Definition: ena.h:624
uint8_t id
Feature identifier.
Definition: ena.h:457
uint16_t cpus
Number of CPUs.
Definition: ena.h:246
uint32_t len
Length.
Definition: ena.h:478
uint16_t cons
Consumer index.
Definition: ena.h:687
uint32_t queues
Maximum number of low latency queues.
Definition: ena.h:162
Host attributes.
Definition: ena.h:216
ena_llq_desc
Low latency queue descriptor count.
Definition: ena.h:196
Headers are placed inline immediately after descriptors.
Definition: ena.h:186
uint8_t reserved_b[2]
Reserved.
Definition: ena.h:140
union ena_aq_req * req
Requests.
Definition: ena.h:582
ena_llq_header
Low latency queue header locations.
Definition: ena.h:184
Transmit.
Definition: ena.h:304
uint64_t address
Base address.
Definition: ena.h:327
uint16_t cq_id
Completion queue identifier.
Definition: ena.h:323
uint8_t reserved
Reserved.
Definition: ena.h:106
ena_sq_policy
Submission queue policy.
Definition: ena.h:335
unsigned int cons
Consumer counter.
Definition: ena.h:592
Use on-device memory (must be used in addition to host memory)
Definition: ena.h:339
uint8_t flags
Flags.
Definition: ena.h:683
uint16_t supported
Bitmask of supported option values.
Definition: ena.h:154
unsigned int cons
Consumer counter.
Definition: ena.h:795
uint16_t policy
Policy.
Definition: ena.h:321
uint16_t mode
Acceleration mode.
Definition: ena.h:176
uint8_t size
Entry size (in 32-bit words)
Definition: ena.h:391
uint8_t flags
Flags.
Definition: ena.h:95
uint16_t ext
Extended status.
Definition: ena.h:112
uint16_t busdevfn
PCI bus:dev.fn address.
Definition: ena.h:244
union ena_tx_sqe::@40 __attribute__((packed))
Address and inlined length.
struct ena_aenq_event * evt
Events.
Definition: ena.h:616
uint64_t debug
Debug area base address.
Definition: ena.h:220
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
uint8_t id
Feature identifier.
Definition: ena.h:484
unsigned int phase
Phase.
Definition: ena.h:744
struct ena_get_stats_req get_stats
Get statistics.
Definition: ena.h:554
uint32_t supported
Bitmask of supported AENQ groups (device -> host)
Definition: ena.h:207
uint16_t count
Actual number of entries.
Definition: ena.h:415
struct ena_create_cq_req create_cq
Create completion queue.
Definition: ena.h:546
struct ena_destroy_cq_req destroy_cq
Destroy completion queue.
Definition: ena.h:548
Create completion queue response.
Definition: ena.h:409
uint8_t direction
Direction.
Definition: ena.h:317
Create submission queue request.
Definition: ena.h:313
struct ena_rx_cqe * rx
Receive completion queue entries.
Definition: ena.h:786
struct ena_cq cq
Completion queue.
Definition: ena.h:830
struct ena_llq_option stride
Descriptor strides.
Definition: ena.h:172
uint8_t flags
Flags.
Definition: ena.h:698
uint32_t vector
MSI-X vector.
Definition: ena.h:395
struct ena_aq_header header
Header.
Definition: ena.h:366
uint8_t flags
Flags.
Definition: ena.h:626
Destroy submission queue response.
Definition: ena.h:376
struct ena_acq_header header
Header.
Definition: ena.h:562
uint32_t len
Length.
Definition: ena.h:451
uint8_t pad[64]
Padding.
Definition: ena.h:576
struct ena_acq_header header
Header.
Definition: ena.h:378
uint8_t reserved_b[4]
Reserved.
Definition: ena.h:180
uint8_t inlined[96]
Inlined header data.
Definition: ena.h:717
uint16_t id
Completion queue identifier.
Definition: ena.h:799
unsigned char uint8_t
Definition: stdint.h:10
uint8_t reserved_b[2]
Reserved.
Definition: ena.h:505
struct ena_host_attributes host
Host attributes.
Definition: ena.h:298
uint8_t actual
Actual number of entries.
Definition: ena.h:805
Destroy submission queue request.
Definition: ena.h:364
struct ena_create_cq_rsp create_cq
Create completion queue.
Definition: ena.h:568
Low latency transmit queue bounce buffer.
Definition: ena.h:711
#define ETH_ALEN
Definition: if_ether.h:8
uint8_t reserved_a[4]
Reserved.
Definition: ena.h:174
uint16_t queue
Queue ID.
Definition: ena.h:507
ena_sq_direction
Submission queue direction.
Definition: ena.h:302
uint32_t node
NUMA node register offset.
Definition: ena.h:417
unsigned int uint32_t
Definition: stdint.h:12
uint8_t requested
Requested number of entries.
Definition: ena.h:803
struct ena_acq acq
Admin completion queue.
Definition: ena.h:846
Async event notification queue config.
Definition: ena.h:205
uint32_t version
Driver version.
Definition: ena.h:238
Low latency queue config.
Definition: ena.h:160
struct ena_llq_option desc
Descriptor counts.
Definition: ena.h:170
struct ena_create_sq_rsp create_sq
Create submission queue.
Definition: ena.h:564
uint8_t reserved_b[3]
Reserved.
Definition: ena.h:628
uint16_t id
Submission queue identifier.
Definition: ena.h:368
struct io_buffer * rx_iobuf[ENA_RX_COUNT]
Receive I/O buffers, indexed by buffer ID.
Definition: ena.h:860
uint8_t reserved_a
Reserved.
Definition: ena.h:653
Async event notification queue event.
Definition: ena.h:598
uint8_t reserved_b[8]
Reserved.
Definition: ena.h:704
Use host memory.
Definition: ena.h:337
uint8_t reserved
Reserved.
Definition: ena.h:91
Memory is contiguous.
Definition: ena.h:341
Two descriptors before inline headers.
Definition: ena.h:198
uint8_t intr
Interrupts enabled.
Definition: ena.h:389
uint64_t address
Address.
Definition: ena.h:480
struct ena_acq_header header
Header.
Definition: ena.h:411
uint16_t syndrome
ID of event.
Definition: ena.h:602
A named feature.
Definition: features.h:78
struct ena_get_feature_req get_feature
Get feature.
Definition: ena.h:550
Get statistics response.
Definition: ena.h:522
struct ena_tx_llqe * llq
Low latency queue bounce buffer.
Definition: ena.h:729
Entries are 128 bytes.
Definition: ena.h:192
struct ena_host_info * info
Host info.
Definition: ena.h:842
void * llqe
Low latency queue base.
Definition: ena.h:736
struct ena_sq sq
Submission queue.
Definition: ena.h:828
uint64_t rx_bytes
Receive byte count.
Definition: ena.h:530
uint32_t version
Device version.
Definition: ena.h:128
uint16_t len
Length.
Definition: ena.h:700
uint16_t id
Request identifier.
Definition: ena.h:702
Receive submission queue entry.
Definition: ena.h:649
uint8_t pad[64]
Padding.
Definition: ena.h:556
uint8_t flags
Flags.
Definition: ena.h:110
union ena_cq::@47 cqe
Entries.
uint64_t address
Address.
Definition: ena.h:634
Receive completion queue entry.
Definition: ena.h:694
uint8_t direction
Direction.
Definition: ena.h:370
Admin completion queue response.
Definition: ena.h:560
uint8_t flags
Flags.
Definition: ena.h:482
uint32_t physical
Physical address width.
Definition: ena.h:134
uint8_t opcode
Opcode.
Definition: ena.h:93
Async event notification queue.
Definition: ena.h:614
union ena_acq_rsp * rsp
Responses.
Definition: ena.h:590
uint64_t tx_bytes
Transmit byte count.
Definition: ena.h:526
uint16_t id
Submission queue identifier.
Definition: ena.h:349
uint8_t flags
Flags.
Definition: ena.h:655
struct ena_acq_header header
Header.
Definition: ena.h:524
uint16_t len
Length.
Definition: ena.h:622
void * mem
On-device memory.
Definition: ena.h:838
char dist_str[128]
Operating system distribution (string)
Definition: ena.h:230
uint64_t timestamp
Timestamp.
Definition: ena.h:608
ena_llq_size
Low latency queue entry sizes.
Definition: ena.h:190
uint16_t id
Submission queue identifier.
Definition: ena.h:748
uint8_t scope
Scope.
Definition: ena.h:503
uint32_t count
Maximum queue depth.
Definition: ena.h:164
char kernel_str[32]
Kernel version (string)
Definition: ena.h:234
struct ena_destroy_sq_req destroy_sq
Destroy submission queue.
Definition: ena.h:544
struct ena_rx_sqe * rx
Receive submission queue entries.
Definition: ena.h:727
uint8_t fill
Fill level (limited to completion queue size)
Definition: ena.h:754
Get feature request.
Definition: ena.h:447
uint8_t flags
Phase.
Definition: ena.h:604
Device attributes.
Definition: ena.h:124
struct ena_llq_option size
Entry sizes.
Definition: ena.h:168
An ENA network card.
Definition: ena.h:834
uint32_t kernel
Kernel version (numeric)
Definition: ena.h:236
uint8_t reserved[2]
Reserved.
Definition: ena.h:459
Admin queue request.
Definition: ena.h:538
Admin queue entry header.
Definition: ena.h:87
uint8_t id
Request identifier.
Definition: ena.h:89
uint8_t status
Status.
Definition: ena.h:681
struct ena_aq_header header
Header.
Definition: ena.h:540
struct ena_aq_header header
Header.
Definition: ena.h:497
unsigned int prod
Producer counter.
Definition: ena.h:584
struct io_buffer * tx_iobuf[ENA_TX_COUNT]
Transmit I/O buffers, indexed by buffer ID.
Definition: ena.h:856
uint64_t rx_packets
Receive packet count.
Definition: ena.h:532
Admin completion queue entry header.
Definition: ena.h:102
struct ena_aenq_config aenq
Async event notification queue config.
Definition: ena.h:296
enum ena_llq_header __attribute__
Admin completion queue.
Definition: ena.h:588
Receive.
Definition: ena.h:306
Set feature request.
Definition: ena.h:474
struct ena_destroy_cq_rsp destroy_cq
Destroy completion queue.
Definition: ena.h:570
uint8_t direction
Direction.
Definition: ena.h:750
uint16_t policy
Queue policy.
Definition: ena.h:746
void * raw
Raw data.
Definition: ena.h:731
struct ena_create_sq_req create_sq
Create submission queue.
Definition: ena.h:542
uint16_t burst
Maximum burst size.
Definition: ena.h:178
Get statistics request.
Definition: ena.h:495
unsigned int phase
Phase.
Definition: ena.h:594
uint8_t inlined
Inlined length.
Definition: ena.h:640
uint16_t device
Device ID.
Definition: ena.h:509
uint16_t cons
Consumer index.
Definition: ena.h:114
uint32_t implementation
Implementation.
Definition: ena.h:126
uint8_t data[48]
Additional event data.
Definition: ena.h:610
uint8_t id
Request identifier.
Definition: ena.h:104
A persistent I/O buffer.
Definition: iobuf.h:37
uint32_t type
Operating system type.
Definition: ena.h:228