/******************************************************************************** Copyright (C) 2016 Marvell International Ltd. SPDX-License-Identifier: BSD-2-Clause-Patent *******************************************************************************/ #ifndef __MVPP2_LIB_H__ #define __MVPP2_LIB_H__ #include "Mvpp2LibHw.h" #include "Pp2Dxe.h" /* number of RXQs used by single Port */ STATIC INT32 RxqNumber = 1; /* number of TXQs used by single Port */ STATIC INT32 TxqNumber = 1; VOID Mvpp2PrsMacPromiscSet ( IN MVPP2_SHARED *Priv, IN INT32 PortId, IN BOOLEAN Add ); VOID Mvpp2PrsMacMultiSet ( IN MVPP2_SHARED *Priv, IN INT32 PortId, IN INT32 Index, IN BOOLEAN Add ); INT32 Mvpp2PrsDefaultInit ( IN MVPP2_SHARED *Priv ); INT32 Mvpp2PrsMacDaAccept ( IN MVPP2_SHARED *Priv, IN INT32 PortId, IN const UINT8 *Da, IN BOOLEAN Add ); VOID Mvpp2PrsMcastDelAll ( IN MVPP2_SHARED *Priv, IN INT32 PortId ); INT32 Mvpp2PrsTagModeSet ( IN MVPP2_SHARED *Priv, IN INT32 PortId, IN INT32 type ); INT32 Mvpp2PrsDefFlow ( IN PP2DXE_PORT *Port ); VOID Mvpp2ClsInit ( IN MVPP2_SHARED *Priv ); VOID Mvpp2ClsPortConfig ( IN PP2DXE_PORT *Port ); VOID Mvpp2ClsOversizeRxqSet ( IN PP2DXE_PORT *Port ); VOID Mvpp2BmPoolHwCreate ( IN MVPP2_SHARED *Priv, IN MVPP2_BMS_POOL *BmPool, IN INT32 Size ); VOID Mvpp2BmPoolBufsizeSet ( IN MVPP2_SHARED *Priv, IN MVPP2_BMS_POOL *BmPool, IN INT32 BufSize ); VOID Mvpp2BmStop ( IN MVPP2_SHARED *Priv, IN INT32 Pool ); VOID Mvpp2BmIrqClear ( IN MVPP2_SHARED *Priv, IN INT32 Pool ); VOID Mvpp2RxqLongPoolSet ( IN PP2DXE_PORT *Port, IN INT32 Lrxq, IN INT32 LongPool ); VOID Mvpp2RxqShortPoolSet ( IN PP2DXE_PORT *Port, IN INT32 Lrxq, IN INT32 ShortPool ); VOID Mvpp2BmPoolMcPut ( IN PP2DXE_PORT *Port, IN INT32 Pool, IN UINT32 BufPhysAddr, IN UINT32 BufVirtAddr, IN INT32 McId ); VOID Mvpp2PoolRefill ( IN PP2DXE_PORT *Port, IN UINT32 Bm, IN UINT32 PhysAddr, IN UINT32 Cookie ); INTN Mvpp2BmPoolCtrl ( IN MVPP2_SHARED *Priv, IN INTN Pool, IN enum Mvpp2Command cmd ); VOID Mvpp2InterruptsMask ( IN VOID *arg ); VOID Mvpp2InterruptsUnmask ( IN VOID *arg ); VOID Mvpp2PortEnable ( IN PP2DXE_PORT *Port ); VOID Mvpp2PortDisable ( IN PP2DXE_PORT *Port ); VOID Mvpp2DefaultsSet ( IN PP2DXE_PORT *Port ); VOID Mvpp2IngressEnable ( IN PP2DXE_PORT *Port ); VOID Mvpp2IngressDisable ( IN PP2DXE_PORT *Port ); VOID Mvpp2EgressEnable ( IN PP2DXE_PORT *Port ); VOID Mvpp2EgressDisable ( IN PP2DXE_PORT *Port ); UINT32 Mvpp2BmCookieBuild ( IN MVPP2_RX_DESC *RxDesc, IN INT32 Cpu ); INT32 Mvpp2TxqDrainSet ( IN PP2DXE_PORT *Port, IN INT32 Txq, IN BOOLEAN En ); INT32 Mvpp2TxqPendDescNumGet ( IN PP2DXE_PORT *Port, IN MVPP2_TX_QUEUE *Txq ); UINT32 Mvpp2AggrTxqPendDescNumGet ( IN MVPP2_SHARED *Priv, IN INT32 Cpu ); MVPP2_TX_DESC * Mvpp2TxqNextDescGet ( MVPP2_TX_QUEUE *Txq ); VOID Mvpp2AggrTxqPendDescAdd ( IN PP2DXE_PORT *Port, IN INT32 Pending ); INT32 Mvpp2AggrDescNumCheck ( IN MVPP2_SHARED *Priv, IN MVPP2_TX_QUEUE *AggrTxq, IN INT32 Num, IN INT32 Cpu ); INT32 Mvpp2TxqAllocReservedDesc ( IN MVPP2_SHARED *Priv, IN MVPP2_TX_QUEUE *Txq, IN INT32 Num ); VOID Mvpp2TxqDescPut ( IN MVPP2_TX_QUEUE *Txq ); UINT32 Mvpp2TxqDescCsum ( IN INT32 L3Offs, IN INT32 L3Proto, IN INT32 IpHdrLen, IN INT32 L4Proto ); VOID Mvpp2TxqSentCounterClear ( IN OUT VOID *arg ); VOID Mvpp2GmacMaxRxSizeSet ( IN PP2DXE_PORT *Port ); VOID Mvpp2TxpMaxTxSizeSet ( IN PP2DXE_PORT *Port ); VOID Mvpp2RxPktsCoalSet ( IN PP2DXE_PORT *Port, IN OUT MVPP2_RX_QUEUE *Rxq, IN UINT32 Pkts ); VOID Mvpp2RxTimeCoalSet ( IN PP2DXE_PORT *Port, IN OUT MVPP2_RX_QUEUE *Rxq, IN UINT32 Usec ); VOID Mvpp2AggrTxqHwInit ( IN OUT MVPP2_TX_QUEUE *AggrTxq, IN INT32 DescNum, IN INT32 Cpu, IN MVPP2_SHARED *Priv ); VOID Mvpp2RxqHwInit ( IN PP2DXE_PORT *Port, IN OUT MVPP2_RX_QUEUE *Rxq ); VOID Mvpp2RxqDropPkts ( IN PP2DXE_PORT *Port, IN OUT MVPP2_RX_QUEUE *Rxq, IN INT32 Cpu ); VOID Mvpp2TxqHwInit ( IN PP2DXE_PORT *Port, IN OUT MVPP2_TX_QUEUE *Txq ); VOID Mvpp2TxqHwDeinit ( IN PP2DXE_PORT *Port, IN OUT MVPP2_TX_QUEUE *Txq ); VOID Mvpp2PortPowerUp ( IN PP2DXE_PORT *Port ); VOID Mvpp2RxFifoInit ( IN MVPP2_SHARED *Priv ); VOID Mvpp2RxqHwDeinit ( IN PP2DXE_PORT *Port, IN OUT MVPP2_RX_QUEUE *Rxq ); INT32 MvGop110NetcInit ( IN PP2DXE_PORT *Port, IN UINT32 NetCompConfig, IN enum MvNetcPhase phase ); UINT32 MvpPp2xGop110NetcCfgCreate ( IN PP2DXE_PORT *Port ); INT32 MvGop110PortInit ( IN PP2DXE_PORT *Port ); INT32 MvGop110GmacReset ( IN PP2DXE_PORT *Port, IN enum MvReset ResetCmd ); INT32 MvGop110GpcsModeCfg ( IN PP2DXE_PORT *Port, BOOLEAN En ); INT32 MvGop110BypassClkCfg ( IN PP2DXE_PORT *Port, IN BOOLEAN En ); INT32 MvGop110GpcsReset ( IN PP2DXE_PORT *Port, IN enum MvReset ResetCmd ); VOID MvGop110Xlg2GigMacCfg ( IN PP2DXE_PORT *Port ); INT32 MvGop110GmacModeCfg ( IN PP2DXE_PORT *Port ); VOID MvGop110GmacRgmiiCfg ( IN PP2DXE_PORT *Port ); VOID MvGop110GmacSgmii25Cfg ( IN PP2DXE_PORT *Port ); VOID MvGop110GmacSgmiiCfg ( IN PP2DXE_PORT *Port ); VOID MvGop110GmacQsgmiiCfg ( IN PP2DXE_PORT *Port ); INT32 Mvpp2SmiPhyAddrCfg ( IN PP2DXE_PORT *Port, IN INT32 PortId, IN INT32 Addr ); EFI_STATUS MvGopXpcsModeCfg ( IN PP2DXE_PORT *Port, IN INT32 NumOfLanes ); VOID MvGopMpcsModeCfg ( IN PP2DXE_PORT *Port ); VOID MvGopXlgMacModeCfg ( IN PP2DXE_PORT *Port ); VOID MvGopXpcsUnreset ( IN PP2DXE_PORT *Port ); VOID MvGopXlgMacUnreset ( IN PP2DXE_PORT *Port ); BOOLEAN MvGop110PortIsLinkUp ( IN PP2DXE_PORT *Port ); BOOLEAN MvGop110GmacLinkStatusGet ( IN PP2DXE_PORT *Port ); VOID MvGop110PortDisable ( IN PP2DXE_PORT *Port ); VOID MvGop110PortEnable ( IN PP2DXE_PORT *Port ); VOID MvGop110GmacPortEnable ( IN PP2DXE_PORT *Port ); VOID MvGop110GmacPortDisable ( IN PP2DXE_PORT *Port ); VOID MvGop110GmacPortLinkEventMask ( IN PP2DXE_PORT *Port ); INT32 MvGop110PortEventsMask ( IN PP2DXE_PORT *Port ); VOID MvGop110XlgPortLinkEventMask ( IN PP2DXE_PORT *Port ); VOID MvGop110GmacForceLinkUp ( IN PP2DXE_PORT *Port ); INT32 MvGop110FlCfg ( IN PP2DXE_PORT *Port ); INT32 MvGop110SpeedDuplexSet ( IN PP2DXE_PORT *Port, IN INT32 Speed, IN enum MvPortDuplex Duplex ); INT32 MvGop110GmacSpeedDuplexSet ( IN PP2DXE_PORT *Port, IN INT32 Speed, IN enum MvPortDuplex Duplex ); VOID Mvpp2AxiConfig ( IN MVPP2_SHARED *Priv ); VOID Mvpp2TxpClean ( IN PP2DXE_PORT *Port, IN INT32 Txp, IN MVPP2_TX_QUEUE *Txq ); VOID Mvpp2CleanupTxqs ( IN PP2DXE_PORT *Port ); VOID Mvpp2CleanupRxqs ( IN PP2DXE_PORT *Port ); /* Get number of physical egress Port */ STATIC inline INT32 Mvpp2EgressPort ( IN PP2DXE_PORT *Port ) { return MVPP2_MAX_TCONT + Port->Id; } /* Get number of physical TXQ */ STATIC inline INT32 Mvpp2TxqPhys ( IN INT32 PortId, IN INT32 Txq ) { return (MVPP2_MAX_TCONT + PortId) * MVPP2_MAX_TXQ + Txq; } /* Set Pool number in a BM Cookie */ STATIC inline UINT32 Mvpp2BmCookiePoolSet ( IN UINT32 Cookie, IN INT32 Pool ) { UINT32 Bm; Bm = Cookie & ~(0xFF << MVPP2_BM_COOKIE_POOL_OFFS); Bm |= ((Pool & 0xFF) << MVPP2_BM_COOKIE_POOL_OFFS); return Bm; } /* Get Pool number from a BM Cookie */ STATIC inline INT32 Mvpp2BmCookiePoolGet ( IN UINT32 Cookie ) { return (Cookie >> MVPP2_BM_COOKIE_POOL_OFFS) & 0xFF; } /* Release buffer to BM */ STATIC inline VOID Mvpp2BmPoolPut ( IN MVPP2_SHARED *Priv, IN INT32 Pool, IN UINT64 BufPhysAddr, IN UINT64 BufVirtAddr ) { UINT32 Val = 0; Val = (Upper32Bits(BufVirtAddr) & MVPP22_ADDR_HIGH_MASK) << MVPP22_BM_VIRT_HIGH_RLS_OFFST; Val |= (Upper32Bits(BufPhysAddr) & MVPP22_ADDR_HIGH_MASK) << MVPP22_BM_PHY_HIGH_RLS_OFFSET; Mvpp2Write(Priv, MVPP22_BM_PHY_VIRT_HIGH_RLS_REG, Val); Mvpp2Write(Priv, MVPP2_BM_VIRT_RLS_REG, (UINT32)BufVirtAddr); Mvpp2Write(Priv, MVPP2_BM_PHY_RLS_REG(Pool), (UINT32)BufPhysAddr); } STATIC inline VOID Mvpp2InterruptsEnable ( IN PP2DXE_PORT *Port, IN INT32 CpuMask ) { Mvpp2Write(Port->Priv, MVPP2_ISR_ENABLE_REG(Port->Id), MVPP2_ISR_ENABLE_INTERRUPT(CpuMask)); } STATIC inline VOID Mvpp2InterruptsDisable ( IN PP2DXE_PORT *Port, IN INT32 CpuMask ) { Mvpp2Write(Port->Priv, MVPP2_ISR_ENABLE_REG(Port->Id), MVPP2_ISR_DISABLE_INTERRUPT(CpuMask)); } /* Get number of Rx descriptors occupied by received packets */ STATIC inline INT32 Mvpp2RxqReceived ( IN PP2DXE_PORT *Port, IN INT32 RxqId ) { UINT32 Val = Mvpp2Read(Port->Priv, MVPP2_RXQ_STATUS_REG(RxqId)); return Val & MVPP2_RXQ_OCCUPIED_MASK; } /* * Update Rx Queue status with the number of occupied and available * Rx descriptor slots. */ STATIC inline VOID Mvpp2RxqStatusUpdate ( IN PP2DXE_PORT *Port, IN INT32 RxqId, IN INT32 UsedCount, IN INT32 FreeCount ) { /* * Decrement the number of used descriptors and increment count * increment the number of free descriptors. */ UINT32 Val = UsedCount | (FreeCount << MVPP2_RXQ_NUM_NEW_OFFSET); Mvpp2Write(Port->Priv, MVPP2_RXQ_STATUS_UPDATE_REG(RxqId), Val); } /* Get pointer to next RX descriptor to be processed by SW */ STATIC inline MVPP2_RX_DESC * Mvpp2RxqNextDescGet ( IN MVPP2_RX_QUEUE *Rxq ) { INT32 RxDesc = Rxq->NextDescToProc; Rxq->NextDescToProc = MVPP2_QUEUE_NEXT_DESC(Rxq, RxDesc); Mvpp2Prefetch(Rxq->Descs + Rxq->NextDescToProc); return Rxq->Descs + RxDesc; } /* * Get number of sent descriptors and decrement counter. * The number of sent descriptors is returned. * Per-CPU access */ STATIC inline INT32 Mvpp2TxqSentDescProc ( IN PP2DXE_PORT *Port, IN MVPP2_TX_QUEUE *Txq ) { UINT32 Val; /* Reading status reg resets transmitted descriptor counter */ #ifdef MVPP2V1 Val = Mvpp2Read(Port->Priv, MVPP2_TXQ_SENT_REG(Txq->Id)); #else Val = Mvpp2Read(Port->Priv, MVPP22_TXQ_SENT_REG(Txq->Id)); #endif return (Val & MVPP2_TRANSMITTED_COUNT_MASK) >> MVPP2_TRANSMITTED_COUNT_OFFSET; } STATIC inline MVPP2_RX_QUEUE * Mvpp2GetRxQueue ( IN PP2DXE_PORT *Port, IN UINT32 Cause ) { INT32 Queue = Mvpp2Fls(Cause) - 1; return &Port->Rxqs[Queue]; } STATIC inline MVPP2_TX_QUEUE * Mvpp2GetTxQueue ( IN PP2DXE_PORT *Port, IN UINT32 Cause ) { INT32 Queue = Mvpp2Fls(Cause) - 1; return &Port->Txqs[Queue]; } STATIC inline void Mvpp2x2TxdescPhysAddrSet ( IN DmaAddrT PhysAddr, IN MVPP2_TX_DESC *TxDesc ) { UINT64 *BufPhysAddrP = &TxDesc->BufPhysAddrHwCmd2; *BufPhysAddrP &= ~(MVPP22_ADDR_MASK); *BufPhysAddrP |= PhysAddr & MVPP22_ADDR_MASK; } #endif /* __MVPP2_LIB_H__ */