iPXE
ena.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2018 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  *
19  * You can also choose to distribute this program under the terms of
20  * the Unmodified Binary Distribution Licence (as given in the file
21  * COPYING.UBDL), provided that you have satisfied its requirements.
22  */
23 
24 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25 
26 #include <stdint.h>
27 #include <stdio.h>
28 #include <string.h>
29 #include <unistd.h>
30 #include <errno.h>
31 #include <byteswap.h>
32 #include <ipxe/netdevice.h>
33 #include <ipxe/ethernet.h>
34 #include <ipxe/if_ether.h>
35 #include <ipxe/iobuf.h>
36 #include <ipxe/malloc.h>
37 #include <ipxe/pci.h>
38 #include <ipxe/pcibridge.h>
39 #include <ipxe/version.h>
40 #include "ena.h"
41 
42 /** @file
43  *
44  * Amazon ENA network driver
45  *
46  */
47 
48 /**
49  * Get direction name (for debugging)
50  *
51  * @v direction Direction
52  * @ret name Direction name
53  */
54 static const char * ena_direction ( unsigned int direction ) {
55 
56  switch ( direction ) {
57  case ENA_SQ_TX: return "TX";
58  case ENA_SQ_RX: return "RX";
59  default: return "<UNKNOWN>";
60  }
61 }
62 
63 /******************************************************************************
64  *
65  * Device reset
66  *
67  ******************************************************************************
68  */
69 
70 /**
71  * Wait for reset operation to be acknowledged
72  *
73  * @v ena ENA device
74  * @v expected Expected reset state
75  * @ret rc Return status code
76  */
77 static int ena_reset_wait ( struct ena_nic *ena, uint32_t expected ) {
78  uint32_t stat;
79  unsigned int i;
80 
81  /* Wait for reset to complete */
82  for ( i = 0 ; i < ENA_RESET_MAX_WAIT_MS ; i++ ) {
83 
84  /* Check if device is ready */
85  stat = readl ( ena->regs + ENA_STAT );
86  if ( ( stat & ENA_STAT_RESET ) == expected )
87  return 0;
88 
89  /* Delay */
90  mdelay ( 1 );
91  }
92 
93  DBGC ( ena, "ENA %p timed out waiting for reset status %#08x "
94  "(got %#08x)\n", ena, expected, stat );
95  return -ETIMEDOUT;
96 }
97 
98 /**
99  * Reset hardware
100  *
101  * @v ena ENA device
102  * @ret rc Return status code
103  */
104 static int ena_reset ( struct ena_nic *ena ) {
105  int rc;
106 
107  /* Trigger reset */
108  writel ( ENA_CTRL_RESET, ( ena->regs + ENA_CTRL ) );
109 
110  /* Wait for reset to take effect */
111  if ( ( rc = ena_reset_wait ( ena, ENA_STAT_RESET ) ) != 0 )
112  return rc;
113 
114  /* Clear reset */
115  writel ( 0, ( ena->regs + ENA_CTRL ) );
116 
117  /* Wait for reset to clear */
118  if ( ( rc = ena_reset_wait ( ena, 0 ) ) != 0 )
119  return rc;
120 
121  return 0;
122 }
123 
124 /******************************************************************************
125  *
126  * Admin queue
127  *
128  ******************************************************************************
129  */
130 
131 /**
132  * Set queue base address
133  *
134  * @v ena ENA device
135  * @v offset Register offset
136  * @v address Base address
137  */
138 static inline void ena_set_base ( struct ena_nic *ena, unsigned int offset,
139  void *base ) {
141 
142  /* Program base address registers */
143  writel ( ( phys & 0xffffffffUL ),
144  ( ena->regs + offset + ENA_BASE_LO ) );
145  if ( sizeof ( phys ) > sizeof ( uint32_t ) ) {
146  writel ( ( ( ( uint64_t ) phys ) >> 32 ),
147  ( ena->regs + offset + ENA_BASE_HI ) );
148  } else {
149  writel ( 0, ( ena->regs + offset + ENA_BASE_HI ) );
150  }
151 }
152 
153 /**
154  * Set queue capabilities
155  *
156  * @v ena ENA device
157  * @v offset Register offset
158  * @v count Number of entries
159  * @v size Size of each entry
160  */
161 static inline __attribute__ (( always_inline )) void
162 ena_set_caps ( struct ena_nic *ena, unsigned int offset, unsigned int count,
163  size_t size ) {
164 
165  /* Program capabilities register */
166  writel ( ENA_CAPS ( count, size ), ( ena->regs + offset ) );
167 }
168 
169 /**
170  * Clear queue capabilities
171  *
172  * @v ena ENA device
173  * @v offset Register offset
174  */
175 static inline __attribute__ (( always_inline )) void
176 ena_clear_caps ( struct ena_nic *ena, unsigned int offset ) {
177 
178  /* Clear capabilities register */
179  writel ( 0, ( ena->regs + offset ) );
180 }
181 
182 /**
183  * Create admin queues
184  *
185  * @v ena ENA device
186  * @ret rc Return status code
187  */
188 static int ena_create_admin ( struct ena_nic *ena ) {
189  size_t aq_len = ( ENA_AQ_COUNT * sizeof ( ena->aq.req[0] ) );
190  size_t acq_len = ( ENA_ACQ_COUNT * sizeof ( ena->acq.rsp[0] ) );
191  int rc;
192 
193  /* Allocate admin completion queue */
194  ena->acq.rsp = malloc_phys ( acq_len, acq_len );
195  if ( ! ena->acq.rsp ) {
196  rc = -ENOMEM;
197  goto err_alloc_acq;
198  }
199  memset ( ena->acq.rsp, 0, acq_len );
200 
201  /* Allocate admin queue */
202  ena->aq.req = malloc_phys ( aq_len, aq_len );
203  if ( ! ena->aq.req ) {
204  rc = -ENOMEM;
205  goto err_alloc_aq;
206  }
207  memset ( ena->aq.req, 0, aq_len );
208 
209  /* Program queue addresses and capabilities */
210  ena_set_base ( ena, ENA_ACQ_BASE, ena->acq.rsp );
212  sizeof ( ena->acq.rsp[0] ) );
213  ena_set_base ( ena, ENA_AQ_BASE, ena->aq.req );
215  sizeof ( ena->aq.req[0] ) );
216 
217  DBGC ( ena, "ENA %p AQ [%08lx,%08lx) ACQ [%08lx,%08lx)\n",
218  ena, virt_to_phys ( ena->aq.req ),
219  ( virt_to_phys ( ena->aq.req ) + aq_len ),
220  virt_to_phys ( ena->acq.rsp ),
221  ( virt_to_phys ( ena->acq.rsp ) + acq_len ) );
222  return 0;
223 
224  ena_clear_caps ( ena, ENA_AQ_CAPS );
225  ena_clear_caps ( ena, ENA_ACQ_CAPS );
226  free_phys ( ena->aq.req, aq_len );
227  err_alloc_aq:
228  free_phys ( ena->acq.rsp, acq_len );
229  err_alloc_acq:
230  return rc;
231 }
232 
233 /**
234  * Destroy admin queues
235  *
236  * @v ena ENA device
237  */
238 static void ena_destroy_admin ( struct ena_nic *ena ) {
239  size_t aq_len = ( ENA_AQ_COUNT * sizeof ( ena->aq.req[0] ) );
240  size_t acq_len = ( ENA_ACQ_COUNT * sizeof ( ena->acq.rsp[0] ) );
241 
242  /* Clear queue capabilities */
243  ena_clear_caps ( ena, ENA_AQ_CAPS );
244  ena_clear_caps ( ena, ENA_ACQ_CAPS );
245  wmb();
246 
247  /* Free queues */
248  free_phys ( ena->aq.req, aq_len );
249  free_phys ( ena->acq.rsp, acq_len );
250  DBGC ( ena, "ENA %p AQ and ACQ destroyed\n", ena );
251 }
252 
253 /**
254  * Get next available admin queue request
255  *
256  * @v ena ENA device
257  * @ret req Admin queue request
258  */
259 static union ena_aq_req * ena_admin_req ( struct ena_nic *ena ) {
260  union ena_aq_req *req;
261  unsigned int index;
262 
263  /* Get next request */
264  index = ( ena->aq.prod % ENA_AQ_COUNT );
265  req = &ena->aq.req[index];
266 
267  /* Initialise request */
268  memset ( ( ( ( void * ) req ) + sizeof ( req->header ) ), 0,
269  ( sizeof ( *req ) - sizeof ( req->header ) ) );
270  req->header.id = ena->aq.prod;
271 
272  /* Increment producer counter */
273  ena->aq.prod++;
274 
275  return req;
276 }
277 
278 /**
279  * Issue admin queue request
280  *
281  * @v ena ENA device
282  * @v req Admin queue request
283  * @v rsp Admin queue response to fill in
284  * @ret rc Return status code
285  */
286 static int ena_admin ( struct ena_nic *ena, union ena_aq_req *req,
287  union ena_acq_rsp **rsp ) {
288  unsigned int index;
289  unsigned int i;
290  int rc;
291 
292  /* Locate response */
293  index = ( ena->acq.cons % ENA_ACQ_COUNT );
294  *rsp = &ena->acq.rsp[index];
295 
296  /* Mark request as ready */
297  req->header.flags ^= ENA_AQ_PHASE;
298  wmb();
299  DBGC2 ( ena, "ENA %p admin request %#x:\n",
300  ena, le16_to_cpu ( req->header.id ) );
301  DBGC2_HDA ( ena, virt_to_phys ( req ), req, sizeof ( *req ) );
302 
303  /* Ring doorbell */
304  writel ( ena->aq.prod, ( ena->regs + ENA_AQ_DB ) );
305 
306  /* Wait for response */
307  for ( i = 0 ; i < ENA_ADMIN_MAX_WAIT_MS ; i++ ) {
308 
309  /* Check for response */
310  if ( ( (*rsp)->header.flags ^ ena->acq.phase ) & ENA_ACQ_PHASE){
311  mdelay ( 1 );
312  continue;
313  }
314  DBGC2 ( ena, "ENA %p admin response %#x:\n",
315  ena, le16_to_cpu ( (*rsp)->header.id ) );
316  DBGC2_HDA ( ena, virt_to_phys ( *rsp ), *rsp, sizeof ( **rsp ));
317 
318  /* Increment consumer counter */
319  ena->acq.cons++;
320  if ( ( ena->acq.cons % ENA_ACQ_COUNT ) == 0 )
321  ena->acq.phase ^= ENA_ACQ_PHASE;
322 
323  /* Check command identifier */
324  if ( (*rsp)->header.id != req->header.id ) {
325  DBGC ( ena, "ENA %p admin response %#x mismatch:\n",
326  ena, le16_to_cpu ( (*rsp)->header.id ) );
327  rc = -EILSEQ;
328  goto err;
329  }
330 
331  /* Check status */
332  if ( (*rsp)->header.status != 0 ) {
333  DBGC ( ena, "ENA %p admin response %#x status %d:\n",
334  ena, le16_to_cpu ( (*rsp)->header.id ),
335  (*rsp)->header.status );
336  rc = -EIO;
337  goto err;
338  }
339 
340  /* Success */
341  return 0;
342  }
343 
344  rc = -ETIMEDOUT;
345  DBGC ( ena, "ENA %p timed out waiting for admin request %#x:\n",
346  ena, le16_to_cpu ( req->header.id ) );
347  err:
348  DBGC_HDA ( ena, virt_to_phys ( req ), req, sizeof ( *req ) );
349  DBGC_HDA ( ena, virt_to_phys ( *rsp ), *rsp, sizeof ( **rsp ) );
350  return rc;
351 }
352 
353 /**
354  * Set async event notification queue config
355  *
356  * @v ena ENA device
357  * @v enabled Bitmask of the groups to enable
358  * @ret rc Return status code
359  */
360 static int ena_set_aenq_config ( struct ena_nic *ena, uint32_t enabled ) {
361  union ena_aq_req *req;
362  union ena_acq_rsp *rsp;
363  union ena_feature *feature;
364  int rc;
365 
366  /* Construct request */
367  req = ena_admin_req ( ena );
370  feature = &req->set_feature.feature;
371  feature->aenq.enabled = cpu_to_le32 ( enabled );
372 
373  /* Issue request */
374  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
375  DBGC ( ena, "ENA %p could not set AENQ configuration: %s\n",
376  ena, strerror ( rc ) );
377  return rc;
378  }
379 
380  return 0;
381 }
382 
383 /**
384  * Create async event notification queue
385  *
386  * @v ena ENA device
387  * @ret rc Return status code
388  */
389 static int ena_create_async ( struct ena_nic *ena ) {
390  size_t aenq_len = ( ENA_AENQ_COUNT * sizeof ( ena->aenq.evt[0] ) );
391  int rc;
392 
393  /* Allocate async event notification queue */
394  ena->aenq.evt = malloc_phys ( aenq_len, aenq_len );
395  if ( ! ena->aenq.evt ) {
396  rc = -ENOMEM;
397  goto err_alloc_aenq;
398  }
399  memset ( ena->aenq.evt, 0, aenq_len );
400 
401  /* Program queue address and capabilities */
402  ena_set_base ( ena, ENA_AENQ_BASE, ena->aenq.evt );
404  sizeof ( ena->aenq.evt[0] ) );
405 
406  DBGC ( ena, "ENA %p AENQ [%08lx,%08lx)\n",
407  ena, virt_to_phys ( ena->aenq.evt ),
408  ( virt_to_phys ( ena->aenq.evt ) + aenq_len ) );
409 
410  /* Disable all events */
411  if ( ( rc = ena_set_aenq_config ( ena, 0 ) ) != 0 )
412  goto err_set_aenq_config;
413 
414  return 0;
415 
416  err_set_aenq_config:
417  ena_clear_caps ( ena, ENA_AENQ_CAPS );
418  free_phys ( ena->aenq.evt, aenq_len );
419  err_alloc_aenq:
420  return rc;
421 }
422 
423 /**
424  * Destroy async event notification queue
425  *
426  * @v ena ENA device
427  */
428 static void ena_destroy_async ( struct ena_nic *ena ) {
429  size_t aenq_len = ( ENA_AENQ_COUNT * sizeof ( ena->aenq.evt[0] ) );
430 
431  /* Clear queue capabilities */
432  ena_clear_caps ( ena, ENA_AENQ_CAPS );
433  wmb();
434 
435  /* Free queue */
436  free_phys ( ena->aenq.evt, aenq_len );
437  DBGC ( ena, "ENA %p AENQ destroyed\n", ena );
438 }
439 
440 /**
441  * Create submission queue
442  *
443  * @v ena ENA device
444  * @v sq Submission queue
445  * @v cq Corresponding completion queue
446  * @ret rc Return status code
447  */
448 static int ena_create_sq ( struct ena_nic *ena, struct ena_sq *sq,
449  struct ena_cq *cq ) {
450  union ena_aq_req *req;
451  union ena_acq_rsp *rsp;
452  unsigned int i;
453  size_t llqe;
454  int rc;
455 
456  /* Allocate submission queue entries */
457  sq->sqe.raw = malloc_phys ( sq->len, ENA_ALIGN );
458  if ( ! sq->sqe.raw ) {
459  rc = -ENOMEM;
460  goto err_alloc;
461  }
462  memset ( sq->sqe.raw, 0, sq->len );
463 
464  /* Construct request */
465  req = ena_admin_req ( ena );
466  req->header.opcode = ENA_CREATE_SQ;
467  req->create_sq.direction = sq->direction;
468  req->create_sq.policy = cpu_to_le16 ( sq->policy );
469  req->create_sq.cq_id = cpu_to_le16 ( cq->id );
470  req->create_sq.count = cpu_to_le16 ( sq->count );
471  if ( ! ( sq->policy & ENA_SQ_DEVICE_MEMORY ) ) {
472  req->create_sq.address =
473  cpu_to_le64 ( virt_to_bus ( sq->sqe.raw ) );
474  }
475 
476  /* Issue request */
477  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
478  DBGC ( ena, "ENA %p could not create %s SQ: %s\n",
479  ena, ena_direction ( sq->direction ), strerror ( rc ) );
480  goto err_admin;
481  }
482 
483  /* Parse response */
484  sq->id = le16_to_cpu ( rsp->create_sq.id );
485  sq->doorbell = le32_to_cpu ( rsp->create_sq.doorbell );
486  llqe = le32_to_cpu ( rsp->create_sq.llqe );
487  if ( sq->policy & ENA_SQ_DEVICE_MEMORY ) {
488  assert ( ena->mem != NULL );
489  assert ( sq->len >= sizeof ( *sq->sqe.llq ) );
490  sq->llqe = ( ena->mem + llqe );
491  } else {
492  sq->llqe = NULL;
493  }
494 
495  /* Reset producer counter and phase */
496  sq->prod = 0;
497  sq->phase = ENA_SQE_PHASE;
498 
499  /* Calculate fill level */
500  sq->fill = sq->count;
501  if ( sq->fill > cq->actual )
502  sq->fill = cq->actual;
503 
504  /* Initialise buffer ID ring */
505  for ( i = 0 ; i < sq->count ; i++ )
506  sq->ids[i] = i;
507 
508  DBGC ( ena, "ENA %p %s SQ%d at ",
509  ena, ena_direction ( sq->direction ), sq->id );
510  if ( sq->policy & ENA_SQ_DEVICE_MEMORY ) {
511  DBGC ( ena, "LLQ [+%08zx,+%08zx)", llqe,
512  ( llqe + ( sq->count * sizeof ( sq->sqe.llq[0] ) ) ) );
513  } else {
514  DBGC ( ena, "[%08lx,%08lx)", virt_to_phys ( sq->sqe.raw ),
515  ( virt_to_phys ( sq->sqe.raw ) + sq->len ) );
516  }
517  DBGC ( ena, " fill %d db +%04x CQ%d\n",
518  sq->fill, sq->doorbell, cq->id );
519  return 0;
520 
521  err_admin:
522  free_phys ( sq->sqe.raw, sq->len );
523  err_alloc:
524  return rc;
525 }
526 
527 /**
528  * Destroy submission queue
529  *
530  * @v ena ENA device
531  * @v sq Submission queue
532  * @ret rc Return status code
533  */
534 static int ena_destroy_sq ( struct ena_nic *ena, struct ena_sq *sq ) {
535  union ena_aq_req *req;
536  union ena_acq_rsp *rsp;
537  int rc;
538 
539  /* Construct request */
540  req = ena_admin_req ( ena );
542  req->destroy_sq.id = cpu_to_le16 ( sq->id );
543  req->destroy_sq.direction = sq->direction;
544 
545  /* Issue request */
546  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
547  DBGC ( ena, "ENA %p could not destroy %s SQ%d: %s\n",
548  ena, ena_direction ( sq->direction ), sq->id,
549  strerror ( rc ) );
550  return rc;
551  }
552 
553  /* Free submission queue entries */
554  free_phys ( sq->sqe.raw, sq->len );
555 
556  DBGC ( ena, "ENA %p %s SQ%d destroyed\n",
557  ena, ena_direction ( sq->direction ), sq->id );
558  return 0;
559 }
560 
561 /**
562  * Create completion queue
563  *
564  * @v ena ENA device
565  * @v cq Completion queue
566  * @ret rc Return status code
567  */
568 static int ena_create_cq ( struct ena_nic *ena, struct ena_cq *cq ) {
569  union ena_aq_req *req;
570  union ena_acq_rsp *rsp;
571  int rc;
572 
573  /* Allocate completion queue entries */
574  cq->cqe.raw = malloc_phys ( cq->len, ENA_ALIGN );
575  if ( ! cq->cqe.raw ) {
576  rc = -ENOMEM;
577  goto err_alloc;
578  }
579  memset ( cq->cqe.raw, 0, cq->len );
580 
581  /* Construct request */
582  req = ena_admin_req ( ena );
583  req->header.opcode = ENA_CREATE_CQ;
584  req->create_cq.size = cq->size;
585  req->create_cq.count = cpu_to_le16 ( cq->requested );
587  req->create_cq.address = cpu_to_le64 ( virt_to_bus ( cq->cqe.raw ) );
588 
589  /* Issue request */
590  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
591  DBGC ( ena, "ENA %p could not create CQ (broken firmware?): "
592  "%s\n", ena, strerror ( rc ) );
593  goto err_admin;
594  }
595 
596  /* Parse response */
597  cq->id = le16_to_cpu ( rsp->create_cq.id );
598  cq->actual = le16_to_cpu ( rsp->create_cq.count );
599  cq->doorbell = le32_to_cpu ( rsp->create_cq.doorbell );
600  cq->mask = ( cq->actual - 1 );
601  if ( cq->actual != cq->requested ) {
602  DBGC ( ena, "ENA %p CQ%d requested %d actual %d\n",
603  ena, cq->id, cq->requested, cq->actual );
604  }
605 
606  /* Reset consumer counter and phase */
607  cq->cons = 0;
608  cq->phase = ENA_CQE_PHASE;
609 
610  DBGC ( ena, "ENA %p CQ%d at [%08lx,%08lx) db +%04x\n",
611  ena, cq->id, virt_to_phys ( cq->cqe.raw ),
612  ( virt_to_phys ( cq->cqe.raw ) + cq->len ), cq->doorbell );
613  return 0;
614 
615  err_admin:
616  free_phys ( cq->cqe.raw, cq->len );
617  err_alloc:
618  return rc;
619 }
620 
621 /**
622  * Destroy completion queue
623  *
624  * @v ena ENA device
625  * @v cq Completion queue
626  * @ret rc Return status code
627  */
628 static int ena_destroy_cq ( struct ena_nic *ena, struct ena_cq *cq ) {
629  union ena_aq_req *req;
630  union ena_acq_rsp *rsp;
631  int rc;
632 
633  /* Construct request */
634  req = ena_admin_req ( ena );
636  req->destroy_cq.id = cpu_to_le16 ( cq->id );
637 
638  /* Issue request */
639  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
640  DBGC ( ena, "ENA %p could not destroy CQ%d: %s\n",
641  ena, cq->id, strerror ( rc ) );
642  return rc;
643  }
644 
645  /* Free completion queue entries */
646  free_phys ( cq->cqe.raw, cq->len );
647 
648  DBGC ( ena, "ENA %p CQ%d destroyed\n", ena, cq->id );
649  return 0;
650 }
651 
652 /**
653  * Create queue pair
654  *
655  * @v ena ENA device
656  * @v qp Queue pair
657  * @ret rc Return status code
658  */
659 static int ena_create_qp ( struct ena_nic *ena, struct ena_qp *qp ) {
660  int rc;
661 
662  /* Create completion queue */
663  if ( ( rc = ena_create_cq ( ena, &qp->cq ) ) != 0 )
664  goto err_create_cq;
665 
666  /* Create submission queue */
667  if ( ( rc = ena_create_sq ( ena, &qp->sq, &qp->cq ) ) != 0 )
668  goto err_create_sq;
669 
670  return 0;
671 
672  ena_destroy_sq ( ena, &qp->sq );
673  err_create_sq:
674  ena_destroy_cq ( ena, &qp->cq );
675  err_create_cq:
676  return rc;
677 }
678 
679 /**
680  * Destroy queue pair
681  *
682  * @v ena ENA device
683  * @v qp Queue pair
684  * @ret rc Return status code
685  */
686 static int ena_destroy_qp ( struct ena_nic *ena, struct ena_qp *qp ) {
687 
688  /* Destroy submission queue */
689  ena_destroy_sq ( ena, &qp->sq );
690 
691  /* Destroy completion queue */
692  ena_destroy_cq ( ena, &qp->cq );
693 
694  return 0;
695 }
696 
697 /**
698  * Get device attributes
699  *
700  * @v netdev Network device
701  * @ret rc Return status code
702  */
704  struct ena_nic *ena = netdev->priv;
705  union ena_aq_req *req;
706  union ena_acq_rsp *rsp;
707  union ena_feature *feature;
708  int rc;
709 
710  /* Construct request */
711  req = ena_admin_req ( ena );
714 
715  /* Issue request */
716  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
717  DBGC ( ena, "ENA %p could not get device attributes: %s\n",
718  ena, strerror ( rc ) );
719  return rc;
720  }
721 
722  /* Parse response */
723  feature = &rsp->get_feature.feature;
724  memcpy ( netdev->hw_addr, feature->device.mac, ETH_ALEN );
725  netdev->max_pkt_len = le32_to_cpu ( feature->device.mtu );
727  ena->features = le32_to_cpu ( feature->device.features );
728 
729  DBGC ( ena, "ENA %p MAC %s MTU %zd features %#08x\n",
731  ena->features );
732  return 0;
733 }
734 
735 /**
736  * Set host attributes
737  *
738  * @v ena ENA device
739  * @ret rc Return status code
740  */
741 static int ena_set_host_attributes ( struct ena_nic *ena ) {
742  union ena_aq_req *req;
743  union ena_acq_rsp *rsp;
744  union ena_feature *feature;
745  int rc;
746 
747  /* Construct request */
748  req = ena_admin_req ( ena );
751  feature = &req->set_feature.feature;
752  feature->host.info = cpu_to_le64 ( virt_to_bus ( ena->info ) );
753 
754  /* Issue request */
755  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
756  DBGC ( ena, "ENA %p could not set host attributes: %s\n",
757  ena, strerror ( rc ) );
758  return rc;
759  }
760 
761  return 0;
762 }
763 
764 /**
765  * Configure low latency queues
766  *
767  * @v ena ENA device
768  * @ret rc Return status code
769  */
770 static int ena_llq_config ( struct ena_nic *ena ) {
771  union ena_aq_req *req;
772  union ena_acq_rsp *rsp;
773  union ena_feature *feature;
775  uint16_t size;
776  uint16_t desc;
778  uint16_t mode;
779  int rc;
780 
781  /* Construct request */
782  req = ena_admin_req ( ena );
785 
786  /* Issue request */
787  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
788  DBGC ( ena, "ENA %p could not get LLQ configuration: %s\n",
789  ena, strerror ( rc ) );
790  return rc;
791  }
792 
793  /* Parse response */
794  feature = &rsp->get_feature.feature;
795  header = le16_to_cpu ( feature->llq.header.supported );
796  size = le16_to_cpu ( feature->llq.size.supported );
797  desc = le16_to_cpu ( feature->llq.desc.supported );
798  stride = le16_to_cpu ( feature->llq.stride.supported );
799  mode = le16_to_cpu ( feature->llq.mode );
800  DBGC ( ena, "ENA %p LLQ supports %02x:%02x:%02x:%02x:%02x with %dx%d "
801  "entries\n", ena, header, size, desc, stride, mode,
802  le32_to_cpu ( feature->llq.queues ),
803  le32_to_cpu ( feature->llq.count ) );
804 
805  /* Check for a supported configuration */
806  if ( ! feature->llq.queues ) {
807  DBGC ( ena, "ENA %p LLQ has no queues\n", ena );
808  return -ENOTSUP;
809  }
810  if ( ! ( header & ENA_LLQ_HEADER_INLINE ) ) {
811  DBGC ( ena, "ENA %p LLQ does not support inline headers\n",
812  ena );
813  return -ENOTSUP;
814  }
815  if ( ! ( size & ENA_LLQ_SIZE_128 ) ) {
816  DBGC ( ena, "ENA %p LLQ does not support 128-byte entries\n",
817  ena );
818  return -ENOTSUP;
819  }
820  if ( ! ( desc & ENA_LLQ_DESC_2 ) ) {
821  DBGC ( ena, "ENA %p LLQ does not support two-descriptor "
822  "entries\n", ena );
823  return -ENOTSUP;
824  }
825 
826  /* Enable a minimal configuration */
830  stride &= ( -stride ); /* Don't care: use first supported option */
831  DBGC ( ena, "ENA %p LLQ enabling %02x:%02x:%02x:%02x:%02x\n",
832  ena, header, size, desc, stride, mode );
833 
834  /* Construct request */
835  req = ena_admin_req ( ena );
838  feature = &req->set_feature.feature;
839  feature->llq.header.enabled = cpu_to_le16 ( header );
840  feature->llq.size.enabled = cpu_to_le16 ( size );
841  feature->llq.desc.enabled = cpu_to_le16 ( desc );
842  feature->llq.stride.enabled = cpu_to_le16 ( stride );
843  feature->llq.mode = cpu_to_le16 ( mode );
844 
845  /* Issue request */
846  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
847  DBGC ( ena, "ENA %p could not set LLQ configuration: %s\n",
848  ena, strerror ( rc ) );
849  return rc;
850  }
851 
852  /* Use on-device memory for transmit queue */
854  ena->tx.sq.inlined = sizeof ( ena->tx.sq.sqe.llq->inlined );
855 
856  return 0;
857 }
858 
859 /**
860  * Get statistics (for debugging)
861  *
862  * @v ena ENA device
863  * @ret rc Return status code
864  */
865 static int ena_get_stats ( struct ena_nic *ena ) {
866  union ena_aq_req *req;
867  union ena_acq_rsp *rsp;
868  struct ena_get_stats_rsp *stats;
869  int rc;
870 
871  /* Do nothing unless debug messages are enabled */
872  if ( ! DBG_LOG )
873  return 0;
874 
875  /* Construct request */
876  req = ena_admin_req ( ena );
877  req->header.opcode = ENA_GET_STATS;
881 
882  /* Issue request */
883  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
884  DBGC ( ena, "ENA %p could not get statistics: %s\n",
885  ena, strerror ( rc ) );
886  return rc;
887  }
888 
889  /* Parse response */
890  stats = &rsp->get_stats;
891  DBGC ( ena, "ENA %p TX bytes %#llx packets %#llx\n", ena,
892  ( ( unsigned long long ) le64_to_cpu ( stats->tx_bytes ) ),
893  ( ( unsigned long long ) le64_to_cpu ( stats->tx_packets ) ) );
894  DBGC ( ena, "ENA %p RX bytes %#llx packets %#llx drops %#llx\n", ena,
895  ( ( unsigned long long ) le64_to_cpu ( stats->rx_bytes ) ),
896  ( ( unsigned long long ) le64_to_cpu ( stats->rx_packets ) ),
897  ( ( unsigned long long ) le64_to_cpu ( stats->rx_drops ) ) );
898 
899  return 0;
900 }
901 
902 /******************************************************************************
903  *
904  * Network device interface
905  *
906  ******************************************************************************
907  */
908 
909 /**
910  * Refill receive queue
911  *
912  * @v netdev Network device
913  */
914 static void ena_refill_rx ( struct net_device *netdev ) {
915  struct ena_nic *ena = netdev->priv;
916  struct io_buffer *iobuf;
917  struct ena_rx_sqe *sqe;
919  size_t len = netdev->max_pkt_len;
920  unsigned int refilled = 0;
921  unsigned int index;
922  unsigned int id;
923 
924  /* Refill queue */
925  while ( ( ena->rx.sq.prod - ena->rx.cq.cons ) < ena->rx.sq.fill ) {
926 
927  /* Allocate I/O buffer */
928  iobuf = alloc_iob ( len );
929  if ( ! iobuf ) {
930  /* Wait for next refill */
931  break;
932  }
933 
934  /* Get next submission queue entry and buffer ID */
935  index = ( ena->rx.sq.prod % ENA_RX_COUNT );
936  sqe = &ena->rx.sq.sqe.rx[index];
937  id = ena->rx_ids[index];
938 
939  /* Construct submission queue entry */
940  address = virt_to_bus ( iobuf->data );
941  sqe->len = cpu_to_le16 ( len );
942  sqe->id = cpu_to_le16 ( id );
944  wmb();
946  ena->rx.sq.phase );
947 
948  /* Increment producer counter */
949  ena->rx.sq.prod++;
950  if ( ( ena->rx.sq.prod % ENA_RX_COUNT ) == 0 )
951  ena->rx.sq.phase ^= ENA_SQE_PHASE;
952 
953  /* Record I/O buffer */
954  assert ( ena->rx_iobuf[id] == NULL );
955  ena->rx_iobuf[id] = iobuf;
956 
957  DBGC2 ( ena, "ENA %p RX %d at [%08llx,%08llx)\n", ena, id,
958  ( ( unsigned long long ) address ),
959  ( ( unsigned long long ) address + len ) );
960  refilled++;
961  }
962 
963  /* Ring doorbell, if applicable */
964  if ( refilled ) {
965  wmb();
966  writel ( ena->rx.sq.prod, ( ena->regs + ena->rx.sq.doorbell ) );
967  }
968 }
969 
970 /**
971  * Discard unused receive I/O buffers
972  *
973  * @v ena ENA device
974  */
975 static void ena_empty_rx ( struct ena_nic *ena ) {
976  struct io_buffer *iobuf;
977  unsigned int i;
978 
979  for ( i = 0 ; i < ENA_RX_COUNT ; i++ ) {
980  iobuf = ena->rx_iobuf[i];
981  ena->rx_iobuf[i] = NULL;
982  if ( iobuf )
983  free_iob ( iobuf );
984  }
985 }
986 
987 /**
988  * Cancel uncompleted transmit I/O buffers
989  *
990  * @v netdev Network device
991  */
992 static void ena_cancel_tx ( struct net_device *netdev ) {
993  struct ena_nic *ena = netdev->priv;
994  struct io_buffer *iobuf;
995  unsigned int i;
996 
997  for ( i = 0 ; i < ENA_TX_COUNT ; i++ ) {
998  iobuf = ena->tx_iobuf[i];
999  ena->tx_iobuf[i] = NULL;
1000  if ( iobuf )
1002  }
1003 }
1004 
1005 /**
1006  * Open network device
1007  *
1008  * @v netdev Network device
1009  * @ret rc Return status code
1010  */
1011 static int ena_open ( struct net_device *netdev ) {
1012  struct ena_nic *ena = netdev->priv;
1013  int rc;
1014 
1015  /* Create transmit queue pair */
1016  if ( ( rc = ena_create_qp ( ena, &ena->tx ) ) != 0 )
1017  goto err_create_tx;
1018 
1019  /* Create receive queue pair */
1020  if ( ( rc = ena_create_qp ( ena, &ena->rx ) ) != 0 )
1021  goto err_create_rx;
1022 
1023  /* Refill receive queue */
1024  ena_refill_rx ( netdev );
1025 
1026  return 0;
1027 
1028  ena_destroy_qp ( ena, &ena->rx );
1029  err_create_rx:
1030  ena_destroy_qp ( ena, &ena->tx );
1031  err_create_tx:
1032  return rc;
1033 }
1034 
1035 /**
1036  * Close network device
1037  *
1038  * @v netdev Network device
1039  */
1040 static void ena_close ( struct net_device *netdev ) {
1041  struct ena_nic *ena = netdev->priv;
1042 
1043  /* Dump statistics (for debugging) */
1044  ena_get_stats ( ena );
1045 
1046  /* Destroy receive queue pair */
1047  ena_destroy_qp ( ena, &ena->rx );
1048 
1049  /* Discard any unused receive buffers */
1050  ena_empty_rx ( ena );
1051 
1052  /* Destroy transmit queue pair */
1053  ena_destroy_qp ( ena, &ena->tx );
1054 
1055  /* Cancel any uncompleted transmit buffers */
1056  ena_cancel_tx ( netdev );
1057 }
1058 
1059 /**
1060  * Transmit packet
1061  *
1062  * @v netdev Network device
1063  * @v iobuf I/O buffer
1064  * @ret rc Return status code
1065  */
1066 static int ena_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) {
1067  struct ena_nic *ena = netdev->priv;
1068  struct ena_tx_sqe *sqe;
1069  struct ena_tx_llqe *llqe;
1070  const uint64_t *src;
1071  uint64_t *dest;
1073  unsigned int index;
1074  unsigned int id;
1075  unsigned int i;
1076  uint8_t flags;
1077  size_t inlined;
1078  size_t len;
1079 
1080  /* Get next submission queue entry */
1081  if ( ( ena->tx.sq.prod - ena->tx.cq.cons ) >= ena->tx.sq.fill ) {
1082  DBGC ( ena, "ENA %p out of transmit descriptors\n", ena );
1083  return -ENOBUFS;
1084  }
1085  index = ( ena->tx.sq.prod % ENA_TX_COUNT );
1086  sqe = &ena->tx.sq.sqe.tx[index];
1087  id = ena->tx_ids[index];
1088 
1089  /* Construct submission queue entry values */
1090  address = virt_to_bus ( iobuf->data );
1091  len = iob_len ( iobuf );
1092  inlined = ena->tx.sq.inlined;
1093  if ( inlined > len )
1094  inlined = len;
1095  len -= inlined;
1096  address += inlined;
1098  ena->tx.sq.phase );
1099 
1100  /* Prepare low-latency queue bounce buffer, if applicable */
1101  llqe = ena->tx.sq.sqe.llq;
1102  if ( ena->tx.sq.llqe ) {
1103 
1104  /* Construct zero-information metadata queue entry */
1105  llqe->meta.meta = ENA_TX_SQE_META;
1106  llqe->meta.flags = ( flags & ~( ENA_SQE_LAST | ENA_SQE_CPL ) );
1107 
1108  /* Copy inlined data */
1109  memcpy ( llqe->inlined, iobuf->data, inlined );
1110 
1111  /* Place submission queue entry within bounce buffer */
1112  sqe = &llqe->sqe;
1113  flags &= ~ENA_SQE_FIRST;
1114  }
1115 
1116  /* Construct submission queue entry */
1117  sqe->len = cpu_to_le16 ( len );
1118  sqe->id = cpu_to_le16 ( id );
1119  sqe->address = cpu_to_le64 ( address );
1120  sqe->inlined = inlined;
1121  wmb();
1122  sqe->flags = flags;
1123  wmb();
1124 
1125  /* Copy bounce buffer to on-device memory, if applicable */
1126  if ( ena->tx.sq.llqe ) {
1127  src = ( ( const void * ) llqe );
1128  dest = ( ena->tx.sq.llqe + ( index * sizeof ( *llqe ) ) );
1129  for ( i = 0 ; i < ( sizeof ( *llqe ) / sizeof ( *src ) ); i++ )
1130  writeq ( *(src++), dest++ );
1131  wmb();
1132  }
1133 
1134  /* Increment producer counter */
1135  ena->tx.sq.prod++;
1136  if ( ( ena->tx.sq.prod % ENA_TX_COUNT ) == 0 )
1137  ena->tx.sq.phase ^= ENA_SQE_PHASE;
1138 
1139  /* Record I/O buffer */
1140  assert ( ena->tx_iobuf[id] == NULL );
1141  ena->tx_iobuf[id] = iobuf;
1142 
1143  /* Ring doorbell */
1144  writel ( ena->tx.sq.prod, ( ena->regs + ena->tx.sq.doorbell ) );
1145 
1146  DBGC2 ( ena, "ENA %p TX %d at [%08llx,%08llx)\n", ena, id,
1147  ( ( unsigned long long ) address ),
1148  ( ( unsigned long long ) address + len ) );
1149  return 0;
1150 }
1151 
1152 /**
1153  * Poll for completed transmissions
1154  *
1155  * @v netdev Network device
1156  */
1157 static void ena_poll_tx ( struct net_device *netdev ) {
1158  struct ena_nic *ena = netdev->priv;
1159  struct ena_tx_cqe *cqe;
1160  struct io_buffer *iobuf;
1161  unsigned int index;
1162  unsigned int id;
1163 
1164  /* Check for completed packets */
1165  while ( ena->tx.cq.cons != ena->tx.sq.prod ) {
1166 
1167  /* Get next completion queue entry */
1168  index = ( ena->tx.cq.cons & ena->tx.cq.mask );
1169  cqe = &ena->tx.cq.cqe.tx[index];
1170 
1171  /* Stop if completion queue entry is empty */
1172  if ( ( cqe->flags ^ ena->tx.cq.phase ) & ENA_CQE_PHASE )
1173  return;
1174 
1175  /* Increment consumer counter */
1176  ena->tx.cq.cons++;
1177  if ( ! ( ena->tx.cq.cons & ena->tx.cq.mask ) )
1178  ena->tx.cq.phase ^= ENA_CQE_PHASE;
1179 
1180  /* Identify and free buffer ID */
1181  id = ENA_TX_CQE_ID ( le16_to_cpu ( cqe->id ) );
1182  ena->tx_ids[index] = id;
1183 
1184  /* Identify I/O buffer */
1185  iobuf = ena->tx_iobuf[id];
1186  assert ( iobuf != NULL );
1187  ena->tx_iobuf[id] = NULL;
1188 
1189  /* Complete transmit */
1190  DBGC2 ( ena, "ENA %p TX %d complete\n", ena, id );
1191  netdev_tx_complete ( netdev, iobuf );
1192  }
1193 }
1194 
1195 /**
1196  * Poll for received packets
1197  *
1198  * @v netdev Network device
1199  */
1200 static void ena_poll_rx ( struct net_device *netdev ) {
1201  struct ena_nic *ena = netdev->priv;
1202  struct ena_rx_cqe *cqe;
1203  struct io_buffer *iobuf;
1204  unsigned int index;
1205  unsigned int id;
1206  size_t len;
1207 
1208  /* Check for received packets */
1209  while ( ena->rx.cq.cons != ena->rx.sq.prod ) {
1210 
1211  /* Get next completion queue entry */
1212  index = ( ena->rx.cq.cons & ena->rx.cq.mask );
1213  cqe = &ena->rx.cq.cqe.rx[index];
1214 
1215  /* Stop if completion queue entry is empty */
1216  if ( ( cqe->flags ^ ena->rx.cq.phase ) & ENA_CQE_PHASE )
1217  return;
1218 
1219  /* Increment consumer counter */
1220  ena->rx.cq.cons++;
1221  if ( ! ( ena->rx.cq.cons & ena->rx.cq.mask ) )
1222  ena->rx.cq.phase ^= ENA_CQE_PHASE;
1223 
1224  /* Identify and free buffer ID */
1225  id = le16_to_cpu ( cqe->id );
1226  ena->rx_ids[index] = id;
1227 
1228  /* Populate I/O buffer */
1229  iobuf = ena->rx_iobuf[id];
1230  assert ( iobuf != NULL );
1231  ena->rx_iobuf[id] = NULL;
1232  len = le16_to_cpu ( cqe->len );
1233  iob_put ( iobuf, len );
1234 
1235  /* Hand off to network stack */
1236  DBGC2 ( ena, "ENA %p RX %d complete (length %zd)\n",
1237  ena, id, len );
1238  netdev_rx ( netdev, iobuf );
1239  }
1240 }
1241 
1242 /**
1243  * Poll for completed and received packets
1244  *
1245  * @v netdev Network device
1246  */
1247 static void ena_poll ( struct net_device *netdev ) {
1248 
1249  /* Poll for transmit completions */
1250  ena_poll_tx ( netdev );
1251 
1252  /* Poll for receive completions */
1253  ena_poll_rx ( netdev );
1254 
1255  /* Refill receive ring */
1256  ena_refill_rx ( netdev );
1257 }
1258 
1259 /** ENA network device operations */
1261  .open = ena_open,
1262  .close = ena_close,
1263  .transmit = ena_transmit,
1264  .poll = ena_poll,
1265 };
1266 
1267 /******************************************************************************
1268  *
1269  * PCI interface
1270  *
1271  ******************************************************************************
1272  */
1273 
1274 /**
1275  * Assign memory BARs
1276  *
1277  * @v ena ENA device
1278  * @v pci PCI device
1279  * @v prefmembase On-device memory base address to fill in
1280  * @v prefmemsize On-device memory size to fill in
1281  * @ret rc Return status code
1282  *
1283  * Some BIOSes in AWS EC2 are observed to fail to assign a base
1284  * address to the ENA device. The device is the only device behind
1285  * its bridge, and the BIOS does assign a memory window to the bridge.
1286  * We therefore place the device at the start of the memory window.
1287  */
1288 static int ena_membases ( struct ena_nic *ena, struct pci_device *pci,
1289  unsigned long *prefmembase,
1290  unsigned long *prefmemsize ) {
1291  struct pci_bridge *bridge;
1292 
1293  /* Get on-device memory base address and size */
1295  *prefmemsize = pci_bar_size ( pci, ENA_MEM_BAR );
1296 
1297  /* Do nothing if addresses are already assigned */
1298  if ( pci->membase && ( *prefmembase || ( ! *prefmemsize ) ) )
1299  return 0;
1300 
1301  /* Locate PCI bridge */
1302  bridge = pcibridge_find ( pci );
1303  if ( ! bridge ) {
1304  DBGC ( ena, "ENA %p found no PCI bridge\n", ena );
1305  return -ENOTCONN;
1306  }
1307  DBGC ( ena, "ENA %p at " PCI_FMT " claiming bridge " PCI_FMT "\n",
1308  ena, PCI_ARGS ( pci ), PCI_ARGS ( bridge->pci ) );
1309 
1310  /* Sanity check */
1311  if ( PCI_SLOT ( pci->busdevfn ) || PCI_FUNC ( pci->busdevfn ) ) {
1312  DBGC ( ena, "ENA %p at " PCI_FMT " may not be only device "
1313  "on bus\n", ena, PCI_ARGS ( pci ) );
1314  return -ENOTSUP;
1315  }
1316 
1317  /* Place register BAR at start of memory window, if applicable */
1318  if ( ! pci->membase ) {
1319  pci_bar_set ( pci, ENA_REGS_BAR, bridge->membase );
1320  pci->membase = bridge->membase;
1321  DBGC ( ena, "ENA %p at " PCI_FMT " claiming mem %08lx\n",
1322  ena, PCI_ARGS ( pci ), pci->membase );
1323  }
1324 
1325  /* Place memory BAR at start of prefetchable window, if applicable */
1326  if ( *prefmemsize && ( ! *prefmembase ) ) {
1327  pci_bar_set ( pci, ENA_MEM_BAR, bridge->prefmembase );
1328  *prefmembase = bridge->prefmembase;
1329  DBGC ( ena, "ENA %p at " PCI_FMT " claiming prefmem %08lx\n",
1330  ena, PCI_ARGS ( pci ), *prefmembase );
1331  }
1332 
1333  return 0;
1334 }
1335 
1336 /**
1337  * Probe PCI device
1338  *
1339  * @v pci PCI device
1340  * @ret rc Return status code
1341  */
1342 static int ena_probe ( struct pci_device *pci ) {
1343  struct net_device *netdev;
1344  struct ena_nic *ena;
1345  struct ena_host_info *info;
1346  unsigned long prefmembase;
1347  unsigned long prefmemsize;
1348  int rc;
1349 
1350  /* Allocate and initialise net device */
1351  netdev = alloc_etherdev ( sizeof ( *ena ) );
1352  if ( ! netdev ) {
1353  rc = -ENOMEM;
1354  goto err_alloc;
1355  }
1357  ena = netdev->priv;
1358  pci_set_drvdata ( pci, netdev );
1359  netdev->dev = &pci->dev;
1360  memset ( ena, 0, sizeof ( *ena ) );
1361  ena->acq.phase = ENA_ACQ_PHASE;
1362  ena_cq_init ( &ena->tx.cq, ENA_TX_COUNT,
1363  sizeof ( ena->tx.cq.cqe.tx[0] ) );
1364  ena_sq_init ( &ena->tx.sq, ENA_SQ_TX, ENA_TX_COUNT,
1365  sizeof ( ena->tx.sq.sqe.tx[0] ), ena->tx_ids );
1366  ena_cq_init ( &ena->rx.cq, ENA_RX_COUNT,
1367  sizeof ( ena->rx.cq.cqe.rx[0] ) );
1368  ena_sq_init ( &ena->rx.sq, ENA_SQ_RX, ENA_RX_COUNT,
1369  sizeof ( ena->rx.sq.sqe.rx[0] ), ena->rx_ids );
1370 
1371  /* Fix up PCI device */
1372  adjust_pci_device ( pci );
1373 
1374  /* Fix up PCI BAR if left unassigned by BIOS */
1375  if ( ( rc = ena_membases ( ena, pci, &prefmembase,
1376  &prefmemsize ) ) != 0 ) {
1377  goto err_membases;
1378  }
1379 
1380  /* Map registers */
1381  ena->regs = pci_ioremap ( pci, pci->membase, ENA_REGS_SIZE );
1382  if ( ! ena->regs ) {
1383  rc = -ENODEV;
1384  goto err_regs;
1385  }
1386 
1387  /* Map device memory */
1388  if ( prefmemsize ) {
1389  ena->mem = pci_ioremap ( pci, prefmembase, prefmemsize );
1390  if ( ! ena->mem ) {
1391  rc = -ENODEV;
1392  goto err_mem;
1393  }
1394  DBGC ( ena, "ENA %p has %ldkB of on-device memory\n",
1395  ena, ( prefmemsize >> 10 ) );
1396  }
1397 
1398  /* Allocate and initialise host info */
1400  if ( ! info ) {
1401  rc = -ENOMEM;
1402  goto err_info;
1403  }
1404  ena->info = info;
1405  memset ( info, 0, PAGE_SIZE );
1407  snprintf ( info->dist_str, sizeof ( info->dist_str ), "%s",
1409  snprintf ( info->kernel_str, sizeof ( info->kernel_str ), "%s",
1410  product_version );
1413  info->busdevfn = cpu_to_le16 ( pci->busdevfn );
1414  DBGC2 ( ena, "ENA %p host info:\n", ena );
1415  DBGC2_HDA ( ena, virt_to_phys ( info ), info, sizeof ( *info ) );
1416 
1417  /* Reset the NIC */
1418  if ( ( rc = ena_reset ( ena ) ) != 0 )
1419  goto err_reset;
1420 
1421  /* Create admin queues */
1422  if ( ( rc = ena_create_admin ( ena ) ) != 0 )
1423  goto err_create_admin;
1424 
1425  /* Create async event notification queue */
1426  if ( ( rc = ena_create_async ( ena ) ) != 0 )
1427  goto err_create_async;
1428 
1429  /* Set host attributes */
1430  if ( ( rc = ena_set_host_attributes ( ena ) ) != 0 )
1431  goto err_set_host_attributes;
1432 
1433  /* Fetch MAC address */
1434  if ( ( rc = ena_get_device_attributes ( netdev ) ) != 0 )
1435  goto err_get_device_attributes;
1436 
1437  /* Attempt to configure low latency queues, if applicable.
1438  * Ignore any errors and continue without using LLQs.
1439  */
1440  if ( ena->mem && ( ena->features & ENA_FEATURE_LLQ ) )
1441  ena_llq_config ( ena );
1442 
1443  /* Register network device */
1444  if ( ( rc = register_netdev ( netdev ) ) != 0 )
1445  goto err_register_netdev;
1446 
1447  /* Mark as link up, since we have no way to test link state on
1448  * this hardware.
1449  */
1450  netdev_link_up ( netdev );
1451 
1452  return 0;
1453 
1455  err_register_netdev:
1456  err_get_device_attributes:
1457  err_set_host_attributes:
1458  ena_destroy_async ( ena );
1459  err_create_async:
1460  ena_destroy_admin ( ena );
1461  err_create_admin:
1462  ena_reset ( ena );
1463  err_reset:
1464  free_phys ( ena->info, PAGE_SIZE );
1465  err_info:
1466  if ( ena->mem )
1467  iounmap ( ena->mem );
1468  err_mem:
1469  iounmap ( ena->regs );
1470  err_regs:
1471  err_membases:
1472  netdev_nullify ( netdev );
1473  netdev_put ( netdev );
1474  err_alloc:
1475  return rc;
1476 }
1477 
1478 /**
1479  * Remove PCI device
1480  *
1481  * @v pci PCI device
1482  */
1483 static void ena_remove ( struct pci_device *pci ) {
1484  struct net_device *netdev = pci_get_drvdata ( pci );
1485  struct ena_nic *ena = netdev->priv;
1486 
1487  /* Unregister network device */
1489 
1490  /* Destroy async event notification queue */
1491  ena_destroy_async ( ena );
1492 
1493  /* Destroy admin queues */
1494  ena_destroy_admin ( ena );
1495 
1496  /* Reset card */
1497  ena_reset ( ena );
1498 
1499  /* Free host info */
1500  free_phys ( ena->info, PAGE_SIZE );
1501 
1502  /* Unmap registers and on-device memory */
1503  if ( ena->mem )
1504  iounmap ( ena->mem );
1505  iounmap ( ena->regs );
1506 
1507  /* Free network device */
1508  netdev_nullify ( netdev );
1509  netdev_put ( netdev );
1510 }
1511 
1512 /** ENA PCI device IDs */
1513 static struct pci_device_id ena_nics[] = {
1514  PCI_ROM ( 0x1d0f, 0xec20, "ena-vf", "ENA VF", 0 ),
1515  PCI_ROM ( 0x1d0f, 0xec21, "ena-vf-llq", "ENA VF (LLQ)", 0 ),
1516 };
1517 
1518 /** ENA PCI driver */
1519 struct pci_driver ena_driver __pci_driver = {
1520  .ids = ena_nics,
1521  .id_count = ( sizeof ( ena_nics ) / sizeof ( ena_nics[0] ) ),
1522  .probe = ena_probe,
1523  .remove = ena_remove,
1524 };
const char product_short_name[]
Product short name string.
Definition: version.c:76
#define PCI_FUNC(busdevfn)
Definition: pci.h:285
struct ena_aq aq
Admin queue.
Definition: ena.h:844
Queue pair.
Definition: ena.h:826
static void ena_refill_rx(struct net_device *netdev)
Refill receive queue.
Definition: ena.c:914
#define __attribute__(x)
Definition: compiler.h:10
#define ENA_ACQ_COUNT
Number of admin completion queue entries.
Definition: ena.h:31
uint32_t base
Base.
Definition: librm.h:138
struct ena_tx_sqe * tx
Transmit submission queue entries.
Definition: ena.h:725
static void ena_destroy_admin(struct ena_nic *ena)
Destroy admin queues.
Definition: ena.c:238
struct ena_qp rx
Receive queue.
Definition: ena.h:852
unsigned long membase
Memory base.
Definition: pci.h:219
#define ENA_CTRL
Device control register.
Definition: ena.h:76
uint8_t type
Type.
Definition: ena.h:501
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void ena_remove(struct pci_device *pci)
Remove PCI device.
Definition: ena.c:1483
unsigned short uint16_t
Definition: stdint.h:11
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:766
wmb()
void * raw
Raw data.
Definition: ena.h:788
#define ENA_BASE_HI
Base address high register offset.
Definition: ena.h:46
Host information.
Definition: ena.h:226
#define iob_put(iobuf, len)
Definition: iobuf.h:124
u32 info
Definition: ar9003_mac.h:67
#define ENA_RX_COUNT
Number of receive queue entries.
Definition: ena.h:40
#define ENA_AQ_COUNT
Number of admin queue entries.
Definition: ena.h:28
A PCI driver.
Definition: pci.h:251
uint8_t rx_ids[ENA_RX_COUNT]
Receive buffer IDs.
Definition: ena.h:858
union ena_sq::@46 sqe
Entries.
#define ENA_AENQ_CONFIG
Async event notification queue config.
Definition: ena.h:202
static void ena_poll_tx(struct net_device *netdev)
Poll for completed transmissions.
Definition: ena.c:1157
uint8_t mask
Actual number of entries minus one.
Definition: ena.h:807
size_t len
Total length of entries.
Definition: ena.h:740
uint8_t inlined
Maximum inline header length.
Definition: ena.h:756
unsigned int doorbell
Doorbell register offset.
Definition: ena.h:738
uint32_t stat
Completion status.
Definition: dwmac.h:12
uint8_t count
Number of entries.
Definition: ena.h:752
#define le32_to_cpu(value)
Definition: byteswap.h:113
int(* open)(struct net_device *netdev)
Open network device.
Definition: netdevice.h:222
static int ena_llq_config(struct ena_nic *ena)
Configure low latency queues.
Definition: ena.c:770
#define ENA_GET_FEATURE
Get feature.
Definition: ena.h:444
#define ENA_HOST_ATTRIBUTES
Host attributes.
Definition: ena.h:213
Error codes.
#define ENA_CREATE_CQ
Create completion queue.
Definition: ena.h:382
#define ENA_ACQ_BASE
Admin completion queue base address register.
Definition: ena.h:58
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
I/O buffers.
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
uint16_t mode
Acceleration mode.
Definition: ena.h:26
struct pci_device_id * ids
PCI ID table.
Definition: pci.h:253
uint64_t address
Base address.
Definition: ena.h:24
struct ena_tx_cqe * tx
Transmit completion queue entries.
Definition: ena.h:784
size_t mtu
Maximum transmission unit length.
Definition: netdevice.h:415
uint16_t size
Buffer size.
Definition: dwmac.h:14
static int ena_get_device_attributes(struct net_device *netdev)
Get device attributes.
Definition: ena.c:703
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
static int ena_get_stats(struct ena_nic *ena)
Get statistics (for debugging)
Definition: ena.c:865
Transmit submission queue entry.
Definition: ena.h:620
struct ena_qp tx
Transmit queue.
Definition: ena.h:850
#define DBGC(...)
Definition: compiler.h:505
unsigned long pci_bar_size(struct pci_device *pci, unsigned int reg)
Get the size of a PCI BAR.
Definition: pci.c:163
struct ena_set_feature_req set_feature
Set feature.
Definition: ena.h:552
uint16_t count
Number of entries.
Definition: ena.h:325
static int ena_membases(struct ena_nic *ena, struct pci_device *pci, unsigned long *prefmembase, unsigned long *prefmemsize)
Assign memory BARs.
Definition: ena.c:1288
long index
Definition: bigint.h:62
struct ena_aenq aenq
Async event notification queue.
Definition: ena.h:848
#define ENA_SQE_CPL
Request completion.
Definition: ena.h:674
Transmit completion queue entry.
Definition: ena.h:677
unsigned long long uint64_t
Definition: stdint.h:13
uint8_t id
Request identifier.
Definition: ena.h:630
static int ena_open(struct net_device *netdev)
Open network device.
Definition: ena.c:1011
#define cpu_to_le64(value)
Definition: byteswap.h:108
uint16_t count
Number of entries.
Definition: ena.h:393
uint8_t direction
Direction.
Definition: ena.h:14
uint64_t rx_drops
Receive drop count.
Definition: ena.h:534
uint32_t llqe
LLQ descriptor ring offset.
Definition: ena.h:20
#define ENA_AQ_BASE
Admin queue base address register.
Definition: ena.h:52
#define ENA_GET_STATS
Get statistics.
Definition: ena.h:492
#define PAGE_SIZE
Page size.
Definition: io.h:27
static void ena_close(struct net_device *netdev)
Close network device.
Definition: ena.c:1040
uint8_t size
Entry size (in 32-bit words)
Definition: ena.h:801
static int ena_create_qp(struct ena_nic *ena, struct ena_qp *qp)
Create queue pair.
Definition: ena.c:659
unsigned int phase
Phase.
Definition: ena.h:797
#define ENA_ACQ_CAPS
Admin completion queue capabilities register.
Definition: ena.h:61
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition: pci.c:240
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:130
#define ENA_MEM_BAR
On-device memory BAR.
Definition: ena.h:22
struct device dev
Generic device.
Definition: pci.h:212
#define ENA_CTRL_RESET
Reset.
Definition: ena.h:77
uint16_t enabled
Single-entry bitmask of the enabled option value.
Definition: ena.h:14
#define ENA_TX_COUNT
Number of transmit queue entries.
Definition: ena.h:37
#define ENA_AENQ_BASE
Async event notification queue base address register.
Definition: ena.h:73
uint64_t address
Base address.
Definition: ena.h:397
#define ECANCELED
Operation canceled.
Definition: errno.h:343
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
unsigned int doorbell
Doorbell register offset.
Definition: ena.h:791
void * regs
Registers.
Definition: ena.h:836
void pci_bar_set(struct pci_device *pci, unsigned int reg, unsigned long start)
Set the start of a PCI BAR.
Definition: pci.c:114
Dynamic memory allocation.
uint8_t tx_ids[ENA_TX_COUNT]
Transmit buffer IDs.
Definition: ena.h:854
union ena_feature feature
Feature.
Definition: ena.h:14
Completion queue.
Definition: ena.h:780
static int ena_reset_wait(struct ena_nic *ena, uint32_t expected)
Wait for reset operation to be acknowledged.
Definition: ena.c:77
Submission queue.
Definition: ena.h:721
static int ena_set_host_attributes(struct ena_nic *ena)
Set host attributes.
Definition: ena.c:741
static int ena_destroy_qp(struct ena_nic *ena, struct ena_qp *qp)
Destroy queue pair.
Definition: ena.c:686
static void ena_empty_rx(struct ena_nic *ena)
Discard unused receive I/O buffers.
Definition: ena.c:975
Feature.
Definition: ena.h:290
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:518
#define ENA_DEVICE_ATTRIBUTES
Device attributes.
Definition: ena.h:121
static int ena_destroy_sq(struct ena_nic *ena, struct ena_sq *sq)
Destroy submission queue.
Definition: ena.c:534
size_t len
Total length of entries.
Definition: ena.h:793
uint32_t features
Device features.
Definition: ena.h:840
struct ena_llq_option desc
Descriptor counts.
Definition: ena.h:20
#define ENA_CAPS(count, size)
Capability register value.
Definition: ena.h:49
uint16_t id
Request identifier.
Definition: ena.h:679
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition: pci.h:365
#define ENOMEM
Not enough space.
Definition: errno.h:534
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static signed char phys[4]
Definition: epic100.c:88
uint64_t tx_packets
Transmit packet count.
Definition: ena.h:528
#define EILSEQ
Illegal byte sequence.
Definition: errno.h:413
uint8_t inlined
Inlined length.
Definition: ena.h:638
uint8_t id
Feature identifier.
Definition: ena.h:457
#define ENA_BASE_LO
Base address low register offset.
Definition: ena.h:43
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
#define ETH_HLEN
Definition: if_ether.h:9
#define ENA_STAT_RESET
Reset in progress.
Definition: ena.h:84
static void ena_set_caps(struct ena_nic *ena, unsigned int offset, unsigned int count, size_t size)
Set queue capabilities.
Definition: ena.c:162
struct pci_bridge * pcibridge_find(struct pci_device *pci)
Find bridge attached to a PCI device.
Definition: pcibridge.c:48
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:575
Ethernet protocol.
Headers are placed inline immediately after descriptors.
Definition: ena.h:186
#define ENA_TX_CQE_ID(id)
Transmit completion request identifier.
Definition: ena.h:691
static const void * src
Definition: string.h:47
union ena_aq_req * req
Requests.
Definition: ena.h:582
#define ENA_AENQ_CAPS
Async event notification queue capabilities register.
Definition: ena.h:70
Transmit.
Definition: ena.h:304
uint64_t address
Base address.
Definition: ena.h:327
#define ENA_TX_SQE_META
This is a metadata entry.
Definition: ena.h:646
void * priv
Driver private data.
Definition: netdevice.h:431
static int ena_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: ena.c:1066
#define DBGC_HDA(...)
Definition: compiler.h:506
uint16_t cq_id
Completion queue identifier.
Definition: ena.h:323
unsigned int cons
Consumer counter.
Definition: ena.h:592
static int ena_set_aenq_config(struct ena_nic *ena, uint32_t enabled)
Set async event notification queue config.
Definition: ena.c:360
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:788
ring len
Length.
Definition: dwmac.h:231
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
Use on-device memory (must be used in addition to host memory)
Definition: ena.h:339
uint8_t flags
Flags.
Definition: ena.h:683
struct pci_device * pci
PCI device.
Definition: pcibridge.h:19
unsigned int cons
Consumer counter.
Definition: ena.h:795
uint16_t policy
Policy.
Definition: ena.h:321
#define ENA_CQE_PHASE
Completion queue ownership phase flag.
Definition: ena.h:708
static struct net_device * netdev
Definition: gdbudp.c:52
uint8_t size
Entry size (in 32-bit words)
Definition: ena.h:391
static unsigned int count
Number of entries.
Definition: dwmac.h:225
unsigned long pci_bar_start(struct pci_device *pci, unsigned int reg)
Find the start of a PCI BAR.
Definition: pci.c:96
uint8_t flags
Flags.
Definition: ena.h:95
static int ena_probe(struct pci_device *pci)
Probe PCI device.
Definition: ena.c:1342
#define ENA_STATS_TYPE_BASIC
Basic statistics.
Definition: ena.h:513
#define ENA_AENQ_COUNT
Number of async event notification queue entries.
Definition: ena.h:34
struct ena_aenq_event * evt
Events.
Definition: ena.h:616
#define ENA_SQE_FIRST
This is the first descriptor.
Definition: ena.h:668
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
uint8_t id
Feature identifier.
Definition: ena.h:484
unsigned int phase
Phase.
Definition: ena.h:744
uint64_t prefmembase
Prefetchable memory base.
Definition: pcibridge.h:38
struct ena_get_stats_req get_stats
Get statistics.
Definition: ena.h:554
static struct net_device_operations ena_operations
ENA network device operations.
Definition: ena.c:1260
#define cpu_to_le32(value)
Definition: byteswap.h:107
uint8_t id
Request identifier.
Definition: ena.h:12
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
#define ENOTCONN
The socket is not connected.
Definition: errno.h:569
#define DBGC2_HDA(...)
Definition: compiler.h:523
uint8_t direction
Direction.
Definition: ena.h:317
struct ena_llq_option stride
Descriptor strides.
Definition: ena.h:22
#define ENA_MSIX_NONE
Empty MSI-X vector.
Definition: ena.h:406
uint64_t rsp
Definition: librm.h:153
static void ena_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition: ena.c:1247
struct ena_rx_cqe * rx
Receive completion queue entries.
Definition: ena.h:786
struct ena_cq cq
Completion queue.
Definition: ena.h:830
uint8_t flags
Flags.
Definition: ena.h:18
uint8_t flags
Flags.
Definition: ena.h:698
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
A PCI-to-PCI bridge.
Definition: pcibridge.h:17
#define ENA_HOST_INFO_VERSION_WTF
Driver version.
Definition: ena.h:284
uint32_t vector
MSI-X vector.
Definition: ena.h:395
#define ENA_REGS_BAR
Register BAR.
Definition: ena.h:16
static int ena_create_admin(struct ena_nic *ena)
Create admin queues.
Definition: ena.c:188
uint8_t flags
Flags.
Definition: ena.h:626
#define ENA_ACQ_PHASE
Admin completion queue ownership phase flag.
Definition: ena.h:118
#define PCI_FMT
PCI device debug message format.
Definition: pci.h:311
#define PCI_SLOT(busdevfn)
Definition: pci.h:284
static int ena_create_cq(struct ena_nic *ena, struct ena_cq *cq)
Create completion queue.
Definition: ena.c:568
PCI bus.
A PCI device.
Definition: pci.h:210
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:759
#define ENA_SQE_LAST
This is the last descriptor.
Definition: ena.h:671
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition: ethernet.c:175
#define ENA_AQ_DB
Admin queue doorbell register.
Definition: ena.h:64
#define ENA_AQ_CAPS
Admin queue capabilities register.
Definition: ena.h:55
static int ena_admin(struct ena_nic *ena, union ena_aq_req *req, union ena_acq_rsp **rsp)
Issue admin queue request.
Definition: ena.c:286
A network device.
Definition: netdevice.h:352
#define ENODEV
No such device.
Definition: errno.h:509
uint8_t inlined[96]
Inlined header data.
Definition: ena.h:717
#define ENA_ALIGN
Queue alignment.
Definition: ena.h:25
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:531
uint16_t id
Completion queue identifier.
Definition: ena.h:799
const char product_version[]
Product version string.
Definition: version.c:70
unsigned char uint8_t
Definition: stdint.h:10
#define ENA_CREATE_SQ
Create submission queue.
Definition: ena.h:310
#define ENA_AQ_PHASE
Admin queue ownership phase flag.
Definition: ena.h:99
#define ENA_REGS_SIZE
Register BAR size.
Definition: ena.h:19
static void ena_destroy_async(struct ena_nic *ena)
Destroy async event notification queue.
Definition: ena.c:428
uint8_t actual
Actual number of entries.
Definition: ena.h:805
Low latency transmit queue bounce buffer.
Definition: ena.h:711
static void ena_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition: ena.c:1200
#define ENA_STATS_SCOPE_ETH
Ethernet statistics.
Definition: ena.h:516
#define ETH_ALEN
Definition: if_ether.h:8
A PCI device ID list entry.
Definition: pci.h:174
Version number.
#define le16_to_cpu(value)
Definition: byteswap.h:112
unsigned int uint32_t
Definition: stdint.h:12
uint8_t requested
Requested number of entries.
Definition: ena.h:803
#define ENA_DESTROY_CQ
Destroy completion queue.
Definition: ena.h:425
struct ena_acq acq
Admin completion queue.
Definition: ena.h:846
static struct xen_remove_from_physmap * remove
Definition: xenmem.h:39
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
Network device operations.
Definition: netdevice.h:213
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:548
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
Two descriptors before inline headers.
Definition: ena.h:198
Network device management.
unsigned long physaddr_t
Definition: stdint.h:20
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition: pci.h:375
A named feature.
Definition: features.h:78
struct ena_get_feature_req get_feature
Get feature.
Definition: ena.h:550
struct arbelprm_qp_db_record qp
Definition: arbel.h:13
Get statistics response.
Definition: ena.h:522
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
struct ena_tx_llqe * llq
Low latency queue bounce buffer.
Definition: ena.h:729
Entries are 128 bytes.
Definition: ena.h:192
uint32_t busdevfn
Segment, bus, device, and function (bus:dev.fn) number.
Definition: pci.h:237
struct ena_host_info * info
Host info.
Definition: ena.h:842
void * llqe
Low latency queue base.
Definition: ena.h:736
#define ENA_SET_FEATURE
Set feature.
Definition: ena.h:471
struct ena_sq sq
Submission queue.
Definition: ena.h:828
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
uint64_t rx_bytes
Receive byte count.
Definition: ena.h:530
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition: netdevice.c:470
#define ENA_FEATURE_LLQ
Device supports low latency queues.
Definition: ena.h:146
uint16_t len
Length.
Definition: ena.h:700
#define ENOBUFS
No buffer space available.
Definition: errno.h:498
uint16_t id
Request identifier.
Definition: ena.h:702
#define DBGC2(...)
Definition: compiler.h:522
Receive submission queue entry.
Definition: ena.h:649
int(* probe)(struct pci_device *pci)
Probe device.
Definition: pci.h:264
#define ENA_DEVICE_MINE
My device.
Definition: ena.h:519
union ena_cq::@47 cqe
Entries.
uint64_t address
Address.
Definition: ena.h:634
void * data
Start of data.
Definition: iobuf.h:52
Receive completion queue entry.
Definition: ena.h:694
uint8_t direction
Direction.
Definition: ena.h:370
Admin completion queue response.
Definition: ena.h:560
#define EIO
Input/output error.
Definition: errno.h:433
static void ena_cancel_tx(struct net_device *netdev)
Cancel uncompleted transmit I/O buffers.
Definition: ena.c:992
PCI-to-PCI bridge.
#define ENA_RESET_MAX_WAIT_MS
Maximum time to wait for reset.
Definition: ena.h:80
void free_phys(void *ptr, size_t size)
Free memory allocated with malloc_phys()
Definition: malloc.c:722
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:264
#define PCI_ARGS(pci)
PCI device debug message arguments.
Definition: pci.h:314
struct ena_llq_option header
Header locations.
Definition: ena.h:16
uint8_t opcode
Opcode.
Definition: ena.h:93
#define cpu_to_le16(value)
Definition: byteswap.h:106
union ena_acq_rsp * rsp
Responses.
Definition: ena.h:590
uint64_t tx_bytes
Transmit byte count.
Definition: ena.h:526
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
Definition: string.h:150
void iounmap(volatile const void *io_addr)
Unmap I/O address.
#define ENA_SQE_PHASE
Submission queue ownership phase flag.
Definition: ena.h:665
uint16_t len
Length.
Definition: ena.h:622
void * mem
On-device memory.
Definition: ena.h:838
static int ena_create_async(struct ena_nic *ena)
Create async event notification queue.
Definition: ena.c:389
struct ena_tx_sqe sqe
Transmit descriptor.
Definition: ena.h:14
union ena_feature feature
Feature.
Definition: ena.h:488
uint16_t id
Submission queue identifier.
Definition: ena.h:748
uint8_t scope
Scope.
Definition: ena.h:503
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382
static union ena_aq_req * ena_admin_req(struct ena_nic *ena)
Get next available admin queue request.
Definition: ena.c:259
static void ena_set_base(struct ena_nic *ena, unsigned int offset, void *base)
Set queue base address.
Definition: ena.c:138
struct ena_destroy_sq_req destroy_sq
Destroy submission queue.
Definition: ena.h:544
static struct pci_device_id ena_nics[]
ENA PCI device IDs.
Definition: ena.c:1513
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
#define ENA_ADMIN_MAX_WAIT_MS
Maximum time to wait for admin requests.
Definition: ena.h:67
An ENA network card.
Definition: ena.h:834
Admin queue request.
Definition: ena.h:538
struct pci_driver ena_driver __pci_driver
ENA PCI driver.
Definition: ena.c:1519
static const char * ena_direction(unsigned int direction)
Get direction name (for debugging)
Definition: ena.c:54
const char product_name[]
Product name string.
Definition: version.c:73
static int ena_destroy_cq(struct ena_nic *ena, struct ena_cq *cq)
Destroy completion queue.
Definition: ena.c:628
uint8_t id
Request identifier.
Definition: ena.h:89
struct ena_aq_header header
Header.
Definition: ena.h:540
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
size_t max_pkt_len
Maximum packet length.
Definition: netdevice.h:409
Amazon ENA network driver.
#define ENA_DESTROY_SQ
Destroy submission queue.
Definition: ena.h:361
unsigned int prod
Producer counter.
Definition: ena.h:584
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
#define le64_to_cpu(value)
Definition: byteswap.h:114
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
static void ena_clear_caps(struct ena_nic *ena, unsigned int offset)
Clear queue capabilities.
Definition: ena.c:176
#define DBG_LOG
Definition: compiler.h:317
#define ENA_STAT
Device status register.
Definition: ena.h:83
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:381
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define ENA_HOST_INFO_SPEC_2_0
ENA specification version.
Definition: ena.h:287
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669
Receive.
Definition: ena.h:306
#define ENA_LLQ_CONFIG
Low latency queue config.
Definition: ena.h:149
String functions.
#define PCI_ROM(_vendor, _device, _name, _description, _data)
Definition: pci.h:307
uint8_t direction
Direction.
Definition: ena.h:750
uint16_t policy
Queue policy.
Definition: ena.h:746
void writeq(uint64_t data, volatile uint64_t *io_addr)
Write 64-bit qword to memory-mapped device.
void * raw
Raw data.
Definition: ena.h:731
#define ENA_HOST_INFO_TYPE_IPXE
Operating system type.
Definition: ena.h:263
struct ena_create_sq_req create_sq
Create submission queue.
Definition: ena.h:542
static int ena_reset(struct ena_nic *ena)
Reset hardware.
Definition: ena.c:104
static int ena_create_sq(struct ena_nic *ena, struct ena_sq *sq, struct ena_cq *cq)
Create submission queue.
Definition: ena.c:448
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
uint32_t membase
Memory base.
Definition: pcibridge.h:34
void * malloc_phys(size_t size, size_t phys_align)
Allocate memory with specified physical alignment.
Definition: malloc.c:706
void * memset(void *dest, int character, size_t len) __nonnull
A persistent I/O buffer.
Definition: iobuf.h:37