1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
|
/*-
* This file is provided under a dual BSD/GPLv2 license. When using or
* redistributing this file, you may do so under either license.
*
* BSD LICENSE
*
* Copyright 2010-2012 Freescale Semiconductor, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the above-listed copyright holders nor the
* names of any contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* GPL LICENSE SUMMARY
*
* ALTERNATIVELY, this software may be distributed under the terms of the
* GNU General Public License ("GPL") as published by the Free Software
* Foundation, either version 2 of that License or (at your option) any
* later version.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __FMAN_H
#define __FMAN_H
#include <stdbool.h>
#include <net/if.h>
#include <rte_ethdev.h>
#include <rte_ether.h>
#include <compat.h>
#ifndef FMAN_DEVICE_PATH
#define FMAN_DEVICE_PATH "/dev/mem"
#endif
#define MEMAC_NUM_OF_PADDRS 7 /* Num of additional exact match MAC adr regs */
/* Control and Configuration Register (COMMAND_CONFIG) for MEMAC */
#define CMD_CFG_LOOPBACK_EN 0x00000400
/**< 21 XGMII/GMII loopback enable */
#define CMD_CFG_PROMIS_EN 0x00000010
/**< 27 Promiscuous operation enable */
#define CMD_CFG_PAUSE_IGNORE 0x00000100
/**< 23 Ignore Pause frame quanta */
/* Statistics Configuration Register (STATN_CONFIG) */
#define STATS_CFG_CLR 0x00000004
/**< 29 Reset all counters */
#define STATS_CFG_CLR_ON_RD 0x00000002
/**< 30 Clear on read */
#define STATS_CFG_SATURATE 0x00000001
/**< 31 Saturate at the maximum val */
/**< Max receive frame length mask */
#define MAXFRM_SIZE_MEMAC 0x00007fe0
#define MAXFRM_RX_MASK 0x0000ffff
/**< Interface Mode Register Register for MEMAC */
#define IF_MODE_RLP 0x00000820
/**< Pool Limits */
#define FMAN_PORT_MAX_EXT_POOLS_NUM 8
#define FMAN_PORT_OBS_EXT_POOLS_NUM 2
#define FMAN_PORT_CG_MAP_NUM 8
#define FMAN_PORT_PRS_RESULT_WORDS_NUM 8
#define FMAN_PORT_BMI_FIFO_UNITS 0x100
#define FMAN_PORT_IC_OFFSET_UNITS 0x10
#define FMAN_ENABLE_BPOOL_DEPLETION 0xF00000F0
#define HASH_CTRL_MCAST_EN 0x00000100
#define GROUP_ADDRESS 0x0000010000000000LL
#define HASH_CTRL_ADDR_MASK 0x0000003F
/* Pre definitions of FMAN interface and Bpool structures */
struct __fman_if;
struct fman_if_bpool;
/* Lists of fman interfaces and bpools */
TAILQ_HEAD(rte_fman_if_list, __fman_if);
/* Represents the different flavour of network interface */
enum fman_mac_type {
fman_offline = 0,
fman_mac_1g,
fman_mac_10g,
};
struct mac_addr {
uint32_t mac_addr_l; /**< Lower 32 bits of 48-bit MAC address */
uint32_t mac_addr_u; /**< Upper 16 bits of 48-bit MAC address */
};
struct memac_regs {
/* General Control and Status */
uint32_t res0000[2];
uint32_t command_config; /**< 0x008 Ctrl and cfg */
struct mac_addr mac_addr0; /**< 0x00C-0x010 MAC_ADDR_0...1 */
uint32_t maxfrm; /**< 0x014 Max frame length */
uint32_t res0018[5];
uint32_t hashtable_ctrl; /**< 0x02C Hash table control */
uint32_t res0030[4];
uint32_t ievent; /**< 0x040 Interrupt event */
uint32_t tx_ipg_length;
/**< 0x044 Transmitter inter-packet-gap */
uint32_t res0048;
uint32_t imask; /**< 0x04C Interrupt mask */
uint32_t res0050;
uint32_t pause_quanta[4]; /**< 0x054 Pause quanta */
uint32_t pause_thresh[4]; /**< 0x064 Pause quanta threshold */
uint32_t rx_pause_status; /**< 0x074 Receive pause status */
uint32_t res0078[2];
struct mac_addr mac_addr[MEMAC_NUM_OF_PADDRS];
/**< 0x80-0x0B4 mac padr */
uint32_t lpwake_timer;
/**< 0x0B8 Low Power Wakeup Timer */
uint32_t sleep_timer;
/**< 0x0BC Transmit EEE Low Power Timer */
uint32_t res00c0[8];
uint32_t statn_config;
/**< 0x0E0 Statistics configuration */
uint32_t res00e4[7];
/* Rx Statistics Counter */
uint32_t reoct_l; /**<Rx Eth Octets Counter */
uint32_t reoct_u;
uint32_t roct_l; /**<Rx Octet Counters */
uint32_t roct_u;
uint32_t raln_l; /**<Rx Alignment Error Counter */
uint32_t raln_u;
uint32_t rxpf_l; /**<Rx valid Pause Frame */
uint32_t rxpf_u;
uint32_t rfrm_l; /**<Rx Frame counter */
uint32_t rfrm_u;
uint32_t rfcs_l; /**<Rx frame check seq error */
uint32_t rfcs_u;
uint32_t rvlan_l; /**<Rx Vlan Frame Counter */
uint32_t rvlan_u;
uint32_t rerr_l; /**<Rx Frame error */
uint32_t rerr_u;
uint32_t ruca_l; /**<Rx Unicast */
uint32_t ruca_u;
uint32_t rmca_l; /**<Rx Multicast */
uint32_t rmca_u;
uint32_t rbca_l; /**<Rx Broadcast */
uint32_t rbca_u;
uint32_t rdrp_l; /**<Rx Dropper Packet */
uint32_t rdrp_u;
uint32_t rpkt_l; /**<Rx packet */
uint32_t rpkt_u;
uint32_t rund_l; /**<Rx undersized packets */
uint32_t rund_u;
uint32_t r64_l; /**<Rx 64 byte */
uint32_t r64_u;
uint32_t r127_l;
uint32_t r127_u;
uint32_t r255_l;
uint32_t r255_u;
uint32_t r511_l;
uint32_t r511_u;
uint32_t r1023_l;
uint32_t r1023_u;
uint32_t r1518_l;
uint32_t r1518_u;
uint32_t r1519x_l;
uint32_t r1519x_u;
uint32_t rovr_l; /**<Rx oversized but good */
uint32_t rovr_u;
uint32_t rjbr_l; /**<Rx oversized with bad csum */
uint32_t rjbr_u;
uint32_t rfrg_l; /**<Rx fragment Packet */
uint32_t rfrg_u;
uint32_t rcnp_l; /**<Rx control packets (0x8808 */
uint32_t rcnp_u;
uint32_t rdrntp_l; /**<Rx dropped due to FIFO overflow */
uint32_t rdrntp_u;
uint32_t res01d0[12];
/* Tx Statistics Counter */
uint32_t teoct_l; /**<Tx eth octets */
uint32_t teoct_u;
uint32_t toct_l; /**<Tx Octets */
uint32_t toct_u;
uint32_t res0210[2];
uint32_t txpf_l; /**<Tx valid pause frame */
uint32_t txpf_u;
uint32_t tfrm_l; /**<Tx frame counter */
uint32_t tfrm_u;
uint32_t tfcs_l; /**<Tx FCS error */
uint32_t tfcs_u;
uint32_t tvlan_l; /**<Tx Vlan Frame */
uint32_t tvlan_u;
uint32_t terr_l; /**<Tx frame error */
uint32_t terr_u;
uint32_t tuca_l; /**<Tx Unicast */
uint32_t tuca_u;
uint32_t tmca_l; /**<Tx Multicast */
uint32_t tmca_u;
uint32_t tbca_l; /**<Tx Broadcast */
uint32_t tbca_u;
uint32_t res0258[2];
uint32_t tpkt_l; /**<Tx Packet */
uint32_t tpkt_u;
uint32_t tund_l; /**<Tx Undersized */
uint32_t tund_u;
uint32_t t64_l;
uint32_t t64_u;
uint32_t t127_l;
uint32_t t127_u;
uint32_t t255_l;
uint32_t t255_u;
uint32_t t511_l;
uint32_t t511_u;
uint32_t t1023_l;
uint32_t t1023_u;
uint32_t t1518_l;
uint32_t t1518_u;
uint32_t t1519x_l;
uint32_t t1519x_u;
uint32_t res02a8[6];
uint32_t tcnp_l; /**<Tx Control Packet type - 0x8808 */
uint32_t tcnp_u;
uint32_t res02c8[14];
/* Line Interface Control */
uint32_t if_mode; /**< 0x300 Interface Mode Control */
uint32_t if_status; /**< 0x304 Interface Status */
uint32_t res0308[14];
/* HiGig/2 */
uint32_t hg_config; /**< 0x340 Control and cfg */
uint32_t res0344[3];
uint32_t hg_pause_quanta; /**< 0x350 Pause quanta */
uint32_t res0354[3];
uint32_t hg_pause_thresh; /**< 0x360 Pause quanta threshold */
uint32_t res0364[3];
uint32_t hgrx_pause_status; /**< 0x370 Receive pause status */
uint32_t hg_fifos_status; /**< 0x374 fifos status */
uint32_t rhm; /**< 0x378 rx messages counter */
uint32_t thm; /**< 0x37C tx messages counter */
};
struct rx_bmi_regs {
uint32_t fmbm_rcfg; /**< Rx Configuration */
uint32_t fmbm_rst; /**< Rx Status */
uint32_t fmbm_rda; /**< Rx DMA attributes*/
uint32_t fmbm_rfp; /**< Rx FIFO Parameters*/
uint32_t fmbm_rfed; /**< Rx Frame End Data*/
uint32_t fmbm_ricp; /**< Rx Internal Context Parameters*/
uint32_t fmbm_rim; /**< Rx Internal Buffer Margins*/
uint32_t fmbm_rebm; /**< Rx External Buffer Margins*/
uint32_t fmbm_rfne; /**< Rx Frame Next Engine*/
uint32_t fmbm_rfca; /**< Rx Frame Command Attributes.*/
uint32_t fmbm_rfpne; /**< Rx Frame Parser Next Engine*/
uint32_t fmbm_rpso; /**< Rx Parse Start Offset*/
uint32_t fmbm_rpp; /**< Rx Policer Profile */
uint32_t fmbm_rccb; /**< Rx Coarse Classification Base */
uint32_t fmbm_reth; /**< Rx Excessive Threshold */
uint32_t reserved003c[1]; /**< (0x03C 0x03F) */
uint32_t fmbm_rprai[FMAN_PORT_PRS_RESULT_WORDS_NUM];
/**< Rx Parse Results Array Init*/
uint32_t fmbm_rfqid; /**< Rx Frame Queue ID*/
uint32_t fmbm_refqid; /**< Rx Error Frame Queue ID*/
uint32_t fmbm_rfsdm; /**< Rx Frame Status Discard Mask*/
uint32_t fmbm_rfsem; /**< Rx Frame Status Error Mask*/
uint32_t fmbm_rfene; /**< Rx Frame Enqueue Next Engine */
uint32_t reserved0074[0x2]; /**< (0x074-0x07C) */
uint32_t fmbm_rcmne;
/**< Rx Frame Continuous Mode Next Engine */
uint32_t reserved0080[0x20];/**< (0x080 0x0FF) */
uint32_t fmbm_ebmpi[FMAN_PORT_MAX_EXT_POOLS_NUM];
/**< Buffer Manager pool Information-*/
uint32_t fmbm_acnt[FMAN_PORT_MAX_EXT_POOLS_NUM];
/**< Allocate Counter-*/
uint32_t reserved0130[8];
/**< 0x130/0x140 - 0x15F reserved -*/
uint32_t fmbm_rcgm[FMAN_PORT_CG_MAP_NUM];
/**< Congestion Group Map*/
uint32_t fmbm_mpd; /**< BM Pool Depletion */
uint32_t reserved0184[0x1F]; /**< (0x184 0x1FF) */
uint32_t fmbm_rstc; /**< Rx Statistics Counters*/
uint32_t fmbm_rfrc; /**< Rx Frame Counter*/
uint32_t fmbm_rfbc; /**< Rx Bad Frames Counter*/
uint32_t fmbm_rlfc; /**< Rx Large Frames Counter*/
uint32_t fmbm_rffc; /**< Rx Filter Frames Counter*/
uint32_t fmbm_rfdc; /**< Rx Frame Discard Counter*/
uint32_t fmbm_rfldec; /**< Rx Frames List DMA Error Counter*/
uint32_t fmbm_rodc; /**< Rx Out of Buffers Discard nntr*/
uint32_t fmbm_rbdc; /**< Rx Buffers Deallocate Counter*/
uint32_t reserved0224[0x17]; /**< (0x224 0x27F) */
uint32_t fmbm_rpc; /**< Rx Performance Counters*/
uint32_t fmbm_rpcp; /**< Rx Performance Count Parameters*/
uint32_t fmbm_rccn; /**< Rx Cycle Counter*/
uint32_t fmbm_rtuc; /**< Rx Tasks Utilization Counter*/
uint32_t fmbm_rrquc;
/**< Rx Receive Queue Utilization cntr*/
uint32_t fmbm_rduc; /**< Rx DMA Utilization Counter*/
uint32_t fmbm_rfuc; /**< Rx FIFO Utilization Counter*/
uint32_t fmbm_rpac; /**< Rx Pause Activation Counter*/
uint32_t reserved02a0[0x18]; /**< (0x2A0 0x2FF) */
uint32_t fmbm_rdbg; /**< Rx Debug-*/
};
struct fman_port_qmi_regs {
uint32_t fmqm_pnc; /**< PortID n Configuration Register */
uint32_t fmqm_pns; /**< PortID n Status Register */
uint32_t fmqm_pnts; /**< PortID n Task Status Register */
uint32_t reserved00c[4]; /**< 0xn00C - 0xn01B */
uint32_t fmqm_pnen; /**< PortID n Enqueue NIA Register */
uint32_t fmqm_pnetfc; /**< PortID n Enq Total Frame Counter */
uint32_t reserved024[2]; /**< 0xn024 - 0x02B */
uint32_t fmqm_pndn; /**< PortID n Dequeue NIA Register */
uint32_t fmqm_pndc; /**< PortID n Dequeue Config Register */
uint32_t fmqm_pndtfc; /**< PortID n Dequeue tot Frame cntr */
uint32_t fmqm_pndfdc; /**< PortID n Dequeue FQID Dflt Cntr */
uint32_t fmqm_pndcc; /**< PortID n Dequeue Confirm Counter */
};
/* This struct exports parameters about an Fman network interface, determined
* from the device-tree.
*/
struct fman_if {
/* Which Fman this interface belongs to */
uint8_t fman_idx;
/* The type/speed of the interface */
enum fman_mac_type mac_type;
/* Boolean, set when mac type is memac */
uint8_t is_memac;
/* Boolean, set when PHY is RGMII */
uint8_t is_rgmii;
/* The index of this MAC (within the Fman it belongs to) */
uint8_t mac_idx;
/* The MAC address */
struct ether_addr mac_addr;
/* The Qman channel to schedule Tx FQs to */
u16 tx_channel_id;
/* The hard-coded FQIDs for this interface. Note: this doesn't cover
* the PCD nor the "Rx default" FQIDs, which are configured via FMC
* and its XML-based configuration.
*/
uint32_t fqid_rx_def;
uint32_t fqid_rx_err;
uint32_t fqid_tx_err;
uint32_t fqid_tx_confirm;
struct list_head bpool_list;
/* The node for linking this interface into "fman_if_list" */
struct list_head node;
};
/* This struct exposes parameters for buffer pools, extracted from the network
* interface settings in the device tree.
*/
struct fman_if_bpool {
uint32_t bpid;
uint64_t count;
uint64_t size;
uint64_t addr;
/* The node for linking this bpool into fman_if::bpool_list */
struct list_head node;
};
/* Internal Context transfer params - FMBM_RICP*/
struct fman_if_ic_params {
/*IC offset in the packet buffer */
uint16_t iceof;
/*IC internal offset */
uint16_t iciof;
/*IC size to copy */
uint16_t icsz;
};
/* The exported "struct fman_if" type contains the subset of fields we want
* exposed. This struct is embedded in a larger "struct __fman_if" which
* contains the extra bits we *don't* want exposed.
*/
struct __fman_if {
struct fman_if __if;
char node_path[PATH_MAX];
uint64_t regs_size;
void *ccsr_map;
void *bmi_map;
void *qmi_map;
struct list_head node;
};
/* And this is the base list node that the interfaces are added to. (See
* fman_if_enable_all_rx() below for an example of its use.)
*/
extern const struct list_head *fman_if_list;
extern int fman_ccsr_map_fd;
/* To iterate the "bpool_list" for an interface. Eg;
* struct fman_if *p = get_ptr_to_some_interface();
* struct fman_if_bpool *bp;
* printf("Interface uses following BPIDs;\n");
* fman_if_for_each_bpool(bp, p) {
* printf(" %d\n", bp->bpid);
* [...]
* }
*/
#define fman_if_for_each_bpool(bp, __if) \
list_for_each_entry(bp, &(__if)->bpool_list, node)
#define FMAN_ERR(rc, fmt, args...) \
do { \
_errno = (rc); \
DPAA_BUS_LOG(ERR, fmt "(%d)", ##args, errno); \
} while (0)
#define FMAN_IP_REV_1 0xC30C4
#define FMAN_IP_REV_1_MAJOR_MASK 0x0000FF00
#define FMAN_IP_REV_1_MAJOR_SHIFT 8
#define FMAN_V3 0x06
#define FMAN_V3_CONTEXTA_EN_A2V 0x10000000
#define FMAN_V3_CONTEXTA_EN_OVOM 0x02000000
#define FMAN_V3_CONTEXTA_EN_EBD 0x80000000
#define FMAN_CONTEXTA_DIS_CHECKSUM 0x7ull
#define FMAN_CONTEXTA_SET_OPCODE11 0x2000000b00000000
extern u16 fman_ip_rev;
extern u32 fman_dealloc_bufs_mask_hi;
extern u32 fman_dealloc_bufs_mask_lo;
/**
* Initialize the FMAN driver
*
* @args void
* @return
* 0 for success; error OTHERWISE
*/
int fman_init(void);
/**
* Teardown the FMAN driver
*
* @args void
* @return void
*/
void fman_finish(void);
#endif /* __FMAN_H */
|