PDK API Guide for AM65xx
csl_ringacc.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2016-2018 Texas Instruments Incorporated.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the
14  * distribution.
15  *
16  * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  */
47 #ifndef CSL_RINGACC_H_
48 #define CSL_RINGACC_H_
49 
50 #include <stdint.h>
51 #include <stdbool.h>
52 #include <ti/csl/cslr_ringacc.h>
53 
54 #ifdef __cplusplus
55 extern "C" {
56 #endif
57 
78 #define CSL_RINGACC_MAX_RINGS (1024U)
79 
80 #define CSL_RINGACC_MAX_MONITORS (64U)
81 
82 #define CSL_RINGACC_MAX_MONITOR_INTRS (32U)
83 
84 #define CSL_RINGACC_CRED_PASSTHRU (0xFFFFFFFFU)
85 
86 #define CSL_RINGACC_ORDERID_BYPASS (0xFFFFFFFFU)
87 
88 #define CSL_RINGACC_RING_EVENT_DISABLE (0xFFFFU)
89 
99 typedef uint32_t CSL_RingAccRingMode;
101 #define CSL_RINGACC_RING_MODE_RING ((uint32_t) 0U)
102 
104 #define CSL_RINGACC_RING_MODE_MESSAGE ((uint32_t) 1U)
105 
110 #define CSL_RINGACC_RING_MODE_CREDENTIALS ((uint32_t) 2U)
111 
118 #define CSL_RINGACC_RING_MODE_QM ((uint32_t) 3U)
119 
120 #define CSL_RINGACC_RING_MODE_INVALID ((uint32_t) 4U)
121 /* @} */
122 
133 typedef uint32_t CSL_RingAccMonitorDataSrc;
135 #define CSL_RINGACC_MONITOR_DATA_SRC_ELEMENT_CNT ((uint32_t) 0U)
136 
137 #define CSL_RINGACC_MONITOR_DATA_SRC_HEAD_PKT_SIZE ((uint32_t) 1U)
138 
139 #define CSL_RINGACC_MONITOR_DATA_SRC_ACCUM_QUEUE_SIZE ((uint32_t) 2U)
140 
141 #define CSL_RINGACC_MONITOR_DATA_SRC_INVALID ((uint32_t) 3U)
142 /* @} */
143 
153 typedef uint32_t CSL_RingAccMonitorType;
155 #define CSL_RINGACC_MONITOR_TYPE_DISABLED ((uint32_t) 0U)
156 
159 #define CSL_RINGACC_MONITOR_TYPE_STATS ((uint32_t) 1U)
160 
164 #define CSL_RINGACC_MONITOR_TYPE_THRESHOLD ((uint32_t) 2U)
165 
167 #define CSL_RINGACC_MONITOR_TYPE_WATERMARK ((uint32_t) 3U)
168 
170 #define CSL_RINGACC_MONITOR_TYPE_STARVATION ((uint32_t) 4U)
171 
172 #define CSL_RINGACC_MONITOR_TYPE_INVALID ((uint32_t) 5U)
173 /* @} */
174 
184 typedef uint32_t CSL_RingAccMemoryOpsType;
186 #define CSL_RINGACC_MEM_OPS_TYPE_WR ((uint32_t) 0U)
187 
188 #define CSL_RINGACC_MEM_OPS_TYPE_RD ((uint32_t) 1U)
189 /* @} */
190 
191 /* @} */
192 
216 typedef void (*CSL_ringaccMemOpsFxnPtr)(void *pVirtAddr, uint32_t size, uint32_t opsType);
217 
219 typedef struct {
220  CSL_ringacc_gcfgRegs *pGlbRegs;
221  CSL_ringacc_cfgRegs *pCfgRegs;
222  CSL_ringacc_rtRegs *pRtRegs;
223  CSL_ringacc_monitorRegs *pMonRegs;
224  CSL_ringacc_fifosRegs *pFifoRegs;
225  CSL_ringacc_iscRegs *pIscRegs;
226  uint32_t maxRings;
227  uint32_t maxMonitors;
230 
232 typedef struct CSL_RingAccRing_t {
233  void *virtBase;
234  uint64_t physBase;
236  uint32_t elCnt;
237  uint32_t elSz;
238  uint32_t evtNum;
239  uint32_t credSecure;
240  uint32_t credPriv;
241  uint32_t credPrivId;
242  uint32_t credVirtId;
243  uint32_t ringNum;
244  struct CSL_RingAccRing_t *pPair;
245  uint32_t rwIdx;
246  int32_t waiting;
247  uint32_t occ;
249 
250 /* @} */
251 
269 extern uint32_t CSL_ringaccGetRevision( const CSL_RingAccCfg *pCfg );
270 
288 extern void CSL_ringaccInitRingCfg( CSL_RingAccRingCfg *pRingCfg );
289 
300 extern void CSL_ringaccInitRingObj( uint32_t ringNum,
301  CSL_RingAccRingCfg *pRing );
302 
336 extern int32_t CSL_ringaccInitRing( CSL_RingAccCfg *pCfg,
337  uint32_t ringNum,
338  CSL_RingAccRingCfg *pRing );
339 
352 extern int32_t CSL_ringaccSetEvent( CSL_RingAccCfg *pCfg,
353  uint32_t ringNum,
354  uint32_t evtNum );
355 
367 extern uint32_t CSL_ringaccGetRingNum( const CSL_RingAccRingCfg *pRing );
368 
386 extern void CSL_ringaccSetRingOrderId( CSL_RingAccCfg *pCfg, const CSL_RingAccRingCfg *pRing, uint32_t orderId );
387 
404 extern void CSL_ringaccCfgRingCred( CSL_RingAccCfg *pCfg, const CSL_RingAccRingCfg *pRing, bool bEnable, bool bLock );
405 
420 extern void CSL_ringaccResetRing( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing );
421 
436 extern void *CSL_ringaccGetCmdRingPtr( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing );
437 
458 extern void *CSL_ringaccGetRspRingPtr( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing );
459 
477 static inline int32_t CSL_ringaccSetRingDoorbell( CSL_RingAccCfg *pCfg, uint32_t ringNum, int32_t cnt );
478 
479 static inline int32_t CSL_ringaccSetRingDoorbell( CSL_RingAccCfg *pCfg, uint32_t ringNum, int32_t cnt )
480 {
481  int32_t retVal;
482 
483  if( ringNum < pCfg->maxRings )
484  {
485  CSL_REG32_WR( &pCfg->pRtRegs->RINGRT[ringNum].DB, CSL_FMK(RINGACC_RT_RINGRT_DB_CNT, (uint32_t)cnt) );
486  retVal = 0;
487  }
488  else
489  {
490  retVal = -1;
491  }
492  return retVal;
493 }
494 
511 static inline void CSL_ringaccCommitToCmdRing( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, int32_t cnt );
512 
513 static inline void CSL_ringaccCommitToCmdRing( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, int32_t cnt )
514 {
515  int32_t cntLocal = cnt;
516 
517  if( cntLocal == 0 )
518  {
519  cntLocal = pRing->waiting;
520  }
521  if( cntLocal > 0 )
522  {
523  if( CSL_ringaccSetRingDoorbell( pCfg, pRing->ringNum, cntLocal ) == 0 )
524  {
525  pRing->waiting -= cntLocal;
526  }
527  }
528 }
529 
546 extern void CSL_ringaccAckRspRing( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, int32_t cnt );
547 
572 extern int32_t CSL_ringaccCfgTrace( CSL_RingAccCfg *pCfg, bool bTraceAll, bool bIncMsgData, uint32_t ringNum );
573 
588 extern int32_t CSL_ringaccSetTraceEnable( CSL_RingAccCfg *pCfg, bool bEnable );
589 
602 extern int32_t CSL_ringaccEnableTrace( CSL_RingAccCfg *pCfg );
603 
615 extern int32_t CSL_ringaccDisableTrace( CSL_RingAccCfg *pCfg );
616 
632 extern uint32_t CSL_ringaccGetRingIdx( const CSL_RingAccCfg *pCfg, uint32_t ringNum );
633 
649 extern uint32_t CSL_ringaccGetRingHwIdx( const CSL_RingAccCfg *pCfg, uint32_t ringNum );
650 
666 extern uint32_t CSL_ringaccGetRingOcc( const CSL_RingAccCfg *pCfg, uint32_t ringNum );
667 
683 extern uint32_t CSL_ringaccGetRingHwOcc( const CSL_RingAccCfg *pCfg, uint32_t ringNum );
684 
718 extern int32_t CSL_ringaccCfgRingMonitor( CSL_RingAccCfg *pCfg,
719  uint32_t monNum,
720  CSL_RingAccMonitorType monType,
721  uint32_t ringNum,
722  uint32_t eventNum,
724  uint32_t data0Val,
725  uint32_t data1Val );
726 
755 extern int32_t CSL_ringaccReadRingMonitor( const CSL_RingAccCfg *pCfg, uint32_t monNum, uint32_t *pData0, uint32_t *pData1 );
756 
776 extern int32_t CSL_ringaccPush32( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint32_t val, CSL_ringaccMemOpsFxnPtr pfMemOps);
777 
795 extern int32_t CSL_ringaccPop32( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint32_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps );
796 
820 extern int32_t CSL_ringaccHwPop32( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint32_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps );
821 
839 extern int32_t CSL_ringaccPeek32( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint32_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps );
840 
865 extern int32_t CSL_ringaccPush64( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint64_t val, CSL_ringaccMemOpsFxnPtr pfMemOps );
866 
889 extern int32_t CSL_ringaccPop64( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint64_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps );
890 
915 extern int32_t CSL_ringaccHwPop64( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint64_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps );
916 
939 extern int32_t CSL_ringaccPeek64( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint64_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps );
940 
968 extern int32_t CSL_ringaccWrData( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint8_t *pData, uint32_t numBytes, CSL_ringaccMemOpsFxnPtr pfMemOps );
969 
994 extern int32_t CSL_ringaccRdData( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint8_t *pData, uint32_t numBytes, CSL_ringaccMemOpsFxnPtr pfMemOps );
995 
1019 extern int32_t CSL_ringaccPeekData( CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint8_t *pData, uint32_t numBytes, CSL_ringaccMemOpsFxnPtr pfMemOps );
1020 
1021 /* @} */
1022 
1023 #ifdef __cplusplus
1024 }
1025 #endif
1026 
1027 #endif
1028 
void CSL_ringaccAckRspRing(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, int32_t cnt)
Acknowledge elements read from a ring.
int32_t CSL_ringaccSetEvent(CSL_RingAccCfg *pCfg, uint32_t ringNum, uint32_t evtNum)
Set the ring event.
int32_t CSL_ringaccHwPop64(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint64_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps)
Mimic a hardware pop of a 64-bit value from the head of a ring.
uint32_t CSL_ringaccGetRingHwIdx(const CSL_RingAccCfg *pCfg, uint32_t ringNum)
Get the current ring hardware read/write index (for debug).
void CSL_ringaccResetRing(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing)
Reset a ring.
int32_t CSL_ringaccEnableTrace(CSL_RingAccCfg *pCfg)
Enable trace support.
CSL_RingAccRingMode mode
Definition: csl_ringacc.h:235
void CSL_ringaccInitRingObj(uint32_t ringNum, CSL_RingAccRingCfg *pRing)
Initialize the ring object.
void * CSL_ringaccGetRspRingPtr(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing)
Get pointer to next available response ring element.
int32_t CSL_ringaccPop64(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint64_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps)
Pop a 64-bit value from the head of a ring.
uint64_t physBase
Definition: csl_ringacc.h:234
uint32_t CSL_RingAccMonitorDataSrc
Definition: csl_ringacc.h:133
int32_t waiting
Definition: csl_ringacc.h:246
uint32_t maxMonitors
Definition: csl_ringacc.h:227
uint32_t rwIdx
Definition: csl_ringacc.h:245
int32_t CSL_ringaccPeekData(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint8_t *pData, uint32_t numBytes, CSL_ringaccMemOpsFxnPtr pfMemOps)
Peek at data from a ring (ring mode only)
uint32_t ringNum
Definition: csl_ringacc.h:243
int32_t CSL_ringaccCfgTrace(CSL_RingAccCfg *pCfg, bool bTraceAll, bool bIncMsgData, uint32_t ringNum)
Configure trace support.
uint32_t credPriv
Definition: csl_ringacc.h:240
int32_t CSL_ringaccHwPop32(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint32_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps)
Mimic a hardware pop of a 32-bit value from the head of a ring.
uint32_t evtNum
Definition: csl_ringacc.h:238
CSL_RingAccCfg contains information to configure the ring accelerator.
Definition: csl_ringacc.h:219
int32_t CSL_ringaccCfgRingMonitor(CSL_RingAccCfg *pCfg, uint32_t monNum, CSL_RingAccMonitorType monType, uint32_t ringNum, uint32_t eventNum, CSL_RingAccMonitorDataSrc dataSrc, uint32_t data0Val, uint32_t data1Val)
Configure a ring monitor.
int32_t CSL_ringaccSetTraceEnable(CSL_RingAccCfg *pCfg, bool bEnable)
Enable or disable trace support.
uint32_t CSL_RingAccMonitorType
Definition: csl_ringacc.h:153
uint32_t CSL_RingAccRingMode
Definition: csl_ringacc.h:99
uint32_t CSL_ringaccGetRingNum(const CSL_RingAccRingCfg *pRing)
Get the ring number associated with a ring.
CSL_ringacc_iscRegs * pIscRegs
Definition: csl_ringacc.h:225
void(* CSL_ringaccMemOpsFxnPtr)(void *pVirtAddr, uint32_t size, uint32_t opsType)
User-provided memory fence call-back function to perform memory sync operations. The operation to per...
Definition: csl_ringacc.h:216
void * CSL_ringaccGetCmdRingPtr(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing)
Get pointer to next free command ring element.
int32_t CSL_ringaccPeek32(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint32_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps)
Peek at a 32-bit value from the head of a ring.
uint32_t credPrivId
Definition: csl_ringacc.h:241
static int32_t CSL_ringaccSetRingDoorbell(CSL_RingAccCfg *pCfg, uint32_t ringNum, int32_t cnt)
Write to the ring doorbell.
Definition: csl_ringacc.h:479
int32_t CSL_ringaccPush32(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint32_t val, CSL_ringaccMemOpsFxnPtr pfMemOps)
Push a 32-bit value to the tail of a ring.
uint32_t maxRings
Definition: csl_ringacc.h:226
uint32_t CSL_ringaccGetRingHwOcc(const CSL_RingAccCfg *pCfg, uint32_t ringNum)
Get the current ring hardware occupancy (for debug).
uint32_t CSL_RingAccMemoryOpsType
Definition: csl_ringacc.h:184
int32_t CSL_ringaccPop32(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint32_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps)
Pop a 32-bit value from the head of a ring.
uint32_t credSecure
Definition: csl_ringacc.h:239
CSL_ringacc_gcfgRegs * pGlbRegs
Definition: csl_ringacc.h:220
CSL_RingAccRingCfg contains information to configure a ring.
Definition: csl_ringacc.h:232
uint32_t CSL_ringaccGetRingIdx(const CSL_RingAccCfg *pCfg, uint32_t ringNum)
Get the current ring read/write index.
void CSL_ringaccSetRingOrderId(CSL_RingAccCfg *pCfg, const CSL_RingAccRingCfg *pRing, uint32_t orderId)
Specify the orderid value for a ring.
int32_t CSL_ringaccReadRingMonitor(const CSL_RingAccCfg *pCfg, uint32_t monNum, uint32_t *pData0, uint32_t *pData1)
Read a ring monitor.
CSL_ringacc_cfgRegs * pCfgRegs
Definition: csl_ringacc.h:221
static void CSL_ringaccCommitToCmdRing(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, int32_t cnt)
Commit elements written to a ring.
Definition: csl_ringacc.h:513
CSL_ringacc_rtRegs * pRtRegs
Definition: csl_ringacc.h:222
int32_t CSL_ringaccInitRing(CSL_RingAccCfg *pCfg, uint32_t ringNum, CSL_RingAccRingCfg *pRing)
Initialize a ring.
void * virtBase
Definition: csl_ringacc.h:233
uint32_t occ
Definition: csl_ringacc.h:247
void CSL_ringaccCfgRingCred(CSL_RingAccCfg *pCfg, const CSL_RingAccRingCfg *pRing, bool bEnable, bool bLock)
Configure the security credentials for a ring.
uint32_t credVirtId
Definition: csl_ringacc.h:242
CSL_ringacc_fifosRegs * pFifoRegs
Definition: csl_ringacc.h:224
bool bTraceSupported
Definition: csl_ringacc.h:228
void CSL_ringaccInitRingCfg(CSL_RingAccRingCfg *pRingCfg)
Initialize a CSL_RingAccRingCfg structure.
uint16_t size
Definition: tisci_boardcfg.h:112
uint32_t elCnt
Definition: csl_ringacc.h:236
int32_t CSL_ringaccPeek64(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint64_t *pVal, CSL_ringaccMemOpsFxnPtr pfMemOps)
Peek at a 64-bit value from the head of a ring.
CSL_ringacc_monitorRegs * pMonRegs
Definition: csl_ringacc.h:223
uint32_t CSL_ringaccGetRevision(const CSL_RingAccCfg *pCfg)
Return revision of the RingAcc module.
int32_t CSL_ringaccWrData(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint8_t *pData, uint32_t numBytes, CSL_ringaccMemOpsFxnPtr pfMemOps)
Write data into a ring (ring mode only)
int32_t CSL_ringaccRdData(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint8_t *pData, uint32_t numBytes, CSL_ringaccMemOpsFxnPtr pfMemOps)
Read data from a ring (ring mode only)
int32_t CSL_ringaccDisableTrace(CSL_RingAccCfg *pCfg)
Disable trace support.
uint32_t CSL_ringaccGetRingOcc(const CSL_RingAccCfg *pCfg, uint32_t ringNum)
Get the current ring occupancy.
int32_t CSL_ringaccPush64(CSL_RingAccCfg *pCfg, CSL_RingAccRingCfg *pRing, uint64_t val, CSL_ringaccMemOpsFxnPtr pfMemOps)
Push a 64-bit value to the tail of a ring.
struct CSL_RingAccRing_t * pPair
Definition: csl_ringacc.h:244
uint32_t elSz
Definition: csl_ringacc.h:237