• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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