xref: /freebsd/sys/contrib/ncsw/Peripherals/QM/fsl_qman.h (revision 0aeed3e99367bed5755068d9218cd8041644ff2b)
1*0aeed3e9SJustin Hibbits /******************************************************************************
2*0aeed3e9SJustin Hibbits 
3*0aeed3e9SJustin Hibbits  � 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc.
4*0aeed3e9SJustin Hibbits  All rights reserved.
5*0aeed3e9SJustin Hibbits 
6*0aeed3e9SJustin Hibbits  This is proprietary source code of Freescale Semiconductor Inc.,
7*0aeed3e9SJustin Hibbits  and its use is subject to the NetComm Device Drivers EULA.
8*0aeed3e9SJustin Hibbits  The copyright notice above does not evidence any actual or intended
9*0aeed3e9SJustin Hibbits  publication of such source code.
10*0aeed3e9SJustin Hibbits 
11*0aeed3e9SJustin Hibbits  ALTERNATIVELY, redistribution and use in source and binary forms, with
12*0aeed3e9SJustin Hibbits  or without modification, are permitted provided that the following
13*0aeed3e9SJustin Hibbits  conditions are met:
14*0aeed3e9SJustin Hibbits      * Redistributions of source code must retain the above copyright
15*0aeed3e9SJustin Hibbits        notice, this list of conditions and the following disclaimer.
16*0aeed3e9SJustin Hibbits      * Redistributions in binary form must reproduce the above copyright
17*0aeed3e9SJustin Hibbits        notice, this list of conditions and the following disclaimer in the
18*0aeed3e9SJustin Hibbits        documentation and/or other materials provided with the distribution.
19*0aeed3e9SJustin Hibbits      * Neither the name of Freescale Semiconductor nor the
20*0aeed3e9SJustin Hibbits        names of its contributors may be used to endorse or promote products
21*0aeed3e9SJustin Hibbits        derived from this software without specific prior written permission.
22*0aeed3e9SJustin Hibbits 
23*0aeed3e9SJustin Hibbits  THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
24*0aeed3e9SJustin Hibbits  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25*0aeed3e9SJustin Hibbits  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26*0aeed3e9SJustin Hibbits  DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
27*0aeed3e9SJustin Hibbits  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28*0aeed3e9SJustin Hibbits  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29*0aeed3e9SJustin Hibbits  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30*0aeed3e9SJustin Hibbits  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31*0aeed3e9SJustin Hibbits  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32*0aeed3e9SJustin Hibbits  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33*0aeed3e9SJustin Hibbits  *
34*0aeed3e9SJustin Hibbits 
35*0aeed3e9SJustin Hibbits  **************************************************************************/
36*0aeed3e9SJustin Hibbits /******************************************************************************
37*0aeed3e9SJustin Hibbits  @File          fsl_qman.h
38*0aeed3e9SJustin Hibbits 
39*0aeed3e9SJustin Hibbits  @Description   QM header
40*0aeed3e9SJustin Hibbits *//***************************************************************************/
41*0aeed3e9SJustin Hibbits #ifndef __FSL_QMAN_H
42*0aeed3e9SJustin Hibbits #define __FSL_QMAN_H
43*0aeed3e9SJustin Hibbits 
44*0aeed3e9SJustin Hibbits #include "std_ext.h"
45*0aeed3e9SJustin Hibbits #include "string_ext.h"
46*0aeed3e9SJustin Hibbits #include "qm_ext.h"
47*0aeed3e9SJustin Hibbits 
48*0aeed3e9SJustin Hibbits 
49*0aeed3e9SJustin Hibbits /*************************************************/
50*0aeed3e9SJustin Hibbits /*   QMan s/w corenet portal, low-level i/face   */
51*0aeed3e9SJustin Hibbits /*************************************************/
52*0aeed3e9SJustin Hibbits typedef enum {
53*0aeed3e9SJustin Hibbits     e_QmPortalPCI = 0,          /* PI index, cache-inhibited */
54*0aeed3e9SJustin Hibbits     e_QmPortalPCE,              /* PI index, cache-enabled */
55*0aeed3e9SJustin Hibbits     e_QmPortalPVB               /* valid-bit */
56*0aeed3e9SJustin Hibbits } e_QmPortalProduceMode;
57*0aeed3e9SJustin Hibbits 
58*0aeed3e9SJustin Hibbits typedef enum {
59*0aeed3e9SJustin Hibbits     e_QmPortalEqcrCCI = 0,      /* CI index, cache-inhibited */
60*0aeed3e9SJustin Hibbits     e_QmPortalEqcrCCE           /* CI index, cache-enabled */
61*0aeed3e9SJustin Hibbits } e_QmPortalEqcrConsumeMode;
62*0aeed3e9SJustin Hibbits 
63*0aeed3e9SJustin Hibbits typedef enum {
64*0aeed3e9SJustin Hibbits     e_QmPortalDqrrCCI = 0,      /* CI index, cache-inhibited */
65*0aeed3e9SJustin Hibbits     e_QmPortalDqrrCCE,          /* CI index, cache-enabled */
66*0aeed3e9SJustin Hibbits     e_QmPortalDqrrDCA           /* Discrete Consumption Acknowledgment */
67*0aeed3e9SJustin Hibbits } e_QmPortalDqrrConsumeMode;
68*0aeed3e9SJustin Hibbits 
69*0aeed3e9SJustin Hibbits typedef enum {
70*0aeed3e9SJustin Hibbits     e_QmPortalMrCCI = 0,        /* CI index, cache-inhibited */
71*0aeed3e9SJustin Hibbits     e_QmPortalMrCCE             /* CI index, cache-enabled */
72*0aeed3e9SJustin Hibbits } e_QmPortalMrConsumeMode;
73*0aeed3e9SJustin Hibbits 
74*0aeed3e9SJustin Hibbits typedef enum {
75*0aeed3e9SJustin Hibbits     e_QmPortalDequeuePushMode = 0,  /* SDQCR  + VDQCR */
76*0aeed3e9SJustin Hibbits     e_QmPortalDequeuePullMode       /* PDQCR */
77*0aeed3e9SJustin Hibbits } e_QmPortalDequeueMode;
78*0aeed3e9SJustin Hibbits 
79*0aeed3e9SJustin Hibbits /* Portal constants */
80*0aeed3e9SJustin Hibbits #define QM_EQCR_SIZE    8
81*0aeed3e9SJustin Hibbits #define QM_DQRR_SIZE    16
82*0aeed3e9SJustin Hibbits #define QM_MR_SIZE      8
83*0aeed3e9SJustin Hibbits 
84*0aeed3e9SJustin Hibbits /* Hardware constants */
85*0aeed3e9SJustin Hibbits 
86*0aeed3e9SJustin Hibbits enum qm_isr_reg {
87*0aeed3e9SJustin Hibbits     qm_isr_status = 0,
88*0aeed3e9SJustin Hibbits     qm_isr_enable = 1,
89*0aeed3e9SJustin Hibbits     qm_isr_disable = 2,
90*0aeed3e9SJustin Hibbits     qm_isr_inhibit = 3
91*0aeed3e9SJustin Hibbits };
92*0aeed3e9SJustin Hibbits enum qm_dc_portal {
93*0aeed3e9SJustin Hibbits     qm_dc_portal_fman0 = 0,
94*0aeed3e9SJustin Hibbits     qm_dc_portal_fman1 = 1,
95*0aeed3e9SJustin Hibbits     qm_dc_portal_caam = 2,
96*0aeed3e9SJustin Hibbits     qm_dc_portal_pme = 3
97*0aeed3e9SJustin Hibbits };
98*0aeed3e9SJustin Hibbits 
99*0aeed3e9SJustin Hibbits /* Represents s/w corenet portal mapped data structures */
100*0aeed3e9SJustin Hibbits struct qm_eqcr_entry;    /* EQCR (EnQueue Command Ring) entries */
101*0aeed3e9SJustin Hibbits struct qm_dqrr_entry;    /* DQRR (DeQueue Response Ring) entries */
102*0aeed3e9SJustin Hibbits struct qm_mr_entry;    /* MR (Message Ring) entries */
103*0aeed3e9SJustin Hibbits struct qm_mc_command;    /* MC (Management Command) command */
104*0aeed3e9SJustin Hibbits struct qm_mc_result;    /* MC result */
105*0aeed3e9SJustin Hibbits 
106*0aeed3e9SJustin Hibbits /* This type represents a s/w corenet portal space, and is used for creating the
107*0aeed3e9SJustin Hibbits  * portal objects within it (EQCR, DQRR, etc) */
108*0aeed3e9SJustin Hibbits struct qm_portal;
109*0aeed3e9SJustin Hibbits 
110*0aeed3e9SJustin Hibbits /* When iterating the available portals, this is the exposed config structure */
111*0aeed3e9SJustin Hibbits struct qm_portal_config {
112*0aeed3e9SJustin Hibbits     /* If the caller enables DQRR stashing (and thus wishes to operate the
113*0aeed3e9SJustin Hibbits      * portal from only one cpu), this is the logical CPU that the portal
114*0aeed3e9SJustin Hibbits      * will stash to. Whether stashing is enabled or not, this setting is
115*0aeed3e9SJustin Hibbits      * also used for any "core-affine" portals, ie. default portals
116*0aeed3e9SJustin Hibbits      * associated to the corresponding cpu. -1 implies that there is no core
117*0aeed3e9SJustin Hibbits      * affinity configured. */
118*0aeed3e9SJustin Hibbits     int cpu;
119*0aeed3e9SJustin Hibbits     /* portal interrupt line */
120*0aeed3e9SJustin Hibbits     int irq;
121*0aeed3e9SJustin Hibbits     /* The portal's dedicated channel id, use this value for initializing
122*0aeed3e9SJustin Hibbits      * frame queues to target this portal when scheduled. */
123*0aeed3e9SJustin Hibbits     e_QmFQChannel channel;
124*0aeed3e9SJustin Hibbits     /* A mask of which pool channels this portal has dequeue access to
125*0aeed3e9SJustin Hibbits      * (using QM_SDQCR_CHANNELS_POOL(n) for the bitmask) */
126*0aeed3e9SJustin Hibbits     uint32_t pools;
127*0aeed3e9SJustin Hibbits     /* which portal sub-interfaces are already bound (ie. "in use") */
128*0aeed3e9SJustin Hibbits     uint8_t bound;
129*0aeed3e9SJustin Hibbits };
130*0aeed3e9SJustin Hibbits /* qm_portal_config::bound uses these bit masks */
131*0aeed3e9SJustin Hibbits #define QM_BIND_EQCR    0x01
132*0aeed3e9SJustin Hibbits #define QM_BIND_DQRR    0x02
133*0aeed3e9SJustin Hibbits #define QM_BIND_MR      0x04
134*0aeed3e9SJustin Hibbits #define QM_BIND_MC      0x08
135*0aeed3e9SJustin Hibbits #define QM_BIND_ISR     0x10
136*0aeed3e9SJustin Hibbits 
137*0aeed3e9SJustin Hibbits /* This struct represents a pool channel */
138*0aeed3e9SJustin Hibbits struct qm_pool_channel {
139*0aeed3e9SJustin Hibbits     /* The QM_SDQCR_CHANNELS_POOL(n) bit that corresponds to this channel */
140*0aeed3e9SJustin Hibbits     uint32_t pool;
141*0aeed3e9SJustin Hibbits     /* The channel id, used for initialising frame queues to target this
142*0aeed3e9SJustin Hibbits      * channel. */
143*0aeed3e9SJustin Hibbits     e_QmFQChannel channel;
144*0aeed3e9SJustin Hibbits     /* Bitmask of portal (logical-, not cell-)indices that have dequeue
145*0aeed3e9SJustin Hibbits      * access to this channel;
146*0aeed3e9SJustin Hibbits      * 0x001 -> qm_portal_get(0)
147*0aeed3e9SJustin Hibbits      * 0x002 -> qm_portal_get(1)
148*0aeed3e9SJustin Hibbits      * 0x004 -> qm_portal_get(2)
149*0aeed3e9SJustin Hibbits      * ...
150*0aeed3e9SJustin Hibbits      * 0x200 -> qm_portal_get(9)
151*0aeed3e9SJustin Hibbits      */
152*0aeed3e9SJustin Hibbits     uint32_t portals;
153*0aeed3e9SJustin Hibbits };
154*0aeed3e9SJustin Hibbits 
155*0aeed3e9SJustin Hibbits /* ------------------------------ */
156*0aeed3e9SJustin Hibbits /* --- Portal enumeration API --- */
157*0aeed3e9SJustin Hibbits 
158*0aeed3e9SJustin Hibbits /* Obtain the number of portals available */
159*0aeed3e9SJustin Hibbits uint8_t qm_portal_num(void);
160*0aeed3e9SJustin Hibbits 
161*0aeed3e9SJustin Hibbits /* Obtain a portal handle and configuration information about it */
162*0aeed3e9SJustin Hibbits struct qm_portal *qm_portal_get(uint8_t idx);
163*0aeed3e9SJustin Hibbits 
164*0aeed3e9SJustin Hibbits 
165*0aeed3e9SJustin Hibbits /* ------------------------------------ */
166*0aeed3e9SJustin Hibbits /* --- Pool channel enumeration API --- */
167*0aeed3e9SJustin Hibbits 
168*0aeed3e9SJustin Hibbits /* Obtain a mask of the available pool channels, expressed using
169*0aeed3e9SJustin Hibbits  * QM_SDQCR_CHANNELS_POOL(n). */
170*0aeed3e9SJustin Hibbits uint32_t qm_pools(void);
171*0aeed3e9SJustin Hibbits 
172*0aeed3e9SJustin Hibbits /* Retrieve a pool channel configuration, given a QM_SDQCR_CHANNEL_POOL(n)
173*0aeed3e9SJustin Hibbits  * bit-mask (the least significant bit of 'mask' is used if more than one bit is
174*0aeed3e9SJustin Hibbits  * set). */
175*0aeed3e9SJustin Hibbits const struct qm_pool_channel *qm_pool_channel(uint32_t mask);
176*0aeed3e9SJustin Hibbits 
177*0aeed3e9SJustin Hibbits /* Flags to qm_fq_free_flags() */
178*0aeed3e9SJustin Hibbits #define QM_FQ_FREE_WAIT       0x00000001 /* wait if RCR is full */
179*0aeed3e9SJustin Hibbits #define QM_FQ_FREE_WAIT_INT   0x00000002 /* if wait, interruptible? */
180*0aeed3e9SJustin Hibbits #define QM_FQ_FREE_WAIT_SYNC  0x00000004 /* if wait, until consumed? */
181*0aeed3e9SJustin Hibbits 
182*0aeed3e9SJustin Hibbits 
183*0aeed3e9SJustin Hibbits #define QM_SDQCR_SOURCE_CHANNELS        0x0
184*0aeed3e9SJustin Hibbits #define QM_SDQCR_SOURCE_SPECIFICWQ      0x40000000
185*0aeed3e9SJustin Hibbits #define QM_SDQCR_COUNT_EXACT1           0x0
186*0aeed3e9SJustin Hibbits #define QM_SDQCR_COUNT_UPTO3            0x20000000
187*0aeed3e9SJustin Hibbits #define QM_SDQCR_DEDICATED_PRECEDENCE   0x10000000
188*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_MASK              0x03000000
189*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_NULL              0x0
190*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_PRIO_QOS          0x01000000
191*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_ACTIVE_QOS        0x02000000
192*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_ACTIVE            0x03000000
193*0aeed3e9SJustin Hibbits #define QM_SDQCR_TYPE_SET(v)            (((v) & 0x03) << (31-7))
194*0aeed3e9SJustin Hibbits #define QM_SDQCR_TOKEN_MASK             0x00ff0000
195*0aeed3e9SJustin Hibbits #define QM_SDQCR_TOKEN_SET(v)           (((v) & 0xff) << 16)
196*0aeed3e9SJustin Hibbits #define QM_SDQCR_TOKEN_GET(v)           (((v) >> 16) & 0xff)
197*0aeed3e9SJustin Hibbits #define QM_SDQCR_CHANNELS_DEDICATED     0x00008000
198*0aeed3e9SJustin Hibbits #define QM_SDQCR_CHANNELS_POOL_MASK     0x00007fff
199*0aeed3e9SJustin Hibbits #define QM_SDQCR_CHANNELS_POOL(n)       (0x00008000 >> (n))
200*0aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_MASK        0x000000f7
201*0aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_DEDICATED   0x00000000
202*0aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_POOL(n)     ((n) << 4)
203*0aeed3e9SJustin Hibbits #define QM_SDQCR_SPECIFICWQ_WQ(n)       (n)
204*0aeed3e9SJustin Hibbits 
205*0aeed3e9SJustin Hibbits /* For qm_dqrr_vdqcr_set(); Choose one PRECEDENCE. EXACT is optional. Use
206*0aeed3e9SJustin Hibbits  * NUMFRAMES(n) (6-bit) or NUMFRAMES_TILLEMPTY to fill in the frame-count. Use
207*0aeed3e9SJustin Hibbits  * FQID(n) to fill in the frame queue ID. */
208*0aeed3e9SJustin Hibbits #define QM_VDQCR_PRECEDENCE_VDQCR       0x0
209*0aeed3e9SJustin Hibbits #define QM_VDQCR_PRECEDENCE_SDQCR       0x80000000
210*0aeed3e9SJustin Hibbits #define QM_VDQCR_EXACT                  0x40000000
211*0aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_MASK         0x3f000000
212*0aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_SET(n)       (((n) & 0x3f) << 24)
213*0aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_GET(n)       (((n) >> 24) & 0x3f)
214*0aeed3e9SJustin Hibbits #define QM_VDQCR_NUMFRAMES_TILLEMPTY    QM_VDQCR_NUMFRAMES_SET(0)
215*0aeed3e9SJustin Hibbits #define QM_VDQCR_FQID_MASK              0x00ffffff
216*0aeed3e9SJustin Hibbits #define QM_VDQCR_FQID(n)                ((n) & QM_VDQCR_FQID_MASK)
217*0aeed3e9SJustin Hibbits 
218*0aeed3e9SJustin Hibbits /* For qm_dqrr_pdqcr_set(); Choose one MODE. Choose one COUNT.
219*0aeed3e9SJustin Hibbits  * If MODE==SCHEDULED
220*0aeed3e9SJustin Hibbits  *   Choose SCHEDULED_CHANNELS or SCHEDULED_SPECIFICWQ. Choose one dequeue TYPE.
221*0aeed3e9SJustin Hibbits  *   If CHANNELS,
222*0aeed3e9SJustin Hibbits  *     Choose CHANNELS_DEDICATED and/or CHANNELS_POOL() channels.
223*0aeed3e9SJustin Hibbits  *     You can choose DEDICATED_PRECEDENCE if the portal channel should have
224*0aeed3e9SJustin Hibbits  *     priority.
225*0aeed3e9SJustin Hibbits  *   If SPECIFICWQ,
226*0aeed3e9SJustin Hibbits  *     Either select the work-queue ID with SPECIFICWQ_WQ(), or select the
227*0aeed3e9SJustin Hibbits  *     channel (SPECIFICWQ_DEDICATED or SPECIFICWQ_POOL()) and specify the
228*0aeed3e9SJustin Hibbits  *     work-queue priority (0-7) with SPECIFICWQ_WQ() - either way, you get the
229*0aeed3e9SJustin Hibbits  *     same value.
230*0aeed3e9SJustin Hibbits  * If MODE==UNSCHEDULED
231*0aeed3e9SJustin Hibbits  *     Choose FQID().
232*0aeed3e9SJustin Hibbits  */
233*0aeed3e9SJustin Hibbits #define QM_PDQCR_MODE_SCHEDULED         0x0
234*0aeed3e9SJustin Hibbits #define QM_PDQCR_MODE_UNSCHEDULED       0x80000000
235*0aeed3e9SJustin Hibbits #define QM_PDQCR_SCHEDULED_CHANNELS     0x0
236*0aeed3e9SJustin Hibbits #define QM_PDQCR_SCHEDULED_SPECIFICWQ   0x40000000
237*0aeed3e9SJustin Hibbits #define QM_PDQCR_COUNT_EXACT1           0x0
238*0aeed3e9SJustin Hibbits #define QM_PDQCR_COUNT_UPTO3            0x20000000
239*0aeed3e9SJustin Hibbits #define QM_PDQCR_DEDICATED_PRECEDENCE   0x10000000
240*0aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_MASK              0x03000000
241*0aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_NULL              0x0
242*0aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_PRIO_QOS          0x01000000
243*0aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_ACTIVE_QOS        0x02000000
244*0aeed3e9SJustin Hibbits #define QM_PDQCR_TYPE_ACTIVE            0x03000000
245*0aeed3e9SJustin Hibbits #define QM_PDQCR_CHANNELS_DEDICATED     0x00008000
246*0aeed3e9SJustin Hibbits #define QM_PDQCR_CHANNELS_POOL(n)       (0x00008000 >> (n))
247*0aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_MASK        0x000000f7
248*0aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_DEDICATED   0x00000000
249*0aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_POOL(n)     ((n) << 4)
250*0aeed3e9SJustin Hibbits #define QM_PDQCR_SPECIFICWQ_WQ(n)       (n)
251*0aeed3e9SJustin Hibbits #define QM_PDQCR_FQID(n)                ((n) & 0xffffff)
252*0aeed3e9SJustin Hibbits 
253*0aeed3e9SJustin Hibbits /* ------------------------------------- */
254*0aeed3e9SJustin Hibbits /* --- Portal interrupt register API --- */
255*0aeed3e9SJustin Hibbits 
256*0aeed3e9SJustin Hibbits /* Quick explanation of the Qman interrupt model. Each bit has a source
257*0aeed3e9SJustin Hibbits  * condition, that source is asserted iff the condition is true. Eg. Each
258*0aeed3e9SJustin Hibbits  * DQAVAIL source bit tracks whether the corresponding channel's work queues
259*0aeed3e9SJustin Hibbits  * contain any truly scheduled frame queues. That source exists "asserted" if
260*0aeed3e9SJustin Hibbits  * and while there are truly-scheduled FQs available, it is deasserted as/when
261*0aeed3e9SJustin Hibbits  * there are no longer any truly-scheduled FQs available. The same is true for
262*0aeed3e9SJustin Hibbits  * the various other interrupt source conditions (QM_PIRQ_***). The following
263*0aeed3e9SJustin Hibbits  * steps indicate what those source bits affect;
264*0aeed3e9SJustin Hibbits  *    1. if the corresponding bit is set in the disable register, the source
265*0aeed3e9SJustin Hibbits  *       bit is masked off, we never see any effect from it.
266*0aeed3e9SJustin Hibbits  *    2. otherwise, the corresponding bit is set in the status register. Once
267*0aeed3e9SJustin Hibbits  *       asserted in the status register, it must be write-1-to-clear'd - the
268*0aeed3e9SJustin Hibbits  *       status register bit will stay set even if the source condition
269*0aeed3e9SJustin Hibbits  *       deasserts.
270*0aeed3e9SJustin Hibbits  *    3. if a bit is set in the status register but *not* set in the enable
271*0aeed3e9SJustin Hibbits  *       register, it will not cause the interrupt to assert. Other bits may
272*0aeed3e9SJustin Hibbits  *       still cause the interrupt to assert of course, and a read of the
273*0aeed3e9SJustin Hibbits  *       status register can still reveal un-enabled bits - this is why the
274*0aeed3e9SJustin Hibbits  *       enable and disable registers aren't strictly speaking "opposites".
275*0aeed3e9SJustin Hibbits  *       "Un-enabled" means it won't, on its own, trigger an interrupt.
276*0aeed3e9SJustin Hibbits  *       "Disabled" means it won't even show up in the status register.
277*0aeed3e9SJustin Hibbits  *    4. if a bit is set in the status register *and* the enable register, the
278*0aeed3e9SJustin Hibbits  *       interrupt line will assert if and only if the inhibit register is
279*0aeed3e9SJustin Hibbits  *       zero. The inhibit register is the only interrupt-related register that
280*0aeed3e9SJustin Hibbits  *       does not share the bit definitions - it is a boolean on/off register.
281*0aeed3e9SJustin Hibbits  */
282*0aeed3e9SJustin Hibbits 
283*0aeed3e9SJustin Hibbits /* Create/destroy */
284*0aeed3e9SJustin Hibbits 
285*0aeed3e9SJustin Hibbits /* Used by all portal interrupt registers except 'inhibit' */
286*0aeed3e9SJustin Hibbits #define QM_PIRQ_CSCI        0x00100000      /* Congestion State Change */
287*0aeed3e9SJustin Hibbits #define QM_PIRQ_EQCI        0x00080000      /* Enqueue Command Committed */
288*0aeed3e9SJustin Hibbits #define QM_PIRQ_EQRI        0x00040000      /* EQCR Ring (below threshold) */
289*0aeed3e9SJustin Hibbits #define QM_PIRQ_DQRI        0x00020000      /* DQRR Ring (non-empty) */
290*0aeed3e9SJustin Hibbits #define QM_PIRQ_MRI         0x00010000      /* MR Ring (non-empty) */
291*0aeed3e9SJustin Hibbits /* The DQAVAIL interrupt fields break down into these bits; */
292*0aeed3e9SJustin Hibbits #define QM_PIRQ_DQAVAIL     0x0000ffff      /* Channels with frame availability */
293*0aeed3e9SJustin Hibbits #define QM_DQAVAIL_PORTAL   0x8000          /* Portal channel */
294*0aeed3e9SJustin Hibbits #define QM_DQAVAIL_POOL(n)  (0x8000 >> (n)) /* Pool channel, n==[1..15] */
295*0aeed3e9SJustin Hibbits 
296*0aeed3e9SJustin Hibbits /* These are qm_<reg>_<verb>(). So for example, qm_disable_write() means "write
297*0aeed3e9SJustin Hibbits  * the disable register" rather than "disable the ability to write". */
298*0aeed3e9SJustin Hibbits #define qm_isr_status_read(qm)      __qm_isr_read(qm, qm_isr_status)
299*0aeed3e9SJustin Hibbits #define qm_isr_status_clear(qm, m)  __qm_isr_write(qm, qm_isr_status, m)
300*0aeed3e9SJustin Hibbits #define qm_isr_enable_read(qm)      __qm_isr_read(qm, qm_isr_enable)
301*0aeed3e9SJustin Hibbits #define qm_isr_enable_write(qm, v)  __qm_isr_write(qm, qm_isr_enable, v)
302*0aeed3e9SJustin Hibbits #define qm_isr_disable_read(qm)     __qm_isr_read(qm, qm_isr_disable)
303*0aeed3e9SJustin Hibbits #define qm_isr_disable_write(qm, v) __qm_isr_write(qm, qm_isr_disable, v)
304*0aeed3e9SJustin Hibbits #define qm_isr_inhibit(qm)          __qm_isr_write(qm, qm_isr_inhibit, 1)
305*0aeed3e9SJustin Hibbits #define qm_isr_uninhibit(qm)        __qm_isr_write(qm, qm_isr_inhibit, 0)
306*0aeed3e9SJustin Hibbits 
307*0aeed3e9SJustin Hibbits /* ------------------------------------------------------- */
308*0aeed3e9SJustin Hibbits /* --- Qman data structures (and associated constants) --- */
309*0aeed3e9SJustin Hibbits 
310*0aeed3e9SJustin Hibbits /* See David Lapp's "Frame formats" document, "dpateam", Jan 07, 2008 */
311*0aeed3e9SJustin Hibbits #define QM_FD_FORMAT_SG         0x4
312*0aeed3e9SJustin Hibbits #define QM_FD_FORMAT_LONG       0x2
313*0aeed3e9SJustin Hibbits #define QM_FD_FORMAT_COMPOUND   0x1
314*0aeed3e9SJustin Hibbits enum qm_fd_format {
315*0aeed3e9SJustin Hibbits     /* 'contig' implies a contiguous buffer, whereas 'sg' implies a
316*0aeed3e9SJustin Hibbits      * scatter-gather table. 'big' implies a 29-bit length with no offset
317*0aeed3e9SJustin Hibbits      * field, otherwise length is 20-bit and offset is 9-bit. 'compound'
318*0aeed3e9SJustin Hibbits      * implies a s/g-like table, where each entry itself represents a frame
319*0aeed3e9SJustin Hibbits      * (contiguous or scatter-gather) and the 29-bit "length" is
320*0aeed3e9SJustin Hibbits      * interpreted purely for congestion calculations, ie. a "congestion
321*0aeed3e9SJustin Hibbits      * weight". */
322*0aeed3e9SJustin Hibbits     qm_fd_contig = 0,
323*0aeed3e9SJustin Hibbits     qm_fd_contig_big = QM_FD_FORMAT_LONG,
324*0aeed3e9SJustin Hibbits     qm_fd_sg = QM_FD_FORMAT_SG,
325*0aeed3e9SJustin Hibbits     qm_fd_sg_big = QM_FD_FORMAT_SG | QM_FD_FORMAT_LONG,
326*0aeed3e9SJustin Hibbits     qm_fd_compound = QM_FD_FORMAT_COMPOUND
327*0aeed3e9SJustin Hibbits };
328*0aeed3e9SJustin Hibbits 
329*0aeed3e9SJustin Hibbits #if defined(__MWERKS__) && !defined(__GNUC__)
330*0aeed3e9SJustin Hibbits #pragma pack(push,1)
331*0aeed3e9SJustin Hibbits #endif /* defined(__MWERKS__) && ... */
332*0aeed3e9SJustin Hibbits #define MEM_MAP_START
333*0aeed3e9SJustin Hibbits 
334*0aeed3e9SJustin Hibbits  _Packed struct qm_fqd_stashing {
335*0aeed3e9SJustin Hibbits     /* See QM_STASHING_EXCL_<...> */
336*0aeed3e9SJustin Hibbits     volatile uint8_t exclusive;
337*0aeed3e9SJustin Hibbits     volatile uint8_t reserved1:2;
338*0aeed3e9SJustin Hibbits     /* Numbers of cachelines */
339*0aeed3e9SJustin Hibbits     volatile uint8_t annotation_cl:2;
340*0aeed3e9SJustin Hibbits     volatile uint8_t data_cl:2;
341*0aeed3e9SJustin Hibbits     volatile uint8_t context_cl:2;
342*0aeed3e9SJustin Hibbits } _PackedType;
343*0aeed3e9SJustin Hibbits 
344*0aeed3e9SJustin Hibbits typedef _Packed union {
345*0aeed3e9SJustin Hibbits     /* Treat it as 64-bit opaque */
346*0aeed3e9SJustin Hibbits     _Packed struct {
347*0aeed3e9SJustin Hibbits         volatile uint32_t hi;
348*0aeed3e9SJustin Hibbits         volatile uint32_t lo;
349*0aeed3e9SJustin Hibbits     } _PackedType;
350*0aeed3e9SJustin Hibbits     /* Treat it as s/w portal stashing config */
351*0aeed3e9SJustin Hibbits     /* See 1.5.6.7.1: "FQD Context_A field used for [...] */
352*0aeed3e9SJustin Hibbits     _Packed struct {
353*0aeed3e9SJustin Hibbits         struct qm_fqd_stashing stashing;
354*0aeed3e9SJustin Hibbits         volatile uint8_t reserved1;
355*0aeed3e9SJustin Hibbits         /* 40-bit address of FQ context to
356*0aeed3e9SJustin Hibbits          * stash, must be cacheline-aligned */
357*0aeed3e9SJustin Hibbits         volatile uint8_t context_hi;
358*0aeed3e9SJustin Hibbits         volatile uint32_t context_lo;
359*0aeed3e9SJustin Hibbits     } _PackedType;
360*0aeed3e9SJustin Hibbits } _PackedType u_QmFqdContextA;
361*0aeed3e9SJustin Hibbits 
362*0aeed3e9SJustin Hibbits /* See 1.5.1.1: "Frame Descriptor (FD)" */
363*0aeed3e9SJustin Hibbits _Packed struct qm_fd {
364*0aeed3e9SJustin Hibbits     volatile uint8_t dd:2;    /* dynamic debug */
365*0aeed3e9SJustin Hibbits     volatile uint8_t liodn_offset:6; /* aka. "Partition ID" in rev1.0 */
366*0aeed3e9SJustin Hibbits     volatile uint8_t bpid;    /* Buffer Pool ID */
367*0aeed3e9SJustin Hibbits     volatile uint8_t eliodn_offset:4;
368*0aeed3e9SJustin Hibbits     volatile uint8_t reserved:4;
369*0aeed3e9SJustin Hibbits     volatile uint8_t addr_hi;    /* high 8-bits of 40-bit address */
370*0aeed3e9SJustin Hibbits     volatile uint32_t addr_lo;    /* low 32-bits of 40-bit address */
371*0aeed3e9SJustin Hibbits     /* The 'format' field indicates the interpretation of the remaining 29
372*0aeed3e9SJustin Hibbits      * bits of the 32-bit word. For packing reasons, it is duplicated in the
373*0aeed3e9SJustin Hibbits      * other union elements. */
374*0aeed3e9SJustin Hibbits     _Packed union {
375*0aeed3e9SJustin Hibbits         /* If 'format' is _contig or _sg, 20b length and 9b offset */
376*0aeed3e9SJustin Hibbits         _Packed struct {
377*0aeed3e9SJustin Hibbits             volatile enum qm_fd_format format:3;
378*0aeed3e9SJustin Hibbits             volatile uint16_t offset:9;
379*0aeed3e9SJustin Hibbits             volatile uint32_t length20:20;
380*0aeed3e9SJustin Hibbits         } _PackedType;
381*0aeed3e9SJustin Hibbits         /* If 'format' is _contig_big or _sg_big, 29b length */
382*0aeed3e9SJustin Hibbits         _Packed struct {
383*0aeed3e9SJustin Hibbits             volatile enum qm_fd_format _format1:3;
384*0aeed3e9SJustin Hibbits             volatile uint32_t length29:29;
385*0aeed3e9SJustin Hibbits         } _PackedType;
386*0aeed3e9SJustin Hibbits         /* If 'format' is _compound, 29b "congestion weight" */
387*0aeed3e9SJustin Hibbits         _Packed struct {
388*0aeed3e9SJustin Hibbits             volatile enum qm_fd_format _format2:3;
389*0aeed3e9SJustin Hibbits             volatile uint32_t cong_weight:29;
390*0aeed3e9SJustin Hibbits         } _PackedType;
391*0aeed3e9SJustin Hibbits         /* For easier/faster copying of this part of the fd (eg. from a
392*0aeed3e9SJustin Hibbits          * DQRR entry to an EQCR entry) copy 'opaque' */
393*0aeed3e9SJustin Hibbits         volatile uint32_t opaque;
394*0aeed3e9SJustin Hibbits     } _PackedType;
395*0aeed3e9SJustin Hibbits     _Packed union {
396*0aeed3e9SJustin Hibbits         volatile uint32_t cmd;
397*0aeed3e9SJustin Hibbits         volatile uint32_t status;
398*0aeed3e9SJustin Hibbits     }_PackedType;
399*0aeed3e9SJustin Hibbits } _PackedType;
400*0aeed3e9SJustin Hibbits 
401*0aeed3e9SJustin Hibbits #define QM_FD_DD_NULL        0x00
402*0aeed3e9SJustin Hibbits #define QM_FD_PID_MASK        0x3f
403*0aeed3e9SJustin Hibbits 
404*0aeed3e9SJustin Hibbits /* See 1.5.8.1: "Enqueue Command" */
405*0aeed3e9SJustin Hibbits _Packed struct qm_eqcr_entry {
406*0aeed3e9SJustin Hibbits     volatile uint8_t __dont_write_directly__verb;
407*0aeed3e9SJustin Hibbits     volatile uint8_t dca;
408*0aeed3e9SJustin Hibbits     volatile uint16_t seqnum;
409*0aeed3e9SJustin Hibbits     volatile uint32_t orp;    /* 24-bit */
410*0aeed3e9SJustin Hibbits     volatile uint32_t fqid;    /* 24-bit */
411*0aeed3e9SJustin Hibbits     volatile uint32_t tag;
412*0aeed3e9SJustin Hibbits     volatile struct qm_fd fd;
413*0aeed3e9SJustin Hibbits     volatile uint8_t reserved3[32];
414*0aeed3e9SJustin Hibbits } _PackedType;
415*0aeed3e9SJustin Hibbits 
416*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_VBIT               0x80
417*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_CMD_MASK           0x61    /* but only one value; */
418*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_CMD_ENQUEUE        0x01
419*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_MASK        0x18    /* 4 possible values; */
420*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_GREEN       0x00
421*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_YELLOW      0x08
422*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_RED         0x10
423*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_COLOUR_OVERRIDE    0x18
424*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_INTERRUPT          0x04    /* on command consumption */
425*0aeed3e9SJustin Hibbits #define QM_EQCR_VERB_ORP                0x02    /* enable order restoration */
426*0aeed3e9SJustin Hibbits #define QM_EQCR_DCA_ENABLE              0x80
427*0aeed3e9SJustin Hibbits #define QM_EQCR_DCA_PARK                0x40
428*0aeed3e9SJustin Hibbits #define QM_EQCR_DCA_IDXMASK             0x0f    /* "DQRR::idx" goes here */
429*0aeed3e9SJustin Hibbits #define QM_EQCR_SEQNUM_NESN             0x8000  /* Advance NESN */
430*0aeed3e9SJustin Hibbits #define QM_EQCR_SEQNUM_NLIS             0x4000  /* More fragments to come */
431*0aeed3e9SJustin Hibbits #define QM_EQCR_SEQNUM_SEQMASK          0x3fff  /* sequence number goes here */
432*0aeed3e9SJustin Hibbits #define QM_EQCR_FQID_NULL               0   /* eg. for an ORP seqnum hole */
433*0aeed3e9SJustin Hibbits 
434*0aeed3e9SJustin Hibbits /* See 1.5.8.2: "Frame Dequeue Response" */
435*0aeed3e9SJustin Hibbits _Packed struct qm_dqrr_entry {
436*0aeed3e9SJustin Hibbits     volatile uint8_t        verb;
437*0aeed3e9SJustin Hibbits     volatile uint8_t        stat;
438*0aeed3e9SJustin Hibbits     volatile uint16_t       seqnum;    /* 15-bit */
439*0aeed3e9SJustin Hibbits     volatile uint8_t        tok;
440*0aeed3e9SJustin Hibbits     volatile uint8_t        reserved2[3];
441*0aeed3e9SJustin Hibbits     volatile uint32_t       fqid;    /* 24-bit */
442*0aeed3e9SJustin Hibbits     volatile uint32_t       contextB;
443*0aeed3e9SJustin Hibbits     volatile struct qm_fd   fd;
444*0aeed3e9SJustin Hibbits     volatile uint8_t        reserved4[32];
445*0aeed3e9SJustin Hibbits } _PackedType;
446*0aeed3e9SJustin Hibbits 
447*0aeed3e9SJustin Hibbits #define QM_DQRR_VERB_VBIT               0x80
448*0aeed3e9SJustin Hibbits #define QM_DQRR_VERB_MASK               0x7f    /* where the verb contains; */
449*0aeed3e9SJustin Hibbits #define QM_DQRR_VERB_FRAME_DEQUEUE      0x60    /* "this format" */
450*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FQ_EMPTY           0x80    /* FQ empty */
451*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FQ_HELDACTIVE      0x40    /* FQ held active */
452*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FQ_FORCEELIGIBLE   0x20    /* FQ was force-eligible'd */
453*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_FD_VALID           0x10    /* has a non-NULL FD */
454*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_UNSCHEDULED        0x02    /* Unscheduled dequeue */
455*0aeed3e9SJustin Hibbits #define QM_DQRR_STAT_DQCR_EXPIRED       0x01    /* VDQCR or PDQCR expired*/
456*0aeed3e9SJustin Hibbits 
457*0aeed3e9SJustin Hibbits #define VDQCR_DONE (QM_DQRR_STAT_UNSCHEDULED | QM_DQRR_STAT_DQCR_EXPIRED)
458*0aeed3e9SJustin Hibbits 
459*0aeed3e9SJustin Hibbits 
460*0aeed3e9SJustin Hibbits /* See 1.5.8.3: "ERN Message Response" */
461*0aeed3e9SJustin Hibbits /* See 1.5.8.4: "FQ State Change Notification" */
462*0aeed3e9SJustin Hibbits _Packed struct qm_mr_entry {
463*0aeed3e9SJustin Hibbits     volatile uint8_t verb;
464*0aeed3e9SJustin Hibbits     _Packed union {
465*0aeed3e9SJustin Hibbits         _Packed struct {
466*0aeed3e9SJustin Hibbits             volatile uint8_t dca;
467*0aeed3e9SJustin Hibbits             volatile uint16_t seqnum;
468*0aeed3e9SJustin Hibbits             volatile uint8_t rc;        /* Rejection Code */
469*0aeed3e9SJustin Hibbits             volatile uint32_t orp:24;
470*0aeed3e9SJustin Hibbits             volatile uint32_t fqid;    /* 24-bit */
471*0aeed3e9SJustin Hibbits             volatile uint32_t tag;
472*0aeed3e9SJustin Hibbits             volatile struct qm_fd fd;
473*0aeed3e9SJustin Hibbits         } _PackedType ern;
474*0aeed3e9SJustin Hibbits         _Packed struct {
475*0aeed3e9SJustin Hibbits             volatile uint8_t colour:2;    /* See QM_MR_DCERN_COLOUR_* */
476*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1:3;
477*0aeed3e9SJustin Hibbits             volatile enum qm_dc_portal portal:3;
478*0aeed3e9SJustin Hibbits             volatile uint16_t reserved2;
479*0aeed3e9SJustin Hibbits             volatile uint8_t rc;        /* Rejection Code */
480*0aeed3e9SJustin Hibbits             volatile uint32_t reserved3:24;
481*0aeed3e9SJustin Hibbits             volatile uint32_t fqid;    /* 24-bit */
482*0aeed3e9SJustin Hibbits             volatile uint32_t tag;
483*0aeed3e9SJustin Hibbits             volatile struct qm_fd fd;
484*0aeed3e9SJustin Hibbits         } _PackedType dcern;
485*0aeed3e9SJustin Hibbits         _Packed struct {
486*0aeed3e9SJustin Hibbits             volatile uint8_t fqs;        /* Frame Queue Status */
487*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1[6];
488*0aeed3e9SJustin Hibbits             volatile uint32_t fqid;    /* 24-bit */
489*0aeed3e9SJustin Hibbits             volatile uint32_t contextB;
490*0aeed3e9SJustin Hibbits             volatile uint8_t reserved2[16];
491*0aeed3e9SJustin Hibbits         } _PackedType fq;        /* FQRN/FQRNI/FQRL/FQPN */
492*0aeed3e9SJustin Hibbits     } _PackedType;
493*0aeed3e9SJustin Hibbits     volatile uint8_t reserved2[32];
494*0aeed3e9SJustin Hibbits } _PackedType;
495*0aeed3e9SJustin Hibbits 
496*0aeed3e9SJustin Hibbits #define QM_MR_VERB_VBIT            0x80
497*0aeed3e9SJustin Hibbits /* The "ern" VERB bits match QM_EQCR_VERB_*** so aren't reproduced here. ERNs
498*0aeed3e9SJustin Hibbits  * originating from direct-connect portals ("dcern") use 0x20 as a verb which
499*0aeed3e9SJustin Hibbits  * would be invalid as a s/w enqueue verb. A s/w ERN can be distinguished from
500*0aeed3e9SJustin Hibbits  * the other MR types by noting if the 0x20 bit is unset. */
501*0aeed3e9SJustin Hibbits #define QM_MR_VERB_TYPE_MASK        0x23
502*0aeed3e9SJustin Hibbits #define QM_MR_VERB_DC_ERN           0x20
503*0aeed3e9SJustin Hibbits #define QM_MR_VERB_FQRN             0x21
504*0aeed3e9SJustin Hibbits #define QM_MR_VERB_FQRNI            0x22
505*0aeed3e9SJustin Hibbits #define QM_MR_VERB_FQRL             0x23
506*0aeed3e9SJustin Hibbits #define QM_MR_VERB_FQPN             0x24
507*0aeed3e9SJustin Hibbits #define QM_MR_RC_MASK               0xf0    /* contains one of; */
508*0aeed3e9SJustin Hibbits #define QM_MR_RC_CGR_TAILDROP       0x00
509*0aeed3e9SJustin Hibbits #define QM_MR_RC_WRED               0x10
510*0aeed3e9SJustin Hibbits #define QM_MR_RC_ERROR              0x20
511*0aeed3e9SJustin Hibbits #define QM_MR_RC_ORPWINDOW_EARLY    0x30
512*0aeed3e9SJustin Hibbits #define QM_MR_RC_ORPWINDOW_LATE     0x40
513*0aeed3e9SJustin Hibbits #define QM_MR_RC_FQ_TAILDROP        0x50
514*0aeed3e9SJustin Hibbits #define QM_MR_RC_ORP_RETIRED        0x60
515*0aeed3e9SJustin Hibbits #define QM_MR_RC_ORP_DISABLE        0x70
516*0aeed3e9SJustin Hibbits #define QM_MR_FQS_ORLPRESENT        0x02    /* ORL fragments to come */
517*0aeed3e9SJustin Hibbits #define QM_MR_FQS_NOTEMPTY          0x01    /* FQ has enqueued frames */
518*0aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_GREEN    0x00
519*0aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_YELLOW   0x01
520*0aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_RED      0x02
521*0aeed3e9SJustin Hibbits #define QM_MR_DCERN_COLOUR_OVERRIDE 0x03
522*0aeed3e9SJustin Hibbits 
523*0aeed3e9SJustin Hibbits /* This identical structure of FQD fields is present in the "Init FQ" command
524*0aeed3e9SJustin Hibbits  * and the "Query FQ" result. It's suctioned out here into its own struct. It's
525*0aeed3e9SJustin Hibbits  * also used as the qman_query_fq() result structure in the high-level API. */
526*0aeed3e9SJustin Hibbits 
527*0aeed3e9SJustin Hibbits /* TODO What about OAC for intra-class? */
528*0aeed3e9SJustin Hibbits #define QM_FQD_TD_THRESH_OAC_EN     0x4000
529*0aeed3e9SJustin Hibbits 
530*0aeed3e9SJustin Hibbits _Packed struct qm_fqd {
531*0aeed3e9SJustin Hibbits     _Packed union {
532*0aeed3e9SJustin Hibbits         volatile uint8_t orpc;
533*0aeed3e9SJustin Hibbits         _Packed struct {
534*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1:2;
535*0aeed3e9SJustin Hibbits             volatile uint8_t orprws:3;
536*0aeed3e9SJustin Hibbits             volatile uint8_t oa:1;
537*0aeed3e9SJustin Hibbits             volatile uint8_t olws:2;
538*0aeed3e9SJustin Hibbits         } _PackedType;
539*0aeed3e9SJustin Hibbits     } _PackedType;
540*0aeed3e9SJustin Hibbits     volatile uint8_t cgid;
541*0aeed3e9SJustin Hibbits     volatile uint16_t fq_ctrl;    /* See QM_FQCTRL_<...> */
542*0aeed3e9SJustin Hibbits     _Packed union {
543*0aeed3e9SJustin Hibbits         volatile uint16_t dest_wq;
544*0aeed3e9SJustin Hibbits         _Packed struct {
545*0aeed3e9SJustin Hibbits             volatile uint16_t channel:13; /* enum qm_channel */
546*0aeed3e9SJustin Hibbits             volatile uint16_t wq:3;
547*0aeed3e9SJustin Hibbits         } _PackedType dest;
548*0aeed3e9SJustin Hibbits     } _PackedType;
549*0aeed3e9SJustin Hibbits     volatile uint16_t reserved2:1;
550*0aeed3e9SJustin Hibbits     volatile uint16_t ics_cred:15;
551*0aeed3e9SJustin Hibbits     _Packed union {
552*0aeed3e9SJustin Hibbits         volatile uint16_t td_thresh;
553*0aeed3e9SJustin Hibbits         _Packed struct {
554*0aeed3e9SJustin Hibbits             volatile uint16_t reserved1:3;
555*0aeed3e9SJustin Hibbits             volatile uint16_t mant:8;
556*0aeed3e9SJustin Hibbits             volatile uint16_t exp:5;
557*0aeed3e9SJustin Hibbits         } _PackedType td;
558*0aeed3e9SJustin Hibbits     } _PackedType;
559*0aeed3e9SJustin Hibbits     volatile uint32_t           context_b;
560*0aeed3e9SJustin Hibbits     volatile u_QmFqdContextA    context_a;
561*0aeed3e9SJustin Hibbits } _PackedType;
562*0aeed3e9SJustin Hibbits 
563*0aeed3e9SJustin Hibbits /* See 1.5.2.2: "Frame Queue Descriptor (FQD)" */
564*0aeed3e9SJustin Hibbits /* Frame Queue Descriptor (FQD) field 'fq_ctrl' uses these constants */
565*0aeed3e9SJustin Hibbits #define QM_FQCTRL_MASK          0x07ff    /* 'fq_ctrl' flags; */
566*0aeed3e9SJustin Hibbits #define QM_FQCTRL_CGE           0x0400    /* Congestion Group Enable */
567*0aeed3e9SJustin Hibbits #define QM_FQCTRL_TDE           0x0200    /* Tail-Drop Enable */
568*0aeed3e9SJustin Hibbits #define QM_FQCTRL_ORP           0x0100    /* ORP Enable */
569*0aeed3e9SJustin Hibbits #define QM_FQCTRL_CTXASTASHING  0x0080    /* Context-A stashing */
570*0aeed3e9SJustin Hibbits #define QM_FQCTRL_CPCSTASH      0x0040    /* CPC Stash Enable */
571*0aeed3e9SJustin Hibbits #define QM_FQCTRL_FORCESFDR     0x0008    /* High-priority SFDRs */
572*0aeed3e9SJustin Hibbits #define QM_FQCTRL_AVOIDBLOCK    0x0004    /* Don't block active */
573*0aeed3e9SJustin Hibbits #define QM_FQCTRL_HOLDACTIVE    0x0002    /* Hold active in portal */
574*0aeed3e9SJustin Hibbits #define QM_FQCTRL_LOCKINCACHE   0x0001    /* Aggressively cache FQD */
575*0aeed3e9SJustin Hibbits 
576*0aeed3e9SJustin Hibbits /* See 1.5.6.7.1: "FQD Context_A field used for [...] */
577*0aeed3e9SJustin Hibbits /* Frame Queue Descriptor (FQD) field 'CONTEXT_A' uses these constants */
578*0aeed3e9SJustin Hibbits #define QM_STASHING_EXCL_ANNOTATION     0x04
579*0aeed3e9SJustin Hibbits #define QM_STASHING_EXCL_DATA           0x02
580*0aeed3e9SJustin Hibbits #define QM_STASHING_EXCL_CONTEXT        0x01
581*0aeed3e9SJustin Hibbits 
582*0aeed3e9SJustin Hibbits /* See 1.5.8.4: "FQ State Change Notification" */
583*0aeed3e9SJustin Hibbits /* This struct represents the 32-bit "WR_PARM_[GYR]" parameters in CGR fields
584*0aeed3e9SJustin Hibbits  * and associated commands/responses. The WRED parameters are calculated from
585*0aeed3e9SJustin Hibbits  * these fields as follows;
586*0aeed3e9SJustin Hibbits  *   MaxTH = MA * (2 ^ Mn)
587*0aeed3e9SJustin Hibbits  *   Slope = SA / (2 ^ Sn)
588*0aeed3e9SJustin Hibbits  *    MaxP = 4 * (Pn + 1)
589*0aeed3e9SJustin Hibbits  */
590*0aeed3e9SJustin Hibbits _Packed struct qm_cgr_wr_parm {
591*0aeed3e9SJustin Hibbits     _Packed union {
592*0aeed3e9SJustin Hibbits         volatile uint32_t word;
593*0aeed3e9SJustin Hibbits         _Packed struct {
594*0aeed3e9SJustin Hibbits             volatile uint32_t MA:8;
595*0aeed3e9SJustin Hibbits             volatile uint32_t Mn:5;
596*0aeed3e9SJustin Hibbits             volatile uint32_t SA:7; /* must be between 64-127 */
597*0aeed3e9SJustin Hibbits             volatile uint32_t Sn:6;
598*0aeed3e9SJustin Hibbits             volatile uint32_t Pn:6;
599*0aeed3e9SJustin Hibbits         } _PackedType;
600*0aeed3e9SJustin Hibbits     } _PackedType;
601*0aeed3e9SJustin Hibbits } _PackedType;
602*0aeed3e9SJustin Hibbits 
603*0aeed3e9SJustin Hibbits /* This struct represents the 13-bit "CS_THRES" CGR field. In the corresponding
604*0aeed3e9SJustin Hibbits  * management commands, this is padded to a 16-bit structure field, so that's
605*0aeed3e9SJustin Hibbits  * how we represent it here. The congestion state threshold is calculated from
606*0aeed3e9SJustin Hibbits  * these fields as follows;
607*0aeed3e9SJustin Hibbits  *   CS threshold = TA * (2 ^ Tn)
608*0aeed3e9SJustin Hibbits  */
609*0aeed3e9SJustin Hibbits _Packed struct qm_cgr_cs_thres {
610*0aeed3e9SJustin Hibbits     volatile uint16_t reserved:3;
611*0aeed3e9SJustin Hibbits     volatile uint16_t TA:8;
612*0aeed3e9SJustin Hibbits     volatile uint16_t Tn:5;
613*0aeed3e9SJustin Hibbits } _PackedType;
614*0aeed3e9SJustin Hibbits 
615*0aeed3e9SJustin Hibbits /* This identical structure of CGR fields is present in the "Init/Modify CGR"
616*0aeed3e9SJustin Hibbits  * commands and the "Query CGR" result. It's suctioned out here into its own
617*0aeed3e9SJustin Hibbits  * struct. */
618*0aeed3e9SJustin Hibbits _Packed struct __qm_mc_cgr {
619*0aeed3e9SJustin Hibbits     volatile struct qm_cgr_wr_parm wr_parm_g;
620*0aeed3e9SJustin Hibbits     volatile struct qm_cgr_wr_parm wr_parm_y;
621*0aeed3e9SJustin Hibbits     volatile struct qm_cgr_wr_parm wr_parm_r;
622*0aeed3e9SJustin Hibbits     volatile uint8_t wr_en_g;    /* boolean, use QM_CGR_EN */
623*0aeed3e9SJustin Hibbits     volatile uint8_t wr_en_y;    /* boolean, use QM_CGR_EN */
624*0aeed3e9SJustin Hibbits     volatile uint8_t wr_en_r;    /* boolean, use QM_CGR_EN */
625*0aeed3e9SJustin Hibbits     volatile uint8_t cscn_en;    /* boolean, use QM_CGR_EN */
626*0aeed3e9SJustin Hibbits     volatile uint32_t cscn_targ;    /* use QM_CGR_TARG_* */
627*0aeed3e9SJustin Hibbits     volatile uint8_t cstd_en;    /* boolean, use QM_CGR_EN */
628*0aeed3e9SJustin Hibbits     volatile uint8_t cs;        /* boolean, only used in query response */
629*0aeed3e9SJustin Hibbits     volatile struct qm_cgr_cs_thres cs_thres;
630*0aeed3e9SJustin Hibbits     volatile uint8_t frame_mode;  /* boolean, use QM_CGR_EN */
631*0aeed3e9SJustin Hibbits } _PackedType;
632*0aeed3e9SJustin Hibbits 
633*0aeed3e9SJustin Hibbits #define QM_CGR_EN       0x01 /* For wr_en_*, cscn_en, cstd_en, frame_mode */
634*0aeed3e9SJustin Hibbits 
635*0aeed3e9SJustin Hibbits /* See 1.5.8.5.1: "Initialize FQ" */
636*0aeed3e9SJustin Hibbits /* See 1.5.8.5.2: "Query FQ" */
637*0aeed3e9SJustin Hibbits /* See 1.5.8.5.3: "Query FQ Non-Programmable Fields" */
638*0aeed3e9SJustin Hibbits /* See 1.5.8.5.4: "Alter FQ State Commands " */
639*0aeed3e9SJustin Hibbits /* See 1.5.8.6.1: "Initialize/Modify CGR" */
640*0aeed3e9SJustin Hibbits /* See 1.5.8.6.2: "Query CGR" */
641*0aeed3e9SJustin Hibbits /* See 1.5.8.6.3: "Query Congestion Group State" */
642*0aeed3e9SJustin Hibbits _Packed struct qm_mc_command {
643*0aeed3e9SJustin Hibbits     volatile uint8_t __dont_write_directly__verb;
644*0aeed3e9SJustin Hibbits     _Packed union {
645*0aeed3e9SJustin Hibbits         _Packed struct qm_mcc_initfq {
646*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1;
647*0aeed3e9SJustin Hibbits             volatile uint16_t we_mask;    /* Write Enable Mask */
648*0aeed3e9SJustin Hibbits             volatile uint32_t fqid;    /* 24-bit */
649*0aeed3e9SJustin Hibbits             volatile uint16_t count;    /* Initialises 'count+1' FQDs */
650*0aeed3e9SJustin Hibbits             volatile struct qm_fqd fqd; /* the FQD fields go here */
651*0aeed3e9SJustin Hibbits             volatile uint8_t reserved3[32];
652*0aeed3e9SJustin Hibbits         } _PackedType initfq;
653*0aeed3e9SJustin Hibbits         _Packed struct qm_mcc_queryfq {
654*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1[3];
655*0aeed3e9SJustin Hibbits             volatile uint32_t fqid;    /* 24-bit */
656*0aeed3e9SJustin Hibbits             volatile uint8_t reserved2[56];
657*0aeed3e9SJustin Hibbits         } _PackedType queryfq;
658*0aeed3e9SJustin Hibbits         _Packed struct qm_mcc_queryfq_np {
659*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1[3];
660*0aeed3e9SJustin Hibbits             volatile uint32_t fqid;    /* 24-bit */
661*0aeed3e9SJustin Hibbits             volatile uint8_t reserved2[56];
662*0aeed3e9SJustin Hibbits         } _PackedType queryfq_np;
663*0aeed3e9SJustin Hibbits         _Packed struct qm_mcc_alterfq {
664*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1[3];
665*0aeed3e9SJustin Hibbits             volatile uint32_t fqid;    /* 24-bit */
666*0aeed3e9SJustin Hibbits             volatile uint8_t reserved2[12];
667*0aeed3e9SJustin Hibbits             volatile uint32_t context_b;
668*0aeed3e9SJustin Hibbits             volatile uint8_t reserved3[40];
669*0aeed3e9SJustin Hibbits         } _PackedType alterfq;
670*0aeed3e9SJustin Hibbits         _Packed struct qm_mcc_initcgr {
671*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1;
672*0aeed3e9SJustin Hibbits             volatile uint16_t we_mask;    /* Write Enable Mask */
673*0aeed3e9SJustin Hibbits             volatile struct __qm_mc_cgr cgr;    /* CGR fields */
674*0aeed3e9SJustin Hibbits             volatile uint8_t reserved2[2];
675*0aeed3e9SJustin Hibbits             volatile uint8_t cgid;
676*0aeed3e9SJustin Hibbits             volatile uint8_t reserved4[32];
677*0aeed3e9SJustin Hibbits         } _PackedType initcgr;
678*0aeed3e9SJustin Hibbits         _Packed struct qm_mcc_querycgr {
679*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1[30];
680*0aeed3e9SJustin Hibbits             volatile uint8_t cgid;
681*0aeed3e9SJustin Hibbits             volatile uint8_t reserved2[32];
682*0aeed3e9SJustin Hibbits         } _PackedType querycgr;
683*0aeed3e9SJustin Hibbits         _Packed struct qm_mcc_querycongestion {
684*0aeed3e9SJustin Hibbits             volatile uint8_t reserved[63];
685*0aeed3e9SJustin Hibbits         } _PackedType querycongestion;
686*0aeed3e9SJustin Hibbits         _Packed struct qm_mcc_querywq {
687*0aeed3e9SJustin Hibbits             volatile uint8_t reserved;
688*0aeed3e9SJustin Hibbits             /* select channel if verb != QUERYWQ_DEDICATED */
689*0aeed3e9SJustin Hibbits             _Packed union {
690*0aeed3e9SJustin Hibbits                 volatile uint16_t channel_wq; /* ignores wq (3 lsbits) */
691*0aeed3e9SJustin Hibbits                 _Packed struct {
692*0aeed3e9SJustin Hibbits                     volatile uint16_t id:13; /* enum qm_channel */
693*0aeed3e9SJustin Hibbits                     volatile uint16_t reserved1:3;
694*0aeed3e9SJustin Hibbits                 } _PackedType channel;
695*0aeed3e9SJustin Hibbits             } _PackedType;
696*0aeed3e9SJustin Hibbits             volatile uint8_t reserved2[60];
697*0aeed3e9SJustin Hibbits         } _PackedType querywq;
698*0aeed3e9SJustin Hibbits     } _PackedType;
699*0aeed3e9SJustin Hibbits } _PackedType;
700*0aeed3e9SJustin Hibbits 
701*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_VBIT        0x80
702*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_MASK        0x7f    /* where the verb contains; */
703*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_INITFQ_PARKED   0x40
704*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_INITFQ_SCHED    0x41
705*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYFQ     0x44
706*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYFQ_NP      0x45    /* "non-programmable" fields */
707*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYWQ     0x46
708*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYWQ_DEDICATED   0x47
709*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_SCHED     0x48    /* Schedule FQ */
710*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_FE        0x49    /* Force Eligible FQ */
711*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_RETIRE    0x4a    /* Retire FQ */
712*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_OOS       0x4b    /* Take FQ out of service */
713*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_ALTER_RETIRE_CTXB 0x4c  /* Retire FQ with contextB*/
714*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_INITCGR         0x50
715*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_MODIFYCGR       0x51
716*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYCGR        0x58
717*0aeed3e9SJustin Hibbits #define QM_MCC_VERB_QUERYCONGESTION 0x59
718*0aeed3e9SJustin Hibbits /* INITFQ-specific flags */
719*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_MASK       0x01ff  /* 'Write Enable' flags; */
720*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_OAC        0x0100
721*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_ORPC       0x0080
722*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_CGID       0x0040
723*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_FQCTRL     0x0020
724*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_DESTWQ     0x0010
725*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_ICSCRED        0x0008
726*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_TDTHRESH       0x0004
727*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_CONTEXTB       0x0002
728*0aeed3e9SJustin Hibbits #define QM_INITFQ_WE_CONTEXTA       0x0001
729*0aeed3e9SJustin Hibbits /* INITCGR/MODIFYCGR-specific flags */
730*0aeed3e9SJustin Hibbits #define QM_CGR_WE_MASK          0x07ff  /* 'Write Enable Mask'; */
731*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_PARM_G     0x0400
732*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_PARM_Y     0x0200
733*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_PARM_R     0x0100
734*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_EN_G       0x0080
735*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_EN_Y       0x0040
736*0aeed3e9SJustin Hibbits #define QM_CGR_WE_WR_EN_R       0x0020
737*0aeed3e9SJustin Hibbits #define QM_CGR_WE_CSCN_EN       0x0010
738*0aeed3e9SJustin Hibbits #define QM_CGR_WE_CSCN_TARG     0x0008
739*0aeed3e9SJustin Hibbits #define QM_CGR_WE_CSTD_EN       0x0004
740*0aeed3e9SJustin Hibbits #define QM_CGR_WE_CS_THRES      0x0002
741*0aeed3e9SJustin Hibbits #define QM_CGR_WE_MODE          0x0001
742*0aeed3e9SJustin Hibbits 
743*0aeed3e9SJustin Hibbits /* See 1.5.8.5.1: "Initialize FQ" */
744*0aeed3e9SJustin Hibbits /* See 1.5.8.5.2: "Query FQ" */
745*0aeed3e9SJustin Hibbits /* See 1.5.8.5.3: "Query FQ Non-Programmable Fields" */
746*0aeed3e9SJustin Hibbits /* See 1.5.8.5.4: "Alter FQ State Commands " */
747*0aeed3e9SJustin Hibbits /* See 1.5.8.6.1: "Initialize/Modify CGR" */
748*0aeed3e9SJustin Hibbits /* See 1.5.8.6.2: "Query CGR" */
749*0aeed3e9SJustin Hibbits /* See 1.5.8.6.3: "Query Congestion Group State" */
750*0aeed3e9SJustin Hibbits _Packed struct qm_mc_result {
751*0aeed3e9SJustin Hibbits     volatile uint8_t verb;
752*0aeed3e9SJustin Hibbits     volatile uint8_t result;
753*0aeed3e9SJustin Hibbits     _Packed union {
754*0aeed3e9SJustin Hibbits         _Packed struct qm_mcr_initfq {
755*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1[62];
756*0aeed3e9SJustin Hibbits         } _PackedType initfq;
757*0aeed3e9SJustin Hibbits         _Packed struct qm_mcr_queryfq {
758*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1[8];
759*0aeed3e9SJustin Hibbits             volatile struct qm_fqd fqd;    /* the FQD fields are here */
760*0aeed3e9SJustin Hibbits             volatile uint16_t oac;
761*0aeed3e9SJustin Hibbits             volatile uint8_t reserved2[30];
762*0aeed3e9SJustin Hibbits         } _PackedType queryfq;
763*0aeed3e9SJustin Hibbits         _Packed struct qm_mcr_queryfq_np {
764*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1;
765*0aeed3e9SJustin Hibbits             volatile uint8_t state;    /* QM_MCR_NP_STATE_*** */
766*0aeed3e9SJustin Hibbits             volatile uint8_t reserved2;
767*0aeed3e9SJustin Hibbits             volatile uint32_t fqd_link:24;
768*0aeed3e9SJustin Hibbits             volatile uint16_t odp_seq;
769*0aeed3e9SJustin Hibbits             volatile uint16_t orp_nesn;
770*0aeed3e9SJustin Hibbits             volatile uint16_t orp_ea_hseq;
771*0aeed3e9SJustin Hibbits             volatile uint16_t orp_ea_tseq;
772*0aeed3e9SJustin Hibbits             volatile uint8_t reserved3;
773*0aeed3e9SJustin Hibbits             volatile uint32_t orp_ea_hptr:24;
774*0aeed3e9SJustin Hibbits             volatile uint8_t reserved4;
775*0aeed3e9SJustin Hibbits             volatile uint32_t orp_ea_tptr:24;
776*0aeed3e9SJustin Hibbits             volatile uint8_t reserved5;
777*0aeed3e9SJustin Hibbits             volatile uint32_t pfdr_hptr:24;
778*0aeed3e9SJustin Hibbits             volatile uint8_t reserved6;
779*0aeed3e9SJustin Hibbits             volatile uint32_t pfdr_tptr:24;
780*0aeed3e9SJustin Hibbits             volatile uint8_t reserved7[5];
781*0aeed3e9SJustin Hibbits             volatile uint8_t reserved8:7;
782*0aeed3e9SJustin Hibbits             volatile uint8_t is:1;
783*0aeed3e9SJustin Hibbits             volatile uint16_t ics_surp;
784*0aeed3e9SJustin Hibbits             volatile uint32_t byte_cnt;
785*0aeed3e9SJustin Hibbits             volatile uint8_t reserved9;
786*0aeed3e9SJustin Hibbits             volatile uint32_t frm_cnt:24;
787*0aeed3e9SJustin Hibbits             volatile uint32_t reserved10;
788*0aeed3e9SJustin Hibbits             volatile uint16_t ra1_sfdr;    /* QM_MCR_NP_RA1_*** */
789*0aeed3e9SJustin Hibbits             volatile uint16_t ra2_sfdr;    /* QM_MCR_NP_RA2_*** */
790*0aeed3e9SJustin Hibbits             volatile uint16_t reserved11;
791*0aeed3e9SJustin Hibbits             volatile uint16_t od1_sfdr;    /* QM_MCR_NP_OD1_*** */
792*0aeed3e9SJustin Hibbits             volatile uint16_t od2_sfdr;    /* QM_MCR_NP_OD2_*** */
793*0aeed3e9SJustin Hibbits             volatile uint16_t od3_sfdr;    /* QM_MCR_NP_OD3_*** */
794*0aeed3e9SJustin Hibbits         } _PackedType queryfq_np;
795*0aeed3e9SJustin Hibbits         _Packed struct qm_mcr_alterfq {
796*0aeed3e9SJustin Hibbits             volatile uint8_t fqs;        /* Frame Queue Status */
797*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1[61];
798*0aeed3e9SJustin Hibbits         } _PackedType alterfq;
799*0aeed3e9SJustin Hibbits         _Packed struct qm_mcr_initcgr {
800*0aeed3e9SJustin Hibbits             volatile uint8_t reserved1[62];
801*0aeed3e9SJustin Hibbits         } _PackedType initcgr;
802*0aeed3e9SJustin Hibbits         _Packed struct qm_mcr_querycgr {
803*0aeed3e9SJustin Hibbits             volatile uint16_t reserved1;
804*0aeed3e9SJustin Hibbits             volatile struct __qm_mc_cgr cgr; /* CGR fields */
805*0aeed3e9SJustin Hibbits             volatile uint8_t reserved2[3];
806*0aeed3e9SJustin Hibbits             volatile uint32_t reserved3:24;
807*0aeed3e9SJustin Hibbits             volatile uint32_t i_bcnt_hi:8;/* high 8-bits of 40-bit "Instant" */
808*0aeed3e9SJustin Hibbits             volatile uint32_t i_bcnt_lo;    /* low 32-bits of 40-bit */
809*0aeed3e9SJustin Hibbits             volatile uint32_t reserved4:24;
810*0aeed3e9SJustin Hibbits             volatile uint32_t a_bcnt_hi:8;/* high 8-bits of 40-bit "Average" */
811*0aeed3e9SJustin Hibbits             volatile uint32_t a_bcnt_lo;    /* low 32-bits of 40-bit */
812*0aeed3e9SJustin Hibbits             volatile uint32_t lgt;    /* Last Group Tick */
813*0aeed3e9SJustin Hibbits             volatile uint8_t reserved5[12];
814*0aeed3e9SJustin Hibbits         } _PackedType querycgr;
815*0aeed3e9SJustin Hibbits         _Packed struct qm_mcr_querycongestion {
816*0aeed3e9SJustin Hibbits             volatile uint8_t reserved[30];
817*0aeed3e9SJustin Hibbits             /* Access this struct using QM_MCR_QUERYCONGESTION() */
818*0aeed3e9SJustin Hibbits             _Packed struct __qm_mcr_querycongestion {
819*0aeed3e9SJustin Hibbits                 volatile uint32_t __state[8];
820*0aeed3e9SJustin Hibbits             } _PackedType state;
821*0aeed3e9SJustin Hibbits         } _PackedType querycongestion;
822*0aeed3e9SJustin Hibbits         _Packed struct qm_mcr_querywq {
823*0aeed3e9SJustin Hibbits             _Packed union {
824*0aeed3e9SJustin Hibbits                 volatile uint16_t channel_wq; /* ignores wq (3 lsbits) */
825*0aeed3e9SJustin Hibbits                 _Packed struct {
826*0aeed3e9SJustin Hibbits                     volatile uint16_t id:13; /* enum qm_channel */
827*0aeed3e9SJustin Hibbits                     volatile uint16_t reserved:3;
828*0aeed3e9SJustin Hibbits                 } _PackedType channel;
829*0aeed3e9SJustin Hibbits             } _PackedType;
830*0aeed3e9SJustin Hibbits             volatile uint8_t reserved[28];
831*0aeed3e9SJustin Hibbits             volatile uint32_t wq_len[8];
832*0aeed3e9SJustin Hibbits         } _PackedType querywq;
833*0aeed3e9SJustin Hibbits     } _PackedType;
834*0aeed3e9SJustin Hibbits } _PackedType;
835*0aeed3e9SJustin Hibbits 
836*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_RRID        0x80
837*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_MASK        QM_MCC_VERB_MASK
838*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_INITFQ_PARKED   QM_MCC_VERB_INITFQ_PARKED
839*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_INITFQ_SCHED    QM_MCC_VERB_INITFQ_SCHED
840*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYFQ     QM_MCC_VERB_QUERYFQ
841*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYFQ_NP      QM_MCC_VERB_QUERYFQ_NP
842*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYWQ     QM_MCC_VERB_QUERYWQ
843*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_QUERYWQ_DEDICATED   QM_MCC_VERB_QUERYWQ_DEDICATED
844*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_SCHED     QM_MCC_VERB_ALTER_SCHED
845*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_FE        QM_MCC_VERB_ALTER_FE
846*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_RETIRE    QM_MCC_VERB_ALTER_RETIRE
847*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_RETIRE_CTXB QM_MCC_VERB_ALTER_RETIRE_CTXB
848*0aeed3e9SJustin Hibbits #define QM_MCR_VERB_ALTER_OOS       QM_MCC_VERB_ALTER_OOS
849*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_NULL          0x00
850*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_OK            0xf0
851*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_FQID      0xf1
852*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_FQSTATE   0xf2
853*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_NOTEMPTY  0xf3    /* OOS fails if FQ is !empty */
854*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_BADCHANNEL    0xf4
855*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_PENDING       0xf8
856*0aeed3e9SJustin Hibbits #define QM_MCR_RESULT_ERR_BADCOMMAND    0xff
857*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_FE      0x10
858*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_R       0x08
859*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_MASK        0x07    /* Reads FQD::STATE; */
860*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_OOS     0x00
861*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_RETIRED     0x01
862*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_TEN_SCHED   0x02
863*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_TRU_SCHED   0x03
864*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_PARKED      0x04
865*0aeed3e9SJustin Hibbits #define QM_MCR_NP_STATE_ACTIVE      0x05
866*0aeed3e9SJustin Hibbits #define QM_MCR_NP_PTR_MASK      0x07ff  /* for RA[12] & OD[123] */
867*0aeed3e9SJustin Hibbits #define QM_MCR_NP_RA1_NRA(v)        (((v) >> 14) & 0x3) /* FQD::NRA */
868*0aeed3e9SJustin Hibbits #define QM_MCR_NP_RA2_IT(v)     (((v) >> 14) & 0x1) /* FQD::IT */
869*0aeed3e9SJustin Hibbits #define QM_MCR_NP_OD1_NOD(v)        (((v) >> 14) & 0x3) /* FQD::NOD */
870*0aeed3e9SJustin Hibbits #define QM_MCR_NP_OD3_NPC(v)        (((v) >> 14) & 0x3) /* FQD::NPC */
871*0aeed3e9SJustin Hibbits #define QM_MCR_FQS_ORLPRESENT       0x02    /* ORL fragments to come */
872*0aeed3e9SJustin Hibbits #define QM_MCR_FQS_NOTEMPTY     0x01    /* FQ has enqueued frames */
873*0aeed3e9SJustin Hibbits 
874*0aeed3e9SJustin Hibbits #define MEM_MAP_END
875*0aeed3e9SJustin Hibbits #if defined(__MWERKS__) && !defined(__GNUC__)
876*0aeed3e9SJustin Hibbits #pragma pack(pop)
877*0aeed3e9SJustin Hibbits #endif /* defined(__MWERKS__) && ... */
878*0aeed3e9SJustin Hibbits 
879*0aeed3e9SJustin Hibbits 
880*0aeed3e9SJustin Hibbits /* This extracts the state for congestion group 'n' from a query response.
881*0aeed3e9SJustin Hibbits  * Eg.
882*0aeed3e9SJustin Hibbits  *   uint8_t cgr = [...];
883*0aeed3e9SJustin Hibbits  *   struct qm_mc_result *res = [...];
884*0aeed3e9SJustin Hibbits  *   printf("congestion group %d congestion state: %d\n", cgr,
885*0aeed3e9SJustin Hibbits  *       QM_MCR_QUERYCONGESTION(&res->querycongestion.state, cgr));
886*0aeed3e9SJustin Hibbits  */
887*0aeed3e9SJustin Hibbits #define __CGR_WORD(num)        (num >> 5)
888*0aeed3e9SJustin Hibbits #define __CGR_SHIFT(num)    (num & 0x1f)
889*0aeed3e9SJustin Hibbits static __inline__ int QM_MCR_QUERYCONGESTION(struct __qm_mcr_querycongestion *p,
890*0aeed3e9SJustin Hibbits                     uint8_t cgr)
891*0aeed3e9SJustin Hibbits {
892*0aeed3e9SJustin Hibbits     return (int)(p->__state[__CGR_WORD(cgr)] & (0x80000000 >> __CGR_SHIFT(cgr)));
893*0aeed3e9SJustin Hibbits }
894*0aeed3e9SJustin Hibbits 
895*0aeed3e9SJustin Hibbits 
896*0aeed3e9SJustin Hibbits /*********************/
897*0aeed3e9SJustin Hibbits /* Utility interface */
898*0aeed3e9SJustin Hibbits /*********************/
899*0aeed3e9SJustin Hibbits 
900*0aeed3e9SJustin Hibbits /* Represents an allocator over a range of FQIDs. NB, accesses are not locked,
901*0aeed3e9SJustin Hibbits  * spinlock them yourself if needed. */
902*0aeed3e9SJustin Hibbits struct qman_fqid_pool;
903*0aeed3e9SJustin Hibbits 
904*0aeed3e9SJustin Hibbits /* Create/destroy a FQID pool, num must be a multiple of 32. NB, _destroy()
905*0aeed3e9SJustin Hibbits  * always succeeds, but returns non-zero if there were "leaked" FQID
906*0aeed3e9SJustin Hibbits  * allocations. */
907*0aeed3e9SJustin Hibbits struct qman_fqid_pool *qman_fqid_pool_create(uint32_t fqid_start, uint32_t num);
908*0aeed3e9SJustin Hibbits int qman_fqid_pool_destroy(struct qman_fqid_pool *pool);
909*0aeed3e9SJustin Hibbits /* Alloc/free a FQID from the range. _alloc() returns zero for success. */
910*0aeed3e9SJustin Hibbits int qman_fqid_pool_alloc(struct qman_fqid_pool *pool, uint32_t *fqid);
911*0aeed3e9SJustin Hibbits void qman_fqid_pool_free(struct qman_fqid_pool *pool, uint32_t fqid);
912*0aeed3e9SJustin Hibbits uint32_t qman_fqid_pool_used(struct qman_fqid_pool *pool);
913*0aeed3e9SJustin Hibbits 
914*0aeed3e9SJustin Hibbits /*******************************************************************/
915*0aeed3e9SJustin Hibbits /* Managed (aka "shared" or "mux/demux") portal, high-level i/face */
916*0aeed3e9SJustin Hibbits /*******************************************************************/
917*0aeed3e9SJustin Hibbits 
918*0aeed3e9SJustin Hibbits     /* Congestion Groups */
919*0aeed3e9SJustin Hibbits     /* ----------------- */
920*0aeed3e9SJustin Hibbits /* This wrapper represents a bit-array for the state of the 256 Qman congestion
921*0aeed3e9SJustin Hibbits  * groups. Is also used as a *mask* for congestion groups, eg. so we ignore
922*0aeed3e9SJustin Hibbits  * those that don't concern us. We harness the structure and accessor details
923*0aeed3e9SJustin Hibbits  * already used in the management command to query congestion groups. */
924*0aeed3e9SJustin Hibbits struct qman_cgrs {
925*0aeed3e9SJustin Hibbits     struct __qm_mcr_querycongestion q;
926*0aeed3e9SJustin Hibbits };
927*0aeed3e9SJustin Hibbits static __inline__ void QMAN_CGRS_INIT(struct qman_cgrs *c)
928*0aeed3e9SJustin Hibbits {
929*0aeed3e9SJustin Hibbits     memset(c, 0, sizeof(*c));
930*0aeed3e9SJustin Hibbits }
931*0aeed3e9SJustin Hibbits static __inline__ int QMAN_CGRS_GET(struct qman_cgrs *c, int num)
932*0aeed3e9SJustin Hibbits {
933*0aeed3e9SJustin Hibbits     return QM_MCR_QUERYCONGESTION(&c->q, (uint8_t)num);
934*0aeed3e9SJustin Hibbits }
935*0aeed3e9SJustin Hibbits static __inline__ void QMAN_CGRS_SET(struct qman_cgrs *c, int num)
936*0aeed3e9SJustin Hibbits {
937*0aeed3e9SJustin Hibbits     c->q.__state[__CGR_WORD(num)] |= (0x80000000 >> __CGR_SHIFT(num));
938*0aeed3e9SJustin Hibbits }
939*0aeed3e9SJustin Hibbits static __inline__ void QMAN_CGRS_UNSET(struct qman_cgrs *c, int num)
940*0aeed3e9SJustin Hibbits {
941*0aeed3e9SJustin Hibbits     c->q.__state[__CGR_WORD(num)] &= ~(0x80000000 >> __CGR_SHIFT(num));
942*0aeed3e9SJustin Hibbits }
943*0aeed3e9SJustin Hibbits 
944*0aeed3e9SJustin Hibbits     /* Portal and Frame Queues */
945*0aeed3e9SJustin Hibbits     /* ----------------------- */
946*0aeed3e9SJustin Hibbits 
947*0aeed3e9SJustin Hibbits /* This object type represents Qman frame queue descriptors (FQD), and is
948*0aeed3e9SJustin Hibbits  * stored within a cacheline passed to qman_new_fq(). */
949*0aeed3e9SJustin Hibbits struct qman_fq;
950*0aeed3e9SJustin Hibbits 
951*0aeed3e9SJustin Hibbits /* This enum, and the callback type that returns it, are used when handling
952*0aeed3e9SJustin Hibbits  * dequeued frames via DQRR. Note that for "null" callbacks registered with the
953*0aeed3e9SJustin Hibbits  * portal object (for handling dequeues that do not demux because contextB is
954*0aeed3e9SJustin Hibbits  * NULL), the return value *MUST* be qman_cb_dqrr_consume. */
955*0aeed3e9SJustin Hibbits enum qman_cb_dqrr_result {
956*0aeed3e9SJustin Hibbits     /* DQRR entry can be consumed */
957*0aeed3e9SJustin Hibbits     qman_cb_dqrr_consume,
958*0aeed3e9SJustin Hibbits     /* DQRR entry cannot be consumed now, pause until next poll request */
959*0aeed3e9SJustin Hibbits     qman_cb_dqrr_pause,
960*0aeed3e9SJustin Hibbits     /* Like _consume, but requests parking - FQ must be held-active */
961*0aeed3e9SJustin Hibbits     qman_cb_dqrr_park,
962*0aeed3e9SJustin Hibbits     /* Does not consume, for DCA mode only. This allows out-of-order
963*0aeed3e9SJustin Hibbits      * consumes by explicit calls to qman_dca() and/or the use of implicit
964*0aeed3e9SJustin Hibbits      * DCA via EQCR entries. */
965*0aeed3e9SJustin Hibbits     qman_cb_dqrr_defer
966*0aeed3e9SJustin Hibbits };
967*0aeed3e9SJustin Hibbits 
968*0aeed3e9SJustin Hibbits /*typedef enum qman_cb_dqrr_result (*qman_cb_dqrr)(t_Handle                   h_Arg,
969*0aeed3e9SJustin Hibbits                                                  t_Handle                   h_QmPortal,
970*0aeed3e9SJustin Hibbits                                                  struct qman_fq             *fq,
971*0aeed3e9SJustin Hibbits                                                  const struct qm_dqrr_entry *dqrr);*/
972*0aeed3e9SJustin Hibbits typedef t_QmReceivedFrameCallback * qman_cb_dqrr;
973*0aeed3e9SJustin Hibbits typedef t_QmReceivedFrameCallback * qman_cb_fqs;
974*0aeed3e9SJustin Hibbits typedef t_QmRejectedFrameCallback * qman_cb_ern;
975*0aeed3e9SJustin Hibbits /* This callback type is used when handling ERNs, FQRNs and FQRLs via MR. They
976*0aeed3e9SJustin Hibbits  * are always consumed after the callback returns. */
977*0aeed3e9SJustin Hibbits typedef void (*qman_cb_mr)(t_Handle                 h_Arg,
978*0aeed3e9SJustin Hibbits                            t_Handle                 h_QmPortal,
979*0aeed3e9SJustin Hibbits                            struct qman_fq           *fq,
980*0aeed3e9SJustin Hibbits                            const struct qm_mr_entry *msg);
981*0aeed3e9SJustin Hibbits 
982*0aeed3e9SJustin Hibbits struct qman_fq_cb {
983*0aeed3e9SJustin Hibbits     qman_cb_dqrr    dqrr;   /* for dequeued frames */
984*0aeed3e9SJustin Hibbits     qman_cb_ern     ern;   /* for s/w ERNs */
985*0aeed3e9SJustin Hibbits     qman_cb_mr      dc_ern; /* for diverted h/w ERNs */
986*0aeed3e9SJustin Hibbits     qman_cb_mr      fqs;    /* frame-queue state changes*/
987*0aeed3e9SJustin Hibbits };
988*0aeed3e9SJustin Hibbits 
989*0aeed3e9SJustin Hibbits enum qman_fq_state {
990*0aeed3e9SJustin Hibbits     qman_fq_state_oos,
991*0aeed3e9SJustin Hibbits     qman_fq_state_waiting_parked,
992*0aeed3e9SJustin Hibbits     qman_fq_state_parked,
993*0aeed3e9SJustin Hibbits     qman_fq_state_sched,
994*0aeed3e9SJustin Hibbits     qman_fq_state_retired
995*0aeed3e9SJustin Hibbits };
996*0aeed3e9SJustin Hibbits 
997*0aeed3e9SJustin Hibbits /* Flags to qman_create_portal() */
998*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_IRQ         0x00000001 /* use interrupt handler */
999*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_IRQ_FAST    0x00000002 /* ... for fast-path too! */
1000*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_IRQ_SLOW    0x00000003 /* ... for slow-path too! */
1001*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_DCA         0x00000004 /* use DCA */
1002*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_LOCKED      0x00000008 /* multi-core locking */
1003*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_NOTAFFINE   0x00000010 /* not cpu-default portal */
1004*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_RSTASH      0x00000020 /* enable DQRR entry stashing */
1005*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_DSTASH      0x00000040 /* enable data stashing */
1006*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_RECOVER     0x00000080 /* recovery mode */
1007*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_WAIT        0x00000100 /* for recovery; can wait */
1008*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_WAIT_INT    0x00000200 /* for wait; interruptible */
1009*0aeed3e9SJustin Hibbits #define QMAN_PORTAL_FLAG_CACHE       0x00000400 /* use cachable area for EQCR/DQRR */
1010*0aeed3e9SJustin Hibbits 
1011*0aeed3e9SJustin Hibbits /* Flags to qman_create_fq() */
1012*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_NO_ENQUEUE      0x00000001 /* can't enqueue */
1013*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_NO_MODIFY       0x00000002 /* can only enqueue */
1014*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_TO_DCPORTAL     0x00000004 /* consumed by CAAM/PME/Fman */
1015*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_LOCKED          0x00000008 /* multi-core locking */
1016*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_RECOVER         0x00000010 /* recovery mode */
1017*0aeed3e9SJustin Hibbits #define QMAN_FQ_FLAG_DYNAMIC_FQID    0x00000020 /* (de)allocate fqid */
1018*0aeed3e9SJustin Hibbits 
1019*0aeed3e9SJustin Hibbits /* Flags to qman_destroy_fq() */
1020*0aeed3e9SJustin Hibbits #define QMAN_FQ_DESTROY_PARKED       0x00000001 /* FQ can be parked or OOS */
1021*0aeed3e9SJustin Hibbits 
1022*0aeed3e9SJustin Hibbits /* Flags from qman_fq_state() */
1023*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_CHANGING       0x80000000 /* 'state' is changing */
1024*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_NE             0x40000000 /* retired FQ isn't empty */
1025*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_ORL            0x20000000 /* retired FQ has ORL */
1026*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_BLOCKOOS       0xe0000000 /* if any are set, no OOS */
1027*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_CGR_EN         0x10000000 /* CGR enabled */
1028*0aeed3e9SJustin Hibbits #define QMAN_FQ_STATE_VDQCR          0x08000000 /* being volatile dequeued */
1029*0aeed3e9SJustin Hibbits 
1030*0aeed3e9SJustin Hibbits /* Flags to qman_init_fq() */
1031*0aeed3e9SJustin Hibbits #define QMAN_INITFQ_FLAG_SCHED       0x00000001 /* schedule rather than park */
1032*0aeed3e9SJustin Hibbits #define QMAN_INITFQ_FLAG_NULL        0x00000002 /* zero 'contextB', no demux */
1033*0aeed3e9SJustin Hibbits #define QMAN_INITFQ_FLAG_LOCAL       0x00000004 /* set dest portal */
1034*0aeed3e9SJustin Hibbits 
1035*0aeed3e9SJustin Hibbits /* Flags to qman_volatile_dequeue() */
1036*0aeed3e9SJustin Hibbits #define QMAN_VOLATILE_FLAG_WAIT_INT  0x00000001 /* if we wait, interruptible? */
1037*0aeed3e9SJustin Hibbits #define QMAN_VOLATILE_FLAG_WAIT      0x00000002 /* wait if VDQCR is in use */
1038*0aeed3e9SJustin Hibbits #define QMAN_VOLATILE_FLAG_FINISH    0x00000004 /* wait till VDQCR completes */
1039*0aeed3e9SJustin Hibbits 
1040*0aeed3e9SJustin Hibbits /* Flags to qman_enqueue(). NB, the strange numbering is to align with
1041*0aeed3e9SJustin Hibbits  * hardware, bit-wise. */
1042*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WAIT       0x00010000 /* wait if EQCR is full */
1043*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WAIT_INT   0x00020000 /* if wait, interruptible? */
1044*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WAIT_SYNC  0x00040000 /* if wait, until consumed? */
1045*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_WATCH_CGR  0x00080000 /* watch congestion state */
1046*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_INTERRUPT  0x00000004 /* on command consumption */
1047*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_DCA        0x00008000 /* perform enqueue-DCA */
1048*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_DCA_PARK   0x00004000 /* If DCA, requests park */
1049*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_DCA_PTR(p)        /* If DCA, p is DQRR entry */ \
1050*0aeed3e9SJustin Hibbits         (((uint32_t)(p) << 2) & 0x00000f00)
1051*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_GREEN    0x00000000 /* choose one C_*** flag */
1052*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_YELLOW   0x00000008
1053*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_RED      0x00000010
1054*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_C_OVERRIDE 0x00000018
1055*0aeed3e9SJustin Hibbits /* For the ORP-specific qman_enqueue_orp() variant, this flag indicates "Not
1056*0aeed3e9SJustin Hibbits  * Last In Sequence", ie. a non-terminating fragment. */
1057*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_NLIS       0x01000000
1058*0aeed3e9SJustin Hibbits /* - this flag performs no enqueue but fills in an ORP sequence number that
1059*0aeed3e9SJustin Hibbits  *   would otherwise block it (eg. if a frame has been dropped). */
1060*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_HOLE       0x02000000
1061*0aeed3e9SJustin Hibbits /* - this flag performs no enqueue but advances NESN to the given sequence
1062*0aeed3e9SJustin Hibbits  *   number. */
1063*0aeed3e9SJustin Hibbits #define QMAN_ENQUEUE_FLAG_NESN       0x04000000
1064*0aeed3e9SJustin Hibbits 
1065*0aeed3e9SJustin Hibbits     /* FQ management */
1066*0aeed3e9SJustin Hibbits     /* ------------- */
1067*0aeed3e9SJustin Hibbits /**
1068*0aeed3e9SJustin Hibbits  * qman_free_fq - Deallocates a FQ
1069*0aeed3e9SJustin Hibbits  * @fq: the frame queue object to release
1070*0aeed3e9SJustin Hibbits  * @flags: bit-mask of QMAN_FQ_FREE_*** options
1071*0aeed3e9SJustin Hibbits  *
1072*0aeed3e9SJustin Hibbits  * The memory for this frame queue object ('mem' provided in qman_new_fq()) is
1073*0aeed3e9SJustin Hibbits  * not deallocated but the caller regains ownership, to do with as desired. The
1074*0aeed3e9SJustin Hibbits  * FQ must be in the 'out-of-service' state unless the QMAN_FQ_FREE_PARKED flag
1075*0aeed3e9SJustin Hibbits  * is specified, in which case it may also be in the 'parked' state.
1076*0aeed3e9SJustin Hibbits  */
1077*0aeed3e9SJustin Hibbits void qman_free_fq(struct qman_fq *fq, uint32_t flags);
1078*0aeed3e9SJustin Hibbits 
1079*0aeed3e9SJustin Hibbits /**
1080*0aeed3e9SJustin Hibbits  * qman_fq_fqid - Queries the frame queue ID of a FQ object
1081*0aeed3e9SJustin Hibbits  * @fq: the frame queue object to query
1082*0aeed3e9SJustin Hibbits  */
1083*0aeed3e9SJustin Hibbits uint32_t qman_fq_fqid(struct qman_fq *fq);
1084*0aeed3e9SJustin Hibbits 
1085*0aeed3e9SJustin Hibbits /**
1086*0aeed3e9SJustin Hibbits  * qman_fq_state - Queries the state of a FQ object
1087*0aeed3e9SJustin Hibbits  * @fq: the frame queue object to query
1088*0aeed3e9SJustin Hibbits  * @state: pointer to state enum to return the FQ scheduling state
1089*0aeed3e9SJustin Hibbits  * @flags: pointer to state flags to receive QMAN_FQ_STATE_*** bitmask
1090*0aeed3e9SJustin Hibbits  *
1091*0aeed3e9SJustin Hibbits  * Queries the state of the FQ object, without performing any h/w commands.
1092*0aeed3e9SJustin Hibbits  * This captures the state, as seen by the driver, at the time the function
1093*0aeed3e9SJustin Hibbits  * executes.
1094*0aeed3e9SJustin Hibbits  */
1095*0aeed3e9SJustin Hibbits void qman_fq_state(struct qman_fq *fq, enum qman_fq_state *state, uint32_t *flags);
1096*0aeed3e9SJustin Hibbits 
1097*0aeed3e9SJustin Hibbits #endif /* __FSL_QMAN_H */
1098