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  return rc;
376 
377  return 0;
378 }
379 
380 /**
381  * Create async event notification queue
382  *
383  * @v ena ENA device
384  * @ret rc Return status code
385  */
386 static int ena_create_async ( struct ena_nic *ena ) {
387  size_t aenq_len = ( ENA_AENQ_COUNT * sizeof ( ena->aenq.evt[0] ) );
388  int rc;
389 
390  /* Allocate async event notification queue */
391  ena->aenq.evt = malloc_phys ( aenq_len, aenq_len );
392  if ( ! ena->aenq.evt ) {
393  rc = -ENOMEM;
394  goto err_alloc_aenq;
395  }
396  memset ( ena->aenq.evt, 0, aenq_len );
397 
398  /* Program queue address and capabilities */
399  ena_set_base ( ena, ENA_AENQ_BASE, ena->aenq.evt );
401  sizeof ( ena->aenq.evt[0] ) );
402 
403  DBGC ( ena, "ENA %p AENQ [%08lx,%08lx)\n",
404  ena, virt_to_phys ( ena->aenq.evt ),
405  ( virt_to_phys ( ena->aenq.evt ) + aenq_len ) );
406 
407  /* Disable all events */
408  if ( ( rc = ena_set_aenq_config ( ena, 0 ) ) != 0 )
409  goto err_set_aenq_config;
410 
411  return 0;
412 
413  err_set_aenq_config:
414  ena_clear_caps ( ena, ENA_AENQ_CAPS );
415  free_phys ( ena->aenq.evt, aenq_len );
416  err_alloc_aenq:
417  return rc;
418 }
419 
420 /**
421  * Destroy async event notification queue
422  *
423  * @v ena ENA device
424  */
425 static void ena_destroy_async ( struct ena_nic *ena ) {
426  size_t aenq_len = ( ENA_AENQ_COUNT * sizeof ( ena->aenq.evt[0] ) );
427 
428  /* Clear queue capabilities */
429  ena_clear_caps ( ena, ENA_AENQ_CAPS );
430  wmb();
431 
432  /* Free queue */
433  free_phys ( ena->aenq.evt, aenq_len );
434  DBGC ( ena, "ENA %p AENQ destroyed\n", ena );
435 }
436 
437 /**
438  * Create submission queue
439  *
440  * @v ena ENA device
441  * @v sq Submission queue
442  * @v cq Corresponding completion queue
443  * @ret rc Return status code
444  */
445 static int ena_create_sq ( struct ena_nic *ena, struct ena_sq *sq,
446  struct ena_cq *cq ) {
447  union ena_aq_req *req;
448  union ena_acq_rsp *rsp;
449  unsigned int i;
450  int rc;
451 
452  /* Allocate submission queue entries */
453  sq->sqe.raw = malloc_phys ( sq->len, ENA_ALIGN );
454  if ( ! sq->sqe.raw ) {
455  rc = -ENOMEM;
456  goto err_alloc;
457  }
458  memset ( sq->sqe.raw, 0, sq->len );
459 
460  /* Construct request */
461  req = ena_admin_req ( ena );
462  req->header.opcode = ENA_CREATE_SQ;
463  req->create_sq.direction = sq->direction;
466  req->create_sq.cq_id = cpu_to_le16 ( cq->id );
467  req->create_sq.count = cpu_to_le16 ( sq->count );
468  req->create_sq.address = cpu_to_le64 ( virt_to_bus ( sq->sqe.raw ) );
469 
470  /* Issue request */
471  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 )
472  goto err_admin;
473 
474  /* Parse response */
475  sq->id = le16_to_cpu ( rsp->create_sq.id );
476  sq->doorbell = le32_to_cpu ( rsp->create_sq.doorbell );
477 
478  /* Reset producer counter and phase */
479  sq->prod = 0;
480  sq->phase = ENA_SQE_PHASE;
481 
482  /* Calculate fill level */
483  sq->fill = sq->max;
484  if ( sq->fill > cq->actual )
485  sq->fill = cq->actual;
486 
487  /* Initialise buffer ID ring */
488  for ( i = 0 ; i < sq->count ; i++ )
489  sq->ids[i] = i;
490 
491  DBGC ( ena, "ENA %p %s SQ%d at [%08lx,%08lx) fill %d db +%04x CQ%d\n",
492  ena, ena_direction ( sq->direction ), sq->id,
493  virt_to_phys ( sq->sqe.raw ),
494  ( virt_to_phys ( sq->sqe.raw ) + sq->len ),
495  sq->fill, sq->doorbell, cq->id );
496  return 0;
497 
498  err_admin:
499  free_phys ( sq->sqe.raw, sq->len );
500  err_alloc:
501  return rc;
502 }
503 
504 /**
505  * Destroy submission queue
506  *
507  * @v ena ENA device
508  * @v sq Submission queue
509  * @ret rc Return status code
510  */
511 static int ena_destroy_sq ( struct ena_nic *ena, struct ena_sq *sq ) {
512  union ena_aq_req *req;
513  union ena_acq_rsp *rsp;
514  int rc;
515 
516  /* Construct request */
517  req = ena_admin_req ( ena );
519  req->destroy_sq.id = cpu_to_le16 ( sq->id );
520  req->destroy_sq.direction = sq->direction;
521 
522  /* Issue request */
523  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 )
524  return rc;
525 
526  /* Free submission queue entries */
527  free_phys ( sq->sqe.raw, sq->len );
528 
529  DBGC ( ena, "ENA %p %s SQ%d destroyed\n",
530  ena, ena_direction ( sq->direction ), sq->id );
531  return 0;
532 }
533 
534 /**
535  * Create completion queue
536  *
537  * @v ena ENA device
538  * @v cq Completion queue
539  * @ret rc Return status code
540  */
541 static int ena_create_cq ( struct ena_nic *ena, struct ena_cq *cq ) {
542  union ena_aq_req *req;
543  union ena_acq_rsp *rsp;
544  int rc;
545 
546  /* Allocate completion queue entries */
547  cq->cqe.raw = malloc_phys ( cq->len, ENA_ALIGN );
548  if ( ! cq->cqe.raw ) {
549  rc = -ENOMEM;
550  goto err_alloc;
551  }
552  memset ( cq->cqe.raw, 0, cq->len );
553 
554  /* Construct request */
555  req = ena_admin_req ( ena );
556  req->header.opcode = ENA_CREATE_CQ;
557  req->create_cq.size = cq->size;
558  req->create_cq.count = cpu_to_le16 ( cq->requested );
560  req->create_cq.address = cpu_to_le64 ( virt_to_bus ( cq->cqe.raw ) );
561 
562  /* Issue request */
563  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 ) {
564  DBGC ( ena, "ENA %p CQ%d creation failed (broken firmware?)\n",
565  ena, cq->id );
566  goto err_admin;
567  }
568 
569  /* Parse response */
570  cq->id = le16_to_cpu ( rsp->create_cq.id );
571  cq->actual = le16_to_cpu ( rsp->create_cq.count );
572  cq->doorbell = le32_to_cpu ( rsp->create_cq.doorbell );
573  cq->mask = ( cq->actual - 1 );
574  if ( cq->actual != cq->requested ) {
575  DBGC ( ena, "ENA %p CQ%d requested %d actual %d\n",
576  ena, cq->id, cq->requested, cq->actual );
577  }
578 
579  /* Reset consumer counter and phase */
580  cq->cons = 0;
581  cq->phase = ENA_CQE_PHASE;
582 
583  DBGC ( ena, "ENA %p CQ%d at [%08lx,%08lx) db +%04x\n",
584  ena, cq->id, virt_to_phys ( cq->cqe.raw ),
585  ( virt_to_phys ( cq->cqe.raw ) + cq->len ), cq->doorbell );
586  return 0;
587 
588  err_admin:
589  free_phys ( cq->cqe.raw, cq->len );
590  err_alloc:
591  return rc;
592 }
593 
594 /**
595  * Destroy completion queue
596  *
597  * @v ena ENA device
598  * @v cq Completion queue
599  * @ret rc Return status code
600  */
601 static int ena_destroy_cq ( struct ena_nic *ena, struct ena_cq *cq ) {
602  union ena_aq_req *req;
603  union ena_acq_rsp *rsp;
604  int rc;
605 
606  /* Construct request */
607  req = ena_admin_req ( ena );
609  req->destroy_cq.id = cpu_to_le16 ( cq->id );
610 
611  /* Issue request */
612  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 )
613  return rc;
614 
615  /* Free completion queue entries */
616  free_phys ( cq->cqe.raw, cq->len );
617 
618  DBGC ( ena, "ENA %p CQ%d destroyed\n", ena, cq->id );
619  return 0;
620 }
621 
622 /**
623  * Create queue pair
624  *
625  * @v ena ENA device
626  * @v qp Queue pair
627  * @ret rc Return status code
628  */
629 static int ena_create_qp ( struct ena_nic *ena, struct ena_qp *qp ) {
630  int rc;
631 
632  /* Create completion queue */
633  if ( ( rc = ena_create_cq ( ena, &qp->cq ) ) != 0 )
634  goto err_create_cq;
635 
636  /* Create submission queue */
637  if ( ( rc = ena_create_sq ( ena, &qp->sq, &qp->cq ) ) != 0 )
638  goto err_create_sq;
639 
640  return 0;
641 
642  ena_destroy_sq ( ena, &qp->sq );
643  err_create_sq:
644  ena_destroy_cq ( ena, &qp->cq );
645  err_create_cq:
646  return rc;
647 }
648 
649 /**
650  * Destroy queue pair
651  *
652  * @v ena ENA device
653  * @v qp Queue pair
654  * @ret rc Return status code
655  */
656 static int ena_destroy_qp ( struct ena_nic *ena, struct ena_qp *qp ) {
657 
658  /* Destroy submission queue */
659  ena_destroy_sq ( ena, &qp->sq );
660 
661  /* Destroy completion queue */
662  ena_destroy_cq ( ena, &qp->cq );
663 
664  return 0;
665 }
666 
667 /**
668  * Get device attributes
669  *
670  * @v netdev Network device
671  * @ret rc Return status code
672  */
674  struct ena_nic *ena = netdev->priv;
675  union ena_aq_req *req;
676  union ena_acq_rsp *rsp;
677  union ena_feature *feature;
678  int rc;
679 
680  /* Construct request */
681  req = ena_admin_req ( ena );
684 
685  /* Issue request */
686  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 )
687  return rc;
688 
689  /* Parse response */
690  feature = &rsp->get_feature.feature;
691  memcpy ( netdev->hw_addr, feature->device.mac, ETH_ALEN );
692  netdev->max_pkt_len = le32_to_cpu ( feature->device.mtu );
694 
695  DBGC ( ena, "ENA %p MAC %s MTU %zd\n",
696  ena, eth_ntoa ( netdev->hw_addr ), netdev->max_pkt_len );
697  return 0;
698 }
699 
700 /**
701  * Set host attributes
702  *
703  * @v ena ENA device
704  * @ret rc Return status code
705  */
706 static int ena_set_host_attributes ( struct ena_nic *ena ) {
707  union ena_aq_req *req;
708  union ena_acq_rsp *rsp;
709  union ena_feature *feature;
710  int rc;
711 
712  /* Construct request */
713  req = ena_admin_req ( ena );
716  feature = &req->set_feature.feature;
717  feature->host.info = cpu_to_le64 ( virt_to_bus ( ena->info ) );
718 
719  /* Issue request */
720  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 )
721  return rc;
722 
723  return 0;
724 }
725 
726 /**
727  * Get statistics (for debugging)
728  *
729  * @v ena ENA device
730  * @ret rc Return status code
731  */
732 static int ena_get_stats ( struct ena_nic *ena ) {
733  union ena_aq_req *req;
734  union ena_acq_rsp *rsp;
735  struct ena_get_stats_rsp *stats;
736  int rc;
737 
738  /* Do nothing unless debug messages are enabled */
739  if ( ! DBG_LOG )
740  return 0;
741 
742  /* Construct request */
743  req = ena_admin_req ( ena );
744  req->header.opcode = ENA_GET_STATS;
748 
749  /* Issue request */
750  if ( ( rc = ena_admin ( ena, req, &rsp ) ) != 0 )
751  return rc;
752 
753  /* Parse response */
754  stats = &rsp->get_stats;
755  DBGC ( ena, "ENA %p TX bytes %#llx packets %#llx\n", ena,
756  ( ( unsigned long long ) le64_to_cpu ( stats->tx_bytes ) ),
757  ( ( unsigned long long ) le64_to_cpu ( stats->tx_packets ) ) );
758  DBGC ( ena, "ENA %p RX bytes %#llx packets %#llx drops %#llx\n", ena,
759  ( ( unsigned long long ) le64_to_cpu ( stats->rx_bytes ) ),
760  ( ( unsigned long long ) le64_to_cpu ( stats->rx_packets ) ),
761  ( ( unsigned long long ) le64_to_cpu ( stats->rx_drops ) ) );
762 
763  return 0;
764 }
765 
766 /******************************************************************************
767  *
768  * Network device interface
769  *
770  ******************************************************************************
771  */
772 
773 /**
774  * Refill receive queue
775  *
776  * @v netdev Network device
777  */
778 static void ena_refill_rx ( struct net_device *netdev ) {
779  struct ena_nic *ena = netdev->priv;
780  struct io_buffer *iobuf;
781  struct ena_rx_sqe *sqe;
783  size_t len = netdev->max_pkt_len;
784  unsigned int refilled = 0;
785  unsigned int index;
786  unsigned int id;
787 
788  /* Refill queue */
789  while ( ( ena->rx.sq.prod - ena->rx.cq.cons ) < ena->rx.sq.fill ) {
790 
791  /* Allocate I/O buffer */
792  iobuf = alloc_iob ( len );
793  if ( ! iobuf ) {
794  /* Wait for next refill */
795  break;
796  }
797 
798  /* Get next submission queue entry and buffer ID */
799  index = ( ena->rx.sq.prod % ENA_RX_COUNT );
800  sqe = &ena->rx.sq.sqe.rx[index];
801  id = ena->rx_ids[index];
802 
803  /* Construct submission queue entry */
804  address = virt_to_bus ( iobuf->data );
805  sqe->len = cpu_to_le16 ( len );
806  sqe->id = cpu_to_le16 ( id );
807  sqe->address = cpu_to_le64 ( address );
808  wmb();
810  ena->rx.sq.phase );
811 
812  /* Increment producer counter */
813  ena->rx.sq.prod++;
814  if ( ( ena->rx.sq.prod % ENA_RX_COUNT ) == 0 )
815  ena->rx.sq.phase ^= ENA_SQE_PHASE;
816 
817  /* Record I/O buffer */
818  assert ( ena->rx_iobuf[id] == NULL );
819  ena->rx_iobuf[id] = iobuf;
820 
821  DBGC2 ( ena, "ENA %p RX %d at [%08llx,%08llx)\n", ena, id,
822  ( ( unsigned long long ) address ),
823  ( ( unsigned long long ) address + len ) );
824  refilled++;
825  }
826 
827  /* Ring doorbell, if applicable */
828  if ( refilled ) {
829  wmb();
830  writel ( ena->rx.sq.prod, ( ena->regs + ena->rx.sq.doorbell ) );
831  }
832 }
833 
834 /**
835  * Discard unused receive I/O buffers
836  *
837  * @v ena ENA device
838  */
839 static void ena_empty_rx ( struct ena_nic *ena ) {
840  unsigned int i;
841 
842  for ( i = 0 ; i < ENA_RX_COUNT ; i++ ) {
843  if ( ena->rx_iobuf[i] )
844  free_iob ( ena->rx_iobuf[i] );
845  ena->rx_iobuf[i] = NULL;
846  }
847 }
848 
849 /**
850  * Open network device
851  *
852  * @v netdev Network device
853  * @ret rc Return status code
854  */
855 static int ena_open ( struct net_device *netdev ) {
856  struct ena_nic *ena = netdev->priv;
857  int rc;
858 
859  /* Create transmit queue pair */
860  if ( ( rc = ena_create_qp ( ena, &ena->tx ) ) != 0 )
861  goto err_create_tx;
862 
863  /* Create receive queue pair */
864  if ( ( rc = ena_create_qp ( ena, &ena->rx ) ) != 0 )
865  goto err_create_rx;
866 
867  /* Refill receive queue */
868  ena_refill_rx ( netdev );
869 
870  return 0;
871 
872  ena_destroy_qp ( ena, &ena->rx );
873  err_create_rx:
874  ena_destroy_qp ( ena, &ena->tx );
875  err_create_tx:
876  return rc;
877 }
878 
879 /**
880  * Close network device
881  *
882  * @v netdev Network device
883  */
884 static void ena_close ( struct net_device *netdev ) {
885  struct ena_nic *ena = netdev->priv;
886 
887  /* Dump statistics (for debugging) */
888  ena_get_stats ( ena );
889 
890  /* Destroy receive queue pair */
891  ena_destroy_qp ( ena, &ena->rx );
892 
893  /* Discard any unused receive buffers */
894  ena_empty_rx ( ena );
895 
896  /* Destroy transmit queue pair */
897  ena_destroy_qp ( ena, &ena->tx );
898 }
899 
900 /**
901  * Transmit packet
902  *
903  * @v netdev Network device
904  * @v iobuf I/O buffer
905  * @ret rc Return status code
906  */
907 static int ena_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) {
908  struct ena_nic *ena = netdev->priv;
909  struct ena_tx_sqe *sqe;
911  unsigned int index;
912  unsigned int id;
913  size_t len;
914 
915  /* Get next submission queue entry */
916  if ( ( ena->tx.sq.prod - ena->tx.cq.cons ) >= ena->tx.sq.fill ) {
917  DBGC ( ena, "ENA %p out of transmit descriptors\n", ena );
918  return -ENOBUFS;
919  }
920  index = ( ena->tx.sq.prod % ENA_TX_COUNT );
921  sqe = &ena->tx.sq.sqe.tx[index];
922  id = ena->tx_ids[index];
923 
924  /* Construct submission queue entry */
925  address = virt_to_bus ( iobuf->data );
926  len = iob_len ( iobuf );
927  sqe->len = cpu_to_le16 ( len );
928  sqe->id = cpu_to_le16 ( id );
929  sqe->address = cpu_to_le64 ( address );
930  wmb();
932  ena->tx.sq.phase );
933  wmb();
934 
935  /* Increment producer counter */
936  ena->tx.sq.prod++;
937  if ( ( ena->tx.sq.prod % ENA_TX_COUNT ) == 0 )
938  ena->tx.sq.phase ^= ENA_SQE_PHASE;
939 
940  /* Record I/O buffer */
941  assert ( ena->tx_iobuf[id] == NULL );
942  ena->tx_iobuf[id] = iobuf;
943 
944  /* Ring doorbell */
945  writel ( ena->tx.sq.prod, ( ena->regs + ena->tx.sq.doorbell ) );
946 
947  DBGC2 ( ena, "ENA %p TX %d at [%08llx,%08llx)\n", ena, id,
948  ( ( unsigned long long ) address ),
949  ( ( unsigned long long ) address + len ) );
950  return 0;
951 }
952 
953 /**
954  * Poll for completed transmissions
955  *
956  * @v netdev Network device
957  */
958 static void ena_poll_tx ( struct net_device *netdev ) {
959  struct ena_nic *ena = netdev->priv;
960  struct ena_tx_cqe *cqe;
961  struct io_buffer *iobuf;
962  unsigned int index;
963  unsigned int id;
964 
965  /* Check for completed packets */
966  while ( ena->tx.cq.cons != ena->tx.sq.prod ) {
967 
968  /* Get next completion queue entry */
969  index = ( ena->tx.cq.cons & ena->tx.cq.mask );
970  cqe = &ena->tx.cq.cqe.tx[index];
971 
972  /* Stop if completion queue entry is empty */
973  if ( ( cqe->flags ^ ena->tx.cq.phase ) & ENA_CQE_PHASE )
974  return;
975 
976  /* Increment consumer counter */
977  ena->tx.cq.cons++;
978  if ( ! ( ena->tx.cq.cons & ena->tx.cq.mask ) )
979  ena->tx.cq.phase ^= ENA_CQE_PHASE;
980 
981  /* Identify and free buffer ID */
982  id = ENA_TX_CQE_ID ( le16_to_cpu ( cqe->id ) );
983  ena->tx_ids[index] = id;
984 
985  /* Identify I/O buffer */
986  iobuf = ena->tx_iobuf[id];
987  assert ( iobuf != NULL );
988  ena->tx_iobuf[id] = NULL;
989 
990  /* Complete transmit */
991  DBGC2 ( ena, "ENA %p TX %d complete\n", ena, id );
992  netdev_tx_complete ( netdev, iobuf );
993  }
994 }
995 
996 /**
997  * Poll for received packets
998  *
999  * @v netdev Network device
1000  */
1001 static void ena_poll_rx ( struct net_device *netdev ) {
1002  struct ena_nic *ena = netdev->priv;
1003  struct ena_rx_cqe *cqe;
1004  struct io_buffer *iobuf;
1005  unsigned int index;
1006  unsigned int id;
1007  size_t len;
1008 
1009  /* Check for received packets */
1010  while ( ena->rx.cq.cons != ena->rx.sq.prod ) {
1011 
1012  /* Get next completion queue entry */
1013  index = ( ena->rx.cq.cons & ena->rx.cq.mask );
1014  cqe = &ena->rx.cq.cqe.rx[index];
1015 
1016  /* Stop if completion queue entry is empty */
1017  if ( ( cqe->flags ^ ena->rx.cq.phase ) & ENA_CQE_PHASE )
1018  return;
1019 
1020  /* Increment consumer counter */
1021  ena->rx.cq.cons++;
1022  if ( ! ( ena->rx.cq.cons & ena->rx.cq.mask ) )
1023  ena->rx.cq.phase ^= ENA_CQE_PHASE;
1024 
1025  /* Identify and free buffer ID */
1026  id = le16_to_cpu ( cqe->id );
1027  ena->rx_ids[index] = id;
1028 
1029  /* Populate I/O buffer */
1030  iobuf = ena->rx_iobuf[id];
1031  assert ( iobuf != NULL );
1032  ena->rx_iobuf[id] = NULL;
1033  len = le16_to_cpu ( cqe->len );
1034  iob_put ( iobuf, len );
1035 
1036  /* Hand off to network stack */
1037  DBGC2 ( ena, "ENA %p RX %d complete (length %zd)\n",
1038  ena, id, len );
1039  netdev_rx ( netdev, iobuf );
1040  }
1041 }
1042 
1043 /**
1044  * Poll for completed and received packets
1045  *
1046  * @v netdev Network device
1047  */
1048 static void ena_poll ( struct net_device *netdev ) {
1049 
1050  /* Poll for transmit completions */
1051  ena_poll_tx ( netdev );
1052 
1053  /* Poll for receive completions */
1054  ena_poll_rx ( netdev );
1055 
1056  /* Refill receive ring */
1057  ena_refill_rx ( netdev );
1058 }
1059 
1060 /** ENA network device operations */
1062  .open = ena_open,
1063  .close = ena_close,
1064  .transmit = ena_transmit,
1065  .poll = ena_poll,
1066 };
1067 
1068 /******************************************************************************
1069  *
1070  * PCI interface
1071  *
1072  ******************************************************************************
1073  */
1074 
1075 /**
1076  * Assign memory BAR
1077  *
1078  * @v ena ENA device
1079  * @v pci PCI device
1080  * @ret rc Return status code
1081  *
1082  * Some BIOSes in AWS EC2 are observed to fail to assign a base
1083  * address to the ENA device. The device is the only device behind
1084  * its bridge, and the BIOS does assign a memory window to the bridge.
1085  * We therefore place the device at the start of the memory window.
1086  */
1087 static int ena_membase ( struct ena_nic *ena, struct pci_device *pci ) {
1088  struct pci_bridge *bridge;
1089 
1090  /* Locate PCI bridge */
1091  bridge = pcibridge_find ( pci );
1092  if ( ! bridge ) {
1093  DBGC ( ena, "ENA %p found no PCI bridge\n", ena );
1094  return -ENOTCONN;
1095  }
1096 
1097  /* Sanity check */
1098  if ( PCI_SLOT ( pci->busdevfn ) || PCI_FUNC ( pci->busdevfn ) ) {
1099  DBGC ( ena, "ENA %p at " PCI_FMT " may not be only device "
1100  "on bus\n", ena, PCI_ARGS ( pci ) );
1101  return -ENOTSUP;
1102  }
1103 
1104  /* Place device at start of memory window */
1106  pci->membase = bridge->membase;
1107  DBGC ( ena, "ENA %p at " PCI_FMT " claiming bridge " PCI_FMT " mem "
1108  "%08x\n", ena, PCI_ARGS ( pci ), PCI_ARGS ( bridge->pci ),
1109  bridge->membase );
1110 
1111  return 0;
1112 }
1113 
1114 /**
1115  * Probe PCI device
1116  *
1117  * @v pci PCI device
1118  * @ret rc Return status code
1119  */
1120 static int ena_probe ( struct pci_device *pci ) {
1121  struct net_device *netdev;
1122  struct ena_nic *ena;
1123  struct ena_host_info *info;
1124  int rc;
1125 
1126  /* Allocate and initialise net device */
1127  netdev = alloc_etherdev ( sizeof ( *ena ) );
1128  if ( ! netdev ) {
1129  rc = -ENOMEM;
1130  goto err_alloc;
1131  }
1133  ena = netdev->priv;
1134  pci_set_drvdata ( pci, netdev );
1135  netdev->dev = &pci->dev;
1136  memset ( ena, 0, sizeof ( *ena ) );
1137  ena->acq.phase = ENA_ACQ_PHASE;
1138  ena_cq_init ( &ena->tx.cq, ENA_TX_COUNT,
1139  sizeof ( ena->tx.cq.cqe.tx[0] ) );
1140  ena_sq_init ( &ena->tx.sq, ENA_SQ_TX, ENA_TX_COUNT, ENA_TX_COUNT,
1141  sizeof ( ena->tx.sq.sqe.tx[0] ), ena->tx_ids );
1142  ena_cq_init ( &ena->rx.cq, ENA_RX_COUNT,
1143  sizeof ( ena->rx.cq.cqe.rx[0] ) );
1144  ena_sq_init ( &ena->rx.sq, ENA_SQ_RX, ENA_RX_COUNT, ENA_RX_FILL,
1145  sizeof ( ena->rx.sq.sqe.rx[0] ), ena->rx_ids );
1146 
1147  /* Fix up PCI device */
1148  adjust_pci_device ( pci );
1149 
1150  /* Fix up PCI BAR if left unassigned by BIOS */
1151  if ( ( ! pci->membase ) && ( ( rc = ena_membase ( ena, pci ) ) != 0 ) )
1152  goto err_membase;
1153 
1154  /* Map registers */
1155  ena->regs = pci_ioremap ( pci, pci->membase, ENA_BAR_SIZE );
1156  if ( ! ena->regs ) {
1157  rc = -ENODEV;
1158  goto err_ioremap;
1159  }
1160 
1161  /* Allocate and initialise host info */
1163  if ( ! info ) {
1164  rc = -ENOMEM;
1165  goto err_info;
1166  }
1167  ena->info = info;
1168  memset ( info, 0, PAGE_SIZE );
1170  snprintf ( info->dist_str, sizeof ( info->dist_str ), "%s",
1172  snprintf ( info->kernel_str, sizeof ( info->kernel_str ), "%s",
1173  product_version );
1176  info->busdevfn = cpu_to_le16 ( pci->busdevfn );
1177  DBGC2 ( ena, "ENA %p host info:\n", ena );
1178  DBGC2_HDA ( ena, virt_to_phys ( info ), info, sizeof ( *info ) );
1179 
1180  /* Reset the NIC */
1181  if ( ( rc = ena_reset ( ena ) ) != 0 )
1182  goto err_reset;
1183 
1184  /* Create admin queues */
1185  if ( ( rc = ena_create_admin ( ena ) ) != 0 )
1186  goto err_create_admin;
1187 
1188  /* Create async event notification queue */
1189  if ( ( rc = ena_create_async ( ena ) ) != 0 )
1190  goto err_create_async;
1191 
1192  /* Set host attributes */
1193  if ( ( rc = ena_set_host_attributes ( ena ) ) != 0 )
1194  goto err_set_host_attributes;
1195 
1196  /* Fetch MAC address */
1197  if ( ( rc = ena_get_device_attributes ( netdev ) ) != 0 )
1198  goto err_get_device_attributes;
1199 
1200  /* Register network device */
1201  if ( ( rc = register_netdev ( netdev ) ) != 0 )
1202  goto err_register_netdev;
1203 
1204  /* Mark as link up, since we have no way to test link state on
1205  * this hardware.
1206  */
1207  netdev_link_up ( netdev );
1208 
1209  return 0;
1210 
1212  err_register_netdev:
1213  err_get_device_attributes:
1214  err_set_host_attributes:
1215  ena_destroy_async ( ena );
1216  err_create_async:
1217  ena_destroy_admin ( ena );
1218  err_create_admin:
1219  ena_reset ( ena );
1220  err_reset:
1221  free_phys ( ena->info, PAGE_SIZE );
1222  err_info:
1223  iounmap ( ena->regs );
1224  err_ioremap:
1225  err_membase:
1226  netdev_nullify ( netdev );
1227  netdev_put ( netdev );
1228  err_alloc:
1229  return rc;
1230 }
1231 
1232 /**
1233  * Remove PCI device
1234  *
1235  * @v pci PCI device
1236  */
1237 static void ena_remove ( struct pci_device *pci ) {
1238  struct net_device *netdev = pci_get_drvdata ( pci );
1239  struct ena_nic *ena = netdev->priv;
1240 
1241  /* Unregister network device */
1243 
1244  /* Destroy async event notification queue */
1245  ena_destroy_async ( ena );
1246 
1247  /* Destroy admin queues */
1248  ena_destroy_admin ( ena );
1249 
1250  /* Reset card */
1251  ena_reset ( ena );
1252 
1253  /* Free host info */
1254  free_phys ( ena->info, PAGE_SIZE );
1255 
1256  /* Free network device */
1257  iounmap ( ena->regs );
1258  netdev_nullify ( netdev );
1259  netdev_put ( netdev );
1260 }
1261 
1262 /** ENA PCI device IDs */
1263 static struct pci_device_id ena_nics[] = {
1264  PCI_ROM ( 0x1d0f, 0xec20, "ena-vf", "ENA VF", 0 ),
1265  PCI_ROM ( 0x1d0f, 0xec21, "ena-vf-llq", "ENA VF (LLQ)", 0 ),
1266 };
1267 
1268 /** ENA PCI driver */
1269 struct pci_driver ena_driver __pci_driver = {
1270  .ids = ena_nics,
1271  .id_count = ( sizeof ( ena_nics ) / sizeof ( ena_nics[0] ) ),
1272  .probe = ena_probe,
1273  .remove = ena_remove,
1274 };
const char product_short_name[]
Product short name string.
Definition: version.c:76
#define PCI_FUNC(busdevfn)
Definition: pci.h:281
struct ena_aq aq
Admin queue.
Definition: ena.h:749
Queue pair.
Definition: ena.h:735
static void ena_refill_rx(struct net_device *netdev)
Refill receive queue.
Definition: ena.c:778
#define __attribute__(x)
Definition: compiler.h:10
#define ENA_ACQ_COUNT
Number of admin completion queue entries.
Definition: ena.h:25
uint32_t base
Base.
Definition: librm.h:252
struct ena_tx_sqe * tx
Transmit submission queue entries.
Definition: ena.h:639
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:757
unsigned long membase
Memory base.
Definition: pci.h:215
#define ENA_CTRL
Device control register.
Definition: ena.h:73
uint8_t type
Type.
Definition: ena.h:438
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void ena_remove(struct pci_device *pci)
Remove PCI device.
Definition: ena.c:1237
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:752
wmb()
void * raw
Raw data.
Definition: ena.h:697
#define ENA_BASE_HI
Base address high register offset.
Definition: ena.h:43
Host information.
Definition: ena.h:167
#define iob_put(iobuf, len)
Definition: iobuf.h:120
u32 info
Definition: ar9003_mac.h:67
#define ENA_RX_COUNT
Number of receive queue entries.
Definition: ena.h:34
#define ENA_AQ_COUNT
Number of admin queue entries.
Definition: ena.h:22
A PCI driver.
Definition: pci.h:247
uint8_t rx_ids[ENA_RX_COUNT]
Receive buffer IDs.
Definition: ena.h:763
#define ENA_AENQ_CONFIG
Async event notification queue config.
Definition: ena.h:143
static void ena_poll_tx(struct net_device *netdev)
Poll for completed transmissions.
Definition: ena.c:958
uint8_t mask
Actual number of entries minus one.
Definition: ena.h:716
size_t len
Total length of entries.
Definition: ena.h:650
unsigned int doorbell
Doorbell register offset.
Definition: ena.h:648
uint8_t count
Number of entries.
Definition: ena.h:660
#define le32_to_cpu(value)
Definition: byteswap.h:113
int(* open)(struct net_device *netdev)
Open network device.
Definition: netdevice.h:222
#define ENA_GET_FEATURE
Get feature.
Definition: ena.h:381
#define ENA_HOST_ATTRIBUTES
Host attributes.
Definition: ena.h:154
Error codes.
#define ENA_CREATE_CQ
Create completion queue.
Definition: ena.h:319
#define ENA_ACQ_BASE
Admin completion queue base address register.
Definition: ena.h:55
uint8_t * ids
Buffer IDs.
Definition: ena.h:646
unsigned int prod
Producer counter.
Definition: ena.h:652
uint16_t id
Completion queue identifier.
Definition: ena.h:369
I/O buffers.
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:146
struct pci_device_id * ids
PCI ID table.
Definition: pci.h:249
uint64_t address
Base address.
Definition: ena.h:24
struct ena_tx_cqe * tx
Transmit completion queue entries.
Definition: ena.h:693
size_t mtu
Maximum transmission unit length.
Definition: netdevice.h:415
uint8_t size
Entry size (in 32-bit words)
Definition: ena.h:16
static int ena_get_device_attributes(struct net_device *netdev)
Get device attributes.
Definition: ena.c:673
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:732
Transmit submission queue entry.
Definition: ena.h:557
struct ena_qp tx
Transmit queue.
Definition: ena.h:755
#define DBGC(...)
Definition: compiler.h:505
struct ena_set_feature_req set_feature
Set feature.
Definition: ena.h:489
uint16_t count
Number of entries.
Definition: ena.h:264
union ena_sq::@39 sqe
Entries.
long index
Definition: bigint.h:62
struct ena_aenq aenq
Async event notification queue.
Definition: ena.h:753
#define ENA_SQE_CPL
Request completion.
Definition: ena.h:598
Transmit completion queue entry.
Definition: ena.h:601
unsigned long long uint64_t
Definition: stdint.h:13
uint8_t id
Request identifier.
Definition: ena.h:567
static void *__malloc malloc_phys(size_t size, size_t phys_align)
Allocate memory with specified physical alignment.
Definition: malloc.h:61
static int ena_open(struct net_device *netdev)
Open network device.
Definition: ena.c:855
#define PCI_BASE_ADDRESS_0
Definition: pci.h:62
union ena_cq::@40 cqe
Entries.
#define cpu_to_le64(value)
Definition: byteswap.h:108
uint16_t count
Number of entries.
Definition: ena.h:330
uint8_t direction
Direction.
Definition: ena.h:14
uint64_t rx_drops
Receive drop count.
Definition: ena.h:471
uint16_t len
Length.
Definition: ena.h:575
#define ENA_AQ_BASE
Admin queue base address register.
Definition: ena.h:49
#define ENA_GET_STATS
Get statistics.
Definition: ena.h:429
#define PAGE_SIZE
Page size.
Definition: io.h:27
static void ena_close(struct net_device *netdev)
Close network device.
Definition: ena.c:884
uint8_t size
Entry size (in 32-bit words)
Definition: ena.h:710
static int ena_create_qp(struct ena_nic *ena, struct ena_qp *qp)
Create queue pair.
Definition: ena.c:629
unsigned int phase
Phase.
Definition: ena.h:706
#define ENA_ACQ_CAPS
Admin completion queue capabilities register.
Definition: ena.h:58
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition: pci.c:154
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:129
static __always_inline unsigned long virt_to_phys(volatile const void *addr)
Convert virtual address to a physical address.
Definition: uaccess.h:361
uint64_t address
Address.
Definition: ena.h:585
struct device dev
Generic device.
Definition: pci.h:208
#define ENA_CTRL_RESET
Reset.
Definition: ena.h:74
uint32_t enabled
Bitmask of enabled AENQ groups (host -> device)
Definition: ena.h:14
#define ENA_TX_COUNT
Number of transmit queue entries.
Definition: ena.h:31
#define ENA_AENQ_BASE
Async event notification queue base address register.
Definition: ena.h:70
uint64_t address
Base address.
Definition: ena.h:334
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
unsigned int doorbell
Doorbell register offset.
Definition: ena.h:700
void * regs
Registers.
Definition: ena.h:745
Dynamic memory allocation.
uint8_t tx_ids[ENA_TX_COUNT]
Transmit buffer IDs.
Definition: ena.h:759
union ena_feature feature
Feature.
Definition: ena.h:14
Completion queue.
Definition: ena.h:689
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:635
static int ena_set_host_attributes(struct ena_nic *ena)
Set host attributes.
Definition: ena.c:706
static int ena_destroy_qp(struct ena_nic *ena, struct ena_qp *qp)
Destroy queue pair.
Definition: ena.c:656
static void ena_empty_rx(struct ena_nic *ena)
Discard unused receive I/O buffers.
Definition: ena.c:839
Feature.
Definition: ena.h:231
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:515
#define ENA_DEVICE_ATTRIBUTES
Device attributes.
Definition: ena.h:118
static int ena_destroy_sq(struct ena_nic *ena, struct ena_sq *sq)
Destroy submission queue.
Definition: ena.c:511
size_t len
Total length of entries.
Definition: ena.h:702
#define ENA_CAPS(count, size)
Capability register value.
Definition: ena.h:46
uint16_t id
Request identifier.
Definition: ena.h:603
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition: pci.h:359
#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:465
#define EILSEQ
Illegal byte sequence.
Definition: errno.h:413
uint16_t id
Request identifier.
Definition: ena.h:581
uint8_t id
Feature identifier.
Definition: ena.h:394
#define ENA_BASE_LO
Base address low register offset.
Definition: ena.h:40
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:81
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:572
Ethernet protocol.
#define ENA_TX_CQE_ID(id)
Transmit completion request identifier.
Definition: ena.h:615
union ena_aq_req * req
Requests.
Definition: ena.h:519
#define ENA_AENQ_CAPS
Async event notification queue capabilities register.
Definition: ena.h:67
Transmit.
Definition: ena.h:243
uint64_t address
Base address.
Definition: ena.h:266
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:907
#define DBGC_HDA(...)
Definition: compiler.h:506
uint16_t cq_id
Completion queue identifier.
Definition: ena.h:262
unsigned int cons
Consumer counter.
Definition: ena.h:529
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:774
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
uint8_t flags
Flags.
Definition: ena.h:607
struct pci_device * pci
PCI device.
Definition: pcibridge.h:19
unsigned int cons
Consumer counter.
Definition: ena.h:704
uint16_t policy
Policy.
Definition: ena.h:260
#define ENA_CQE_PHASE
Completion queue ownership phase flag.
Definition: ena.h:632
static struct net_device * netdev
Definition: gdbudp.c:52
uint8_t size
Entry size (in 32-bit words)
Definition: ena.h:328
uint16_t count
Number of entries.
Definition: ena.h:22
uint8_t flags
Flags.
Definition: ena.h:92
static int ena_probe(struct pci_device *pci)
Probe PCI device.
Definition: ena.c:1120
#define ENA_STATS_TYPE_BASIC
Basic statistics.
Definition: ena.h:450
#define ENA_AENQ_COUNT
Number of async event notification queue entries.
Definition: ena.h:28
struct ena_aenq_event * evt
Events.
Definition: ena.h:553
#define ENA_SQE_FIRST
This is the first descriptor.
Definition: ena.h:592
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
uint8_t id
Feature identifier.
Definition: ena.h:421
unsigned int phase
Phase.
Definition: ena.h:654
struct ena_get_stats_req get_stats
Get statistics.
Definition: ena.h:491
static struct net_device_operations ena_operations
ENA network device operations.
Definition: ena.c:1061
#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:483
struct ena_destroy_cq_req destroy_cq
Destroy completion queue.
Definition: ena.h:485
#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:256
#define ENA_MSIX_NONE
Empty MSI-X vector.
Definition: ena.h:343
uint64_t rsp
Definition: librm.h:267
static void ena_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition: ena.c:1048
struct ena_rx_cqe * rx
Receive completion queue entries.
Definition: ena.h:695
struct ena_cq cq
Completion queue.
Definition: ena.h:739
uint8_t flags
Flags.
Definition: ena.h:622
A PCI-to-PCI bridge.
Definition: pcibridge.h:17
#define ENA_HOST_INFO_VERSION_WTF
Driver version.
Definition: ena.h:225
uint32_t vector
MSI-X vector.
Definition: ena.h:332
static int ena_create_admin(struct ena_nic *ena)
Create admin queues.
Definition: ena.c:188
uint8_t flags
Flags.
Definition: ena.h:563
#define ENA_ACQ_PHASE
Admin completion queue ownership phase flag.
Definition: ena.h:115
#define PCI_FMT
PCI device debug message format.
Definition: pci.h:307
#define PCI_SLOT(busdevfn)
Definition: pci.h:280
static int ena_create_cq(struct ena_nic *ena, struct ena_cq *cq)
Create completion queue.
Definition: ena.c:541
PCI bus.
A PCI device.
Definition: pci.h:206
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:595
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
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:61
#define ENA_AQ_CAPS
Admin queue capabilities register.
Definition: ena.h:52
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
#define ENA_ALIGN
Queue alignment.
Definition: ena.h:19
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:528
uint16_t id
Completion queue identifier.
Definition: ena.h:708
const char product_version[]
Product version string.
Definition: version.c:70
#define ENA_CREATE_SQ
Create submission queue.
Definition: ena.h:249
#define ENA_AQ_PHASE
Admin queue ownership phase flag.
Definition: ena.h:96
#define ENA_BAR_SIZE
BAR size.
Definition: ena.h:16
static void ena_destroy_async(struct ena_nic *ena)
Destroy async event notification queue.
Definition: ena.c:425
uint8_t actual
Actual number of entries.
Definition: ena.h:714
static void ena_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition: ena.c:1001
#define ENA_STATS_SCOPE_ETH
Ethernet statistics.
Definition: ena.h:453
#define ETH_ALEN
Definition: if_ether.h:8
A PCI device ID list entry.
Definition: pci.h:170
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:712
#define ENA_DESTROY_CQ
Destroy completion queue.
Definition: ena.h:362
struct ena_acq acq
Admin completion queue.
Definition: ena.h:751
static struct xen_remove_from_physmap * remove
Definition: xenmem.h:39
uint16_t id
Submission queue identifier.
Definition: ena.h:305
struct io_buffer * rx_iobuf[ENA_RX_COUNT]
Receive I/O buffers, indexed by buffer ID.
Definition: ena.h:765
Use host memory.
Definition: ena.h:276
Memory is contiguous.
Definition: ena.h:278
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
Network device management.
unsigned long physaddr_t
Definition: stdint.h:20
uint8_t max
Maximum fill level.
Definition: ena.h:662
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition: pci.h:369
A named feature.
Definition: features.h:78
struct ena_get_feature_req get_feature
Get feature.
Definition: ena.h:487
struct arbelprm_qp_db_record qp
Definition: arbel.h:13
Get statistics response.
Definition: ena.h:459
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
uint32_t busdevfn
Segment, bus, device, and function (bus:dev.fn) number.
Definition: pci.h:233
struct ena_host_info * info
Host info.
Definition: ena.h:747
#define ENA_SET_FEATURE
Set feature.
Definition: ena.h:408
struct ena_sq sq
Submission queue.
Definition: ena.h:737
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
uint64_t rx_bytes
Receive byte count.
Definition: ena.h:467
uint16_t len
Length.
Definition: ena.h:624
#define ENOBUFS
No buffer space available.
Definition: errno.h:498
uint16_t id
Request identifier.
Definition: ena.h:626
#define DBGC2(...)
Definition: compiler.h:522
Receive submission queue entry.
Definition: ena.h:573
int(* probe)(struct pci_device *pci)
Probe device.
Definition: pci.h:260
#define ENA_DEVICE_MINE
My device.
Definition: ena.h:456
uint64_t address
Address.
Definition: ena.h:569
void * data
Start of data.
Definition: iobuf.h:48
Receive completion queue entry.
Definition: ena.h:618
uint8_t direction
Direction.
Definition: ena.h:307
Admin completion queue response.
Definition: ena.h:497
#define EIO
Input/output error.
Definition: errno.h:433
PCI-to-PCI bridge.
#define ENA_RESET_MAX_WAIT_MS
Maximum time to wait for reset.
Definition: ena.h:77
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:310
uint8_t opcode
Opcode.
Definition: ena.h:90
int pci_write_config_dword(struct pci_device *pci, unsigned int where, uint32_t value)
Write 32-bit dword to PCI configuration space.
#define cpu_to_le16(value)
Definition: byteswap.h:106
union ena_acq_rsp * rsp
Responses.
Definition: ena.h:527
uint64_t tx_bytes
Transmit byte count.
Definition: ena.h:463
uint8_t flags
Flags.
Definition: ena.h:579
void iounmap(volatile const void *io_addr)
Unmap I/O address.
#define ENA_SQE_PHASE
Submission queue ownership phase flag.
Definition: ena.h:589
uint16_t len
Length.
Definition: ena.h:559
static int ena_create_async(struct ena_nic *ena)
Create async event notification queue.
Definition: ena.c:386
union ena_feature feature
Feature.
Definition: ena.h:425
uint16_t id
Submission queue identifier.
Definition: ena.h:656
uint8_t scope
Scope.
Definition: ena.h:440
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382
static void free_phys(void *ptr, size_t size)
Free memory allocated with malloc_phys()
Definition: malloc.h:76
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:481
static struct pci_device_id ena_nics[]
ENA PCI device IDs.
Definition: ena.c:1263
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
struct ena_rx_sqe * rx
Receive submission queue entries.
Definition: ena.h:641
uint8_t fill
Fill level (limited to completion queue size)
Definition: ena.h:664
#define ENA_ADMIN_MAX_WAIT_MS
Maximum time to wait for admin requests.
Definition: ena.h:64
An ENA network card.
Definition: ena.h:743
Admin queue request.
Definition: ena.h:475
struct pci_driver ena_driver __pci_driver
ENA PCI driver.
Definition: ena.c:1269
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:601
uint8_t id
Request identifier.
Definition: ena.h:86
struct ena_aq_header header
Header.
Definition: ena.h:477
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:298
unsigned int prod
Producer counter.
Definition: ena.h:521
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:761
uint64_t rx_packets
Receive packet count.
Definition: ena.h:469
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:80
uint32_t len
Length.
Definition: ena.h:14
static int ena_membase(struct ena_nic *ena, struct pci_device *pci)
Assign memory BAR.
Definition: ena.c:1087
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:228
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669
Receive.
Definition: ena.h:245
String functions.
#define PCI_ROM(_vendor, _device, _name, _description, _data)
Definition: pci.h:303
uint8_t direction
Direction.
Definition: ena.h:658
#define ENA_RX_FILL
Receive queue maximum fill level.
Definition: ena.h:37
void * raw
Raw data.
Definition: ena.h:643
#define ENA_HOST_INFO_TYPE_IPXE
Operating system type.
Definition: ena.h:204
struct ena_create_sq_req create_sq
Create submission queue.
Definition: ena.h:479
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:445
unsigned int phase
Phase.
Definition: ena.h:531
uint16_t device
Device ID.
Definition: ena.h:446
uint32_t membase
Memory base.
Definition: pcibridge.h:34
void * memset(void *dest, int character, size_t len) __nonnull
A persistent I/O buffer.
Definition: iobuf.h:33