10aeed3e9SJustin Hibbits /******************************************************************************
20aeed3e9SJustin Hibbits
30aeed3e9SJustin Hibbits � 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc.
40aeed3e9SJustin Hibbits All rights reserved.
50aeed3e9SJustin Hibbits
60aeed3e9SJustin Hibbits This is proprietary source code of Freescale Semiconductor Inc.,
70aeed3e9SJustin Hibbits and its use is subject to the NetComm Device Drivers EULA.
80aeed3e9SJustin Hibbits The copyright notice above does not evidence any actual or intended
90aeed3e9SJustin Hibbits publication of such source code.
100aeed3e9SJustin Hibbits
110aeed3e9SJustin Hibbits ALTERNATIVELY, redistribution and use in source and binary forms, with
120aeed3e9SJustin Hibbits or without modification, are permitted provided that the following
130aeed3e9SJustin Hibbits conditions are met:
140aeed3e9SJustin Hibbits * Redistributions of source code must retain the above copyright
150aeed3e9SJustin Hibbits notice, this list of conditions and the following disclaimer.
160aeed3e9SJustin Hibbits * Redistributions in binary form must reproduce the above copyright
170aeed3e9SJustin Hibbits notice, this list of conditions and the following disclaimer in the
180aeed3e9SJustin Hibbits documentation and/or other materials provided with the distribution.
190aeed3e9SJustin Hibbits * Neither the name of Freescale Semiconductor nor the
200aeed3e9SJustin Hibbits names of its contributors may be used to endorse or promote products
210aeed3e9SJustin Hibbits derived from this software without specific prior written permission.
220aeed3e9SJustin Hibbits
230aeed3e9SJustin Hibbits THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
240aeed3e9SJustin Hibbits EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
250aeed3e9SJustin Hibbits WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
260aeed3e9SJustin Hibbits DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
270aeed3e9SJustin Hibbits DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
280aeed3e9SJustin Hibbits (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
290aeed3e9SJustin Hibbits LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
300aeed3e9SJustin Hibbits ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
310aeed3e9SJustin Hibbits (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
320aeed3e9SJustin Hibbits SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
330aeed3e9SJustin Hibbits *
340aeed3e9SJustin Hibbits
350aeed3e9SJustin Hibbits **************************************************************************/
360aeed3e9SJustin Hibbits /******************************************************************************
370aeed3e9SJustin Hibbits @File qm.h
380aeed3e9SJustin Hibbits
390aeed3e9SJustin Hibbits @Description QM header
400aeed3e9SJustin Hibbits *//***************************************************************************/
410aeed3e9SJustin Hibbits #ifndef __QM_H
420aeed3e9SJustin Hibbits #define __QM_H
430aeed3e9SJustin Hibbits
440aeed3e9SJustin Hibbits #include "std_ext.h"
450aeed3e9SJustin Hibbits #include "list_ext.h"
460aeed3e9SJustin Hibbits #include "qm_ext.h"
470aeed3e9SJustin Hibbits #include "qman_private.h"
480aeed3e9SJustin Hibbits #include "qm_ipc.h"
490aeed3e9SJustin Hibbits
500aeed3e9SJustin Hibbits
510aeed3e9SJustin Hibbits #define __ERR_MODULE__ MODULE_QM
520aeed3e9SJustin Hibbits
530aeed3e9SJustin Hibbits #define QM_NUM_OF_SWP 10
540aeed3e9SJustin Hibbits #define QM_NUM_OF_DCP 5
550aeed3e9SJustin Hibbits
560aeed3e9SJustin Hibbits #define CACHELINE_SIZE 64
570aeed3e9SJustin Hibbits #define QM_CONTEXTA_MAX_STASH_SIZE (3 * CACHELINE_SIZE)
580aeed3e9SJustin Hibbits
590aeed3e9SJustin Hibbits /**************************************************************************//**
600aeed3e9SJustin Hibbits @Description Exceptions
610aeed3e9SJustin Hibbits *//***************************************************************************/
620aeed3e9SJustin Hibbits #define QM_EX_CORENET_INITIATOR_DATA 0x20000000
630aeed3e9SJustin Hibbits #define QM_EX_CORENET_TARGET_DATA 0x10000000
640aeed3e9SJustin Hibbits #define QM_EX_CORENET_INVALID_TARGET_TRANSACTION 0x08000000
650aeed3e9SJustin Hibbits #define QM_EX_PFDR_THRESHOLD 0x04000000
660aeed3e9SJustin Hibbits #define QM_EX_MULTI_ECC 0x02000000
670aeed3e9SJustin Hibbits #define QM_EX_SINGLE_ECC 0x01000000
680aeed3e9SJustin Hibbits #define QM_EX_PFDR_ENQUEUE_BLOCKED 0x00800000
690aeed3e9SJustin Hibbits #define QM_EX_INVALID_COMMAND 0x00010000
700aeed3e9SJustin Hibbits #define QM_EX_DEQUEUE_DCP 0x00000800
710aeed3e9SJustin Hibbits #define QM_EX_DEQUEUE_FQ 0x00000400
720aeed3e9SJustin Hibbits #define QM_EX_DEQUEUE_SOURCE 0x00000200
730aeed3e9SJustin Hibbits #define QM_EX_DEQUEUE_QUEUE 0x00000100
740aeed3e9SJustin Hibbits #define QM_EX_ENQUEUE_OVERFLOW 0x00000008
750aeed3e9SJustin Hibbits #define QM_EX_ENQUEUE_STATE 0x00000004
760aeed3e9SJustin Hibbits #define QM_EX_ENQUEUE_CHANNEL 0x00000002
770aeed3e9SJustin Hibbits #define QM_EX_ENQUEUE_QUEUE 0x00000001
780aeed3e9SJustin Hibbits
790aeed3e9SJustin Hibbits #define GET_EXCEPTION_FLAG(bitMask, exception) switch(exception){ \
800aeed3e9SJustin Hibbits case e_QM_EX_CORENET_INITIATOR_DATA: \
810aeed3e9SJustin Hibbits bitMask = QM_EX_CORENET_INITIATOR_DATA; break; \
820aeed3e9SJustin Hibbits case e_QM_EX_CORENET_TARGET_DATA: \
830aeed3e9SJustin Hibbits bitMask = QM_EX_CORENET_TARGET_DATA; break; \
840aeed3e9SJustin Hibbits case e_QM_EX_CORENET_INVALID_TARGET_TRANSACTION: \
850aeed3e9SJustin Hibbits bitMask = QM_EX_CORENET_INVALID_TARGET_TRANSACTION; break; \
860aeed3e9SJustin Hibbits case e_QM_EX_PFDR_THRESHOLD: \
870aeed3e9SJustin Hibbits bitMask = QM_EX_PFDR_THRESHOLD; break; \
880aeed3e9SJustin Hibbits case e_QM_EX_PFDR_ENQUEUE_BLOCKED: \
890aeed3e9SJustin Hibbits bitMask = QM_EX_PFDR_ENQUEUE_BLOCKED; break; \
900aeed3e9SJustin Hibbits case e_QM_EX_SINGLE_ECC: \
910aeed3e9SJustin Hibbits bitMask = QM_EX_SINGLE_ECC; break; \
920aeed3e9SJustin Hibbits case e_QM_EX_MULTI_ECC: \
930aeed3e9SJustin Hibbits bitMask = QM_EX_MULTI_ECC; break; \
940aeed3e9SJustin Hibbits case e_QM_EX_INVALID_COMMAND: \
950aeed3e9SJustin Hibbits bitMask = QM_EX_INVALID_COMMAND; break; \
960aeed3e9SJustin Hibbits case e_QM_EX_DEQUEUE_DCP: \
970aeed3e9SJustin Hibbits bitMask = QM_EX_DEQUEUE_DCP; break; \
980aeed3e9SJustin Hibbits case e_QM_EX_DEQUEUE_FQ: \
990aeed3e9SJustin Hibbits bitMask = QM_EX_DEQUEUE_FQ; break; \
1000aeed3e9SJustin Hibbits case e_QM_EX_DEQUEUE_SOURCE: \
1010aeed3e9SJustin Hibbits bitMask = QM_EX_DEQUEUE_SOURCE; break; \
1020aeed3e9SJustin Hibbits case e_QM_EX_DEQUEUE_QUEUE: \
1030aeed3e9SJustin Hibbits bitMask = QM_EX_DEQUEUE_QUEUE; break; \
1040aeed3e9SJustin Hibbits case e_QM_EX_ENQUEUE_OVERFLOW: \
1050aeed3e9SJustin Hibbits bitMask = QM_EX_ENQUEUE_OVERFLOW; break; \
1060aeed3e9SJustin Hibbits case e_QM_EX_ENQUEUE_STATE: \
1070aeed3e9SJustin Hibbits bitMask = QM_EX_ENQUEUE_STATE; break; \
1080aeed3e9SJustin Hibbits case e_QM_EX_ENQUEUE_CHANNEL: \
1090aeed3e9SJustin Hibbits bitMask = QM_EX_ENQUEUE_CHANNEL; break; \
1100aeed3e9SJustin Hibbits case e_QM_EX_ENQUEUE_QUEUE: \
1110aeed3e9SJustin Hibbits bitMask = QM_EX_ENQUEUE_QUEUE; break; \
1120aeed3e9SJustin Hibbits default: bitMask = 0;break;}
1130aeed3e9SJustin Hibbits
1140aeed3e9SJustin Hibbits /**************************************************************************//**
1150aeed3e9SJustin Hibbits @Description defaults
1160aeed3e9SJustin Hibbits *//***************************************************************************/
1170aeed3e9SJustin Hibbits /* QM defaults */
1180aeed3e9SJustin Hibbits #define DEFAULT_exceptions ((uint32_t)(QM_EX_CORENET_INITIATOR_DATA | \
1190aeed3e9SJustin Hibbits QM_EX_CORENET_TARGET_DATA | \
1200aeed3e9SJustin Hibbits QM_EX_CORENET_INVALID_TARGET_TRANSACTION | \
1210aeed3e9SJustin Hibbits QM_EX_PFDR_THRESHOLD | \
1220aeed3e9SJustin Hibbits QM_EX_SINGLE_ECC | \
1230aeed3e9SJustin Hibbits QM_EX_MULTI_ECC | \
1240aeed3e9SJustin Hibbits QM_EX_PFDR_ENQUEUE_BLOCKED | \
1250aeed3e9SJustin Hibbits QM_EX_INVALID_COMMAND | \
1260aeed3e9SJustin Hibbits QM_EX_DEQUEUE_DCP | \
1270aeed3e9SJustin Hibbits QM_EX_DEQUEUE_FQ | \
1280aeed3e9SJustin Hibbits QM_EX_DEQUEUE_SOURCE | \
1290aeed3e9SJustin Hibbits QM_EX_DEQUEUE_QUEUE | \
1300aeed3e9SJustin Hibbits QM_EX_ENQUEUE_OVERFLOW | \
1310aeed3e9SJustin Hibbits QM_EX_ENQUEUE_STATE | \
1320aeed3e9SJustin Hibbits QM_EX_ENQUEUE_CHANNEL | \
1330aeed3e9SJustin Hibbits QM_EX_ENQUEUE_QUEUE ))
1340aeed3e9SJustin Hibbits #define DEFAULT_rtFramesDepth 30000
1350aeed3e9SJustin Hibbits #define DEFAULT_pfdrThreshold 0
1360aeed3e9SJustin Hibbits #define DEFAULT_sfdrThreshold 0
1370aeed3e9SJustin Hibbits #define DEFAULT_pfdrBaseConstant 64
1380aeed3e9SJustin Hibbits /* Corenet initiator settings. Stash request queues are 4-deep to match cores'
1390aeed3e9SJustin Hibbits ability to snart. Stash priority is 3, other priorities are 2. */
1400aeed3e9SJustin Hibbits #define DEFAULT_initiatorSrcciv 0
1410aeed3e9SJustin Hibbits #define DEFAULT_initiatorSrqW 3
1420aeed3e9SJustin Hibbits #define DEFAULT_initiatorRwW 2
1430aeed3e9SJustin Hibbits #define DEFAULT_initiatorBmanW 2
1440aeed3e9SJustin Hibbits
1450aeed3e9SJustin Hibbits
1460aeed3e9SJustin Hibbits /* QM-Portal defaults */
1470aeed3e9SJustin Hibbits #define DEFAULT_dequeueDcaMode FALSE
1480aeed3e9SJustin Hibbits #define DEFAULT_dequeueUpToThreeFrames TRUE
1490aeed3e9SJustin Hibbits #define DEFAULT_dequeueCommandType e_QM_PORTAL_PRIORITY_PRECEDENCE_INTRA_CLASS_SCHEDULING
1500aeed3e9SJustin Hibbits #define DEFAULT_dequeueUserToken 0xab
1510aeed3e9SJustin Hibbits #define DEFAULT_dequeueSpecifiedWq FALSE
1520aeed3e9SJustin Hibbits #define DEFAULT_dequeueDedicatedChannel TRUE
1530aeed3e9SJustin Hibbits #define DEFAULT_dequeuePoolChannelId 0
1540aeed3e9SJustin Hibbits #define DEFAULT_dequeueWqId 0
1550aeed3e9SJustin Hibbits #define DEFAULT_dequeueDedicatedChannelHasPrecedenceOverPoolChannels TRUE
1560aeed3e9SJustin Hibbits #define DEFAULT_dqrrSize DQRR_MAXFILL
1570aeed3e9SJustin Hibbits #define DEFAULT_pullMode FALSE
1580aeed3e9SJustin Hibbits #define DEFAULT_portalExceptions ((uint32_t)(QM_PIRQ_EQCI | \
1590aeed3e9SJustin Hibbits QM_PIRQ_EQRI | \
1600aeed3e9SJustin Hibbits QM_PIRQ_DQRI | \
1610aeed3e9SJustin Hibbits QM_PIRQ_MRI | \
1620aeed3e9SJustin Hibbits QM_PIRQ_CSCI))
1630aeed3e9SJustin Hibbits
1640aeed3e9SJustin Hibbits /**************************************************************************//**
1650aeed3e9SJustin Hibbits @Description Memory Mapped Registers
1660aeed3e9SJustin Hibbits *//***************************************************************************/
1670aeed3e9SJustin Hibbits
1680aeed3e9SJustin Hibbits #if defined(__MWERKS__) && !defined(__GNUC__)
1690aeed3e9SJustin Hibbits #pragma pack(push,1)
1700aeed3e9SJustin Hibbits #endif /* defined(__MWERKS__) && ... */
1710aeed3e9SJustin Hibbits #define MEM_MAP_START
1720aeed3e9SJustin Hibbits
1730aeed3e9SJustin Hibbits typedef _Packed struct
1740aeed3e9SJustin Hibbits {
1750aeed3e9SJustin Hibbits /* QMan Software Portal Configuration Registers */
1760aeed3e9SJustin Hibbits _Packed struct {
1770aeed3e9SJustin Hibbits volatile uint32_t lio_cfg; /**< QMan Software Portal LIO Configuration */
1780aeed3e9SJustin Hibbits volatile uint32_t io_cfg; /**< QMan Software Portal 0 IO Configuration */
1790aeed3e9SJustin Hibbits volatile uint8_t res1[4]; /**< reserved */
1800aeed3e9SJustin Hibbits volatile uint32_t dd_cfg; /**< Software Portal Dynamic Debug Configuration */
1810aeed3e9SJustin Hibbits } _PackedType swpConfRegs[QM_NUM_OF_SWP];
1820aeed3e9SJustin Hibbits volatile uint8_t res1[352]; /**< reserved */
1830aeed3e9SJustin Hibbits
1840aeed3e9SJustin Hibbits /* Dynamic Debug (DD) Configuration Registers */
1850aeed3e9SJustin Hibbits volatile uint32_t qman_dd_cfg; /**< QMan Dynamic Debug (DD) Configuration */
1860aeed3e9SJustin Hibbits volatile uint8_t res2[12]; /**< reserved */
1870aeed3e9SJustin Hibbits volatile uint32_t qcsp_dd_ihrsr; /**< Software Portal DD Internal Halt Request Status */
1880aeed3e9SJustin Hibbits volatile uint32_t qcsp_dd_ihrfr; /**< Software Portal DD Internal Halt Request Force */
1890aeed3e9SJustin Hibbits volatile uint32_t qcsp_dd_hasr; /**< Software Portal DD Halt Acknowledge Status */
1900aeed3e9SJustin Hibbits volatile uint8_t res3[4]; /**< reserved */
1910aeed3e9SJustin Hibbits volatile uint32_t dcp_dd_ihrsr; /**< DCP DD Internal Halt Request Status */
1920aeed3e9SJustin Hibbits volatile uint32_t dcp_dd_ihrfr; /**< DCP DD Internal Halt Request Force */
1930aeed3e9SJustin Hibbits volatile uint32_t dcp_dd_hasr; /**< DCP DD Halt Acknowledge Status */
1940aeed3e9SJustin Hibbits volatile uint8_t res4[212]; /**< reserved */
1950aeed3e9SJustin Hibbits
1960aeed3e9SJustin Hibbits /* Direct Connect Portal (DCP) Configuration Registers */
1970aeed3e9SJustin Hibbits _Packed struct {
1980aeed3e9SJustin Hibbits volatile uint32_t cfg; /**< DCP Configuration */
1990aeed3e9SJustin Hibbits volatile uint32_t dd_cfg; /**< DCP Dynamic Debug Configuration */
2000aeed3e9SJustin Hibbits volatile uint32_t dlm_cfg; /**< DCP Dequeue Latency Monitor Configuration */
2010aeed3e9SJustin Hibbits volatile uint32_t dlm_avg; /**< DCP Dequeue Latency Monitor Average */
2020aeed3e9SJustin Hibbits } _PackedType dcpConfRegs[QM_NUM_OF_DCP];
2030aeed3e9SJustin Hibbits volatile uint8_t res5[176]; /**< reserved */
2040aeed3e9SJustin Hibbits
2050aeed3e9SJustin Hibbits /* Packed Frame Descriptor Record (PFDR) Manager Query Registers */
2060aeed3e9SJustin Hibbits volatile uint32_t pfdr_fpc; /**< PFDR Free Pool Count */
2070aeed3e9SJustin Hibbits volatile uint32_t pfdr_fp_head; /**< PFDR Free Pool Head Pointer */
2080aeed3e9SJustin Hibbits volatile uint32_t pfdr_fp_tail; /**< PFDR Free Pool Tail Pointer */
2090aeed3e9SJustin Hibbits volatile uint8_t res6[4]; /**< reserved */
2100aeed3e9SJustin Hibbits volatile uint32_t pfdr_fp_lwit; /**< PFDR Free Pool Low Watermark Interrupt Threshold */
2110aeed3e9SJustin Hibbits volatile uint32_t pfdr_cfg; /**< PFDR Configuration */
2120aeed3e9SJustin Hibbits volatile uint8_t res7[232]; /**< reserved */
2130aeed3e9SJustin Hibbits
2140aeed3e9SJustin Hibbits /* Single Frame Descriptor Record (SFDR) Manager Registers */
2150aeed3e9SJustin Hibbits volatile uint32_t sfdr_cfg; /**< SFDR Configuration */
2160aeed3e9SJustin Hibbits volatile uint32_t sfdr_in_use; /**< SFDR In Use Register */
2170aeed3e9SJustin Hibbits volatile uint8_t res8[248]; /**< reserved */
2180aeed3e9SJustin Hibbits
2190aeed3e9SJustin Hibbits /* Work Queue Semaphore and Context Manager Registers */
2200aeed3e9SJustin Hibbits volatile uint32_t wq_cs_cfg[6]; /**< Work Queue Class Scheduler Configuration */
2210aeed3e9SJustin Hibbits volatile uint8_t res9[24]; /**< reserved */
2220aeed3e9SJustin Hibbits volatile uint32_t wq_def_enq_wqid; /**< Work Queue Default Enqueue WQID */
2230aeed3e9SJustin Hibbits volatile uint8_t res10[12]; /**< reserved */
2240aeed3e9SJustin Hibbits volatile uint32_t wq_sc_dd_cfg[5]; /**< WQ S/W Channel Dynamic Debug Config */
2250aeed3e9SJustin Hibbits volatile uint8_t res11[44]; /**< reserved */
2260aeed3e9SJustin Hibbits volatile uint32_t wq_pc_dd_cs_cfg[8]; /**< WQ Pool Channel Dynamic Debug Config */
2270aeed3e9SJustin Hibbits volatile uint8_t res12[32]; /**< reserved */
2280aeed3e9SJustin Hibbits volatile uint32_t wq_dc0_dd_cs_cfg[6]; /**< WQ DCP0 Chan. Dynamic Debug Config */
2290aeed3e9SJustin Hibbits volatile uint8_t res13[40]; /**< reserved */
2300aeed3e9SJustin Hibbits volatile uint32_t wq_dc1_dd_cs_cfg[6]; /**< WQ DCP1 Chan. Dynamic Debug Config */
2310aeed3e9SJustin Hibbits volatile uint8_t res14[40]; /**< reserved */
2320aeed3e9SJustin Hibbits volatile uint32_t wq_dc2_dd_cs_cfg; /**< WQ DCP2 Chan. Dynamic Debug Config */
2330aeed3e9SJustin Hibbits volatile uint8_t res15[60]; /**< reserved */
2340aeed3e9SJustin Hibbits volatile uint32_t wq_dc3_dd_cs_cfg; /**< WQ DCP3 Chan. Dynamic Debug Config */
2350aeed3e9SJustin Hibbits volatile uint8_t res16[124]; /**< reserved */
2360aeed3e9SJustin Hibbits
2370aeed3e9SJustin Hibbits /* Congestion Manager (CM) Registers */
2380aeed3e9SJustin Hibbits volatile uint32_t cm_cfg; /**< CM Configuration Register */
2390aeed3e9SJustin Hibbits volatile uint8_t res17[508]; /**< reserved */
2400aeed3e9SJustin Hibbits
2410aeed3e9SJustin Hibbits /* QMan Error Capture Registers */
2420aeed3e9SJustin Hibbits volatile uint32_t ecsr; /**< QMan Error Capture Status Register */
2430aeed3e9SJustin Hibbits volatile uint32_t ecir; /**< QMan Error Capture Information Register */
2440aeed3e9SJustin Hibbits volatile uint32_t eadr; /**< QMan Error Capture Address Register */
2450aeed3e9SJustin Hibbits volatile uint8_t res18[4]; /**< reserved */
2460aeed3e9SJustin Hibbits volatile uint32_t edata[16]; /**< QMan ECC Error Data Register */
2470aeed3e9SJustin Hibbits volatile uint8_t res19[32]; /**< reserved */
2480aeed3e9SJustin Hibbits volatile uint32_t sbet; /**< QMan Single Bit ECC Error Threshold Register */
2490aeed3e9SJustin Hibbits volatile uint8_t res20[12]; /**< reserved */
2500aeed3e9SJustin Hibbits volatile uint32_t sbec[7]; /**< QMan Single Bit ECC Error Count Register */
2510aeed3e9SJustin Hibbits volatile uint8_t res21[100]; /**< reserved */
2520aeed3e9SJustin Hibbits
2530aeed3e9SJustin Hibbits /* QMan Initialization and Debug Control Registers */
2540aeed3e9SJustin Hibbits volatile uint32_t mcr; /**< QMan Management Command/Result Register */
2550aeed3e9SJustin Hibbits volatile uint32_t mcp0; /**< QMan Management Command Parameter 0 Register */
2560aeed3e9SJustin Hibbits volatile uint32_t mcp1; /**< QMan Management Command Parameter 1 Register */
2570aeed3e9SJustin Hibbits volatile uint8_t res22[20]; /**< reserved */
2580aeed3e9SJustin Hibbits volatile uint32_t mr[16]; /**< QMan Management Return Register */
2590aeed3e9SJustin Hibbits volatile uint8_t res23[148]; /**< reserved */
2600aeed3e9SJustin Hibbits volatile uint32_t idle_stat; /**< QMan Idle Status Register */
2610aeed3e9SJustin Hibbits
2620aeed3e9SJustin Hibbits /* QMan ID/Revision Registers */
2630aeed3e9SJustin Hibbits volatile uint32_t ip_rev_1; /**< QMan IP Block Revision 1 register */
2640aeed3e9SJustin Hibbits volatile uint32_t ip_rev_2; /**< QMan IP Block Revision 2 register */
2650aeed3e9SJustin Hibbits
2660aeed3e9SJustin Hibbits /* QMan Initiator Interface Memory Window Configuration Registers */
2670aeed3e9SJustin Hibbits volatile uint32_t fqd_bare; /**< FQD Extended Base Address Register */
2680aeed3e9SJustin Hibbits volatile uint32_t fqd_bar; /**< Frame Queue Descriptor (FQD) Base Address Register */
2690aeed3e9SJustin Hibbits volatile uint8_t res24[8]; /**< reserved */
2700aeed3e9SJustin Hibbits volatile uint32_t fqd_ar; /**< FQD Attributes Register */
2710aeed3e9SJustin Hibbits volatile uint8_t res25[12]; /**< reserved */
2720aeed3e9SJustin Hibbits volatile uint32_t pfdr_bare; /**< PFDR Extended Base Address Register */
2730aeed3e9SJustin Hibbits volatile uint32_t pfdr_bar; /**< Packed Frame Descriptor Record (PFDR) Base Addr */
2740aeed3e9SJustin Hibbits volatile uint8_t res26[8]; /**< reserved */
2750aeed3e9SJustin Hibbits volatile uint32_t pfdr_ar; /**< PFDR Attributes Register */
2760aeed3e9SJustin Hibbits volatile uint8_t res27[76]; /**< reserved */
2770aeed3e9SJustin Hibbits volatile uint32_t qcsp_bare; /**< QCSP Extended Base Address */
2780aeed3e9SJustin Hibbits volatile uint32_t qcsp_bar; /**< QMan Software Portal Base Address */
2790aeed3e9SJustin Hibbits volatile uint8_t res28[120]; /**< reserved */
2800aeed3e9SJustin Hibbits volatile uint32_t ci_sched_cfg; /**< Initiator Scheduling Configuration */
2810aeed3e9SJustin Hibbits volatile uint32_t srcidr; /**< QMan Source ID Register */
2820aeed3e9SJustin Hibbits volatile uint32_t liodnr; /**< QMan Logical I/O Device Number Register */
2830aeed3e9SJustin Hibbits volatile uint8_t res29[4]; /**< reserved */
2840aeed3e9SJustin Hibbits volatile uint32_t ci_rlm_cfg; /**< Initiator Read Latency Monitor Configuration */
2850aeed3e9SJustin Hibbits volatile uint32_t ci_rlm_avg; /**< Initiator Read Latency Monitor Average */
2860aeed3e9SJustin Hibbits volatile uint8_t res30[232]; /**< reserved */
2870aeed3e9SJustin Hibbits
2880aeed3e9SJustin Hibbits /* QMan Interrupt and Error Registers */
2890aeed3e9SJustin Hibbits volatile uint32_t err_isr; /**< QMan Error Interrupt Status Register */
2900aeed3e9SJustin Hibbits volatile uint32_t err_ier; /**< QMan Error Interrupt Enable Register */
2910aeed3e9SJustin Hibbits volatile uint32_t err_isdr; /**< QMan Error Interrupt Status Disable Register */
2920aeed3e9SJustin Hibbits volatile uint32_t err_iir; /**< QMan Error Interrupt Inhibit Register */
2930aeed3e9SJustin Hibbits volatile uint8_t res31[4]; /**< reserved */
2940aeed3e9SJustin Hibbits volatile uint32_t err_her; /**< QMan Error Halt Enable Register */
2950aeed3e9SJustin Hibbits
2960aeed3e9SJustin Hibbits } _PackedType t_QmRegs;
2970aeed3e9SJustin Hibbits
2980aeed3e9SJustin Hibbits #define MEM_MAP_END
2990aeed3e9SJustin Hibbits #if defined(__MWERKS__) && !defined(__GNUC__)
3000aeed3e9SJustin Hibbits #pragma pack(pop)
3010aeed3e9SJustin Hibbits #endif /* defined(__MWERKS__) && ... */
3020aeed3e9SJustin Hibbits
3030aeed3e9SJustin Hibbits
3040aeed3e9SJustin Hibbits /**************************************************************************//**
3050aeed3e9SJustin Hibbits @Description General defines
3060aeed3e9SJustin Hibbits *//***************************************************************************/
3070aeed3e9SJustin Hibbits
3080aeed3e9SJustin Hibbits #define MODULE_NAME_SIZE 30
3090aeed3e9SJustin Hibbits
3100aeed3e9SJustin Hibbits #define PORTALS_OFFSET_CE(portal) (0x4000 * portal)
3110aeed3e9SJustin Hibbits #define PORTALS_OFFSET_CI(portal) (0x1000 * portal)
3120aeed3e9SJustin Hibbits
3130aeed3e9SJustin Hibbits #define PFDR_ENTRY_SIZE 64 /* 64 bytes */
3140aeed3e9SJustin Hibbits #define FQD_ENTRY_SIZE 64 /* 64 bytes */
3150aeed3e9SJustin Hibbits
3160aeed3e9SJustin Hibbits /* Compilation constants */
3170aeed3e9SJustin Hibbits #define DQRR_MAXFILL 15
3180aeed3e9SJustin Hibbits #define EQCR_THRESH 1 /* reread h/w CI when running out of space */
3190aeed3e9SJustin Hibbits
3200aeed3e9SJustin Hibbits /**************************************************************************//**
3210aeed3e9SJustin Hibbits @Description Register defines
3220aeed3e9SJustin Hibbits *//***************************************************************************/
3230aeed3e9SJustin Hibbits
3240aeed3e9SJustin Hibbits /* Assists for QMAN_MCR */
3250aeed3e9SJustin Hibbits #define MCR_INIT_PFDR 0x01000000
3260aeed3e9SJustin Hibbits #define MCR_get_rslt(v) (uint8_t)((v) >> 24)
3270aeed3e9SJustin Hibbits #define MCR_rslt_idle(r) (!rslt || (rslt >= 0xf0))
3280aeed3e9SJustin Hibbits #define MCR_rslt_ok(r) (rslt == 0xf0)
3290aeed3e9SJustin Hibbits #define MCR_rslt_eaccess(r) (rslt == 0xf8)
3300aeed3e9SJustin Hibbits #define MCR_rslt_inval(r) (rslt == 0xff)
3310aeed3e9SJustin Hibbits
3320aeed3e9SJustin Hibbits /* masks */
3330aeed3e9SJustin Hibbits #define REV1_MAJOR_MASK 0x0000FF00
3340aeed3e9SJustin Hibbits #define REV1_MINOR_MASK 0x000000FF
3350aeed3e9SJustin Hibbits
3360aeed3e9SJustin Hibbits #define REV2_INTEG_MASK 0x00FF0000
3370aeed3e9SJustin Hibbits #define REV2_ERR_MASK 0x0000FF00
3380aeed3e9SJustin Hibbits #define REV2_CFG_MASK 0x000000FF
3390aeed3e9SJustin Hibbits
3400aeed3e9SJustin Hibbits #define AR_ENABLE 0x80000000
3410aeed3e9SJustin Hibbits #define AR_PRIORITY 0x40000000
3420aeed3e9SJustin Hibbits #define AR_STASH 0x20000000
3430aeed3e9SJustin Hibbits #define AR_SIZE_MASK 0x0000003f
3440aeed3e9SJustin Hibbits
3450aeed3e9SJustin Hibbits #define ECIR_PORTAL_TYPE 0x20000000
3460aeed3e9SJustin Hibbits #define ECIR_PORTAL_MASK 0x1f000000
3470aeed3e9SJustin Hibbits #define ECIR_FQID_MASK 0x00ffffff
3480aeed3e9SJustin Hibbits
3490aeed3e9SJustin Hibbits #define CI_SCHED_CFG_EN 0x80000000
3500aeed3e9SJustin Hibbits /* shifts */
3510aeed3e9SJustin Hibbits #define REV1_MAJOR_SHIFT 8
3520aeed3e9SJustin Hibbits #define REV1_MINOR_SHIFT 0
3530aeed3e9SJustin Hibbits
3540aeed3e9SJustin Hibbits #define REV2_INTEG_SHIFT 16
3550aeed3e9SJustin Hibbits #define REV2_ERR_SHIFT 8
3560aeed3e9SJustin Hibbits #define REV2_CFG_SHIFT 0
3570aeed3e9SJustin Hibbits
3580aeed3e9SJustin Hibbits #define AR_SIZE_SHIFT 0
3590aeed3e9SJustin Hibbits
3600aeed3e9SJustin Hibbits #define ECIR_PORTAL_SHIFT 24
3610aeed3e9SJustin Hibbits #define ECIR_FQID_SHIFT 0
3620aeed3e9SJustin Hibbits
3630aeed3e9SJustin Hibbits #define CI_SCHED_CFG_SRCCIV_SHIFT 24
3640aeed3e9SJustin Hibbits #define CI_SCHED_CFG_SRQ_W_SHIFT 8
3650aeed3e9SJustin Hibbits #define CI_SCHED_CFG_RW_W_SHIFT 4
3660aeed3e9SJustin Hibbits #define CI_SCHED_CFG_BMAN_W_SHIFT 0
3670aeed3e9SJustin Hibbits
3680aeed3e9SJustin Hibbits
3690aeed3e9SJustin Hibbits /********* CGR ******************************/
3700aeed3e9SJustin Hibbits #define QM_CGR_TARG_FIRST_SWPORTAL 0x80000000
3710aeed3e9SJustin Hibbits #define QM_CGR_TARG_FIRST_DCPORTAL 0x00200000
3720aeed3e9SJustin Hibbits #define QM_CGR_TARGET_SWP(portlaId) (QM_CGR_TARG_FIRST_SWPORTAL >> portlaId)
3730aeed3e9SJustin Hibbits #define QM_CGR_TARGET_DCP(portlaId) (QM_CGR_TARG_FIRST_DCPORTAL >> portlaId)
3740aeed3e9SJustin Hibbits
3750aeed3e9SJustin Hibbits
3760aeed3e9SJustin Hibbits #define QM_DCP_CFG_ED 0x00000100
3770aeed3e9SJustin Hibbits /*
3780aeed3e9SJustin Hibbits #define CGR_VALID 0x80
3790aeed3e9SJustin Hibbits #define CGR_VERB_INIT 0x50
3800aeed3e9SJustin Hibbits #define CGR_VERB_MODIFY 0x51
3810aeed3e9SJustin Hibbits #define CGR_WRITE_ALL 0x07FF
3820aeed3e9SJustin Hibbits #define CGR_WRITE_ENABLE_CSCN 0x0010
3830aeed3e9SJustin Hibbits #define CGR_WRITE_ENABLE_GREEN_MODIFY 0x0380
3840aeed3e9SJustin Hibbits #define CGR_WRITE_ENABLE_YELLOW_MODIFY 0x0240
3850aeed3e9SJustin Hibbits #define CGR_WRITE_ENABLE_RED_MODIFY 0x0120
3860aeed3e9SJustin Hibbits
3870aeed3e9SJustin Hibbits
3880aeed3e9SJustin Hibbits #define CGR_MODE_BYTE 0x00
3890aeed3e9SJustin Hibbits #define CGR_MODE_FRAME 0x01
3900aeed3e9SJustin Hibbits #define GCR_ENABLE_WRED 0x01
3910aeed3e9SJustin Hibbits #define GCR_ENABLE_TD 0x01
3920aeed3e9SJustin Hibbits #define GCR_ENABLE_CSCN 0x01
3930aeed3e9SJustin Hibbits */
3940aeed3e9SJustin Hibbits
3950aeed3e9SJustin Hibbits
3960aeed3e9SJustin Hibbits /* Lock/unlock frame queues, subject to the "UNLOCKED" flag. This is about
3970aeed3e9SJustin Hibbits * inter-processor locking only. */
3980aeed3e9SJustin Hibbits #define FQLOCK(fq) \
3990aeed3e9SJustin Hibbits do { \
4000aeed3e9SJustin Hibbits if (fq->flags & QMAN_FQ_FLAG_LOCKED) \
4010aeed3e9SJustin Hibbits XX_LockSpinlock(&fq->fqlock); \
4020aeed3e9SJustin Hibbits } while(0)
4030aeed3e9SJustin Hibbits #define FQUNLOCK(fq) \
4040aeed3e9SJustin Hibbits do { \
4050aeed3e9SJustin Hibbits if (fq->flags & QMAN_FQ_FLAG_LOCKED) \
4060aeed3e9SJustin Hibbits XX_UnlockSpinlock(&fq->fqlock); \
4070aeed3e9SJustin Hibbits } while(0)
4080aeed3e9SJustin Hibbits
4090aeed3e9SJustin Hibbits /* Lock/unlock portals, subject to "UNLOCKED" flag. This is about disabling
4100aeed3e9SJustin Hibbits * interrupts/preemption and, if FLAG_UNLOCKED isn't defined, inter-processor
4110aeed3e9SJustin Hibbits * locking as well. */
4120aeed3e9SJustin Hibbits #define NCSW_PLOCK(p) ((t_QmPortal*)(p))->irq_flags = XX_DisableAllIntr()
4130aeed3e9SJustin Hibbits #define PUNLOCK(p) XX_RestoreAllIntr(((t_QmPortal*)(p))->irq_flags)
4140aeed3e9SJustin Hibbits
4150aeed3e9SJustin Hibbits
4160aeed3e9SJustin Hibbits typedef void (t_QmLoopDequeueRing)(t_Handle h_QmPortal);
4170aeed3e9SJustin Hibbits
4180aeed3e9SJustin Hibbits /* Follows WQ_CS_CFG0-5 */
4190aeed3e9SJustin Hibbits typedef enum {
4200aeed3e9SJustin Hibbits e_QM_WQ_SW_PORTALS = 0,
4210aeed3e9SJustin Hibbits e_QM_WQ_POOLS,
4220aeed3e9SJustin Hibbits e_QM_WQ_DCP0,
4230aeed3e9SJustin Hibbits e_QM_WQ_DCP1,
4240aeed3e9SJustin Hibbits e_QM_WQ_DCP2,
4250aeed3e9SJustin Hibbits e_QM_WQ_DCP3
4260aeed3e9SJustin Hibbits } e_QmWqClass;
4270aeed3e9SJustin Hibbits
4280aeed3e9SJustin Hibbits typedef enum {
4290aeed3e9SJustin Hibbits e_QM_PORTAL_NO_DEQUEUES = 0,
4300aeed3e9SJustin Hibbits e_QM_PORTAL_PRIORITY_PRECEDENCE_INTRA_CLASS_SCHEDULING,
4310aeed3e9SJustin Hibbits e_QM_PORTAL_ACTIVE_FQ_PRECEDENCE_INTRA_CLASS_SCHEDULING,
4320aeed3e9SJustin Hibbits e_QM_PORTAL_ACTIVE_FQ_PRECEDENCE_OVERRIDE_INTRA_CLASS_SCHEDULING
4330aeed3e9SJustin Hibbits } e_QmPortalDequeueCommandType;
4340aeed3e9SJustin Hibbits
4350aeed3e9SJustin Hibbits typedef enum e_QmInterModuleCounters {
4360aeed3e9SJustin Hibbits e_QM_IM_COUNTERS_SFDR_IN_USE = 0,
4370aeed3e9SJustin Hibbits e_QM_IM_COUNTERS_PFDR_IN_USE,
4380aeed3e9SJustin Hibbits e_QM_IM_COUNTERS_PFDR_FREE_POOL
4390aeed3e9SJustin Hibbits } e_QmInterModuleCounters;
4400aeed3e9SJustin Hibbits
4410aeed3e9SJustin Hibbits typedef struct t_QmInterModulePortalInitParams {
4420aeed3e9SJustin Hibbits uint8_t portalId;
4430aeed3e9SJustin Hibbits uint8_t stashDestQueue;
4440aeed3e9SJustin Hibbits uint16_t liodn;
4450aeed3e9SJustin Hibbits uint16_t dqrrLiodn;
4460aeed3e9SJustin Hibbits uint16_t fdFqLiodn;
4470aeed3e9SJustin Hibbits } t_QmInterModulePortalInitParams;
4480aeed3e9SJustin Hibbits
4490aeed3e9SJustin Hibbits typedef struct t_QmCg {
4500aeed3e9SJustin Hibbits t_Handle h_Qm;
4510aeed3e9SJustin Hibbits t_Handle h_QmPortal;
4520aeed3e9SJustin Hibbits t_QmExceptionsCallback *f_Exception;
4530aeed3e9SJustin Hibbits t_Handle h_App;
4540aeed3e9SJustin Hibbits uint8_t id;
4550aeed3e9SJustin Hibbits } t_QmCg;
4560aeed3e9SJustin Hibbits
4570aeed3e9SJustin Hibbits typedef struct {
4580aeed3e9SJustin Hibbits uintptr_t swPortalsBaseAddress; /**< QM Software Portals Base Address (virtual) */
4590aeed3e9SJustin Hibbits uint32_t partFqidBase;
4600aeed3e9SJustin Hibbits uint32_t partNumOfFqids;
4610aeed3e9SJustin Hibbits uint32_t totalNumOfFqids;
4620aeed3e9SJustin Hibbits uint32_t rtFramesDepth;
4630aeed3e9SJustin Hibbits uint32_t fqdMemPartitionId;
4640aeed3e9SJustin Hibbits uint32_t pfdrMemPartitionId;
4650aeed3e9SJustin Hibbits uint32_t pfdrThreshold;
4660aeed3e9SJustin Hibbits uint32_t sfdrThreshold;
4670aeed3e9SJustin Hibbits uint32_t pfdrBaseConstant;
4680aeed3e9SJustin Hibbits uint16_t liodn;
4690aeed3e9SJustin Hibbits t_QmDcPortalParams dcPortalsParams[DPAA_MAX_NUM_OF_DC_PORTALS];
4700aeed3e9SJustin Hibbits } t_QmDriverParams;
4710aeed3e9SJustin Hibbits
4720aeed3e9SJustin Hibbits typedef struct {
4730aeed3e9SJustin Hibbits uint8_t guestId;
4740aeed3e9SJustin Hibbits t_Handle h_RsrvFqidMm;
4750aeed3e9SJustin Hibbits t_Handle h_FqidMm;
4760aeed3e9SJustin Hibbits t_Handle h_Session;
4770aeed3e9SJustin Hibbits char moduleName[MODULE_NAME_SIZE];
4780aeed3e9SJustin Hibbits t_Handle h_Portals[DPAA_MAX_NUM_OF_SW_PORTALS];
4790aeed3e9SJustin Hibbits t_QmRegs *p_QmRegs;
4800aeed3e9SJustin Hibbits uint32_t *p_FqdBase;
4810aeed3e9SJustin Hibbits uint32_t *p_PfdrBase;
4820aeed3e9SJustin Hibbits uint32_t exceptions;
4830aeed3e9SJustin Hibbits t_QmExceptionsCallback *f_Exception;
4840aeed3e9SJustin Hibbits t_Handle h_App;
485*852ba100SJustin Hibbits uintptr_t errIrq; /**< error interrupt line; NO_IRQ if interrupts not used */
4860aeed3e9SJustin Hibbits uint32_t numOfPfdr;
4870aeed3e9SJustin Hibbits uint16_t partNumOfCgs;
4880aeed3e9SJustin Hibbits uint16_t partCgsBase;
4890aeed3e9SJustin Hibbits uint8_t cgsUsed[QM_MAX_NUM_OF_CGS];
4900aeed3e9SJustin Hibbits t_Handle lock;
4910aeed3e9SJustin Hibbits t_QmDriverParams *p_QmDriverParams;
4920aeed3e9SJustin Hibbits } t_Qm;
4930aeed3e9SJustin Hibbits
4940aeed3e9SJustin Hibbits typedef struct {
4950aeed3e9SJustin Hibbits uint32_t hwExtStructsMemAttr;
4960aeed3e9SJustin Hibbits uint8_t dqrrSize;
4970aeed3e9SJustin Hibbits bool pullMode;
4980aeed3e9SJustin Hibbits bool dequeueDcaMode;
4990aeed3e9SJustin Hibbits bool dequeueUpToThreeFrames;
5000aeed3e9SJustin Hibbits e_QmPortalDequeueCommandType commandType;
5010aeed3e9SJustin Hibbits uint8_t userToken;
5020aeed3e9SJustin Hibbits bool specifiedWq;
5030aeed3e9SJustin Hibbits bool dedicatedChannel;
5040aeed3e9SJustin Hibbits bool dedicatedChannelHasPrecedenceOverPoolChannels;
5050aeed3e9SJustin Hibbits uint8_t poolChannels[QM_MAX_NUM_OF_POOL_CHANNELS];
5060aeed3e9SJustin Hibbits uint8_t poolChannelId;
5070aeed3e9SJustin Hibbits uint8_t wqId;
5080aeed3e9SJustin Hibbits uint16_t fdLiodnOffset;
5090aeed3e9SJustin Hibbits uint8_t stashDestQueue;
5100aeed3e9SJustin Hibbits uint8_t eqcr;
5110aeed3e9SJustin Hibbits bool eqcrHighPri;
5120aeed3e9SJustin Hibbits bool dqrr;
5130aeed3e9SJustin Hibbits uint16_t dqrrLiodn;
5140aeed3e9SJustin Hibbits bool dqrrHighPri;
5150aeed3e9SJustin Hibbits bool fdFq;
5160aeed3e9SJustin Hibbits uint16_t fdFqLiodn;
5170aeed3e9SJustin Hibbits bool fdFqHighPri;
5180aeed3e9SJustin Hibbits bool fdFqDrop;
5190aeed3e9SJustin Hibbits } t_QmPortalDriverParams;
5200aeed3e9SJustin Hibbits
5210aeed3e9SJustin Hibbits /*typedef struct t_QmPortalCgs{
5220aeed3e9SJustin Hibbits uint32_t cgsMask[QM_MAX_NUM_OF_CGS/32];
5230aeed3e9SJustin Hibbits }t_QmPortalCgs;
5240aeed3e9SJustin Hibbits */
5250aeed3e9SJustin Hibbits typedef struct t_QmPortal {
5260aeed3e9SJustin Hibbits t_Handle h_Qm;
5270aeed3e9SJustin Hibbits struct qm_portal *p_LowQmPortal;
5280aeed3e9SJustin Hibbits uint32_t bits; /* PORTAL_BITS_*** - dynamic, strictly internal */
5290aeed3e9SJustin Hibbits t_Handle h_App;
5300aeed3e9SJustin Hibbits t_QmLoopDequeueRing *f_LoopDequeueRingCB;
5310aeed3e9SJustin Hibbits bool pullMode;
5320aeed3e9SJustin Hibbits /* To avoid overloading the term "flags", we use these 2; */
5330aeed3e9SJustin Hibbits uint32_t options; /* QMAN_PORTAL_FLAG_*** - static, caller-provided */
5340aeed3e9SJustin Hibbits uint32_t irq_flags;
5350aeed3e9SJustin Hibbits /* The wrap-around eq_[prod|cons] counters are used to support
5360aeed3e9SJustin Hibbits * QMAN_ENQUEUE_FLAG_WAIT_SYNC. */
5370aeed3e9SJustin Hibbits uint32_t eqProd;
5380aeed3e9SJustin Hibbits volatile int disable_count;
5390aeed3e9SJustin Hibbits struct qman_cgrs cgrs[2]; /* 2-element array. cgrs[0] is mask, cgrs[1] is previous snapshot. */
5400aeed3e9SJustin Hibbits /* If we receive a DQRR or MR ring entry for a "null" FQ, ie. for which
5410aeed3e9SJustin Hibbits * FQD::contextB is NULL rather than pointing to a FQ object, we use
5420aeed3e9SJustin Hibbits * these handlers. (This is not considered a fast-path mechanism.) */
5430aeed3e9SJustin Hibbits t_Handle cgsHandles[QM_MAX_NUM_OF_CGS];
5440aeed3e9SJustin Hibbits struct qman_fq_cb *p_NullCB;
5450aeed3e9SJustin Hibbits t_QmReceivedFrameCallback *f_DfltFrame;
5460aeed3e9SJustin Hibbits t_QmRejectedFrameCallback *f_RejectedFrame;
5470aeed3e9SJustin Hibbits t_QmPortalDriverParams *p_QmPortalDriverParams;
5480aeed3e9SJustin Hibbits } t_QmPortal;
5490aeed3e9SJustin Hibbits
5500aeed3e9SJustin Hibbits struct qman_fq {
5510aeed3e9SJustin Hibbits struct qman_fq_cb cb;
5520aeed3e9SJustin Hibbits t_Handle h_App;
5530aeed3e9SJustin Hibbits t_Handle h_QmFqr;
5540aeed3e9SJustin Hibbits t_Handle fqlock;
5550aeed3e9SJustin Hibbits uint32_t fqid;
5560aeed3e9SJustin Hibbits uint32_t fqidOffset;
5570aeed3e9SJustin Hibbits uint32_t flags;
5580aeed3e9SJustin Hibbits /* s/w-visible states. Ie. tentatively scheduled + truly scheduled +
5590aeed3e9SJustin Hibbits * active + held-active + held-suspended are just "sched". Things like
5600aeed3e9SJustin Hibbits * 'retired' will not be assumed until it is complete (ie.
5610aeed3e9SJustin Hibbits * QMAN_FQ_STATE_CHANGING is set until then, to indicate it's completing
5620aeed3e9SJustin Hibbits * and to gate attempts to retry the retire command). Note, park
5630aeed3e9SJustin Hibbits * commands do not set QMAN_FQ_STATE_CHANGING because it's technically
5640aeed3e9SJustin Hibbits * impossible in the case of enqueue DCAs (which refer to DQRR ring
5650aeed3e9SJustin Hibbits * index rather than the FQ that ring entry corresponds to), so repeated
5660aeed3e9SJustin Hibbits * park commands are allowed (if you're silly enough to try) but won't
5670aeed3e9SJustin Hibbits * change FQ state, and the resulting park notifications move FQs from
5680aeed3e9SJustin Hibbits * 'sched' to 'parked'. */
5690aeed3e9SJustin Hibbits enum qman_fq_state state;
5700aeed3e9SJustin Hibbits int cgr_groupid;
5710aeed3e9SJustin Hibbits };
5720aeed3e9SJustin Hibbits
5730aeed3e9SJustin Hibbits typedef struct {
5740aeed3e9SJustin Hibbits t_Handle h_Qm;
5750aeed3e9SJustin Hibbits t_Handle h_QmPortal;
5760aeed3e9SJustin Hibbits e_QmFQChannel channel;
5770aeed3e9SJustin Hibbits uint8_t workQueue;
5780aeed3e9SJustin Hibbits bool shadowMode;
5790aeed3e9SJustin Hibbits uint32_t fqidBase;
5800aeed3e9SJustin Hibbits uint32_t numOfFqids;
5810aeed3e9SJustin Hibbits t_QmFqrDrainedCompletionCB *f_CompletionCB;
5820aeed3e9SJustin Hibbits t_Handle h_App;
5830aeed3e9SJustin Hibbits uint32_t numOfDrainedFqids;
5840aeed3e9SJustin Hibbits bool *p_DrainedFqs;
5850aeed3e9SJustin Hibbits struct qman_fq **p_Fqs;
5860aeed3e9SJustin Hibbits } t_QmFqr;
5870aeed3e9SJustin Hibbits
5880aeed3e9SJustin Hibbits
5890aeed3e9SJustin Hibbits /****************************************/
5900aeed3e9SJustin Hibbits /* Inter-Module functions */
5910aeed3e9SJustin Hibbits /****************************************/
5920aeed3e9SJustin Hibbits uint32_t QmGetCounter(t_Handle h_Qm, e_QmInterModuleCounters counter);
5930aeed3e9SJustin Hibbits t_Error QmGetRevision(t_Handle h_Qm, t_QmRevisionInfo *p_QmRevisionInfo);
5940aeed3e9SJustin Hibbits t_Error QmGetSetPortalParams(t_Handle h_Qm, t_QmInterModulePortalInitParams *p_PortalParams);
5950aeed3e9SJustin Hibbits t_Error QmFreeDcPortal(t_Handle h_Qm, e_DpaaDcPortal dcPortalId);
5960aeed3e9SJustin Hibbits uint32_t QmFqidGet(t_Qm *p_Qm, uint32_t size, uint32_t alignment, bool force, uint32_t base);
5970aeed3e9SJustin Hibbits t_Error QmFqidPut(t_Qm *p_Qm, uint32_t base);
5980aeed3e9SJustin Hibbits t_Error QmGetCgId(t_Handle h_Qm, uint8_t *p_CgId);
5990aeed3e9SJustin Hibbits t_Error QmFreeCgId(t_Handle h_Qm, uint8_t cgId);
6000aeed3e9SJustin Hibbits
6010aeed3e9SJustin Hibbits
QmSetPortalHandle(t_Handle h_Qm,t_Handle h_Portal,e_DpaaSwPortal portalId)6020aeed3e9SJustin Hibbits static __inline__ void QmSetPortalHandle(t_Handle h_Qm, t_Handle h_Portal, e_DpaaSwPortal portalId)
6030aeed3e9SJustin Hibbits {
6040aeed3e9SJustin Hibbits ASSERT_COND(!((t_Qm*)h_Qm)->h_Portals[portalId] || !h_Portal);
6050aeed3e9SJustin Hibbits ((t_Qm*)h_Qm)->h_Portals[portalId] = h_Portal;
6060aeed3e9SJustin Hibbits }
6070aeed3e9SJustin Hibbits
QmGetPortalHandle(t_Handle h_Qm)6080aeed3e9SJustin Hibbits static __inline__ t_Handle QmGetPortalHandle(t_Handle h_Qm)
6090aeed3e9SJustin Hibbits {
6100aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm*)h_Qm;
6110aeed3e9SJustin Hibbits
6120aeed3e9SJustin Hibbits ASSERT_COND(p_Qm);
6130aeed3e9SJustin Hibbits return p_Qm->h_Portals[CORE_GetId()];
6140aeed3e9SJustin Hibbits }
6150aeed3e9SJustin Hibbits
GenerateCgrThresh(uint64_t val,int roundup)6160aeed3e9SJustin Hibbits static __inline__ uint32_t GenerateCgrThresh(uint64_t val, int roundup)
6170aeed3e9SJustin Hibbits {
6180aeed3e9SJustin Hibbits uint32_t e = 0; /* co-efficient, exponent */
6190aeed3e9SJustin Hibbits uint32_t oddbit = 0;
6200aeed3e9SJustin Hibbits while(val > 0xff) {
6210aeed3e9SJustin Hibbits oddbit = (uint32_t)val & 1;
6220aeed3e9SJustin Hibbits val >>= 1;
6230aeed3e9SJustin Hibbits e++;
6240aeed3e9SJustin Hibbits if(roundup && oddbit)
6250aeed3e9SJustin Hibbits val++;
6260aeed3e9SJustin Hibbits }
6270aeed3e9SJustin Hibbits return (uint32_t)((val << 5) | e);
6280aeed3e9SJustin Hibbits }
6290aeed3e9SJustin Hibbits
SetException(t_Qm * p_Qm,e_QmExceptions exception,bool enable)6300aeed3e9SJustin Hibbits static __inline__ t_Error SetException(t_Qm *p_Qm, e_QmExceptions exception, bool enable)
6310aeed3e9SJustin Hibbits {
6320aeed3e9SJustin Hibbits uint32_t bitMask = 0;
6330aeed3e9SJustin Hibbits
6340aeed3e9SJustin Hibbits ASSERT_COND(p_Qm);
6350aeed3e9SJustin Hibbits
6360aeed3e9SJustin Hibbits GET_EXCEPTION_FLAG(bitMask, exception);
6370aeed3e9SJustin Hibbits if(bitMask)
6380aeed3e9SJustin Hibbits {
6390aeed3e9SJustin Hibbits if (enable)
6400aeed3e9SJustin Hibbits p_Qm->exceptions |= bitMask;
6410aeed3e9SJustin Hibbits else
6420aeed3e9SJustin Hibbits p_Qm->exceptions &= ~bitMask;
6430aeed3e9SJustin Hibbits }
6440aeed3e9SJustin Hibbits else
6450aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
6460aeed3e9SJustin Hibbits
6470aeed3e9SJustin Hibbits return E_OK;
6480aeed3e9SJustin Hibbits }
6490aeed3e9SJustin Hibbits
6500aeed3e9SJustin Hibbits
6510aeed3e9SJustin Hibbits #endif /* __QM_H */
652