1 /********************************************************************************
2 Copyright (C) 2016 Marvell International Ltd.
3
4 Marvell BSD License Option
5
6 If you received this File from Marvell, you may opt to use, redistribute and/or
7 modify this File under the following licensing terms.
8 Redistribution and use in source and binary forms, with or without modification,
9 are permitted provided that the following conditions are met:
10
11 * Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13
14 * Redistributions in binary form must reproduce the above copyright
15 notice, this list of conditions and the following disclaimer in the
16 documentation and/or other materials provided with the distribution.
17
18 * Neither the name of Marvell nor the names of its contributors may be
19 used to endorse or promote products derived from this software without
20 specific prior written permission.
21
22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
23 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
26 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
29 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
33 *******************************************************************************/
34
35 #ifndef __MVPP2_LIB_H__
36 #define __MVPP2_LIB_H__
37
38 #include "Mvpp2LibHw.h"
39 #include "Pp2Dxe.h"
40
41 /* number of RXQs used by single Port */
42 STATIC INT32 RxqNumber = 1;
43 /* number of TXQs used by single Port */
44 STATIC INT32 TxqNumber = 1;
45
46 VOID
47 Mvpp2PrsMacPromiscSet (
48 IN MVPP2_SHARED *Priv,
49 IN INT32 PortId,
50 IN BOOLEAN Add
51 );
52
53 VOID
54 Mvpp2PrsMacMultiSet (
55 IN MVPP2_SHARED *Priv,
56 IN INT32 PortId,
57 IN INT32 Index,
58 IN BOOLEAN Add
59 );
60
61 INT32
62 Mvpp2PrsDefaultInit (
63 IN MVPP2_SHARED *Priv
64 );
65
66 INT32
67 Mvpp2PrsMacDaAccept (
68 IN MVPP2_SHARED *Priv,
69 IN INT32 PortId,
70 IN const UINT8 *Da,
71 IN BOOLEAN Add
72 );
73
74 VOID
75 Mvpp2PrsMcastDelAll (
76 IN MVPP2_SHARED *Priv,
77 IN INT32 PortId
78 );
79
80 INT32
81 Mvpp2PrsTagModeSet (
82 IN MVPP2_SHARED *Priv,
83 IN INT32 PortId,
84 IN INT32 type
85 );
86
87 INT32
88 Mvpp2PrsDefFlow (
89 IN PP2DXE_PORT *Port
90 );
91
92 VOID
93 Mvpp2ClsInit (
94 IN MVPP2_SHARED *Priv
95 );
96
97 VOID
98 Mvpp2ClsPortConfig (
99 IN PP2DXE_PORT *Port
100 );
101
102 VOID
103 Mvpp2ClsOversizeRxqSet (
104 IN PP2DXE_PORT *Port
105 );
106
107 VOID
108 Mvpp2BmPoolHwCreate (
109 IN MVPP2_SHARED *Priv,
110 IN MVPP2_BMS_POOL *BmPool,
111 IN INT32 Size
112 );
113
114 VOID
115 Mvpp2BmPoolBufsizeSet (
116 IN MVPP2_SHARED *Priv,
117 IN MVPP2_BMS_POOL *BmPool,
118 IN INT32 BufSize
119 );
120
121 VOID
122 Mvpp2BmStop (
123 IN MVPP2_SHARED *Priv,
124 IN INT32 Pool
125 );
126
127 VOID
128 Mvpp2BmIrqClear (
129 IN MVPP2_SHARED *Priv,
130 IN INT32 Pool
131 );
132
133 VOID
134 Mvpp2RxqLongPoolSet (
135 IN PP2DXE_PORT *Port,
136 IN INT32 Lrxq,
137 IN INT32 LongPool
138 );
139
140 VOID
141 Mvpp2RxqShortPoolSet (
142 IN PP2DXE_PORT *Port,
143 IN INT32 Lrxq,
144 IN INT32 ShortPool
145 );
146
147 VOID
148 Mvpp2BmPoolMcPut (
149 IN PP2DXE_PORT *Port,
150 IN INT32 Pool,
151 IN UINT32 BufPhysAddr,
152 IN UINT32 BufVirtAddr,
153 IN INT32 McId
154 );
155
156 VOID
157 Mvpp2PoolRefill (
158 IN PP2DXE_PORT *Port,
159 IN UINT32 Bm,
160 IN UINT32 PhysAddr,
161 IN UINT32 Cookie
162 );
163
164 INTN
165 Mvpp2BmPoolCtrl (
166 IN MVPP2_SHARED *Priv,
167 IN INTN Pool,
168 IN enum Mvpp2Command cmd
169 );
170
171 VOID
172 Mvpp2InterruptsMask (
173 IN VOID *arg
174 );
175
176 VOID
177 Mvpp2InterruptsUnmask (
178 IN VOID *arg
179 );
180
181 VOID
182 Mvpp2PortEnable (
183 IN PP2DXE_PORT *Port
184 );
185
186 VOID
187 Mvpp2PortDisable (
188 IN PP2DXE_PORT *Port
189 );
190
191 VOID
192 Mvpp2DefaultsSet (
193 IN PP2DXE_PORT *Port
194 );
195
196 VOID
197 Mvpp2IngressEnable (
198 IN PP2DXE_PORT *Port
199 );
200
201 VOID
202 Mvpp2IngressDisable (
203 IN PP2DXE_PORT *Port
204 );
205
206 VOID
207 Mvpp2EgressEnable (
208 IN PP2DXE_PORT *Port
209 );
210
211 VOID
212 Mvpp2EgressDisable (
213 IN PP2DXE_PORT *Port
214 );
215
216 UINT32
217 Mvpp2BmCookieBuild (
218 IN MVPP2_RX_DESC *RxDesc,
219 IN INT32 Cpu
220 );
221
222 INT32
223 Mvpp2TxqDrainSet (
224 IN PP2DXE_PORT *Port,
225 IN INT32 Txq,
226 IN BOOLEAN En
227 );
228
229 INT32
230 Mvpp2TxqPendDescNumGet (
231 IN PP2DXE_PORT *Port,
232 IN MVPP2_TX_QUEUE *Txq
233 );
234
235 UINT32
236 Mvpp2AggrTxqPendDescNumGet (
237 IN MVPP2_SHARED *Priv,
238 IN INT32 Cpu
239 );
240
241 MVPP2_TX_DESC *
242 Mvpp2TxqNextDescGet (
243 MVPP2_TX_QUEUE *Txq
244 );
245
246 VOID
247 Mvpp2AggrTxqPendDescAdd (
248 IN PP2DXE_PORT *Port,
249 IN INT32 Pending
250 );
251
252 INT32
253 Mvpp2AggrDescNumCheck (
254 IN MVPP2_SHARED *Priv,
255 IN MVPP2_TX_QUEUE *AggrTxq,
256 IN INT32 Num,
257 IN INT32 Cpu
258 );
259
260 INT32
261 Mvpp2TxqAllocReservedDesc (
262 IN MVPP2_SHARED *Priv,
263 IN MVPP2_TX_QUEUE *Txq,
264 IN INT32 Num
265 );
266
267 VOID
268 Mvpp2TxqDescPut (
269 IN MVPP2_TX_QUEUE *Txq
270 );
271
272 UINT32
273 Mvpp2TxqDescCsum (
274 IN INT32 L3Offs,
275 IN INT32 L3Proto,
276 IN INT32 IpHdrLen,
277 IN INT32 L4Proto
278 );
279
280 VOID
281 Mvpp2TxqSentCounterClear (
282 IN OUT VOID *arg
283 );
284
285 VOID
286 Mvpp2GmacMaxRxSizeSet (
287 IN PP2DXE_PORT *Port
288 );
289
290 VOID
291 Mvpp2TxpMaxTxSizeSet (
292 IN PP2DXE_PORT *Port
293 );
294
295 VOID
296 Mvpp2RxPktsCoalSet (
297 IN PP2DXE_PORT *Port,
298 IN OUT MVPP2_RX_QUEUE *Rxq,
299 IN UINT32 Pkts
300 );
301
302 VOID
303 Mvpp2RxTimeCoalSet (
304 IN PP2DXE_PORT *Port,
305 IN OUT MVPP2_RX_QUEUE *Rxq,
306 IN UINT32 Usec
307 );
308
309 VOID
310 Mvpp2AggrTxqHwInit (
311 IN OUT MVPP2_TX_QUEUE *AggrTxq,
312 IN INT32 DescNum,
313 IN INT32 Cpu,
314 IN MVPP2_SHARED *Priv
315 );
316
317 VOID
318 Mvpp2RxqHwInit (
319 IN PP2DXE_PORT *Port,
320 IN OUT MVPP2_RX_QUEUE *Rxq
321 );
322
323 VOID
324 Mvpp2RxqDropPkts (
325 IN PP2DXE_PORT *Port,
326 IN OUT MVPP2_RX_QUEUE *Rxq,
327 IN INT32 Cpu
328 );
329
330 VOID
331 Mvpp2TxqHwInit (
332 IN PP2DXE_PORT *Port,
333 IN OUT MVPP2_TX_QUEUE *Txq
334 );
335
336 VOID
337 Mvpp2TxqHwDeinit (
338 IN PP2DXE_PORT *Port,
339 IN OUT MVPP2_TX_QUEUE *Txq
340 );
341
342 VOID
343 Mvpp2PortPowerUp (
344 IN PP2DXE_PORT *Port
345 );
346
347 VOID
348 Mvpp2RxFifoInit (
349 IN MVPP2_SHARED *Priv
350 );
351
352 VOID
353 Mvpp2RxqHwDeinit (
354 IN PP2DXE_PORT *Port,
355 IN OUT MVPP2_RX_QUEUE *Rxq
356 );
357
358 INT32
359 MvGop110NetcInit (
360 IN PP2DXE_PORT *Port,
361 IN UINT32 NetCompConfig,
362 IN enum MvNetcPhase phase
363 );
364
365 UINT32
366 MvpPp2xGop110NetcCfgCreate (
367 IN PP2DXE_PORT *Port
368 );
369
370 INT32
371 MvGop110PortInit (
372 IN PP2DXE_PORT *Port
373 );
374
375 INT32
376 MvGop110GmacReset (
377 IN PP2DXE_PORT *Port,
378 IN enum MvReset ResetCmd
379 );
380
381 INT32
382 MvGop110GpcsModeCfg (
383 IN PP2DXE_PORT *Port,
384 BOOLEAN En
385 );
386
387 INT32
388 MvGop110BypassClkCfg (
389 IN PP2DXE_PORT *Port,
390 IN BOOLEAN En
391 );
392
393 INT32
394 MvGop110GpcsReset (
395 IN PP2DXE_PORT *Port,
396 IN enum MvReset ResetCmd
397 );
398
399 VOID
400 MvGop110Xlg2GigMacCfg (
401 IN PP2DXE_PORT *Port
402 );
403
404 INT32
405 MvGop110GmacModeCfg (
406 IN PP2DXE_PORT *Port
407 );
408
409 VOID
410 MvGop110GmacRgmiiCfg (
411 IN PP2DXE_PORT *Port
412 );
413
414 VOID
415 MvGop110GmacSgmii25Cfg (
416 IN PP2DXE_PORT *Port
417 );
418
419 VOID
420 MvGop110GmacSgmiiCfg (
421 IN PP2DXE_PORT *Port
422 );
423
424 VOID
425 MvGop110GmacQsgmiiCfg (
426 IN PP2DXE_PORT *Port
427 );
428
429 INT32
430 Mvpp2SmiPhyAddrCfg (
431 IN PP2DXE_PORT *Port,
432 IN INT32 PortId,
433 IN INT32 Addr
434 );
435
436 BOOLEAN
437 MvGop110PortIsLinkUp (
438 IN PP2DXE_PORT *Port
439 );
440
441 BOOLEAN
442 MvGop110GmacLinkStatusGet (
443 IN PP2DXE_PORT *Port
444 );
445
446 VOID
447 MvGop110PortDisable (
448 IN PP2DXE_PORT *Port
449 );
450
451 VOID
452 MvGop110PortEnable (
453 IN PP2DXE_PORT *Port
454 );
455
456 VOID
457 MvGop110GmacPortEnable (
458 IN PP2DXE_PORT *Port
459 );
460
461 VOID
462 MvGop110GmacPortDisable (
463 IN PP2DXE_PORT *Port
464 );
465
466 VOID
467 MvGop110GmacPortLinkEventMask (
468 IN PP2DXE_PORT *Port
469 );
470
471 INT32
472 MvGop110PortEventsMask (
473 IN PP2DXE_PORT *Port
474 );
475
476 INT32
477 MvGop110FlCfg (
478 IN PP2DXE_PORT *Port
479 );
480
481 INT32
482 MvGop110SpeedDuplexSet (
483 IN PP2DXE_PORT *Port,
484 IN INT32 Speed,
485 IN enum MvPortDuplex Duplex
486 );
487
488 INT32
489 MvGop110GmacSpeedDuplexSet (
490 IN PP2DXE_PORT *Port,
491 IN INT32 Speed,
492 IN enum MvPortDuplex Duplex
493 );
494
495 VOID
496 Mvpp2AxiConfig (
497 IN MVPP2_SHARED *Priv
498 );
499
500 VOID
501 Mvpp2TxpClean (
502 IN PP2DXE_PORT *Port,
503 IN INT32 Txp,
504 IN MVPP2_TX_QUEUE *Txq
505 );
506
507 VOID
508 Mvpp2CleanupTxqs (
509 IN PP2DXE_PORT *Port
510 );
511
512 VOID
513 Mvpp2CleanupRxqs (
514 IN PP2DXE_PORT *Port
515 );
516
517 /* Get number of physical egress Port */
518 STATIC
519 inline
520 INT32
Mvpp2EgressPort(IN PP2DXE_PORT * Port)521 Mvpp2EgressPort (
522 IN PP2DXE_PORT *Port
523 )
524 {
525 return MVPP2_MAX_TCONT + Port->Id;
526 }
527
528 /* Get number of physical TXQ */
529 STATIC
530 inline
531 INT32
Mvpp2TxqPhys(IN INT32 PortId,IN INT32 Txq)532 Mvpp2TxqPhys (
533 IN INT32 PortId,
534 IN INT32 Txq
535 )
536 {
537 return (MVPP2_MAX_TCONT + PortId) * MVPP2_MAX_TXQ + Txq;
538 }
539
540 /* Set Pool number in a BM Cookie */
541 STATIC
542 inline
543 UINT32
Mvpp2BmCookiePoolSet(IN UINT32 Cookie,IN INT32 Pool)544 Mvpp2BmCookiePoolSet (
545 IN UINT32 Cookie,
546 IN INT32 Pool
547 )
548 {
549 UINT32 Bm;
550
551 Bm = Cookie & ~(0xFF << MVPP2_BM_COOKIE_POOL_OFFS);
552 Bm |= ((Pool & 0xFF) << MVPP2_BM_COOKIE_POOL_OFFS);
553
554 return Bm;
555 }
556
557 /* Get Pool number from a BM Cookie */
558 STATIC
559 inline
560 INT32
Mvpp2BmCookiePoolGet(IN UINT32 Cookie)561 Mvpp2BmCookiePoolGet (
562 IN UINT32 Cookie
563 )
564 {
565 return (Cookie >> MVPP2_BM_COOKIE_POOL_OFFS) & 0xFF;
566 }
567
568 /* Release buffer to BM */
569 STATIC
570 inline
571 VOID
Mvpp2BmPoolPut(IN MVPP2_SHARED * Priv,IN INT32 Pool,IN UINT64 BufPhysAddr,IN UINT64 BufVirtAddr)572 Mvpp2BmPoolPut (
573 IN MVPP2_SHARED *Priv,
574 IN INT32 Pool,
575 IN UINT64 BufPhysAddr,
576 IN UINT64 BufVirtAddr
577 )
578 {
579 UINT32 Val = 0;
580
581 Val = (Upper32Bits(BufVirtAddr) & MVPP22_ADDR_HIGH_MASK) << MVPP22_BM_VIRT_HIGH_RLS_OFFST;
582 Val |= (Upper32Bits(BufPhysAddr) & MVPP22_ADDR_HIGH_MASK) << MVPP22_BM_PHY_HIGH_RLS_OFFSET;
583 Mvpp2Write(Priv, MVPP22_BM_PHY_VIRT_HIGH_RLS_REG, Val);
584 Mvpp2Write(Priv, MVPP2_BM_VIRT_RLS_REG, (UINT32)BufVirtAddr);
585 Mvpp2Write(Priv, MVPP2_BM_PHY_RLS_REG(Pool), (UINT32)BufPhysAddr);
586 }
587
588 STATIC
589 inline
590 VOID
Mvpp2InterruptsEnable(IN PP2DXE_PORT * Port,IN INT32 CpuMask)591 Mvpp2InterruptsEnable (
592 IN PP2DXE_PORT *Port,
593 IN INT32 CpuMask
594 )
595 {
596 Mvpp2Write(Port->Priv, MVPP2_ISR_ENABLE_REG(Port->Id), MVPP2_ISR_ENABLE_INTERRUPT(CpuMask));
597 }
598
599 STATIC
600 inline
601 VOID
Mvpp2InterruptsDisable(IN PP2DXE_PORT * Port,IN INT32 CpuMask)602 Mvpp2InterruptsDisable (
603 IN PP2DXE_PORT *Port,
604 IN INT32 CpuMask
605 )
606 {
607 Mvpp2Write(Port->Priv, MVPP2_ISR_ENABLE_REG(Port->Id), MVPP2_ISR_DISABLE_INTERRUPT(CpuMask));
608 }
609
610 /* Get number of Rx descriptors occupied by received packets */
611 STATIC
612 inline
613 INT32
Mvpp2RxqReceived(IN PP2DXE_PORT * Port,IN INT32 RxqId)614 Mvpp2RxqReceived (
615 IN PP2DXE_PORT *Port,
616 IN INT32 RxqId
617 )
618 {
619 UINT32 Val = Mvpp2Read(Port->Priv, MVPP2_RXQ_STATUS_REG(RxqId));
620
621 return Val & MVPP2_RXQ_OCCUPIED_MASK;
622 }
623
624 /*
625 * Update Rx Queue status with the number of occupied and available
626 * Rx descriptor slots.
627 */
628 STATIC
629 inline
630 VOID
Mvpp2RxqStatusUpdate(IN PP2DXE_PORT * Port,IN INT32 RxqId,IN INT32 UsedCount,IN INT32 FreeCount)631 Mvpp2RxqStatusUpdate (
632 IN PP2DXE_PORT *Port,
633 IN INT32 RxqId,
634 IN INT32 UsedCount,
635 IN INT32 FreeCount
636 )
637 {
638 /*
639 * Decrement the number of used descriptors and increment count
640 * increment the number of free descriptors.
641 */
642 UINT32 Val = UsedCount | (FreeCount << MVPP2_RXQ_NUM_NEW_OFFSET);
643
644 Mvpp2Write(Port->Priv, MVPP2_RXQ_STATUS_UPDATE_REG(RxqId), Val);
645 }
646
647 /* Get pointer to next RX descriptor to be processed by SW */
648 STATIC
649 inline
650 MVPP2_RX_DESC *
Mvpp2RxqNextDescGet(IN MVPP2_RX_QUEUE * Rxq)651 Mvpp2RxqNextDescGet (
652 IN MVPP2_RX_QUEUE *Rxq
653 )
654 {
655 INT32 RxDesc = Rxq->NextDescToProc;
656
657 Rxq->NextDescToProc = MVPP2_QUEUE_NEXT_DESC(Rxq, RxDesc);
658 Mvpp2Prefetch(Rxq->Descs + Rxq->NextDescToProc);
659 return Rxq->Descs + RxDesc;
660 }
661
662 /*
663 * Get number of sent descriptors and decrement counter.
664 * The number of sent descriptors is returned.
665 * Per-CPU access
666 */
667 STATIC
668 inline
669 INT32
Mvpp2TxqSentDescProc(IN PP2DXE_PORT * Port,IN MVPP2_TX_QUEUE * Txq)670 Mvpp2TxqSentDescProc (
671 IN PP2DXE_PORT *Port,
672 IN MVPP2_TX_QUEUE *Txq
673 )
674 {
675 UINT32 Val;
676
677 /* Reading status reg resets transmitted descriptor counter */
678 #ifdef MVPP2V1
679 Val = Mvpp2Read(Port->Priv, MVPP2_TXQ_SENT_REG(Txq->Id));
680 #else
681 Val = Mvpp2Read(Port->Priv, MVPP22_TXQ_SENT_REG(Txq->Id));
682 #endif
683
684 return (Val & MVPP2_TRANSMITTED_COUNT_MASK) >> MVPP2_TRANSMITTED_COUNT_OFFSET;
685 }
686
687 STATIC
688 inline
689 MVPP2_RX_QUEUE *
Mvpp2GetRxQueue(IN PP2DXE_PORT * Port,IN UINT32 Cause)690 Mvpp2GetRxQueue (
691 IN PP2DXE_PORT *Port,
692 IN UINT32 Cause
693 )
694 {
695 INT32 Queue = Mvpp2Fls(Cause) - 1;
696
697 return &Port->Rxqs[Queue];
698 }
699
700 STATIC
701 inline
702 MVPP2_TX_QUEUE *
Mvpp2GetTxQueue(IN PP2DXE_PORT * Port,IN UINT32 Cause)703 Mvpp2GetTxQueue (
704 IN PP2DXE_PORT *Port,
705 IN UINT32 Cause
706 )
707 {
708 INT32 Queue = Mvpp2Fls(Cause) - 1;
709
710 return &Port->Txqs[Queue];
711 }
712
713 STATIC
714 inline
715 void
Mvpp2x2TxdescPhysAddrSet(IN DmaAddrT PhysAddr,IN MVPP2_TX_DESC * TxDesc)716 Mvpp2x2TxdescPhysAddrSet (
717 IN DmaAddrT PhysAddr,
718 IN MVPP2_TX_DESC *TxDesc
719 )
720 {
721 UINT64 *BufPhysAddrP = &TxDesc->BufPhysAddrHwCmd2;
722
723 *BufPhysAddrP &= ~(MVPP22_ADDR_MASK);
724 *BufPhysAddrP |= PhysAddr & MVPP22_ADDR_MASK;
725 }
726 #endif /* __MVPP2_LIB_H__ */
727