xref: /freebsd/sys/contrib/ncsw/Peripherals/QM/qm.h (revision 95eb4b873b6a8b527c5bd78d7191975dfca38998)
1 /******************************************************************************
2 
3  � 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc.
4  All rights reserved.
5 
6  This is proprietary source code of Freescale Semiconductor Inc.,
7  and its use is subject to the NetComm Device Drivers EULA.
8  The copyright notice above does not evidence any actual or intended
9  publication of such source code.
10 
11  ALTERNATIVELY, redistribution and use in source and binary forms, with
12  or without modification, are permitted provided that the following
13  conditions are met:
14      * Redistributions of source code must retain the above copyright
15        notice, this list of conditions and the following disclaimer.
16      * Redistributions in binary form must reproduce the above copyright
17        notice, this list of conditions and the following disclaimer in the
18        documentation and/or other materials provided with the distribution.
19      * Neither the name of Freescale Semiconductor nor the
20        names of its contributors may be used to endorse or promote products
21        derived from this software without specific prior written permission.
22 
23  THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
24  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26  DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
27  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  *
34 
35  **************************************************************************/
36 /******************************************************************************
37  @File          qm.h
38 
39  @Description   QM header
40 *//***************************************************************************/
41 #ifndef __QM_H
42 #define __QM_H
43 
44 #include "std_ext.h"
45 #include "list_ext.h"
46 #include "qm_ext.h"
47 #include "qman_private.h"
48 #include "qm_ipc.h"
49 
50 
51 #define __ERR_MODULE__  MODULE_QM
52 
53 #define QM_NUM_OF_SWP               10
54 #define QM_NUM_OF_DCP               5
55 
56 #define CACHELINE_SIZE              64
57 #define QM_CONTEXTA_MAX_STASH_SIZE  (3 * CACHELINE_SIZE)
58 
59 /**************************************************************************//**
60  @Description       Exceptions
61 *//***************************************************************************/
62 #define QM_EX_CORENET_INITIATOR_DATA                0x20000000
63 #define QM_EX_CORENET_TARGET_DATA                   0x10000000
64 #define QM_EX_CORENET_INVALID_TARGET_TRANSACTION    0x08000000
65 #define QM_EX_PFDR_THRESHOLD                        0x04000000
66 #define QM_EX_MULTI_ECC                             0x02000000
67 #define QM_EX_SINGLE_ECC                            0x01000000
68 #define QM_EX_PFDR_ENQUEUE_BLOCKED                  0x00800000
69 #define QM_EX_INVALID_COMMAND                       0x00010000
70 #define QM_EX_DEQUEUE_DCP                           0x00000800
71 #define QM_EX_DEQUEUE_FQ                            0x00000400
72 #define QM_EX_DEQUEUE_SOURCE                        0x00000200
73 #define QM_EX_DEQUEUE_QUEUE                         0x00000100
74 #define QM_EX_ENQUEUE_OVERFLOW                      0x00000008
75 #define QM_EX_ENQUEUE_STATE                         0x00000004
76 #define QM_EX_ENQUEUE_CHANNEL                       0x00000002
77 #define QM_EX_ENQUEUE_QUEUE                         0x00000001
78 
79 #define GET_EXCEPTION_FLAG(bitMask, exception)       switch(exception){ \
80     case e_QM_EX_CORENET_INITIATOR_DATA:                                \
81         bitMask = QM_EX_CORENET_INITIATOR_DATA; break;                  \
82     case e_QM_EX_CORENET_TARGET_DATA:                                   \
83         bitMask = QM_EX_CORENET_TARGET_DATA; break;                     \
84     case e_QM_EX_CORENET_INVALID_TARGET_TRANSACTION:                    \
85         bitMask = QM_EX_CORENET_INVALID_TARGET_TRANSACTION; break;      \
86     case e_QM_EX_PFDR_THRESHOLD:                                        \
87         bitMask = QM_EX_PFDR_THRESHOLD; break;                          \
88     case e_QM_EX_PFDR_ENQUEUE_BLOCKED:                                  \
89         bitMask = QM_EX_PFDR_ENQUEUE_BLOCKED; break;                    \
90     case e_QM_EX_SINGLE_ECC:                                            \
91         bitMask = QM_EX_SINGLE_ECC; break;                              \
92     case e_QM_EX_MULTI_ECC:                                             \
93         bitMask = QM_EX_MULTI_ECC; break;                               \
94     case e_QM_EX_INVALID_COMMAND:                                       \
95         bitMask = QM_EX_INVALID_COMMAND; break;                         \
96     case e_QM_EX_DEQUEUE_DCP:                                           \
97         bitMask = QM_EX_DEQUEUE_DCP; break;                             \
98     case e_QM_EX_DEQUEUE_FQ:                                            \
99         bitMask = QM_EX_DEQUEUE_FQ; break;                              \
100     case e_QM_EX_DEQUEUE_SOURCE:                                        \
101         bitMask = QM_EX_DEQUEUE_SOURCE; break;                          \
102     case e_QM_EX_DEQUEUE_QUEUE:                                         \
103         bitMask = QM_EX_DEQUEUE_QUEUE; break;                           \
104     case e_QM_EX_ENQUEUE_OVERFLOW:                                      \
105         bitMask = QM_EX_ENQUEUE_OVERFLOW; break;                        \
106     case e_QM_EX_ENQUEUE_STATE:                                         \
107         bitMask = QM_EX_ENQUEUE_STATE; break;                           \
108     case e_QM_EX_ENQUEUE_CHANNEL:                                       \
109         bitMask = QM_EX_ENQUEUE_CHANNEL; break;                         \
110     case e_QM_EX_ENQUEUE_QUEUE:                                         \
111         bitMask = QM_EX_ENQUEUE_QUEUE; break;                           \
112     default: bitMask = 0;break;}
113 
114 /**************************************************************************//**
115  @Description       defaults
116 *//***************************************************************************/
117 /* QM defaults */
118 #define DEFAULT_exceptions                      ((uint32_t)(QM_EX_CORENET_INITIATOR_DATA                | \
119                                                             QM_EX_CORENET_TARGET_DATA                   | \
120                                                             QM_EX_CORENET_INVALID_TARGET_TRANSACTION    | \
121                                                             QM_EX_PFDR_THRESHOLD                        | \
122                                                             QM_EX_SINGLE_ECC                            | \
123                                                             QM_EX_MULTI_ECC                             | \
124                                                             QM_EX_PFDR_ENQUEUE_BLOCKED                  | \
125                                                             QM_EX_INVALID_COMMAND                       | \
126                                                             QM_EX_DEQUEUE_DCP                           | \
127                                                             QM_EX_DEQUEUE_FQ                            | \
128                                                             QM_EX_DEQUEUE_SOURCE                        | \
129                                                             QM_EX_DEQUEUE_QUEUE                         | \
130                                                             QM_EX_ENQUEUE_OVERFLOW                      | \
131                                                             QM_EX_ENQUEUE_STATE                         | \
132                                                             QM_EX_ENQUEUE_CHANNEL                       | \
133                                                             QM_EX_ENQUEUE_QUEUE                         ))
134 #define DEFAULT_rtFramesDepth                   30000
135 #define DEFAULT_pfdrThreshold                   0
136 #define DEFAULT_sfdrThreshold                   0
137 #define DEFAULT_pfdrBaseConstant                64
138 /* Corenet initiator settings. Stash request queues are 4-deep to match cores'
139     ability to snart. Stash priority is 3, other priorities are 2. */
140 #define DEFAULT_initiatorSrcciv     0
141 #define DEFAULT_initiatorSrqW       3
142 #define DEFAULT_initiatorRwW        2
143 #define DEFAULT_initiatorBmanW      2
144 
145 
146 /* QM-Portal defaults */
147 #define DEFAULT_dequeueDcaMode                  FALSE
148 #define DEFAULT_dequeueUpToThreeFrames          TRUE
149 #define DEFAULT_dequeueCommandType              e_QM_PORTAL_PRIORITY_PRECEDENCE_INTRA_CLASS_SCHEDULING
150 #define DEFAULT_dequeueUserToken                0xab
151 #define DEFAULT_dequeueSpecifiedWq              FALSE
152 #define DEFAULT_dequeueDedicatedChannel         TRUE
153 #define DEFAULT_dequeuePoolChannelId            0
154 #define DEFAULT_dequeueWqId                     0
155 #define DEFAULT_dequeueDedicatedChannelHasPrecedenceOverPoolChannels    TRUE
156 #define DEFAULT_dqrrSize                        DQRR_MAXFILL
157 #define DEFAULT_pullMode                        FALSE
158 #define DEFAULT_portalExceptions                ((uint32_t)(QM_PIRQ_EQCI | \
159                                                             QM_PIRQ_EQRI | \
160                                                             QM_PIRQ_DQRI | \
161                                                             QM_PIRQ_MRI  | \
162                                                             QM_PIRQ_CSCI))
163 
164 /**************************************************************************//**
165  @Description       Memory Mapped Registers
166 *//***************************************************************************/
167 
168 #if defined(__MWERKS__) && !defined(__GNUC__)
169 #pragma pack(push,1)
170 #endif /* defined(__MWERKS__) && ... */
171 #define MEM_MAP_START
172 
173 typedef _Packed struct
174 {
175      /* QMan Software Portal Configuration Registers */
176     _Packed struct {
177         volatile uint32_t   lio_cfg;                /**< QMan Software Portal LIO Configuration */
178         volatile uint32_t   io_cfg;                 /**< QMan Software Portal 0 IO Configuration */
179         volatile uint8_t    res1[4];                /**< reserved */
180         volatile uint32_t   dd_cfg;                 /**< Software Portal Dynamic Debug Configuration */
181     } _PackedType swpConfRegs[QM_NUM_OF_SWP];
182     volatile uint8_t    res1[352];                  /**< reserved */
183 
184     /* Dynamic Debug (DD) Configuration Registers */
185     volatile uint32_t   qman_dd_cfg;                /**< QMan Dynamic Debug (DD) Configuration */
186     volatile uint8_t    res2[12];                   /**< reserved */
187     volatile uint32_t   qcsp_dd_ihrsr;              /**< Software Portal DD Internal Halt Request Status */
188     volatile uint32_t   qcsp_dd_ihrfr;              /**< Software Portal DD Internal Halt Request Force */
189     volatile uint32_t   qcsp_dd_hasr;               /**< Software Portal DD Halt Acknowledge Status */
190     volatile uint8_t    res3[4];                    /**< reserved */
191     volatile uint32_t   dcp_dd_ihrsr;               /**< DCP DD Internal Halt Request Status */
192     volatile uint32_t   dcp_dd_ihrfr;               /**< DCP DD Internal Halt Request Force */
193     volatile uint32_t   dcp_dd_hasr;                /**< DCP DD Halt Acknowledge Status */
194     volatile uint8_t    res4[212];                  /**< reserved */
195 
196     /* Direct Connect Portal (DCP) Configuration Registers */
197     _Packed struct {
198         volatile uint32_t   cfg;                    /**< DCP Configuration */
199         volatile uint32_t   dd_cfg;                 /**< DCP Dynamic Debug Configuration */
200         volatile uint32_t   dlm_cfg;                /**< DCP Dequeue Latency Monitor Configuration */
201         volatile uint32_t   dlm_avg;                /**< DCP Dequeue Latency Monitor Average */
202     } _PackedType dcpConfRegs[QM_NUM_OF_DCP];
203     volatile uint8_t    res5[176];                  /**< reserved */
204 
205     /* Packed Frame Descriptor Record (PFDR) Manager Query Registers */
206     volatile uint32_t   pfdr_fpc;                   /**< PFDR Free Pool Count */
207     volatile uint32_t   pfdr_fp_head;               /**< PFDR Free Pool Head Pointer */
208     volatile uint32_t   pfdr_fp_tail;               /**< PFDR Free Pool Tail Pointer */
209     volatile uint8_t    res6[4];                    /**< reserved */
210     volatile uint32_t   pfdr_fp_lwit;               /**< PFDR Free Pool Low Watermark Interrupt Threshold */
211     volatile uint32_t   pfdr_cfg;                   /**< PFDR Configuration */
212     volatile uint8_t    res7[232];                  /**< reserved */
213 
214     /* Single Frame Descriptor Record (SFDR) Manager Registers */
215     volatile uint32_t   sfdr_cfg;                   /**< SFDR Configuration */
216     volatile uint32_t   sfdr_in_use;                /**< SFDR In Use Register */
217     volatile uint8_t    res8[248];                  /**< reserved */
218 
219     /* Work Queue Semaphore and Context Manager Registers */
220     volatile uint32_t   wq_cs_cfg[6];               /**< Work Queue Class Scheduler Configuration */
221     volatile uint8_t    res9[24];                   /**< reserved */
222     volatile uint32_t   wq_def_enq_wqid;            /**< Work Queue Default Enqueue WQID */
223     volatile uint8_t    res10[12];                   /**< reserved */
224     volatile uint32_t   wq_sc_dd_cfg[5];            /**< WQ S/W Channel Dynamic Debug Config */
225     volatile uint8_t    res11[44];                  /**< reserved */
226     volatile uint32_t   wq_pc_dd_cs_cfg[8];         /**< WQ Pool Channel Dynamic Debug Config */
227     volatile uint8_t    res12[32];                  /**< reserved */
228     volatile uint32_t   wq_dc0_dd_cs_cfg[6];        /**< WQ DCP0 Chan. Dynamic Debug Config */
229     volatile uint8_t    res13[40];                  /**< reserved */
230     volatile uint32_t   wq_dc1_dd_cs_cfg[6];        /**< WQ DCP1 Chan. Dynamic Debug Config */
231     volatile uint8_t    res14[40];                  /**< reserved */
232     volatile uint32_t   wq_dc2_dd_cs_cfg;           /**< WQ DCP2 Chan. Dynamic Debug Config */
233     volatile uint8_t    res15[60];                  /**< reserved */
234     volatile uint32_t   wq_dc3_dd_cs_cfg;           /**< WQ DCP3 Chan. Dynamic Debug Config */
235     volatile uint8_t    res16[124];                 /**< reserved */
236 
237     /* Congestion Manager (CM) Registers */
238     volatile uint32_t   cm_cfg;                     /**< CM Configuration Register */
239     volatile uint8_t    res17[508];                 /**< reserved */
240 
241     /* QMan Error Capture Registers */
242     volatile uint32_t   ecsr;                       /**< QMan Error Capture Status Register */
243     volatile uint32_t   ecir;                       /**< QMan Error Capture Information Register */
244     volatile uint32_t   eadr;                       /**< QMan Error Capture Address Register */
245     volatile uint8_t    res18[4];                   /**< reserved */
246     volatile uint32_t   edata[16];                  /**< QMan ECC Error Data Register */
247     volatile uint8_t    res19[32];                  /**< reserved */
248     volatile uint32_t   sbet;                       /**< QMan Single Bit ECC Error Threshold Register */
249     volatile uint8_t    res20[12];                  /**< reserved */
250     volatile uint32_t   sbec[7];                    /**< QMan Single Bit ECC Error Count Register */
251     volatile uint8_t    res21[100];                 /**< reserved */
252 
253     /* QMan Initialization and Debug Control Registers */
254     volatile uint32_t   mcr;                        /**< QMan Management Command/Result Register */
255     volatile uint32_t   mcp0;                       /**< QMan Management Command Parameter 0 Register */
256     volatile uint32_t   mcp1;                       /**< QMan Management Command Parameter 1 Register */
257     volatile uint8_t    res22[20];                  /**< reserved */
258     volatile uint32_t   mr[16];                     /**< QMan Management Return Register */
259     volatile uint8_t    res23[148];                 /**< reserved */
260     volatile uint32_t   idle_stat;                  /**< QMan Idle Status Register */
261 
262     /* QMan ID/Revision Registers */
263     volatile uint32_t   ip_rev_1;                   /**< QMan IP Block Revision 1 register */
264     volatile uint32_t   ip_rev_2;                   /**< QMan IP Block Revision 2 register */
265 
266     /* QMan Initiator Interface Memory Window Configuration Registers */
267     volatile uint32_t   fqd_bare;                   /**< FQD Extended Base Address Register */
268     volatile uint32_t   fqd_bar;                    /**< Frame Queue Descriptor (FQD) Base Address Register */
269     volatile uint8_t    res24[8];                   /**< reserved */
270     volatile uint32_t   fqd_ar;                     /**< FQD Attributes Register */
271     volatile uint8_t    res25[12];                  /**< reserved */
272     volatile uint32_t   pfdr_bare;                  /**< PFDR Extended Base Address Register */
273     volatile uint32_t   pfdr_bar;                   /**< Packed Frame Descriptor Record (PFDR) Base Addr */
274     volatile uint8_t    res26[8];                   /**< reserved */
275     volatile uint32_t   pfdr_ar;                    /**< PFDR Attributes Register */
276     volatile uint8_t    res27[76];                  /**< reserved */
277     volatile uint32_t   qcsp_bare;                  /**< QCSP Extended Base Address */
278     volatile uint32_t   qcsp_bar;                   /**< QMan Software Portal Base Address */
279     volatile uint8_t    res28[120];                 /**< reserved */
280     volatile uint32_t   ci_sched_cfg;               /**< Initiator Scheduling Configuration */
281     volatile uint32_t   srcidr;                     /**< QMan Source ID Register */
282     volatile uint32_t   liodnr;                     /**< QMan Logical I/O Device Number Register */
283     volatile uint8_t    res29[4];                   /**< reserved */
284     volatile uint32_t   ci_rlm_cfg;                 /**< Initiator Read Latency Monitor Configuration */
285     volatile uint32_t   ci_rlm_avg;                 /**< Initiator Read Latency Monitor Average */
286     volatile uint8_t    res30[232];                 /**< reserved */
287 
288     /* QMan Interrupt and Error Registers */
289     volatile uint32_t   err_isr;                    /**< QMan Error Interrupt Status Register */
290     volatile uint32_t   err_ier;                    /**< QMan Error Interrupt Enable Register */
291     volatile uint32_t   err_isdr;                   /**< QMan Error Interrupt Status Disable Register */
292     volatile uint32_t   err_iir;                    /**< QMan Error Interrupt Inhibit Register */
293     volatile uint8_t    res31[4];                   /**< reserved */
294     volatile uint32_t   err_her;                    /**< QMan Error Halt Enable Register */
295 
296 } _PackedType t_QmRegs;
297 
298 #define MEM_MAP_END
299 #if defined(__MWERKS__) && !defined(__GNUC__)
300 #pragma pack(pop)
301 #endif /* defined(__MWERKS__) && ... */
302 
303 
304 /**************************************************************************//**
305  @Description       General defines
306 *//***************************************************************************/
307 
308 #define MODULE_NAME_SIZE            30
309 
310 #define PORTALS_OFFSET_CE(portal)   (0x4000 * portal)
311 #define PORTALS_OFFSET_CI(portal)   (0x1000 * portal)
312 
313 #define PFDR_ENTRY_SIZE             64 /* 64 bytes */
314 #define FQD_ENTRY_SIZE              64 /* 64 bytes */
315 
316 /* Compilation constants */
317 #define DQRR_MAXFILL        15
318 #define EQCR_THRESH         1    /* reread h/w CI when running out of space */
319 
320 /**************************************************************************//**
321  @Description       Register defines
322 *//***************************************************************************/
323 
324 /* Assists for QMAN_MCR */
325 #define MCR_INIT_PFDR               0x01000000
326 #define MCR_get_rslt(v)             (uint8_t)((v) >> 24)
327 #define MCR_rslt_idle(r)            (!rslt || (rslt >= 0xf0))
328 #define MCR_rslt_ok(r)              (rslt == 0xf0)
329 #define MCR_rslt_eaccess(r)         (rslt == 0xf8)
330 #define MCR_rslt_inval(r)           (rslt == 0xff)
331 
332 /* masks */
333 #define REV1_MAJOR_MASK             0x0000FF00
334 #define REV1_MINOR_MASK             0x000000FF
335 
336 #define REV2_INTEG_MASK             0x00FF0000
337 #define REV2_ERR_MASK               0x0000FF00
338 #define REV2_CFG_MASK               0x000000FF
339 
340 #define AR_ENABLE                   0x80000000
341 #define AR_PRIORITY                 0x40000000
342 #define AR_STASH                    0x20000000
343 #define AR_SIZE_MASK                0x0000003f
344 
345 #define ECIR_PORTAL_TYPE            0x20000000
346 #define ECIR_PORTAL_MASK            0x1f000000
347 #define ECIR_FQID_MASK              0x00ffffff
348 
349 #define CI_SCHED_CFG_EN             0x80000000
350 /* shifts */
351 #define REV1_MAJOR_SHIFT            8
352 #define REV1_MINOR_SHIFT            0
353 
354 #define REV2_INTEG_SHIFT            16
355 #define REV2_ERR_SHIFT              8
356 #define REV2_CFG_SHIFT              0
357 
358 #define AR_SIZE_SHIFT               0
359 
360 #define ECIR_PORTAL_SHIFT           24
361 #define ECIR_FQID_SHIFT             0
362 
363 #define CI_SCHED_CFG_SRCCIV_SHIFT   24
364 #define CI_SCHED_CFG_SRQ_W_SHIFT    8
365 #define CI_SCHED_CFG_RW_W_SHIFT     4
366 #define CI_SCHED_CFG_BMAN_W_SHIFT   0
367 
368 
369 /********* CGR ******************************/
370 #define QM_CGR_TARG_FIRST_SWPORTAL     0x80000000
371 #define QM_CGR_TARG_FIRST_DCPORTAL     0x00200000
372 #define QM_CGR_TARGET_SWP(portlaId)    (QM_CGR_TARG_FIRST_SWPORTAL >> portlaId)
373 #define QM_CGR_TARGET_DCP(portlaId)    (QM_CGR_TARG_FIRST_DCPORTAL >> portlaId)
374 
375 
376 #define QM_DCP_CFG_ED               0x00000100
377 /*
378 #define CGR_VALID                       0x80
379 #define CGR_VERB_INIT                   0x50
380 #define CGR_VERB_MODIFY                 0x51
381 #define CGR_WRITE_ALL                   0x07FF
382 #define CGR_WRITE_ENABLE_CSCN           0x0010
383 #define CGR_WRITE_ENABLE_GREEN_MODIFY   0x0380
384 #define CGR_WRITE_ENABLE_YELLOW_MODIFY  0x0240
385 #define CGR_WRITE_ENABLE_RED_MODIFY     0x0120
386 
387 
388 #define CGR_MODE_BYTE               0x00
389 #define CGR_MODE_FRAME              0x01
390 #define GCR_ENABLE_WRED             0x01
391 #define GCR_ENABLE_TD               0x01
392 #define GCR_ENABLE_CSCN             0x01
393 */
394 
395 
396 /* Lock/unlock frame queues, subject to the "UNLOCKED" flag. This is about
397  * inter-processor locking only. */
398 #define FQLOCK(fq)                              \
399     do {                                        \
400         if (fq->flags & QMAN_FQ_FLAG_LOCKED)    \
401             XX_LockSpinlock(&fq->fqlock);       \
402     } while(0)
403 #define FQUNLOCK(fq)                            \
404     do {                                        \
405         if (fq->flags & QMAN_FQ_FLAG_LOCKED)    \
406             XX_UnlockSpinlock(&fq->fqlock);     \
407     } while(0)
408 
409 /* Lock/unlock portals, subject to "UNLOCKED" flag. This is about disabling
410  * interrupts/preemption and, if FLAG_UNLOCKED isn't defined, inter-processor
411  * locking as well. */
412 #define NCSW_PLOCK(p) ((t_QmPortal*)(p))->irq_flags = XX_DisableAllIntr()
413 #define PUNLOCK(p) XX_RestoreAllIntr(((t_QmPortal*)(p))->irq_flags)
414 
415 
416 typedef void  (t_QmLoopDequeueRing)(t_Handle h_QmPortal);
417 
418 /* Follows WQ_CS_CFG0-5 */
419 typedef enum {
420     e_QM_WQ_SW_PORTALS = 0,
421     e_QM_WQ_POOLS,
422     e_QM_WQ_DCP0,
423     e_QM_WQ_DCP1,
424     e_QM_WQ_DCP2,
425     e_QM_WQ_DCP3
426 } e_QmWqClass;
427 
428 typedef enum {
429     e_QM_PORTAL_NO_DEQUEUES = 0,
430     e_QM_PORTAL_PRIORITY_PRECEDENCE_INTRA_CLASS_SCHEDULING,
431     e_QM_PORTAL_ACTIVE_FQ_PRECEDENCE_INTRA_CLASS_SCHEDULING,
432     e_QM_PORTAL_ACTIVE_FQ_PRECEDENCE_OVERRIDE_INTRA_CLASS_SCHEDULING
433 } e_QmPortalDequeueCommandType;
434 
435 typedef enum e_QmInterModuleCounters {
436     e_QM_IM_COUNTERS_SFDR_IN_USE = 0,
437     e_QM_IM_COUNTERS_PFDR_IN_USE,
438     e_QM_IM_COUNTERS_PFDR_FREE_POOL
439 } e_QmInterModuleCounters;
440 
441 typedef struct t_QmInterModulePortalInitParams {
442     uint8_t             portalId;
443     uint8_t             stashDestQueue;
444     uint16_t            liodn;
445     uint16_t            dqrrLiodn;
446     uint16_t            fdFqLiodn;
447 } t_QmInterModulePortalInitParams;
448 
449 typedef struct t_QmCg {
450     t_Handle                h_Qm;
451     t_Handle                h_QmPortal;
452     t_QmExceptionsCallback  *f_Exception;
453     t_Handle                h_App;
454     uint8_t                 id;
455 } t_QmCg;
456 
457 typedef struct {
458     uintptr_t                   swPortalsBaseAddress;   /**< QM Software Portals Base Address (virtual) */
459     uint32_t                    partFqidBase;
460     uint32_t                    partNumOfFqids;
461     uint32_t                    totalNumOfFqids;
462     uint32_t                    rtFramesDepth;
463     uint32_t                    fqdMemPartitionId;
464     uint32_t                    pfdrMemPartitionId;
465     uint32_t                    pfdrThreshold;
466     uint32_t                    sfdrThreshold;
467     uint32_t                    pfdrBaseConstant;
468     uint16_t                    liodn;
469     t_QmDcPortalParams          dcPortalsParams[DPAA_MAX_NUM_OF_DC_PORTALS];
470 } t_QmDriverParams;
471 
472 typedef struct {
473     uint8_t                     guestId;
474     t_Handle                    h_RsrvFqidMm;
475     t_Handle                    h_FqidMm;
476     t_Handle                    h_Session;
477     char                        moduleName[MODULE_NAME_SIZE];
478     t_Handle                    h_Portals[DPAA_MAX_NUM_OF_SW_PORTALS];
479     t_QmRegs                    *p_QmRegs;
480     uint32_t                    *p_FqdBase;
481     uint32_t                    *p_PfdrBase;
482     uint32_t                    exceptions;
483     t_QmExceptionsCallback      *f_Exception;
484     t_Handle                    h_App;
485     uintptr_t                   errIrq;                 /**< error interrupt line; NO_IRQ if interrupts not used */
486     uint32_t                    numOfPfdr;
487     uint16_t                    partNumOfCgs;
488     uint16_t                    partCgsBase;
489     uint8_t                     cgsUsed[QM_MAX_NUM_OF_CGS];
490 t_Handle lock;
491     t_QmDriverParams            *p_QmDriverParams;
492 } t_Qm;
493 
494 typedef struct {
495     uint32_t                        hwExtStructsMemAttr;
496     uint8_t                         dqrrSize;
497     bool                            pullMode;
498     bool                            dequeueDcaMode;
499     bool                            dequeueUpToThreeFrames;
500     e_QmPortalDequeueCommandType    commandType;
501     uint8_t                         userToken;
502     bool                            specifiedWq;
503     bool                            dedicatedChannel;
504     bool                            dedicatedChannelHasPrecedenceOverPoolChannels;
505     uint8_t                         poolChannels[QM_MAX_NUM_OF_POOL_CHANNELS];
506     uint8_t                         poolChannelId;
507     uint8_t                         wqId;
508     uint16_t                        fdLiodnOffset;
509     uint8_t                         stashDestQueue;
510     uint8_t                         eqcr;
511     bool                            eqcrHighPri;
512     bool                            dqrr;
513     uint16_t                        dqrrLiodn;
514     bool                            dqrrHighPri;
515     bool                            fdFq;
516     uint16_t                        fdFqLiodn;
517     bool                            fdFqHighPri;
518     bool                            fdFqDrop;
519 } t_QmPortalDriverParams;
520 
521 /*typedef struct t_QmPortalCgs{
522     uint32_t    cgsMask[QM_MAX_NUM_OF_CGS/32];
523 }t_QmPortalCgs;
524 */
525 typedef struct t_QmPortal {
526     t_Handle                    h_Qm;
527     struct qm_portal            *p_LowQmPortal;
528     uint32_t                    bits;    /* PORTAL_BITS_*** - dynamic, strictly internal */
529     t_Handle                    h_App;
530     t_QmLoopDequeueRing         *f_LoopDequeueRingCB;
531     bool                        pullMode;
532     /* To avoid overloading the term "flags", we use these 2; */
533     uint32_t                    options;    /* QMAN_PORTAL_FLAG_*** - static, caller-provided */
534     uint32_t                    irq_flags;
535     /* The wrap-around eq_[prod|cons] counters are used to support
536      * QMAN_ENQUEUE_FLAG_WAIT_SYNC. */
537     uint32_t                    eqProd;
538     volatile int                disable_count;
539     struct qman_cgrs            cgrs[2]; /* 2-element array. cgrs[0] is mask, cgrs[1] is previous snapshot. */
540     /* If we receive a DQRR or MR ring entry for a "null" FQ, ie. for which
541      * FQD::contextB is NULL rather than pointing to a FQ object, we use
542      * these handlers. (This is not considered a fast-path mechanism.) */
543     t_Handle                    cgsHandles[QM_MAX_NUM_OF_CGS];
544     struct qman_fq_cb           *p_NullCB;
545     t_QmReceivedFrameCallback   *f_DfltFrame;
546     t_QmRejectedFrameCallback   *f_RejectedFrame;
547     t_QmPortalDriverParams      *p_QmPortalDriverParams;
548 } t_QmPortal;
549 
550 struct qman_fq {
551     struct qman_fq_cb   cb;
552     t_Handle            h_App;
553     t_Handle            h_QmFqr;
554     t_Handle            fqlock;
555     uint32_t            fqid;
556     uint32_t            fqidOffset;
557     uint32_t            flags;
558     /* s/w-visible states. Ie. tentatively scheduled + truly scheduled +
559      * active + held-active + held-suspended are just "sched". Things like
560      * 'retired' will not be assumed until it is complete (ie.
561      * QMAN_FQ_STATE_CHANGING is set until then, to indicate it's completing
562      * and to gate attempts to retry the retire command). Note, park
563      * commands do not set QMAN_FQ_STATE_CHANGING because it's technically
564      * impossible in the case of enqueue DCAs (which refer to DQRR ring
565      * index rather than the FQ that ring entry corresponds to), so repeated
566      * park commands are allowed (if you're silly enough to try) but won't
567      * change FQ state, and the resulting park notifications move FQs from
568      * 'sched' to 'parked'. */
569     enum qman_fq_state  state;
570     int                 cgr_groupid;
571 };
572 
573 typedef struct {
574     t_Handle                    h_Qm;
575     t_Handle                    h_QmPortal;
576     e_QmFQChannel               channel;
577     uint8_t                     workQueue;
578     bool                        shadowMode;
579     uint32_t                    fqidBase;
580     uint32_t                    numOfFqids;
581     t_QmFqrDrainedCompletionCB  *f_CompletionCB;
582     t_Handle                    h_App;
583     uint32_t                    numOfDrainedFqids;
584     bool                        *p_DrainedFqs;
585     struct qman_fq              **p_Fqs;
586 } t_QmFqr;
587 
588 
589 /****************************************/
590 /*       Inter-Module functions         */
591 /****************************************/
592 uint32_t QmGetCounter(t_Handle h_Qm, e_QmInterModuleCounters counter);
593 t_Error  QmGetRevision(t_Handle h_Qm, t_QmRevisionInfo *p_QmRevisionInfo);
594 t_Error  QmGetSetPortalParams(t_Handle h_Qm, t_QmInterModulePortalInitParams *p_PortalParams);
595 t_Error  QmFreeDcPortal(t_Handle h_Qm, e_DpaaDcPortal dcPortalId);
596 uint32_t QmFqidGet(t_Qm *p_Qm, uint32_t size, uint32_t alignment, bool force, uint32_t base);
597 t_Error  QmFqidPut(t_Qm *p_Qm, uint32_t base);
598 t_Error  QmGetCgId(t_Handle h_Qm, uint8_t *p_CgId);
599 t_Error  QmFreeCgId(t_Handle h_Qm, uint8_t cgId);
600 
601 
602 static __inline__ void QmSetPortalHandle(t_Handle h_Qm, t_Handle h_Portal, e_DpaaSwPortal portalId)
603 {
604     ASSERT_COND(!((t_Qm*)h_Qm)->h_Portals[portalId] || !h_Portal);
605     ((t_Qm*)h_Qm)->h_Portals[portalId] = h_Portal;
606 }
607 
608 static __inline__ t_Handle QmGetPortalHandle(t_Handle h_Qm)
609 {
610     t_Qm        *p_Qm       = (t_Qm*)h_Qm;
611 
612     ASSERT_COND(p_Qm);
613     return p_Qm->h_Portals[CORE_GetId()];
614 }
615 
616 static __inline__ uint32_t GenerateCgrThresh(uint64_t val, int roundup)
617 {
618     uint32_t e = 0;    /* co-efficient, exponent */
619     uint32_t oddbit = 0;
620     while(val > 0xff) {
621         oddbit = (uint32_t)val & 1;
622         val >>= 1;
623         e++;
624         if(roundup && oddbit)
625             val++;
626     }
627     return (uint32_t)((val << 5) | e);
628 }
629 
630 static __inline__ t_Error SetException(t_Qm *p_Qm, e_QmExceptions exception, bool enable)
631 {
632     uint32_t            bitMask = 0;
633 
634     ASSERT_COND(p_Qm);
635 
636     GET_EXCEPTION_FLAG(bitMask, exception);
637     if(bitMask)
638     {
639         if (enable)
640             p_Qm->exceptions |= bitMask;
641         else
642             p_Qm->exceptions &= ~bitMask;
643    }
644     else
645         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
646 
647     return E_OK;
648 }
649 
650 
651 #endif /* __QM_H */
652