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          qman_private.h
380aeed3e9SJustin Hibbits 
390aeed3e9SJustin Hibbits  @Description   QM private header
400aeed3e9SJustin Hibbits *//***************************************************************************/
410aeed3e9SJustin Hibbits #ifndef __QMAN_PRIVATE_H
420aeed3e9SJustin Hibbits #define __QMAN_PRIVATE_H
430aeed3e9SJustin Hibbits 
440aeed3e9SJustin Hibbits #include "fsl_qman.h"
450aeed3e9SJustin Hibbits 
460aeed3e9SJustin Hibbits 
470aeed3e9SJustin Hibbits #define __ERR_MODULE__  MODULE_QM
480aeed3e9SJustin Hibbits 
490aeed3e9SJustin Hibbits #if defined(DEBUG) || !defined(DISABLE_ASSERTIONS)
500aeed3e9SJustin Hibbits /* Optionally compile-in assertion-checking */
510aeed3e9SJustin Hibbits #define QM_CHECKING
520aeed3e9SJustin Hibbits #endif /* defined(DEBUG) || ... */
530aeed3e9SJustin Hibbits 
540aeed3e9SJustin Hibbits /* TODO: NB, we currently assume that CORE_MemoryBarier() and lwsync() imply compiler barriers
550aeed3e9SJustin Hibbits  * and that dcbzl(), dcbfl(), and dcbi() won't fall victim to compiler or
560aeed3e9SJustin Hibbits  * execution reordering with respect to other code/instructions that manipulate
570aeed3e9SJustin Hibbits  * the same cacheline. */
580aeed3e9SJustin Hibbits 
590aeed3e9SJustin Hibbits #define dcbf(addr)  \
600aeed3e9SJustin Hibbits     do { \
610aeed3e9SJustin Hibbits         __asm__ __volatile__ ("dcbf 0, %0" : : "r" (addr)); \
620aeed3e9SJustin Hibbits     } while(0)
630aeed3e9SJustin Hibbits 
64852ba100SJustin Hibbits #ifdef CORE_E500MC
650aeed3e9SJustin Hibbits #define dcbt_ro(addr)   \
660aeed3e9SJustin Hibbits     do { \
670aeed3e9SJustin Hibbits         __asm__ __volatile__ ("dcbt 0, %0" : : "r" (addr)); \
680aeed3e9SJustin Hibbits     } while(0)
690aeed3e9SJustin Hibbits 
700aeed3e9SJustin Hibbits #define dcbt_rw(addr)   \
710aeed3e9SJustin Hibbits     do { \
720aeed3e9SJustin Hibbits         __asm__ __volatile__ ("dcbtst 0, %0" : : "r" (addr)); \
730aeed3e9SJustin Hibbits     } while(0)
740aeed3e9SJustin Hibbits 
750aeed3e9SJustin Hibbits #define dcbzl(p) \
760aeed3e9SJustin Hibbits     do { \
770aeed3e9SJustin Hibbits         __asm__ __volatile__ ("dcbzl 0,%0" : : "r" (p)); \
780aeed3e9SJustin Hibbits     } while(0)
790aeed3e9SJustin Hibbits 
800aeed3e9SJustin Hibbits #define dcbz_64(p) \
810aeed3e9SJustin Hibbits     do { \
820aeed3e9SJustin Hibbits         dcbzl(p); \
830aeed3e9SJustin Hibbits     } while (0)
840aeed3e9SJustin Hibbits 
850aeed3e9SJustin Hibbits #define dcbf_64(p) \
860aeed3e9SJustin Hibbits     do { \
870aeed3e9SJustin Hibbits         dcbf(p); \
880aeed3e9SJustin Hibbits     } while (0)
890aeed3e9SJustin Hibbits 
900aeed3e9SJustin Hibbits /* Commonly used combo */
910aeed3e9SJustin Hibbits #define dcbit_ro(p) \
920aeed3e9SJustin Hibbits     do { \
930aeed3e9SJustin Hibbits         dcbi(p); \
940aeed3e9SJustin Hibbits         dcbt_ro(p); \
950aeed3e9SJustin Hibbits     } while (0)
960aeed3e9SJustin Hibbits 
970aeed3e9SJustin Hibbits #else
980aeed3e9SJustin Hibbits 
990aeed3e9SJustin Hibbits #define dcbt_ro(p) \
1000aeed3e9SJustin Hibbits     do { \
1010aeed3e9SJustin Hibbits         __asm__ __volatile__ ("dcbt 0,%0" : : "r" (p)); \
1020aeed3e9SJustin Hibbits         lwsync(); \
1030aeed3e9SJustin Hibbits     } while(0)
1040aeed3e9SJustin Hibbits #define dcbt_rw(p) \
1050aeed3e9SJustin Hibbits     do { \
1060aeed3e9SJustin Hibbits         __asm__ __volatile__ ("dcbtst 0,%0" : : "r" (p)); \
1070aeed3e9SJustin Hibbits     } while(0)
1080aeed3e9SJustin Hibbits #define dcbz(p) \
1090aeed3e9SJustin Hibbits     do { \
1100aeed3e9SJustin Hibbits         __asm__ __volatile__ ("dcbz 0,%0" : : "r" (p)); \
1110aeed3e9SJustin Hibbits     } while (0)
1120aeed3e9SJustin Hibbits #define dcbz_64(p) \
1130aeed3e9SJustin Hibbits     do { \
114852ba100SJustin Hibbits         dcbz((char *)p + 32); \
1150aeed3e9SJustin Hibbits         dcbz(p);    \
1160aeed3e9SJustin Hibbits     } while (0)
1170aeed3e9SJustin Hibbits #define dcbf_64(p) \
1180aeed3e9SJustin Hibbits     do { \
119852ba100SJustin Hibbits         dcbf((char *)p + 32); \
1200aeed3e9SJustin Hibbits         dcbf(p); \
1210aeed3e9SJustin Hibbits     } while (0)
1220aeed3e9SJustin Hibbits /* Commonly used combo */
1230aeed3e9SJustin Hibbits #define dcbit_ro(p) \
1240aeed3e9SJustin Hibbits     do { \
1250aeed3e9SJustin Hibbits         dcbi(p); \
126852ba100SJustin Hibbits         dcbi((char *)p + 32); \
1270aeed3e9SJustin Hibbits         dcbt_ro(p); \
128852ba100SJustin Hibbits         dcbt_ro((char *)p + 32); \
1290aeed3e9SJustin Hibbits     } while (0)
1300aeed3e9SJustin Hibbits 
1310aeed3e9SJustin Hibbits #endif /* CORE_E500MC */
1320aeed3e9SJustin Hibbits 
1330aeed3e9SJustin Hibbits #define dcbi(p) dcbf(p)
1340aeed3e9SJustin Hibbits 
1350aeed3e9SJustin Hibbits struct qm_addr {
1360aeed3e9SJustin Hibbits     void  *addr_ce;    /* cache-enabled */
1370aeed3e9SJustin Hibbits     void  *addr_ci;    /* cache-inhibited */
1380aeed3e9SJustin Hibbits };
1390aeed3e9SJustin Hibbits 
1400aeed3e9SJustin Hibbits /* EQCR state */
1410aeed3e9SJustin Hibbits struct qm_eqcr {
1420aeed3e9SJustin Hibbits     struct qm_eqcr_entry *ring, *cursor;
1430aeed3e9SJustin Hibbits     uint8_t ci, available, ithresh, vbit;
1440aeed3e9SJustin Hibbits 
1450aeed3e9SJustin Hibbits #ifdef QM_CHECKING
1460aeed3e9SJustin Hibbits     uint32_t busy;
1470aeed3e9SJustin Hibbits     e_QmPortalProduceMode       pmode;
1480aeed3e9SJustin Hibbits     e_QmPortalEqcrConsumeMode   cmode;
1490aeed3e9SJustin Hibbits #endif /* QM_CHECKING */
1500aeed3e9SJustin Hibbits };
1510aeed3e9SJustin Hibbits 
1520aeed3e9SJustin Hibbits /* DQRR state */
1530aeed3e9SJustin Hibbits struct qm_dqrr {
1540aeed3e9SJustin Hibbits     struct qm_dqrr_entry *ring, *cursor;
1550aeed3e9SJustin Hibbits     uint8_t pi, ci, fill, ithresh, vbit, flags;
1560aeed3e9SJustin Hibbits 
1570aeed3e9SJustin Hibbits #ifdef QM_CHECKING
1580aeed3e9SJustin Hibbits     e_QmPortalDequeueMode       dmode;
1590aeed3e9SJustin Hibbits     e_QmPortalProduceMode       pmode;
1600aeed3e9SJustin Hibbits     e_QmPortalDqrrConsumeMode   cmode;
1610aeed3e9SJustin Hibbits #endif /* QM_CHECKING */
1620aeed3e9SJustin Hibbits };
1630aeed3e9SJustin Hibbits #define QM_DQRR_FLAG_RE 0x01 /* Stash ring entries */
1640aeed3e9SJustin Hibbits #define QM_DQRR_FLAG_SE 0x02 /* Stash data */
1650aeed3e9SJustin Hibbits 
1660aeed3e9SJustin Hibbits /* MR state */
1670aeed3e9SJustin Hibbits struct qm_mr {
1680aeed3e9SJustin Hibbits     struct qm_mr_entry *ring, *cursor;
1690aeed3e9SJustin Hibbits     uint8_t pi, ci, fill, ithresh, vbit;
1700aeed3e9SJustin Hibbits 
1710aeed3e9SJustin Hibbits #ifdef QM_CHECKING
1720aeed3e9SJustin Hibbits     e_QmPortalProduceMode       pmode;
1730aeed3e9SJustin Hibbits     e_QmPortalMrConsumeMode     cmode;
1740aeed3e9SJustin Hibbits #endif /* QM_CHECKING */
1750aeed3e9SJustin Hibbits };
1760aeed3e9SJustin Hibbits 
1770aeed3e9SJustin Hibbits /* MC state */
1780aeed3e9SJustin Hibbits struct qm_mc {
1790aeed3e9SJustin Hibbits     struct qm_mc_command *cr;
1800aeed3e9SJustin Hibbits     struct qm_mc_result *rr;
1810aeed3e9SJustin Hibbits     uint8_t rridx, vbit;
1820aeed3e9SJustin Hibbits #ifdef QM_CHECKING
1830aeed3e9SJustin Hibbits     enum {
1840aeed3e9SJustin Hibbits         /* Can be _mc_start()ed */
1850aeed3e9SJustin Hibbits         mc_idle,
1860aeed3e9SJustin Hibbits         /* Can be _mc_commit()ed or _mc_abort()ed */
1870aeed3e9SJustin Hibbits         mc_user,
1880aeed3e9SJustin Hibbits         /* Can only be _mc_retry()ed */
1890aeed3e9SJustin Hibbits         mc_hw
1900aeed3e9SJustin Hibbits     } state;
1910aeed3e9SJustin Hibbits #endif /* QM_CHECKING */
1920aeed3e9SJustin Hibbits };
1930aeed3e9SJustin Hibbits 
1940aeed3e9SJustin Hibbits /********************/
1950aeed3e9SJustin Hibbits /* Portal structure */
1960aeed3e9SJustin Hibbits /********************/
1970aeed3e9SJustin Hibbits 
1980aeed3e9SJustin Hibbits struct qm_portal {
1990aeed3e9SJustin Hibbits     /* In the non-QM_CHECKING case, everything up to and
2000aeed3e9SJustin Hibbits      * including 'mc' fits in a cacheline (yay!). The 'config' part is setup-only, so isn't a
2010aeed3e9SJustin Hibbits      * cause for a concern. In other words, don't rearrange this structure
2020aeed3e9SJustin Hibbits      * on a whim, there be dragons ... */
2030aeed3e9SJustin Hibbits     struct qm_addr addr;
2040aeed3e9SJustin Hibbits     struct qm_eqcr eqcr;
2050aeed3e9SJustin Hibbits     struct qm_dqrr dqrr;
2060aeed3e9SJustin Hibbits     struct qm_mr mr;
2070aeed3e9SJustin Hibbits     struct qm_mc mc;
2080aeed3e9SJustin Hibbits     struct qm_portal_config config;
2090aeed3e9SJustin Hibbits     t_Handle bind_lock;
2100aeed3e9SJustin Hibbits     /* Logical index (not cell-index) */
2110aeed3e9SJustin Hibbits     int index;
2120aeed3e9SJustin Hibbits };
2130aeed3e9SJustin Hibbits 
2140aeed3e9SJustin Hibbits #endif /* __QMAN_PRIVATE_H */
215