Browse Source

[thunderx] Add driver for Cavium ThunderX SoC NICs

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 8 years ago
parent
commit
4775dd3835
3 changed files with 2618 additions and 0 deletions
  1. 1668
    0
      src/drivers/net/thunderx.c
  2. 949
    0
      src/drivers/net/thunderx.h
  3. 1
    0
      src/include/ipxe/errfile.h

+ 1668
- 0
src/drivers/net/thunderx.c
File diff suppressed because it is too large
View File


+ 949
- 0
src/drivers/net/thunderx.h View File

@@ -0,0 +1,949 @@
1
+#ifndef _THUNDERX_H
2
+#define _THUNDERX_H
3
+
4
+/** @file
5
+ *
6
+ * Cavium ThunderX Ethernet driver
7
+ *
8
+ */
9
+
10
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11
+
12
+#include <stdint.h>
13
+#include <ipxe/list.h>
14
+#include <ipxe/netdevice.h>
15
+#include <ipxe/uaccess.h>
16
+
17
+/******************************************************************************
18
+ *
19
+ * Address space
20
+ *
21
+ ******************************************************************************
22
+ */
23
+
24
+/** Size of a cache line */
25
+#define TXNIC_LINE_SIZE 128
26
+
27
+/** Virtual function BAR size */
28
+#define TXNIC_VF_BAR_SIZE 0x200000UL
29
+
30
+/** Physical function BAR size */
31
+#define TXNIC_PF_BAR_SIZE 0x40000000UL
32
+
33
+/** BGX BAR size */
34
+#define TXNIC_BGX_BAR_SIZE 0x400000UL
35
+
36
+/** Maximum number of BGX Ethernet interfaces (per node) */
37
+#define TXNIC_NUM_BGX 2
38
+
39
+/** Maximum number of Logical MACs (per BGX) */
40
+#define TXNIC_NUM_LMAC 4
41
+
42
+/** Maximum number of destination MAC addresses (per BGX) */
43
+#define TXNIC_NUM_DMAC 32
44
+
45
+/** Maximum number of steering rules (per BGX) */
46
+#define TXNIC_NUM_STEERING 8
47
+
48
+/**
49
+ * Calculate node ID
50
+ *
51
+ * @v addr		PCI BAR base address
52
+ * @ret node		Node ID
53
+ */
54
+static inline unsigned int txnic_address_node ( uint64_t addr ) {
55
+
56
+	/* Node ID is in bits [45:44] of the hardcoded BAR address */
57
+	return ( ( addr >> 44 ) & 0x3 );
58
+}
59
+
60
+/**
61
+ * Calculate BGX Ethernet interface index
62
+ *
63
+ * @v addr		PCI BAR base address
64
+ * @ret index		Index
65
+ */
66
+static inline unsigned int txnic_address_bgx ( uint64_t addr ) {
67
+
68
+	/* Index is in bit 24 of the hardcoded BAR address */
69
+	return ( ( addr >> 24 ) & 0x1 );
70
+}
71
+
72
+/******************************************************************************
73
+ *
74
+ * Send queue
75
+ *
76
+ ******************************************************************************
77
+ */
78
+
79
+/** Send queue configuration */
80
+#define TXNIC_QS_SQ_CFG(q)		( ( (q) << 18 ) | 0x010800 )
81
+#define TXNIC_QS_SQ_CFG_ENA			(		 1ULL	<< 19 )
82
+#define TXNIC_QS_SQ_CFG_RESET			(		 1ULL	<< 17 )
83
+#define TXNIC_QS_SQ_CFG_QSIZE(sz)		( ( ( uint64_t ) (sz) ) <<  8 )
84
+#define TXNIC_QS_SQ_CFG_QSIZE_1K \
85
+	TXNIC_QS_SQ_CFG_QSIZE ( 0 )
86
+
87
+/** Send queue base address */
88
+#define TXNIC_QS_SQ_BASE(q)		( ( (q) << 18 ) | 0x010820 )
89
+
90
+/** Send queue head pointer */
91
+#define TXNIC_QS_SQ_HEAD(q)		( ( (q) << 18 ) | 0x010828 )
92
+
93
+/** Send queue tail pointer */
94
+#define TXNIC_QS_SQ_TAIL(q)		( ( (q) << 18 ) | 0x010830 )
95
+
96
+/** Send queue doorbell */
97
+#define TXNIC_QS_SQ_DOOR(q)		( ( (q) << 18 ) | 0x010838 )
98
+
99
+/** Send queue status */
100
+#define TXNIC_QS_SQ_STATUS(q)		( ( (q) << 18 ) | 0x010840 )
101
+#define TXNIC_QS_SQ_STATUS_STOPPED		(		 1ULL	<< 21 )
102
+
103
+/** Maximum time to wait for a send queue to stop
104
+ *
105
+ * This is a policy decision.
106
+ */
107
+#define TXNIC_SQ_STOP_MAX_WAIT_MS 100
108
+
109
+/** A send header subdescriptor */
110
+struct txnic_send_header {
111
+	/** Total length */
112
+	uint32_t total;
113
+	/** Unused */
114
+	uint8_t unused_a[2];
115
+	/** Subdescriptor count */
116
+	uint8_t subdcnt;
117
+	/** Flags */
118
+	uint8_t flags;
119
+	/** Unused */
120
+	uint8_t unused_b[8];
121
+} __attribute__ (( packed ));
122
+
123
+/** Flags for send header subdescriptor
124
+ *
125
+ * These comprise SUBDC=0x1 and PNC=0x1.
126
+ */
127
+#define TXNIC_SEND_HDR_FLAGS 0x14
128
+
129
+/** A send gather subdescriptor */
130
+struct txnic_send_gather {
131
+	/** Size */
132
+	uint16_t size;
133
+	/** Unused */
134
+	uint8_t unused[5];
135
+	/** Flags */
136
+	uint8_t flags;
137
+	/** Address */
138
+	uint64_t addr;
139
+} __attribute__ (( packed ));
140
+
141
+/** Flags for send gather subdescriptor
142
+ *
143
+ * These comprise SUBDC=0x4 and LD_TYPE=0x0.
144
+ */
145
+#define TXNIC_SEND_GATHER_FLAGS 0x40
146
+
147
+/** A send queue entry
148
+ *
149
+ * Each send queue entry comprises a single send header subdescriptor
150
+ * and a single send gather subdescriptor.
151
+ */
152
+struct txnic_sqe {
153
+	/** Send header descriptor */
154
+	struct txnic_send_header hdr;
155
+	/** Send gather descriptor */
156
+	struct txnic_send_gather gather;
157
+} __attribute__ (( packed ));
158
+
159
+/** Number of subdescriptors per send queue entry */
160
+#define TXNIC_SQE_SUBDESCS ( sizeof ( struct txnic_sqe ) / \
161
+			     sizeof ( struct txnic_send_header ) )
162
+
163
+/** Number of send queue entries
164
+ *
165
+ * The minimum send queue size is 1024 entries.
166
+ */
167
+#define TXNIC_SQES ( 1024 / TXNIC_SQE_SUBDESCS )
168
+
169
+/** Send queue maximum fill level
170
+ *
171
+ * This is a policy decision.
172
+ */
173
+#define TXNIC_SQ_FILL 32
174
+
175
+/** Send queue alignment */
176
+#define TXNIC_SQ_ALIGN TXNIC_LINE_SIZE
177
+
178
+/** Send queue stride */
179
+#define TXNIC_SQ_STRIDE sizeof ( struct txnic_sqe )
180
+
181
+/** Send queue size */
182
+#define TXNIC_SQ_SIZE ( TXNIC_SQES * TXNIC_SQ_STRIDE )
183
+
184
+/** A send queue */
185
+struct txnic_sq {
186
+	/** Producer counter */
187
+	unsigned int prod;
188
+	/** Consumer counter */
189
+	unsigned int cons;
190
+	/** Send queue entries */
191
+	userptr_t sqe;
192
+};
193
+
194
+/******************************************************************************
195
+ *
196
+ * Receive queue
197
+ *
198
+ ******************************************************************************
199
+ */
200
+
201
+/** Receive queue configuration */
202
+#define TXNIC_QS_RQ_CFG(q)		( ( (q) << 18 ) | 0x010600 )
203
+#define TXNIC_QS_RQ_CFG_ENA			(		 1ULL	<<  1 )
204
+
205
+/** Maximum time to wait for a receive queue to disable
206
+ *
207
+ * This is a policy decision.
208
+ */
209
+#define TXNIC_RQ_DISABLE_MAX_WAIT_MS 100
210
+
211
+/** Receive buffer descriptor ring configuration */
212
+#define TXNIC_QS_RBDR_CFG(q)		( ( (q) << 18 ) | 0x010c00 )
213
+#define TXNIC_QS_RBDR_CFG_ENA			(		 1ULL	<< 44 )
214
+#define TXNIC_QS_RBDR_CFG_RESET			(		 1ULL	<< 43 )
215
+#define TXNIC_QS_RBDR_CFG_QSIZE(sz)		( ( ( uint64_t ) (sz) ) << 32 )
216
+#define TXNIC_QS_RBDR_CFG_QSIZE_8K \
217
+	TXNIC_QS_RBDR_CFG_QSIZE ( 0 )
218
+#define TXNIC_QS_RBDR_CFG_LINES(sz)		( ( ( uint64_t ) (sz) ) <<  0 )
219
+
220
+/** Receive buffer descriptor ring base address */
221
+#define TXNIC_QS_RBDR_BASE(q)		( ( (q) << 18 ) | 0x010c20 )
222
+
223
+/** Receive buffer descriptor ring head pointer */
224
+#define TXNIC_QS_RBDR_HEAD(q)		( ( (q) << 18 ) | 0x010c28 )
225
+
226
+/** Receive buffer descriptor ring tail pointer */
227
+#define TXNIC_QS_RBDR_TAIL(q)		( ( (q) << 18 ) | 0x010c30 )
228
+
229
+/** Receive buffer descriptor ring doorbell */
230
+#define TXNIC_QS_RBDR_DOOR(q)		( ( (q) << 18 ) | 0x010c38 )
231
+
232
+/** Receive buffer descriptor ring status 0 */
233
+#define TXNIC_QS_RBDR_STATUS0(q)	( ( (q) << 18 ) | 0x010c40 )
234
+
235
+/** A receive buffer descriptor ring entry */
236
+struct txnic_rbdr_entry {
237
+	/** Address */
238
+	uint64_t addr;
239
+} __attribute__ (( packed ));
240
+
241
+/** A receive queue entry */
242
+struct txnic_rqe {
243
+	/** Receive buffer descriptor ring entry */
244
+	struct txnic_rbdr_entry rbdre;
245
+} __attribute__ (( packed ));
246
+
247
+/** Number of receive queue entries
248
+ *
249
+ * The minimum receive queue size is 8192 entries.
250
+ */
251
+#define TXNIC_RQES 8192
252
+
253
+/** Receive queue maximum fill level
254
+ *
255
+ * This is a policy decision.  Must not exceed TXNIC_RQES.
256
+ */
257
+#define TXNIC_RQ_FILL 32
258
+
259
+/** Receive queue entry size
260
+ *
261
+ * This is a policy decision.
262
+ */
263
+#define TXNIC_RQE_SIZE ( ( ETH_DATA_ALIGN + ETH_FRAME_LEN +		\
264
+			   4 /* VLAN */ + TXNIC_LINE_SIZE - 1 )		\
265
+			 & ~( TXNIC_LINE_SIZE - 1 ) )
266
+
267
+/** Receive queue alignment */
268
+#define TXNIC_RQ_ALIGN TXNIC_LINE_SIZE
269
+
270
+/** Receive queue stride */
271
+#define TXNIC_RQ_STRIDE sizeof ( struct txnic_rqe )
272
+
273
+/** Receive queue size */
274
+#define TXNIC_RQ_SIZE ( TXNIC_RQES * TXNIC_RQ_STRIDE )
275
+
276
+/** A receive queue */
277
+struct txnic_rq {
278
+	/** Producer counter */
279
+	unsigned int prod;
280
+	/** Consumer counter */
281
+	unsigned int cons;
282
+	/** Receive queue entries */
283
+	userptr_t rqe;
284
+	/** I/O buffers */
285
+	struct io_buffer *iobuf[TXNIC_RQ_FILL];
286
+};
287
+
288
+/******************************************************************************
289
+ *
290
+ * Completion queue
291
+ *
292
+ ******************************************************************************
293
+ */
294
+
295
+/** Completion queue configuration */
296
+#define TXNIC_QS_CQ_CFG(q)		( ( (q) << 18 ) | 0x010400 )
297
+#define TXNIC_QS_CQ_CFG_ENA			(		 1ULL	<< 42 )
298
+#define TXNIC_QS_CQ_CFG_RESET			(		 1ULL	<< 41 )
299
+#define TXNIC_QS_CQ_CFG_QSIZE(sz)		( ( ( uint64_t ) (sz) ) << 32 )
300
+#define TXNIC_QS_CQ_CFG_QSIZE_256 \
301
+	TXNIC_QS_CQ_CFG_QSIZE ( 7 )
302
+
303
+/** Maximum time to wait for a completion queue to disable
304
+ *
305
+ * This is a policy decision.
306
+ */
307
+#define TXNIC_CQ_DISABLE_MAX_WAIT_MS 100
308
+
309
+/** Completion queue base address */
310
+#define TXNIC_QS_CQ_BASE(q)		( ( (q) << 18 ) | 0x010420 )
311
+
312
+/** Completion queue head pointer */
313
+#define TXNIC_QS_CQ_HEAD(q)		( ( (q) << 18 ) | 0x010428 )
314
+
315
+/** Completion queue tail pointer */
316
+#define TXNIC_QS_CQ_TAIL(q)		( ( (q) << 18 ) | 0x010430 )
317
+
318
+/** Completion queue doorbell */
319
+#define TXNIC_QS_CQ_DOOR(q)		( ( (q) << 18 ) | 0x010438 )
320
+
321
+/** Completion queue status */
322
+#define TXNIC_QS_CQ_STATUS(q)		( ( (q) << 18 ) | 0x010440 )
323
+#define TXNIC_QS_CQ_STATUS_QCOUNT(status) \
324
+	( ( (status) >> 0 ) & 0xffff )
325
+
326
+/** Completion queue status 2 */
327
+#define TXNIC_QS_CQ_STATUS2(q)		( ( (q) << 18 ) | 0x010448 )
328
+
329
+/** A send completion queue entry */
330
+struct txnic_cqe_send {
331
+	/** Status */
332
+	uint8_t send_status;
333
+	/** Unused */
334
+	uint8_t unused[4];
335
+	/** Send queue entry pointer */
336
+	uint16_t sqe_ptr;
337
+	/** Type */
338
+	uint8_t cqe_type;
339
+} __attribute__ (( packed ));
340
+
341
+/** Send completion queue entry type */
342
+#define TXNIC_CQE_TYPE_SEND 0x80
343
+
344
+/** A receive completion queue entry */
345
+struct txnic_cqe_rx {
346
+	/** Error opcode */
347
+	uint8_t errop;
348
+	/** Unused */
349
+	uint8_t unused_a[6];
350
+	/** Type */
351
+	uint8_t cqe_type;
352
+	/** Unused */
353
+	uint8_t unused_b[1];
354
+	/** Padding */
355
+	uint8_t apad;
356
+	/** Unused */
357
+	uint8_t unused_c[4];
358
+	/** Length */
359
+	uint16_t len;
360
+} __attribute__ (( packed ));
361
+
362
+/** Receive completion queue entry type */
363
+#define TXNIC_CQE_TYPE_RX 0x20
364
+
365
+/** Applied padding */
366
+#define TXNIC_CQE_RX_APAD_LEN( apad ) ( (apad) >> 5 )
367
+
368
+/** Completion queue entry common fields */
369
+struct txnic_cqe_common {
370
+	/** Unused */
371
+	uint8_t unused_a[7];
372
+	/** Type */
373
+	uint8_t cqe_type;
374
+} __attribute__ (( packed ));
375
+
376
+/** A completion queue entry */
377
+union txnic_cqe {
378
+	/** Common fields */
379
+	struct txnic_cqe_common common;
380
+	/** Send completion */
381
+	struct txnic_cqe_send send;
382
+	/** Receive completion */
383
+	struct txnic_cqe_rx rx;
384
+};
385
+
386
+/** Number of completion queue entries
387
+ *
388
+ * The minimum completion queue size is 256 entries.
389
+ */
390
+#define TXNIC_CQES 256
391
+
392
+/** Completion queue alignment */
393
+#define TXNIC_CQ_ALIGN 512
394
+
395
+/** Completion queue stride */
396
+#define TXNIC_CQ_STRIDE 512
397
+
398
+/** Completion queue size */
399
+#define TXNIC_CQ_SIZE ( TXNIC_CQES * TXNIC_CQ_STRIDE )
400
+
401
+/** A completion queue */
402
+struct txnic_cq {
403
+	/** Consumer counter */
404
+	unsigned int cons;
405
+	/** Completion queue entries */
406
+	userptr_t cqe;
407
+};
408
+
409
+/******************************************************************************
410
+ *
411
+ * Virtual NIC
412
+ *
413
+ ******************************************************************************
414
+ */
415
+
416
+/** A virtual NIC */
417
+struct txnic {
418
+	/** Registers */
419
+	void *regs;
420
+	/** Device name (for debugging) */
421
+	const char *name;
422
+	/** Network device */
423
+	struct net_device *netdev;
424
+
425
+	/** Send queue */
426
+	struct txnic_sq sq;
427
+	/** Receive queue */
428
+	struct txnic_rq rq;
429
+	/** Completion queue */
430
+	struct txnic_cq cq;
431
+};
432
+
433
+/******************************************************************************
434
+ *
435
+ * Physical function
436
+ *
437
+ ******************************************************************************
438
+ */
439
+
440
+/** Physical function configuration */
441
+#define TXNIC_PF_CFG			0x000000
442
+#define TXNIC_PF_CFG_ENA			(		 1ULL	<<  0 )
443
+
444
+/** Backpressure configuration */
445
+#define TXNIC_PF_BP_CFG			0x000080
446
+#define TXNIC_PF_BP_CFG_BP_POLL_ENA		(		 1ULL	<<  6 )
447
+#define TXNIC_PF_BP_CFG_BP_POLL_DLY(dl)		( ( ( uint64_t ) (dl) ) <<  0 )
448
+#define TXNIC_PF_BP_CFG_BP_POLL_DLY_DEFAULT \
449
+	TXNIC_PF_BP_CFG_BP_POLL_DLY ( 3 )
450
+
451
+/** Interface send configuration */
452
+#define TXNIC_PF_INTF_SEND_CFG(in)	( ( (in) << 8 ) | 0x000200 )
453
+#define TXNIC_PF_INTF_SEND_CFG_BLOCK_BGX	(		 1ULL	<<  3 )
454
+#define TXNIC_PF_INTF_SEND_CFG_BLOCK(bl)	( ( ( uint64_t ) (bl) ) <<  0 )
455
+
456
+/** Interface backpressure configuration */
457
+#define TXNIC_PF_INTF_BP_CFG(in)	( ( (in) << 8 ) | 0x000208 )
458
+#define TXNIC_PF_INTF_BP_CFG_BP_ENA		(		 1ULL	<< 63 )
459
+#define TXNIC_PF_INTF_BP_CFG_BP_ID_BGX		(		 1ULL	<<  3 )
460
+#define TXNIC_PF_INTF_BP_CFG_BP_ID(bp)		( ( ( uint64_t ) (bp) ) <<  0 )
461
+
462
+/** Port kind configuration */
463
+#define TXNIC_PF_PKIND_CFG(pk)		( ( (pk) << 3 ) | 0x000600 )
464
+#define TXNIC_PF_PKIND_CFG_LENERR_EN		(		 1ULL	<< 33 )
465
+#define TXNIC_PF_PKIND_CFG_MAXLEN(ct)		( ( ( uint64_t ) (ct) ) << 16 )
466
+#define TXNIC_PF_PKIND_CFG_MAXLEN_DISABLE \
467
+	TXNIC_PF_PKIND_CFG_MAXLEN ( 0xffff )
468
+#define TXNIC_PF_PKIND_CFG_MINLEN(ct)		( ( ( uint64_t ) (ct) ) <<  0 )
469
+#define TXNIC_PF_PKIND_CFG_MINLEN_DISABLE \
470
+	TXNIC_PF_PKIND_CFG_MINLEN ( 0x0000 )
471
+
472
+/** Match parse index configuration */
473
+#define TXNIC_PF_MPI_CFG(ix)		( ( (ix) << 3 ) | 0x210000 )
474
+#define TXNIC_PF_MPI_CFG_VNIC(vn)		( ( ( uint64_t ) (vn) )	<< 24 )
475
+#define TXNIC_PF_MPI_CFG_RSSI_BASE(ix)		( ( ( uint64_t ) (ix) ) <<  0 )
476
+
477
+/** RSS indirection receive queue */
478
+#define TXNIC_PF_RSSI_RQ(ix)		( ( (ix) << 3 ) | 0x220000 )
479
+#define TXNIC_PF_RSSI_RQ_RQ_QS(qs)		( ( ( uint64_t ) (qs) ) << 3 )
480
+
481
+/** LMAC registers */
482
+#define TXNIC_PF_LMAC(lm)		( ( (lm) << 3 ) | 0x240000 )
483
+
484
+/** LMAC configuration */
485
+#define TXNIC_PF_LMAC_CFG		0x000000
486
+#define TXNIC_PF_LMAC_CFG_ADJUST(ad)		( ( ( uint64_t ) (ad) ) <<  8 )
487
+#define TXNIC_PF_LMAC_CFG_ADJUST_DEFAULT \
488
+	TXNIC_PF_LMAC_CFG_ADJUST ( 6 )
489
+#define TXNIC_PF_LMAC_CFG_MIN_PKT_SIZE(sz)	( ( ( uint64_t ) (sz) ) <<  0 )
490
+
491
+/** LMAC configuration 2 */
492
+#define TXNIC_PF_LMAC_CFG2		0x000100
493
+#define TXNIC_PF_LMAC_CFG2_MAX_PKT_SIZE(sz)	( ( ( uint64_t ) (sz) ) <<  0 )
494
+
495
+/** LMAC credit */
496
+#define TXNIC_PF_LMAC_CREDIT		0x004000
497
+#define TXNIC_PF_LMAC_CREDIT_CC_UNIT_CNT(ct)	( ( ( uint64_t ) (ct) ) << 12 )
498
+#define TXNIC_PF_LMAC_CREDIT_CC_UNIT_CNT_DEFAULT \
499
+	TXNIC_PF_LMAC_CREDIT_CC_UNIT_CNT ( 192 )
500
+#define TXNIC_PF_LMAC_CREDIT_CC_PACKET_CNT(ct)	( ( ( uint64_t ) (ct) ) <<  2 )
501
+#define TXNIC_PF_LMAC_CREDIT_CC_PACKET_CNT_DEFAULT \
502
+	TXNIC_PF_LMAC_CREDIT_CC_PACKET_CNT ( 511 )
503
+#define TXNIC_PF_LMAC_CREDIT_CC_ENABLE		(		 1ULL	<<  1 )
504
+
505
+/** Channel registers */
506
+#define TXNIC_PF_CHAN(ch)		( ( (ch) << 3 ) | 0x400000 )
507
+
508
+/** Channel transmit configuration */
509
+#define TXNIC_PF_CHAN_TX_CFG		0x000000
510
+#define TXNIC_PF_CHAN_TX_CFG_BP_ENA		(		 1ULL	<<  0 )
511
+
512
+/** Channel receive configuration */
513
+#define TXNIC_PF_CHAN_RX_CFG		0x020000
514
+#define TXNIC_PF_CHAN_RX_CFG_CPI_BASE(ix)	( ( ( uint64_t ) (ix) ) << 48 )
515
+
516
+/** Channel receive backpressure configuration */
517
+#define TXNIC_PF_CHAN_RX_BP_CFG		0x080000
518
+#define TXNIC_PF_CHAN_RX_BP_CFG_ENA		(		 1ULL	<< 63 )
519
+#define TXNIC_PF_CHAN_RX_BP_CFG_BPID(bp)	( ( ( uint64_t ) (bp) ) <<  0 )
520
+
521
+/** Traffic limiter 2 configuration */
522
+#define TXNIC_PF_TL2_CFG(tl)		( ( (tl) << 3 ) | 0x500000 )
523
+#define TXNIC_PF_TL2_CFG_RR_QUANTUM(rr)		( ( ( uint64_t ) (rr) ) <<  0 )
524
+#define TXNIC_PF_TL2_CFG_RR_QUANTUM_DEFAULT \
525
+	TXNIC_PF_TL2_CFG_RR_QUANTUM ( 0x905 )
526
+
527
+/** Traffic limiter 3 configuration */
528
+#define TXNIC_PF_TL3_CFG(tl)		( ( (tl) << 3 ) | 0x600000 )
529
+#define TXNIC_PF_TL3_CFG_RR_QUANTUM(rr)		( ( ( uint64_t ) (rr) ) <<  0 )
530
+#define TXNIC_PF_TL3_CFG_RR_QUANTUM_DEFAULT \
531
+	TXNIC_PF_TL3_CFG_RR_QUANTUM ( 0x905 )
532
+
533
+/** Traffic limiter 3 channel mapping */
534
+#define TXNIC_PF_TL3_CHAN(tl)		( ( (tl) << 3 ) | 0x620000 )
535
+#define TXNIC_PF_TL3_CHAN_CHAN(ch)		( ( (ch) & 0x7f ) << 0 )
536
+
537
+/** Traffic limiter 4 configuration */
538
+#define TXNIC_PF_TL4_CFG(tl)		( ( (tl) << 3 ) | 0x800000 )
539
+#define TXNIC_PF_TL4_CFG_SQ_QS(qs)		( ( ( uint64_t ) (qs) ) << 27 )
540
+#define TXNIC_PF_TL4_CFG_RR_QUANTUM(rr)		( ( ( uint64_t ) (rr) ) <<  0 )
541
+#define TXNIC_PF_TL4_CFG_RR_QUANTUM_DEFAULT \
542
+	TXNIC_PF_TL4_CFG_RR_QUANTUM ( 0x905 )
543
+
544
+/** Queue set registers */
545
+#define TXNIC_PF_QS(qs)			( ( (qs) << 21 ) | 0x20000000UL )
546
+
547
+/** Queue set configuration */
548
+#define TXNIC_PF_QS_CFG			0x010000
549
+#define TXNIC_PF_QS_CFG_ENA			(		 1ULL	<< 31 )
550
+#define TXNIC_PF_QS_CFG_VNIC(vn)		( ( ( uint64_t ) (vn) ) <<  0 )
551
+
552
+/** Receive queue configuration */
553
+#define TXNIC_PF_QS_RQ_CFG(q)		( ( (q) << 18 ) | 0x010400 )
554
+#define TXNIC_PF_QS_RQ_CFG_CACHING(cx)		( ( ( uint64_t ) (cx) ) << 26 )
555
+#define TXNIC_PF_QS_RQ_CFG_CACHING_ALL \
556
+	TXNIC_PF_QS_RQ_CFG_CACHING ( 1 )
557
+#define TXNIC_PF_QS_RQ_CFG_CQ_QS(qs)		( ( ( uint64_t ) (qs) ) << 19 )
558
+#define TXNIC_PF_QS_RQ_CFG_RBDR_CONT_QS(qs)	( ( ( uint64_t ) (qs) ) <<  9 )
559
+#define TXNIC_PF_QS_RQ_CFG_RBDR_STRT_QS(qs)	( ( ( uint64_t ) (qs) ) <<  1 )
560
+
561
+/** Receive queue drop configuration */
562
+#define TXNIC_PF_QS_RQ_DROP_CFG(q)	( ( (q) << 18 ) | 0x010420 )
563
+
564
+/** Receive queue backpressure configuration */
565
+#define TXNIC_PF_QS_RQ_BP_CFG(q)	( ( (q) << 18 ) | 0x010500 )
566
+#define TXNIC_PF_QS_RQ_BP_CFG_RBDR_BP_ENA	(		 1ULL	<< 63 )
567
+#define TXNIC_PF_QS_RQ_BP_CFG_CQ_BP_ENA		(		 1ULL	<< 62 )
568
+#define TXNIC_PF_QS_RQ_BP_CFG_BPID(bp)		( ( ( uint64_t ) (bp) ) <<  0 )
569
+
570
+/** Send queue configuration */
571
+#define TXNIC_PF_QS_SQ_CFG(q)		( ( (q) << 18 ) | 0x010c00 )
572
+#define TXNIC_PF_QS_SQ_CFG_CQ_QS(qs)		( ( ( uint64_t ) (qs) ) <<  3 )
573
+
574
+/** Send queue configuration 2 */
575
+#define TXNIC_PF_QS_SQ_CFG2(q)		( ( (q) << 18 ) | 0x010c08 )
576
+#define TXNIC_PF_QS_SQ_CFG2_TL4(tl)		( ( ( uint64_t ) (tl) ) <<  0 )
577
+
578
+/** A physical function */
579
+struct txnic_pf {
580
+	/** Registers */
581
+	void *regs;
582
+	/** PCI device */
583
+	struct pci_device *pci;
584
+	/** Node ID */
585
+	unsigned int node;
586
+
587
+	/** Virtual function BAR base */
588
+	unsigned long vf_membase;
589
+	/** Virtual function BAR stride */
590
+	unsigned long vf_stride;
591
+
592
+	/** List of physical functions */
593
+	struct list_head list;
594
+	/** BGX Ethernet interfaces (if known) */
595
+	struct txnic_bgx *bgx[TXNIC_NUM_BGX];
596
+};
597
+
598
+/**
599
+ * Calculate virtual NIC index
600
+ *
601
+ * @v bgx_idx		BGX Ethernet interface index
602
+ * @v lmac_idx		Logical MAC index
603
+ * @ret vnic_idx	Virtual NIC index
604
+ */
605
+#define TXNIC_VNIC_IDX( bgx_idx, lmac_idx ) \
606
+	( ( (bgx_idx) * TXNIC_NUM_LMAC ) + (lmac_idx) )
607
+
608
+/**
609
+ * Calculate BGX Ethernet interface index
610
+ *
611
+ * @v vnic_idx		Virtual NIC index
612
+ * @ret bgx_idx		BGX Ethernet interface index
613
+ */
614
+#define TXNIC_BGX_IDX( vnic_idx ) ( (vnic_idx) / TXNIC_NUM_LMAC )
615
+
616
+/**
617
+ * Calculate logical MAC index
618
+ *
619
+ * @v vnic_idx		Virtual NIC index
620
+ * @ret lmac_idx	Logical MAC index
621
+ */
622
+#define TXNIC_LMAC_IDX( vnic_idx ) ( (vnic_idx) % TXNIC_NUM_LMAC )
623
+
624
+/**
625
+ * Calculate traffic limiter 2 index
626
+ *
627
+ * @v vnic_idx		Virtual NIC index
628
+ * @v tl2_idx		Traffic limiter 2 index
629
+ */
630
+#define TXNIC_TL2_IDX( vnic_idx ) ( (vnic_idx) << 3 )
631
+
632
+/**
633
+ * Calculate traffic limiter 3 index
634
+ *
635
+ * @v vnic_idx		Virtual NIC index
636
+ * @v tl3_idx		Traffic limiter 3 index
637
+ */
638
+#define TXNIC_TL3_IDX( vnic_idx ) ( (vnic_idx) << 5 )
639
+
640
+/**
641
+ * Calculate traffic limiter 4 index
642
+ *
643
+ * @v vnic_idx		Virtual NIC index
644
+ * @v tl4_idx		Traffic limiter 4 index
645
+ */
646
+#define TXNIC_TL4_IDX( vnic_idx ) ( (vnic_idx) << 7 )
647
+
648
+/**
649
+ * Calculate channel index
650
+ *
651
+ * @v vnic_idx		Virtual NIC index
652
+ * @v chan_idx		Channel index
653
+ */
654
+#define TXNIC_CHAN_IDX( vnic_idx ) ( ( TXNIC_BGX_IDX (vnic_idx) << 7 ) | \
655
+				     ( TXNIC_LMAC_IDX (vnic_idx) << 4 ) )
656
+
657
+/******************************************************************************
658
+ *
659
+ * BGX Ethernet interface
660
+ *
661
+ ******************************************************************************
662
+ */
663
+
664
+/** Per-LMAC registers */
665
+#define BGX_LMAC(lm)			( ( (lm) << 20 ) | 0x00000000UL )
666
+
667
+/** CMR configuration */
668
+#define BGX_CMR_CONFIG			0x000000
669
+#define BGX_CMR_CONFIG_ENABLE			(		 1ULL	<< 15 )
670
+#define BGX_CMR_CONFIG_DATA_PKT_RX_EN		(		 1ULL	<< 14 )
671
+#define BGX_CMR_CONFIG_DATA_PKT_TX_EN		(		 1ULL	<< 13 )
672
+#define BGX_CMR_CONFIG_LMAC_TYPE_GET(config) \
673
+	( ( (config) >> 8 ) & 0x7 )
674
+#define BGX_CMR_CONFIG_LMAC_TYPE_SET(ty)	( ( ( uint64_t ) (ty) ) <<  8 )
675
+#define BGX_CMR_CONFIG_LANE_TO_SDS(ls)		( ( ( uint64_t ) (ls) ) <<  0 )
676
+
677
+/** CMR global configuration */
678
+#define BGX_CMR_GLOBAL_CONFIG		0x000008
679
+#define BGX_CMR_GLOBAL_CONFIG_FCS_STRIP		(		 1ULL	<<  6 )
680
+
681
+/** CMR receive statistics 0 */
682
+#define BGX_CMR_RX_STAT0		0x000070
683
+
684
+/** CMR receive statistics 1 */
685
+#define BGX_CMR_RX_STAT1		0x000078
686
+
687
+/** CMR receive statistics 2 */
688
+#define BGX_CMR_RX_STAT2		0x000080
689
+
690
+/** CMR receive statistics 3 */
691
+#define BGX_CMR_RX_STAT3		0x000088
692
+
693
+/** CMR receive statistics 4 */
694
+#define BGX_CMR_RX_STAT4		0x000090
695
+
696
+/** CMR receive statistics 5 */
697
+#define BGX_CMR_RX_STAT5		0x000098
698
+
699
+/** CMR receive statistics 6 */
700
+#define BGX_CMR_RX_STAT6		0x0000a0
701
+
702
+/** CMR receive statistics 7 */
703
+#define BGX_CMR_RX_STAT7		0x0000a8
704
+
705
+/** CMR receive statistics 8 */
706
+#define BGX_CMR_RX_STAT8		0x0000b0
707
+
708
+/** CMR receive statistics 9 */
709
+#define BGX_CMR_RX_STAT9		0x0000b8
710
+
711
+/** CMR receive statistics 10 */
712
+#define BGX_CMR_RX_STAT10		0x0000c0
713
+
714
+/** CMR destination MAC control */
715
+#define BGX_CMR_RX_DMAC_CTL		0x0000e8
716
+#define BGX_CMR_RX_DMAC_CTL_MCST_MODE(md)	( ( ( uint64_t ) (md) ) <<  1 )
717
+#define BGX_CMR_RX_DMAC_CTL_MCST_MODE_ACCEPT \
718
+	BGX_CMR_RX_DMAC_CTL_MCST_MODE ( 1 )
719
+#define BGX_CMR_RX_DMAC_CTL_BCST_ACCEPT		(		 1ULL	<<  0 )
720
+
721
+/** CMR destination MAC CAM */
722
+#define BGX_CMR_RX_DMAC_CAM(i)		( ( (i) << 3 ) | 0x000200 )
723
+
724
+/** CMR receive steering */
725
+#define BGX_CMR_RX_STEERING(i)		( ( (i) << 3 ) | 0x000300 )
726
+
727
+/** CMR backpressure channel mask AND */
728
+#define BGX_CMR_CHAN_MSK_AND		0x000450
729
+#define BGX_CMR_CHAN_MSK_AND_ALL(count) \
730
+	( 0xffffffffffffffffULL >> ( 16 * ( 4 - (count) ) ) )
731
+
732
+/** CMR transmit statistics 0 */
733
+#define BGX_CMR_TX_STAT0		0x000600
734
+
735
+/** CMR transmit statistics 1 */
736
+#define BGX_CMR_TX_STAT1		0x000608
737
+
738
+/** CMR transmit statistics 2 */
739
+#define BGX_CMR_TX_STAT2		0x000610
740
+
741
+/** CMR transmit statistics 3 */
742
+#define BGX_CMR_TX_STAT3		0x000618
743
+
744
+/** CMR transmit statistics 4 */
745
+#define BGX_CMR_TX_STAT4		0x000620
746
+
747
+/** CMR transmit statistics 5 */
748
+#define BGX_CMR_TX_STAT5		0x000628
749
+
750
+/** CMR transmit statistics 6 */
751
+#define BGX_CMR_TX_STAT6		0x000630
752
+
753
+/** CMR transmit statistics 7 */
754
+#define BGX_CMR_TX_STAT7		0x000638
755
+
756
+/** CMR transmit statistics 8 */
757
+#define BGX_CMR_TX_STAT8		0x000640
758
+
759
+/** CMR transmit statistics 9 */
760
+#define BGX_CMR_TX_STAT9		0x000648
761
+
762
+/** CMR transmit statistics 10 */
763
+#define BGX_CMR_TX_STAT10		0x000650
764
+
765
+/** CMR transmit statistics 11 */
766
+#define BGX_CMR_TX_STAT11		0x000658
767
+
768
+/** CMR transmit statistics 12 */
769
+#define BGX_CMR_TX_STAT12		0x000660
770
+
771
+/** CMR transmit statistics 13 */
772
+#define BGX_CMR_TX_STAT13		0x000668
773
+
774
+/** CMR transmit statistics 14 */
775
+#define BGX_CMR_TX_STAT14		0x000670
776
+
777
+/** CMR transmit statistics 15 */
778
+#define BGX_CMR_TX_STAT15		0x000678
779
+
780
+/** CMR transmit statistics 16 */
781
+#define BGX_CMR_TX_STAT16		0x000680
782
+
783
+/** CMR transmit statistics 17 */
784
+#define BGX_CMR_TX_STAT17		0x000688
785
+
786
+/** CMR receive logical MACs */
787
+#define BGX_CMR_RX_LMACS		0x000468
788
+#define BGX_CMR_RX_LMACS_LMACS_GET(lmacs) \
789
+	( ( (lmacs) >> 0 ) & 0x7 )
790
+#define BGX_CMR_RX_LMACS_LMACS_SET(ct)		( ( ( uint64_t ) (ct) ) <<  0 )
791
+
792
+/** CMR transmit logical MACs */
793
+#define BGX_CMR_TX_LMACS		0x001000
794
+#define BGX_CMR_TX_LMACS_LMACS_GET(lmacs) \
795
+	( ( (lmacs) >> 0 ) & 0x7 )
796
+#define BGX_CMR_TX_LMACS_LMACS_SET(ct)		( ( ( uint64_t ) (ct) ) <<  0 )
797
+
798
+/** SPU control 1 */
799
+#define BGX_SPU_CONTROL1		0x010000
800
+#define BGX_SPU_CONTROL1_RESET			(		 1ULL	<< 15 )
801
+#define BGX_SPU_CONTROL1_LO_PWR			(		 1ULL	<< 11 )
802
+
803
+/** SPU reset delay */
804
+#define BGX_SPU_RESET_DELAY_MS 10
805
+
806
+/** SPU status 1 */
807
+#define BGX_SPU_STATUS1			0x010008
808
+#define BGX_SPU_STATUS1_FLT			(		 1ULL	<<  7 )
809
+#define BGX_SPU_STATUS1_RCV_LNK			(		 1ULL	<<  2 )
810
+
811
+/** SPU status 2 */
812
+#define BGX_SPU_STATUS2			0x010020
813
+#define BGX_SPU_STATUS2_RCVFLT			(		 1ULL	<< 10 )
814
+
815
+/** SPU BASE-R status 1 */
816
+#define BGX_SPU_BR_STATUS1		0x010030
817
+#define BGX_SPU_BR_STATUS1_RCV_LNK		(		 1ULL	<< 12 )
818
+#define BGX_SPU_BR_STATUS1_HI_BER		(		 1ULL	<<  1 )
819
+#define BGX_SPU_BR_STATUS1_BLK_LOCK		(		 1ULL	<<  0 )
820
+
821
+/** SPU BASE-R status 2 */
822
+#define BGX_SPU_BR_STATUS2		0x010038
823
+#define BGX_SPU_BR_STATUS2_LATCHED_LOCK		(		 1ULL	<< 15 )
824
+#define BGX_SPU_BR_STATUS2_LATCHED_BER		(		 1ULL	<< 14 )
825
+
826
+/** SPU BASE-R alignment status */
827
+#define BGX_SPU_BR_ALGN_STATUS		0x010050
828
+#define BGX_SPU_BR_ALGN_STATUS_ALIGND		(		 1ULL	<< 12 )
829
+
830
+/** SPU BASE-R link training control */
831
+#define BGX_SPU_BR_PMD_CONTROL		0x010068
832
+#define BGX_SPU_BR_PMD_CONTROL_TRAIN_EN		(		 1ULL	<<  1 )
833
+
834
+/** SPU BASE-R link training status */
835
+#define BGX_SPU_BR_PMD_STATUS		0x010070
836
+
837
+/** SPU link partner coefficient update */
838
+#define BGX_SPU_BR_PMD_LP_CUP		0x010078
839
+
840
+/** SPU local device coefficient update */
841
+#define BGX_SPU_BR_PMD_LD_CUP		0x010088
842
+
843
+/** SPU local device status report */
844
+#define BGX_SPU_BR_PMD_LD_REP		0x010090
845
+
846
+/** SPU forward error correction control */
847
+#define BGX_SPU_FEC_CONTROL		0x0100a0
848
+
849
+/** SPU autonegotation control */
850
+#define BGX_SPU_AN_CONTROL		0x0100c8
851
+
852
+/** SPU autonegotiation status */
853
+#define BGX_SPU_AN_STATUS		0x0100d0
854
+#define BGX_SPU_AN_STATUS_XNP_STAT		(		 1ULL	<<  7 )
855
+#define BGX_SPU_AN_STATUS_PAGE_RX		(		 1ULL	<<  6 )
856
+#define BGX_SPU_AN_STATUS_AN_COMPLETE		(		 1ULL	<<  5 )
857
+#define BGX_SPU_AN_STATUS_LINK_STATUS		(		 1ULL	<<  2 )
858
+#define BGX_SPU_AN_STATUS_LP_AN_ABLE		(		 1ULL	<<  0 )
859
+
860
+/** SPU interrupt */
861
+#define BGX_SPU_INT			0x010220
862
+#define BGX_SPU_INT_TRAINING_FAIL		(		 1ULL	<< 14 )
863
+#define BGX_SPU_INT_TRAINING_DONE		(		 1ULL	<< 13 )
864
+#define BGX_SPU_INT_AN_COMPLETE			(		 1ULL	<< 12 )
865
+#define BGX_SPU_INT_AN_LINK_GOOD		(		 1ULL	<< 11 )
866
+#define BGX_SPU_INT_AN_PAGE_RX			(		 1ULL	<< 10 )
867
+#define BGX_SPU_INT_FEC_UNCORR			(		 1ULL	<<  9 )
868
+#define BGX_SPU_INT_FEC_CORR			(		 1ULL	<<  8 )
869
+#define BGX_SPU_INT_BIP_ERR			(		 1ULL	<<  7 )
870
+#define BGX_SPU_INT_DBG_SYNC			(		 1ULL	<<  6 )
871
+#define BGX_SPU_INT_ALGNLOS			(		 1ULL	<<  5 )
872
+#define BGX_SPU_INT_SYNLOS			(		 1ULL	<<  4 )
873
+#define BGX_SPU_INT_BITLCKLS			(		 1ULL	<<  3 )
874
+#define BGX_SPU_INT_ERR_BLK			(		 1ULL	<<  2 )
875
+#define BGX_SPU_INT_RX_LINK_DOWN		(		 1ULL	<<  1 )
876
+#define BGX_SPU_INT_RX_LINK_UP			(		 1ULL	<<  0 )
877
+
878
+/** LMAC types */
879
+enum txnic_lmac_types {
880
+	TXNIC_LMAC_SGMII	= 0x0,		/**< SGMII/1000BASE-X */
881
+	TXNIC_LMAC_XAUI		= 0x1,		/**< 10GBASE-X/XAUI or DXAUI */
882
+	TXNIC_LMAC_RXAUI	= 0x2,		/**< Reduced XAUI */
883
+	TXNIC_LMAC_10G_R	= 0x3,		/**< 10GBASE-R */
884
+	TXNIC_LMAC_40G_R	= 0x4,		/**< 40GBASE-R */
885
+};
886
+
887
+/** An LMAC type */
888
+struct txnic_lmac_type {
889
+	/** Name */
890
+	const char *name;
891
+	/** Number of LMACs */
892
+	uint8_t count;
893
+	/** Lane-to-SDS mapping */
894
+	uint32_t lane_to_sds;
895
+};
896
+
897
+/** An LMAC address */
898
+union txnic_lmac_address {
899
+	struct {
900
+		uint8_t pad[2];
901
+		uint8_t raw[ETH_ALEN];
902
+	} __attribute__ (( packed ));
903
+	uint64_t be64;
904
+};
905
+
906
+/** A Logical MAC (LMAC) */
907
+struct txnic_lmac {
908
+	/** Registers */
909
+	void *regs;
910
+	/** Containing BGX Ethernet interface */
911
+	struct txnic_bgx *bgx;
912
+	/** Virtual NIC index */
913
+	unsigned int idx;
914
+
915
+	/** MAC address */
916
+	union txnic_lmac_address mac;
917
+
918
+	/** Virtual NIC (if applicable) */
919
+	struct txnic *vnic;
920
+};
921
+
922
+/** A BGX Ethernet interface */
923
+struct txnic_bgx {
924
+	/** Registers */
925
+	void *regs;
926
+	/** PCI device */
927
+	struct pci_device *pci;
928
+	/** Node ID */
929
+	unsigned int node;
930
+	/** BGX index */
931
+	unsigned int idx;
932
+
933
+	/** LMAC type */
934
+	struct txnic_lmac_type *type;
935
+	/** Number of LMACs */
936
+	unsigned int count;
937
+	/** Link training is in use */
938
+	int training;
939
+
940
+	/** List of BGX Ethernet interfaces */
941
+	struct list_head list;
942
+	/** Physical function (if known) */
943
+	struct txnic_pf *pf;
944
+
945
+	/** Logical MACs */
946
+	struct txnic_lmac lmac[TXNIC_NUM_LMAC];
947
+};
948
+
949
+#endif /* _THUNDERX_H */

+ 1
- 0
src/include/ipxe/errfile.h View File

@@ -191,6 +191,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
191 191
 #define ERRFILE_virtio_pci	     ( ERRFILE_DRIVER | 0x007f0000 )
192 192
 #define ERRFILE_pciea		     ( ERRFILE_DRIVER | 0x00c00000 )
193 193
 #define ERRFILE_axge		     ( ERRFILE_DRIVER | 0x00c10000 )
194
+#define ERRFILE_thunderx	     ( ERRFILE_DRIVER | 0x00c20000 )
194 195
 
195 196
 #define ERRFILE_aoe			( ERRFILE_NET | 0x00000000 )
196 197
 #define ERRFILE_arp			( ERRFILE_NET | 0x00010000 )

Loading…
Cancel
Save