xref: /freebsd/sys/contrib/ncsw/Peripherals/QM/qm.h (revision c2c014f24c10f90d85126ac5fbd4d8524de32b1c)
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