blob: 23a45413bc008b96076e112cf5faf6cc4b8e90ec [file] [log] [blame]
Wolfgang Denkba94a1b2006-05-30 15:56:48 +02001/**
2 * @file IxQMgr.h
3 *
4 * @date 30-Oct-2001
5 *
6 * @brief This file contains the public API of IxQMgr component.
7 *
8 * Some functions contained in this module are inline to achieve better
9 * data-path performance. For this to work, the function definitions are
10 * contained in this header file. The "normal" use of inline functions
11 * is to use the inline functions in the module in which they are
12 * defined. In this case these inline functions are used in external
13 * modules and therefore the use of "inline extern". What this means
14 * is as follows: if a function foo is declared as "inline extern" this
15 * definition is only used for inlining, in no case is the function
16 * compiled on its own. If the compiler cannot inline the function it
17 * becomes an external reference. Therefore in IxQMgrQAccess.c all
18 * inline functions are defined without the "inline extern" specifier
19 * and so define the external references. In all other source files
20 * including this header file, these funtions are defined as "inline
21 * extern".
22 *
23 *
24 * @par
25 * IXP400 SW Release version 2.0
26 *
27 * -- Copyright Notice --
28 *
29 * @par
30 * Copyright 2001-2005, Intel Corporation.
31 * All rights reserved.
32 *
33 * @par
Wolfgang Denkcb3761e2013-07-28 22:12:47 +020034 * SPDX-License-Identifier: BSD-3-Clause
Wolfgang Denkba94a1b2006-05-30 15:56:48 +020035 * @par
36 * -- End of Copyright Notice --
37*/
38
39/* ------------------------------------------------------
40 Doxygen group definitions
41 ------------------------------------------------------ */
42/**
43 * @defgroup IxQMgrAPI IXP400 Queue Manager (IxQMgr) API
44 *
45 * @brief The public API for the IXP400 QMgr component.
46 *
47 * IxQMgr is a low level interface to the AHB Queue Manager
48 *
49 * @{
50 */
51
52#ifndef IXQMGR_H
53#define IXQMGR_H
54
55/*
56 * User defined include files
57 */
58
59#include "IxOsal.h"
60
61/*
62 * Define QMgr's IoMem macros, in DC mode if in LE
63 * regular if in BE. (Note: For Linux LSP gold release
64 * may need to adjust mode.
65 */
66#if defined (__BIG_ENDIAN)
67
68#define IX_QMGR_INLINE_READ_LONG IX_OSAL_READ_LONG_BE
69#define IX_QMGR_INLINE_WRITE_LONG IX_OSAL_WRITE_LONG_BE
70
71#else
72
73#define IX_QMGR_INLINE_READ_LONG IX_OSAL_READ_LONG_LE_DC
74#define IX_QMGR_INLINE_WRITE_LONG IX_OSAL_WRITE_LONG_LE_DC
75
76#endif
77
78/*
79 * #defines and macros
80 */
81
82/**
83*
84* @ingroup IxQMgrAPI
85*
86* @def IX_QMGR_INLINE
87*
88* @brief Inline definition, for inlining of Queue Access functions on API
89*
90* Please read the header information in this file for more details on the
91* use of function inlining in this component.
92*
93*/
94
95#ifndef __wince
96
97#ifdef IXQMGRQACCESS_C
98/* If IXQMGRQACCESS_C is set then the IxQmgrQAccess.c is including this file
99 and must instantiate a concrete definition for each inlineable API function
100 whether or not that function actually gets inlined. */
101# ifdef NO_INLINE_APIS
102# undef NO_INLINE_APIS
103# endif
104# define IX_QMGR_INLINE /* Empty Define */
105#else
106# ifndef NO_INLINE_APIS
107# define IX_QMGR_INLINE IX_OSAL_INLINE_EXTERN
108# else
109# define IX_QMGR_INLINE /* Empty Define */
110# endif
111#endif
112
113#else /* ndef __wince */
114
115# ifndef NO_INLINE_APIS
116# define NO_INLINE_APIS
117# endif
118# define IX_QMGR_INLINE
119
120#endif
121
122
123/**
124*
125* @ingroup IxQMgrAPI
126*
127* @def IX_QMGR_MAX_NUM_QUEUES
128*
129* @brief Number of queues supported by the AQM.
130*
131* This constant is used to indicate the number of AQM queues
132*
133*/
134#define IX_QMGR_MAX_NUM_QUEUES 64
135
136/**
137*
138* @ingroup IxQMgrAPI
139*
140* @def IX_QMGR_MIN_QID
141*
142* @brief Minimum queue identifier.
143*
144* This constant is used to indicate the smallest queue identifier
145*
146*/
147#define IX_QMGR_MIN_QID IX_QMGR_QUEUE_0
148
149/**
150*
151* @ingroup IxQMgrAPI
152*
153* @def IX_QMGR_MAX_QID
154*
155* @brief Maximum queue identifier.
156*
157* This constant is used to indicate the largest queue identifier
158*
159*/
160#define IX_QMGR_MAX_QID IX_QMGR_QUEUE_63
161
162/**
163*
164* @ingroup IxQMgrAPI
165*
166* @def IX_QMGR_MIN_QUEUPP_QID
167*
168* @brief Minimum queue identifier for reduced functionality queues.
169*
170* This constant is used to indicate Minimum queue identifier for reduced
171* functionality queues
172*
173*/
174#define IX_QMGR_MIN_QUEUPP_QID 32
175
176/**
177*
178* @ingroup IxQMgrAPI
179*
180* @def IX_QMGR_MAX_QNAME_LEN
181*
182* @brief Maximum queue name length.
183*
184* This constant is used to indicate the maximum null terminated string length
185* (excluding '\0') for a queue name
186*
187*/
188#define IX_QMGR_MAX_QNAME_LEN 16
189
190/**
191 *
192 * @ingroup IxQMgrAPI
193 *
194 * @def IX_QMGR_WARNING
195 *
196 * @brief Warning return code.
197 *
198 * Execution complete, but there is a special case to handle
199 *
200 */
201#define IX_QMGR_WARNING 2
202
203/**
204 *
205 * @ingroup IxQMgrAPI
206 *
207 * @def IX_QMGR_PARAMETER_ERROR
208 *
209 * @brief Parameter error return code (NULL pointer etc..).
210 *
211 * parameter error out of range/invalid
212 *
213 */
214#define IX_QMGR_PARAMETER_ERROR 3
215
216/**
217 *
218 * @ingroup IxQMgrAPI
219 *
220 * @def IX_QMGR_INVALID_Q_ENTRY_SIZE
221 *
222 * @brief Invalid entry size return code.
223 *
224 * Invalid queue entry size for a queue read/write
225 *
226 */
227#define IX_QMGR_INVALID_Q_ENTRY_SIZE 4
228
229/**
230 *
231 * @ingroup IxQMgrAPI
232 *
233 * @def IX_QMGR_INVALID_Q_ID
234 *
235 * @brief Invalid queue identifier return code.
236 *
237 * Invalid queue id, not in range 0-63
238 *
239 */
240#define IX_QMGR_INVALID_Q_ID 5
241
242/**
243 *
244 * @ingroup IxQMgrAPI
245 *
246 * @def IX_QMGR_INVALID_CB_ID
247 *
248 * @brief Invalid callback identifier return code.
249 *
250 * Invalid callback id
251 */
252#define IX_QMGR_INVALID_CB_ID 6
253
254/**
255 *
256 * @ingroup IxQMgrAPI
257 *
258 * @def IX_QMGR_CB_ALREADY_SET
259 *
260 * @brief Callback set error return code.
261 *
262 * The specified callback has already been for this queue
263 *
264 */
265#define IX_QMGR_CB_ALREADY_SET 7
266
267/**
268 *
269 * @ingroup IxQMgrAPI
270 *
271 * @def IX_QMGR_NO_AVAILABLE_SRAM
272 *
273 * @brief Sram consumed return code.
274 *
275 * All AQM Sram is consumed by queue configuration
276 *
277 */
278#define IX_QMGR_NO_AVAILABLE_SRAM 8
279
280/**
281 *
282 * @ingroup IxQMgrAPI
283 *
284 * @def IX_QMGR_INVALID_INT_SOURCE_ID
285 *
286 * @brief Invalid queue interrupt source identifier return code.
287 *
288 * Invalid queue interrupt source given for notification enable
289 */
290#define IX_QMGR_INVALID_INT_SOURCE_ID 9
291
292/**
293 *
294 * @ingroup IxQMgrAPI
295 *
296 * @def IX_QMGR_INVALID_QSIZE
297 *
298 * @brief Invalid queue size error code.
299 *
300 * Invalid queue size not one of 16,32, 64, 128
301 *
302 *
303 */
304#define IX_QMGR_INVALID_QSIZE 10
305
306/**
307 *
308 * @ingroup IxQMgrAPI
309 *
310 * @def IX_QMGR_INVALID_Q_WM
311 *
312 * @brief Invalid queue watermark return code.
313 *
314 * Invalid queue watermark given for watermark set
315 */
316#define IX_QMGR_INVALID_Q_WM 11
317
318/**
319 *
320 * @ingroup IxQMgrAPI
321 *
322 * @def IX_QMGR_Q_NOT_CONFIGURED
323 *
324 * @brief Queue not configured return code.
325 *
326 * Returned to the client when a function has been called on an unconfigured
327 * queue
328 *
329 */
330#define IX_QMGR_Q_NOT_CONFIGURED 12
331
332/**
333 *
334 * @ingroup IxQMgrAPI
335 *
336 * @def IX_QMGR_Q_ALREADY_CONFIGURED
337 *
338 * @brief Queue already configured return code.
339 *
340 * Returned to client to indicate that a queue has already been configured
341 */
342#define IX_QMGR_Q_ALREADY_CONFIGURED 13
343
344/**
345 *
346 * @ingroup IxQMgrAPI
347 *
348 * @def IX_QMGR_Q_UNDERFLOW
349 *
350 * @brief Underflow return code.
351 *
352 * Underflow on a queue read has occurred
353 *
354 */
355#define IX_QMGR_Q_UNDERFLOW 14
356
357/**
358 *
359 * @ingroup IxQMgrAPI
360 *
361 * @def IX_QMGR_Q_OVERFLOW
362 *
363 * @brief Overflow return code.
364 *
365 * Overflow on a queue write has occurred
366 *
367 */
368#define IX_QMGR_Q_OVERFLOW 15
369
370/**
371 *
372 * @ingroup IxQMgrAPI
373 *
374 * @def IX_QMGR_Q_INVALID_PRIORITY
375 *
376 * @brief Invalid priority return code.
377 *
378 * Invalid priority, not one of 0,1,2
379 */
380#define IX_QMGR_Q_INVALID_PRIORITY 16
381
382/**
383 *
384 * @ingroup IxQMgrAPI
385 *
386 * @def IX_QMGR_ENTRY_INDEX_OUT_OF_BOUNDS
387 *
388 * @brief Entry index out of bounds return code.
389 *
390 * Entry index is greater than number of entries in queue.
391 */
392#define IX_QMGR_ENTRY_INDEX_OUT_OF_BOUNDS 17
393
394/**
395 *
396 * @ingroup IxQMgrAPI
397 *
398 * @def ixQMgrDispatcherLoopRun
399 *
400 * @brief Map old function name ixQMgrDispatcherLoopRun ()
401 * to @ref ixQMgrDispatcherLoopRunA0 ().
402 *
403 */
404#define ixQMgrDispatcherLoopRun ixQMgrDispatcherLoopRunA0
405
406
407/**
408 *
409 * @ingroup IxQMgrAPI
410 *
411 * @def IX_QMGR_QUEUE
412 *
413 * @brief Definition of AQM queue numbers
414 *
415 */
416#define IX_QMGR_QUEUE_0 (0) /**< Queue Number 0 */
417#define IX_QMGR_QUEUE_1 (1) /**< Queue Number 1 */
418#define IX_QMGR_QUEUE_2 (2) /**< Queue Number 2 */
419#define IX_QMGR_QUEUE_3 (3) /**< Queue Number 3 */
420#define IX_QMGR_QUEUE_4 (4) /**< Queue Number 4 */
421#define IX_QMGR_QUEUE_5 (5) /**< Queue Number 5 */
422#define IX_QMGR_QUEUE_6 (6) /**< Queue Number 6 */
423#define IX_QMGR_QUEUE_7 (7) /**< Queue Number 7 */
424#define IX_QMGR_QUEUE_8 (8) /**< Queue Number 8 */
425#define IX_QMGR_QUEUE_9 (9) /**< Queue Number 9 */
426#define IX_QMGR_QUEUE_10 (10) /**< Queue Number 10 */
427#define IX_QMGR_QUEUE_11 (11) /**< Queue Number 11 */
428#define IX_QMGR_QUEUE_12 (12) /**< Queue Number 12 */
429#define IX_QMGR_QUEUE_13 (13) /**< Queue Number 13 */
430#define IX_QMGR_QUEUE_14 (14) /**< Queue Number 14 */
431#define IX_QMGR_QUEUE_15 (15) /**< Queue Number 15 */
432#define IX_QMGR_QUEUE_16 (16) /**< Queue Number 16 */
433#define IX_QMGR_QUEUE_17 (17) /**< Queue Number 17 */
434#define IX_QMGR_QUEUE_18 (18) /**< Queue Number 18 */
435#define IX_QMGR_QUEUE_19 (19) /**< Queue Number 19 */
436#define IX_QMGR_QUEUE_20 (20) /**< Queue Number 20 */
437#define IX_QMGR_QUEUE_21 (21) /**< Queue Number 21 */
438#define IX_QMGR_QUEUE_22 (22) /**< Queue Number 22 */
439#define IX_QMGR_QUEUE_23 (23) /**< Queue Number 23 */
440#define IX_QMGR_QUEUE_24 (24) /**< Queue Number 24 */
441#define IX_QMGR_QUEUE_25 (25) /**< Queue Number 25 */
442#define IX_QMGR_QUEUE_26 (26) /**< Queue Number 26 */
443#define IX_QMGR_QUEUE_27 (27) /**< Queue Number 27 */
444#define IX_QMGR_QUEUE_28 (28) /**< Queue Number 28 */
445#define IX_QMGR_QUEUE_29 (29) /**< Queue Number 29 */
446#define IX_QMGR_QUEUE_30 (30) /**< Queue Number 30 */
447#define IX_QMGR_QUEUE_31 (31) /**< Queue Number 31 */
448#define IX_QMGR_QUEUE_32 (32) /**< Queue Number 32 */
449#define IX_QMGR_QUEUE_33 (33) /**< Queue Number 33 */
450#define IX_QMGR_QUEUE_34 (34) /**< Queue Number 34 */
451#define IX_QMGR_QUEUE_35 (35) /**< Queue Number 35 */
452#define IX_QMGR_QUEUE_36 (36) /**< Queue Number 36 */
453#define IX_QMGR_QUEUE_37 (37) /**< Queue Number 37 */
454#define IX_QMGR_QUEUE_38 (38) /**< Queue Number 38 */
455#define IX_QMGR_QUEUE_39 (39) /**< Queue Number 39 */
456#define IX_QMGR_QUEUE_40 (40) /**< Queue Number 40 */
457#define IX_QMGR_QUEUE_41 (41) /**< Queue Number 41 */
458#define IX_QMGR_QUEUE_42 (42) /**< Queue Number 42 */
459#define IX_QMGR_QUEUE_43 (43) /**< Queue Number 43 */
460#define IX_QMGR_QUEUE_44 (44) /**< Queue Number 44 */
461#define IX_QMGR_QUEUE_45 (45) /**< Queue Number 45 */
462#define IX_QMGR_QUEUE_46 (46) /**< Queue Number 46 */
463#define IX_QMGR_QUEUE_47 (47) /**< Queue Number 47 */
464#define IX_QMGR_QUEUE_48 (48) /**< Queue Number 48 */
465#define IX_QMGR_QUEUE_49 (49) /**< Queue Number 49 */
466#define IX_QMGR_QUEUE_50 (50) /**< Queue Number 50 */
467#define IX_QMGR_QUEUE_51 (51) /**< Queue Number 51 */
468#define IX_QMGR_QUEUE_52 (52) /**< Queue Number 52 */
469#define IX_QMGR_QUEUE_53 (53) /**< Queue Number 53 */
470#define IX_QMGR_QUEUE_54 (54) /**< Queue Number 54 */
471#define IX_QMGR_QUEUE_55 (55) /**< Queue Number 55 */
472#define IX_QMGR_QUEUE_56 (56) /**< Queue Number 56 */
473#define IX_QMGR_QUEUE_57 (57) /**< Queue Number 57 */
474#define IX_QMGR_QUEUE_58 (58) /**< Queue Number 58 */
475#define IX_QMGR_QUEUE_59 (59) /**< Queue Number 59 */
476#define IX_QMGR_QUEUE_60 (60) /**< Queue Number 60 */
477#define IX_QMGR_QUEUE_61 (61) /**< Queue Number 61 */
478#define IX_QMGR_QUEUE_62 (62) /**< Queue Number 62 */
479#define IX_QMGR_QUEUE_63 (63) /**< Queue Number 63 */
480#define IX_QMGR_QUEUE_INVALID (64) /**< AQM Queue Number Delimiter */
481
482
483/*
484 * Typedefs
485 */
486
487/**
488 * @typedef IxQMgrQId
489 *
490 * @ingroup IxQMgrAPI
491 *
492 * @brief Used in the API to identify the AQM queues.
493 *
494 */
495typedef int IxQMgrQId;
496
497/**
498 * @typedef IxQMgrQStatus
499 *
500 * @ingroup IxQMgrAPI
501 *
502 * @brief Queue status.
503 *
504 * A queues status is defined by its relative fullness or relative emptiness.
505 * Each of the queues 0-31 have Nearly Empty, Nearly Full, Empty, Full,
506 * Underflow and Overflow status flags. Queues 32-63 have just Nearly Empty and
507 * Full status flags.
508 * The flags bit positions are outlined below:
509 *
510 * OF - bit-5<br>
511 * UF - bit-4<br>
512 * F - bit-3<br>
513 * NF - bit-2<br>
514 * NE - bit-1<br>
515 * E - bit-0<br>
516 *
517 */
518typedef UINT32 IxQMgrQStatus;
519
520/**
521 * @enum IxQMgrQStatusMask
522 *
523 * @ingroup IxQMgrAPI
524 *
525 * @brief Queue status mask.
526 *
527 * Masks for extracting the individual status flags from the IxQMgrStatus
528 * word.
529 *
530 */
531typedef enum
532{
533 IX_QMGR_Q_STATUS_E_BIT_MASK = 0x1,
534 IX_QMGR_Q_STATUS_NE_BIT_MASK = 0x2,
535 IX_QMGR_Q_STATUS_NF_BIT_MASK = 0x4,
536 IX_QMGR_Q_STATUS_F_BIT_MASK = 0x8,
537 IX_QMGR_Q_STATUS_UF_BIT_MASK = 0x10,
538 IX_QMGR_Q_STATUS_OF_BIT_MASK = 0x20
539} IxQMgrQStatusMask;
540
541/**
542 * @enum IxQMgrSourceId
543 *
544 * @ingroup IxQMgrAPI
545 *
546 * @brief Queue interrupt source select.
547 *
548 * This enum defines the different source conditions on a queue that result in
Mike Williams16263082011-07-22 04:01:30 +0000549 * an interrupt being fired by the AQM. Interrupt source is configurable for
Wolfgang Denkba94a1b2006-05-30 15:56:48 +0200550 * queues 0-31 only. The interrupt source for queues 32-63 is hardwired to the
551 * NE(Nearly Empty) status flag.
552 *
553 */
554typedef enum
555{
556 IX_QMGR_Q_SOURCE_ID_E = 0, /**< Queue Empty due to last read */
557 IX_QMGR_Q_SOURCE_ID_NE, /**< Queue Nearly Empty due to last read */
558 IX_QMGR_Q_SOURCE_ID_NF, /**< Queue Nearly Full due to last write */
559 IX_QMGR_Q_SOURCE_ID_F, /**< Queue Full due to last write */
560 IX_QMGR_Q_SOURCE_ID_NOT_E, /**< Queue Not Empty due to last write */
561 IX_QMGR_Q_SOURCE_ID_NOT_NE, /**< Queue Not Nearly Empty due to last write */
562 IX_QMGR_Q_SOURCE_ID_NOT_NF, /**< Queue Not Nearly Full due to last read */
563 IX_QMGR_Q_SOURCE_ID_NOT_F /**< Queue Not Full due to last read */
564} IxQMgrSourceId;
565
566/**
567 * @enum IxQMgrQEntrySizeInWords
568 *
569 * @ingroup IxQMgrAPI
570 *
571 * @brief QMgr queue entry sizes.
572 *
573 * The entry size of a queue specifies the size of a queues entry in words.
574 *
575 */
576typedef enum
577{
578 IX_QMGR_Q_ENTRY_SIZE1 = 1, /**< 1 word entry */
579 IX_QMGR_Q_ENTRY_SIZE2 = 2, /**< 2 word entry */
580 IX_QMGR_Q_ENTRY_SIZE4 = 4 /**< 4 word entry */
581} IxQMgrQEntrySizeInWords;
582
583/**
584 * @enum IxQMgrQSizeInWords
585 *
586 * @ingroup IxQMgrAPI
587 *
588 * @brief QMgr queue sizes.
589 *
590 * These values define the allowed queue sizes for AQM queue. The sizes are
591 * specified in words.
592 *
593 */
594typedef enum
595{
596 IX_QMGR_Q_SIZE16 = 16, /**< 16 word buffer */
597 IX_QMGR_Q_SIZE32 = 32, /**< 32 word buffer */
598 IX_QMGR_Q_SIZE64 = 64, /**< 64 word buffer */
599 IX_QMGR_Q_SIZE128 = 128, /**< 128 word buffer */
600 IX_QMGR_Q_SIZE_INVALID = 129 /**< Insure that this is greater than largest
601 * queue size supported by the hardware
602 */
603} IxQMgrQSizeInWords;
604
605/**
606 * @enum IxQMgrWMLevel
607 *
608 * @ingroup IxQMgrAPI
609 *
610 * @brief QMgr watermark levels.
611 *
612 * These values define the valid watermark levels(in ENTRIES) for queues. Each
613 * queue 0-63 have configurable Nearly full and Nearly empty watermarks. For
614 * queues 32-63 the Nearly full watermark has NO EFFECT.
615 * If the Nearly full watermark is set to IX_QMGR_Q_WM_LEVEL16 this means that
616 * the nearly full flag will be set by the hardware when there are >= 16 empty
617 * entries in the specified queue.
618 * If the Nearly empty watermark is set to IX_QMGR_Q_WM_LEVEL16 this means that
619 * the Nearly empty flag will be set by the hardware when there are <= 16 full
620 * entries in the specified queue.
621 */
622typedef enum
623{
624 IX_QMGR_Q_WM_LEVEL0 = 0, /**< 0 entry watermark */
625 IX_QMGR_Q_WM_LEVEL1 = 1, /**< 1 entry watermark */
626 IX_QMGR_Q_WM_LEVEL2 = 2, /**< 2 entry watermark */
627 IX_QMGR_Q_WM_LEVEL4 = 4, /**< 4 entry watermark */
628 IX_QMGR_Q_WM_LEVEL8 = 8, /**< 8 entry watermark */
629 IX_QMGR_Q_WM_LEVEL16 = 16, /**< 16 entry watermark */
630 IX_QMGR_Q_WM_LEVEL32 = 32, /**< 32 entry watermark */
631 IX_QMGR_Q_WM_LEVEL64 = 64 /**< 64 entry watermark */
632} IxQMgrWMLevel;
633
634/**
635 * @ingroup IxQMgrAPI
636 *
637 * @enum IxQMgrDispatchGroup
638 *
639 * @brief QMgr dispatch group select identifiers.
640 *
641 * This enum defines the groups over which the dispatcher will process when
642 * called. One of the enum values must be used as a input to
643 * @a ixQMgrDispatcherLoopRunA0, @a ixQMgrDispatcherLoopRunB0
644 * or @a ixQMgrDispatcherLoopRunB0LLP.
645 *
646 */
647typedef enum
648{
649 IX_QMGR_QUELOW_GROUP = 0, /**< Queues 0-31 */
650 IX_QMGR_QUEUPP_GROUP /**< Queues 32-63 */
651} IxQMgrDispatchGroup;
652
653/**
654 * @ingroup IxQMgrAPI
655 *
656 * @enum IxQMgrPriority
657 *
658 * @brief Dispatcher priority levels.
659 *
660 * This enum defines the different queue dispatch priority levels.
661 * The lowest priority number (0) is the highest priority level.
662 *
663 */
664typedef enum
665{
666 IX_QMGR_Q_PRIORITY_0 = 0, /**< Priority level 0 */
667 IX_QMGR_Q_PRIORITY_1, /**< Priority level 1 */
668 IX_QMGR_Q_PRIORITY_2, /**< Priority level 2 */
669 IX_QMGR_Q_PRIORITY_INVALID /**< Invalid Priority level */
670} IxQMgrPriority;
671
672/**
673 * @ingroup IxQMgrAPI
674 *
675 * @enum IxQMgrType
676 *
677 * @brief Callback types as used with livelock prevention
678 *
679 * This enum defines the different callback types.
680 * These types are only used when Livelock prevention is enabled.
681 * The default is IX_QMGR_TYPE_REALTIME_OTHER.
682 *
683 */
684
685typedef enum
686{
687 IX_QMGR_TYPE_REALTIME_OTHER = 0, /**< Real time callbacks-always allowed run*/
688 IX_QMGR_TYPE_REALTIME_PERIODIC, /**< Periodic callbacks-always allowed run */
689 IX_QMGR_TYPE_REALTIME_SPORADIC /**< Sporadic callbacks-only run if no
690 periodic callbacks are in progress */
691} IxQMgrType;
692
693
694/**
695 * @ingroup IxQMgrAPI
696 *
697 * @typedef IxQMgrCallbackId
698 *
699 * @brief Uniquely identifies a callback function.
700 *
701 * A unique callback identifier associated with each callback
702 * registered by clients.
703 *
704 */
705typedef unsigned IxQMgrCallbackId;
706
707/**
708 * @typedef IxQMgrCallback
709 *
710 * @brief QMgr notification callback type.
711 *
712 * This defines the interface to all client callback functions.
713 *
714 * @param qId @ref IxQMgrQId [in] - the queue identifier
715 * @param cbId @ref IxQMgrCallbackId [in] - the callback identifier
716 */
717typedef void (*IxQMgrCallback)(IxQMgrQId qId,
718 IxQMgrCallbackId cbId);
719
720/**
721 * @ingroup IxQMgrAPI
722 *
723 * @typedef IxQMgrDispatcherFuncPtr
724 *
725 * @brief QMgr Dispatcher Loop function pointer.
726 *
727 * This defines the interface for QMgr Dispather functions.
728 *
729 * @param group @ref IxQMgrDispatchGroup [in] - the group of the
730 * queue of which the dispatcher will run
731 */
732typedef void (*IxQMgrDispatcherFuncPtr)(IxQMgrDispatchGroup group);
733
734/*
735 * Function Prototypes
736 */
737
738/* ------------------------------------------------------------
739 Initialisation related functions
740 ---------------------------------------------------------- */
741
742/**
743 *
744 * @ingroup IxQMgrAPI
745 *
746 * @fn ixQMgrInit (void)
747 *
748 * @brief Initialise the QMgr.
749 *
750 * This function must be called before and other QMgr function. It
751 * sets up internal data structures.
752 *
753 * @return @li IX_SUCCESS, the IxQMgr successfully initialised
754 * @return @li IX_FAIL, failed to initialize the Qmgr
755 *
756 */
757PUBLIC IX_STATUS
758ixQMgrInit (void);
759
760/**
761 *
762 * @ingroup IxQMgrAPI
763 *
764 * @fn ixQMgrUnload (void)
765 *
766 * @brief Uninitialise the QMgr.
767 *
768 * This function will perform the tasks required to unload the QMgr component
769 * cleanly. This includes unmapping kernel memory.
770 * This should be called before a soft reboot or unloading of a kernel module.
771 *
772 * @pre It should only be called if @ref ixQMgrInit has already been called.
773 *
774 * @post No QMgr functions should be called until ixQMgrInit is called again.
775 *
776 * @return @li IX_SUCCESS, the IxQMgr successfully uninitialised
777 * @return @li IX_FAIL, failed to uninitialize the Qmgr
778 *
779 */
780PUBLIC IX_STATUS
781ixQMgrUnload (void);
782
783/**
784 *
785 * @ingroup IxQMgrAPI
786 *
787 * @fn ixQMgrShow (void)
788 *
789 * @brief Describe queue configuration and statistics for active queues.
790 *
791 * This function shows active queues, their configurations and statistics.
792 *
793 * @return @li void
794 *
795 */
796PUBLIC void
797ixQMgrShow (void);
798
799/**
800 *
801 * @ingroup IxQMgrAPI
802 *
803 * @fn ixQMgrQShow (IxQMgrQId qId)
804 *
805 * @brief Display aqueue configuration and statistics for a queue.
806 *
807 * This function shows queue configuration and statistics for a queue.
808 *
809 * @param qId @ref IxQMgrQId [in] - the queue identifier.
810 *
811 * @return @li IX_SUCCESS, success
812 * @return @li IX_QMGR_Q_NOT_CONFIGURED, queue not configured for this QId
813 *
814 */
815PUBLIC IX_STATUS
816ixQMgrQShow (IxQMgrQId qId);
817
818
819/* ------------------------------------------------------------
820 Configuration related functions
821 ---------------------------------------------------------- */
822
823/**
824 *
825 * @ingroup IxQMgrAPI
826 *
827 * @fn ixQMgrQConfig (char *qName,
828 IxQMgrQId qId,
829 IxQMgrQSizeInWords qSizeInWords,
830 IxQMgrQEntrySizeInWords qEntrySizeInWords)
831 *
832 * @brief Configure an AQM queue.
833 *
834 * This function is called by a client to setup a queue. The size and entrySize
835 * qId and qName(NULL pointer) are checked for valid values. This function must
836 * be called for each queue, before any queue accesses are made and after
837 * ixQMgrInit() has been called. qName is assumed to be a '\0' terminated array
838 * of 16 charachters or less.
839 *
840 * @param *qName char [in] - is the name provided by the client and is associated
841 * with a QId by the QMgr.
842 * @param qId @ref IxQMgrQId [in] - the qId of this queue
843 * @param qSizeInWords @ref IxQMgrQSize [in] - the size of the queue can be one of 16,32
844 * 64, 128 words.
845 * @param qEntrySizeInWords @ref IxQMgrQEntrySizeInWords [in] - the size of a queue entry
846 * can be one of 1,2,4 words.
847 *
848 * @return @li IX_SUCCESS, a specified queue has been successfully configured.
849 * @return @li IX_FAIL, IxQMgr has not been initialised.
850 * @return @li IX_QMGR_PARAMETER_ERROR, invalid parameter(s).
851 * @return @li IX_QMGR_INVALID_QSIZE, invalid queue size
852 * @return @li IX_QMGR_INVALID_Q_ID, invalid queue id
853 * @return @li IX_QMGR_INVALID_Q_ENTRY_SIZE, invalid queue entry size
854 * @return @li IX_QMGR_Q_ALREADY_CONFIGURED, queue already configured
855 *
856 */
857PUBLIC IX_STATUS
858ixQMgrQConfig (char *qName,
859 IxQMgrQId qId,
860 IxQMgrQSizeInWords qSizeInWords,
861 IxQMgrQEntrySizeInWords qEntrySizeInWords);
862
863/**
864 * @ingroup IxQMgrAPI
865 *
866 * @fn ixQMgrQSizeInEntriesGet (IxQMgrQId qId,
867 unsigned *qSizeInEntries)
868 *
869 * @brief Return the size of a queue in entries.
870 *
871 * This function returns the the size of the queue in entriese.
872 *
873 * @param qId @ref IxQMgrQId [in] - the queue identifier
874 * @param *qSizeInEntries @ref IxQMgrQSize [out] - queue size in entries
875 *
876 * @return @li IX_SUCCESS, successfully retrieved the number of full entrie
877 * @return @li IX_QMGR_Q_NOT_CONFIGURED, queue not configured for this QId
878 * @return @li IX_QMGR_PARAMETER_ERROR, invalid parameter(s).
879 *
880 */
881PUBLIC IX_STATUS
882ixQMgrQSizeInEntriesGet (IxQMgrQId qId,
883 unsigned *qSizeInEntries);
884
885/**
886 *
887 * @ingroup IxQMgrAPI
888 *
889 * @fn ixQMgrWatermarkSet (IxQMgrQId qId,
890 IxQMgrWMLevel ne,
891 IxQMgrWMLevel nf)
892 *
893 * @brief Set the Nearly Empty and Nearly Full Watermarks fo a queue.
894 *
895 * This function is called by a client to set the watermarks NE and NF for the
896 * queue specified by qId.
897 * The queue must be empty at the time this function is called, it is the clients
898 * responsibility to ensure that the queue is empty.
899 * This function will read the status of the queue before the watermarks are set
900 * and again after the watermarks are set. If the status register has changed,
901 * due to a queue access by an NPE for example, a warning is returned.
902 * Queues 32-63 only support the NE flag, therefore the value of nf will be ignored
903 * for these queues.
904 *
905 * @param qId @ref IxQMgrQId [in] - the QId of the queue.
906 * @param ne @ref IxQMgrWMLevel [in] - the NE(Nearly Empty) watermark for this
907 * queue. Valid values are 0,1,2,4,8,16,32 and
908 * 64 entries.
909 * @param nf @ref IxQMgrWMLevel [in] - the NF(Nearly Full) watermark for this queue.
910 * Valid values are 0,1,2,4,8,16,32 and 64
911 * entries.
912 *
913 * @return @li IX_SUCCESS, watermarks have been set for the queu
914 * @return @li IX_QMGR_Q_NOT_CONFIGURED, queue not configured for this QId
915 * @return @li IX_QMGR_INVALID_Q_WM, invalid watermark
916 * @return @li IX_QMGR_WARNING, the status register may not be constistent
917 *
918 */
919PUBLIC IX_STATUS
920ixQMgrWatermarkSet (IxQMgrQId qId,
921 IxQMgrWMLevel ne,
922 IxQMgrWMLevel nf);
923
924/**
925 * @ingroup IxQMgrAPI
926 *
927 * @fn ixQMgrAvailableSramAddressGet (UINT32 *address,
928 unsigned *sizeOfFreeSram)
929 *
930 * @brief Return the address of available AQM SRAM.
931 *
932 * This function returns the starting address in AQM SRAM not used by the
933 * current queue configuration and should only be called after all queues
934 * have been configured.
935 * Calling this function before all queues have been configured will will return
936 * the currently available SRAM. A call to configure another queue will use some
937 * of the available SRAM.
938 * The amount of SRAM available is specified in sizeOfFreeSram. The address is the
939 * address of the bottom of available SRAM. Available SRAM extends from address
940 * from address to address + sizeOfFreeSram.
941 *
942 * @param **address UINT32 [out] - the address of the available SRAM, NULL if
943 * none available.
944 * @param *sizeOfFreeSram unsigned [out]- the size in words of available SRAM
945 *
946 * @return @li IX_SUCCESS, there is available SRAM and is pointed to by address
947 * @return @li IX_QMGR_PARAMETER_ERROR, invalid parameter(s)
948 * @return @li IX_QMGR_NO_AVAILABLE_SRAM, all AQM SRAM is consumed by the queue
949 * configuration.
950 *
951 */
952PUBLIC IX_STATUS
953ixQMgrAvailableSramAddressGet (UINT32 *address,
954 unsigned *sizeOfFreeSram);
955
956
957/* ------------------------------------------------------------
958 Queue access related functions
959 ---------------------------------------------------------- */
960
961/**
962 *
963 * @ingroup IxQMgrAPI
964 *
965 * @fn ixQMgrQReadWithChecks (IxQMgrQId qId,
966 UINT32 *entry)
967 *
968 * @brief Read an entry from a queue.
969 *
970 * This function reads an entire entry from a queue returning it in entry. The
971 * queue configuration word is read to determine what entry size this queue is
972 * configured for and then the number of words specified by the entry size is
973 * read. entry must be a pointer to a previously allocated array of sufficient
974 * size to hold an entry.
975 *
976 * @note - IX_QMGR_Q_UNDERFLOW is only returned for queues 0-31 as queues 32-63
977 * do not have an underflow status maintained.
978 *
979 * @param qId @ref IxQMgrQId [in] - the queue identifier.
980 * @param *entry UINT32 [out] - pointer to the entry word(s).
981 *
982 * @return @li IX_SUCCESS, entry was successfully read.
983 * @return @li IX_QMGR_PARAMETER_ERROR, invalid paramter(s).
984 * @return @li IX_QMGR_Q_NOT_CONFIGURED, queue not configured for this QId
985 * @return @li IX_QMGR_Q_UNDERFLOW, attempt to read from an empty queue
986 *
987 */
988PUBLIC IX_STATUS
989ixQMgrQReadWithChecks (IxQMgrQId qId,
990 UINT32 *entry);
991
992
993
994/**
995 * @brief Internal structure to facilitate inlining functions in IxQMgr.h
996 */
997typedef struct
998{
999 /* fields related to write functions */
1000 UINT32 qOflowStatBitMask; /**< overflow status mask */
1001 UINT32 qWriteCount; /**< queue write count */
1002
1003 /* fields related to read and write functions */
1004 volatile UINT32 *qAccRegAddr; /**< access register */
1005 volatile UINT32 *qUOStatRegAddr; /**< status register */
1006 volatile UINT32 *qConfigRegAddr; /**< config register */
1007 UINT32 qEntrySizeInWords; /**< queue entry size in words */
1008 UINT32 qSizeInEntries; /**< queue size in entries */
1009
1010 /* fields related to read functions */
1011 UINT32 qUflowStatBitMask; /**< underflow status mask */
1012 UINT32 qReadCount; /**< queue read count */
1013} IxQMgrQInlinedReadWriteInfo;
1014
1015
1016/**
1017 *
1018 * @ingroup IxQMgrAPI
1019 *
1020 * @fn ixQMgrQReadMWordsMinus1 (IxQMgrQId qId,
1021 UINT32 *entry)
1022 *
1023 * @brief This function reads the remaining of the q entry
1024 * for queues configured with many words.
1025 * (the first word of the entry is already read
1026 * in the inlined function and the entry pointer already
1027 * incremented
1028 *
1029 * @param qId @ref IxQMgrQId [in] - the queue identifier.
1030 * @param *entry UINT32 [out] - pointer to the entry word(s).
1031 *
1032 * @return @li IX_SUCCESS, entry was successfully read.
1033 * @return @li IX_QMGR_Q_UNDERFLOW, attempt to read from an empty queue
1034 *
1035 */
1036PUBLIC IX_STATUS
1037ixQMgrQReadMWordsMinus1 (IxQMgrQId qId,
1038 UINT32 *entry);
1039
1040
1041
1042/**
1043 *
1044 * @ingroup IxQMgrAPI
1045 *
1046 * @fn ixQMgrQRead (IxQMgrQId qId,
1047 UINT32 *entry)
1048 *
1049 * @brief Fast read of an entry from a queue.
1050 *
1051 * This function is a heavily streamlined version of ixQMgrQReadWithChecks(),
1052 * but performs essentially the same task. It reads an entire entry from a
1053 * queue, returning it in entry which must be a pointer to a previously
1054 * allocated array of sufficient size to hold an entry.
1055 *
1056 * @note - This function is inlined, to reduce unnecessary function call
1057 * overhead. It does not perform any parameter checks, or update any statistics.
1058 * Also, it does not check that the queue specified by qId has been configured.
1059 * or is in range. It simply reads an entry from the queue, and checks for
1060 * underflow.
1061 *
1062 * @note - IX_QMGR_Q_UNDERFLOW is only returned for queues 0-31 as queues 32-63
1063 * do not have an underflow status maintained.
1064 *
1065 * @param qId @ref IxQMgrQId [in] - the queue identifier.
1066 * @param *entry UINT32 [out] - pointer to the entry word(s).
1067 *
1068 * @return @li IX_SUCCESS, entry was successfully read.
1069 * @return @li IX_QMGR_Q_UNDERFLOW, attempt to read from an empty queue
1070 *
1071 */
1072#ifdef NO_INLINE_APIS
1073PUBLIC IX_STATUS
1074ixQMgrQRead (IxQMgrQId qId,
1075 UINT32 *entryPtr);
1076#else
1077extern IxQMgrQInlinedReadWriteInfo ixQMgrQInlinedReadWriteInfo[];
1078extern IX_STATUS ixQMgrQReadMWordsMinus1 (IxQMgrQId qId, UINT32 *entryPtr);
1079
1080IX_QMGR_INLINE PUBLIC IX_STATUS
1081ixQMgrQRead (IxQMgrQId qId,
1082 UINT32 *entryPtr);
1083#endif
1084
1085IX_QMGR_INLINE PUBLIC IX_STATUS
1086ixQMgrQRead (IxQMgrQId qId,
1087 UINT32 *entryPtr)
1088#ifdef NO_INLINE_APIS
1089 ;
1090#else
1091{
1092 IxQMgrQInlinedReadWriteInfo *infoPtr = &ixQMgrQInlinedReadWriteInfo[qId];
1093 UINT32 entry, entrySize;
1094
1095 /* get a new entry */
1096 entrySize = infoPtr->qEntrySizeInWords;
1097 entry = IX_QMGR_INLINE_READ_LONG(infoPtr->qAccRegAddr);
1098
1099 if (entrySize != IX_QMGR_Q_ENTRY_SIZE1)
1100 {
1101 *entryPtr = entry;
1102 /* process the remaining part of the entry */
1103 return ixQMgrQReadMWordsMinus1(qId, entryPtr);
1104 }
1105
1106 /* underflow is available for lower queues only */
1107 if (qId < IX_QMGR_MIN_QUEUPP_QID)
1108 {
1109 /* the counter of queue entries is decremented. In happy
1110 * day scenario there are many entries in the queue
1111 * and the counter does not reach zero.
1112 */
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001113 if (infoPtr->qReadCount-- == 0)
Wolfgang Denkba94a1b2006-05-30 15:56:48 +02001114 {
1115 /* There is maybe no entry in the queue
1116 * qReadCount is now negative, but will be corrected before
1117 * the function returns.
1118 */
1119 UINT32 qPtrs; /* queue internal pointers */
1120
1121 /* when a queue is empty, the hw guarantees to return
1122 * a null value. If the value is not null, the queue is
1123 * not empty.
1124 */
1125 if (entry == 0)
1126 {
1127 /* get the queue status */
1128 UINT32 status = IX_QMGR_INLINE_READ_LONG(infoPtr->qUOStatRegAddr);
1129
1130 /* check the underflow status */
1131 if (status & infoPtr->qUflowStatBitMask)
1132 {
1133 /* the queue is empty
1134 * clear the underflow status bit if it was set
1135 */
1136 IX_QMGR_INLINE_WRITE_LONG(infoPtr->qUOStatRegAddr,
1137 status & ~infoPtr->qUflowStatBitMask);
1138 *entryPtr = 0;
1139 infoPtr->qReadCount = 0;
1140 return IX_QMGR_Q_UNDERFLOW;
1141 }
1142 }
1143 /* store the result */
1144 *entryPtr = entry;
1145
1146 /* No underflow occured : someone is filling the queue
1147 * or the queue contains null entries.
1148 * The current counter needs to be
1149 * updated from the current number of entries in the queue
1150 */
1151
1152 /* get snapshot of queue pointers */
1153 qPtrs = IX_QMGR_INLINE_READ_LONG(infoPtr->qConfigRegAddr);
1154
1155 /* Mod subtraction of pointers to get number of words in Q. */
1156 qPtrs = (qPtrs - (qPtrs >> 7)) & 0x7f;
1157
1158 if (qPtrs == 0)
1159 {
1160 /* no entry in the queue */
1161 infoPtr->qReadCount = 0;
1162 }
1163 else
1164 {
1165 /* convert the number of words inside the queue
1166 * to a number of entries
1167 */
1168 infoPtr->qReadCount = qPtrs & (infoPtr->qSizeInEntries - 1);
1169 }
1170 return IX_SUCCESS;
1171 }
1172 }
1173 *entryPtr = entry;
1174 return IX_SUCCESS;
1175}
1176#endif
1177
1178/**
1179 *
1180 * @ingroup IxQMgrAPI
1181 *
1182 * @fn ixQMgrQBurstRead (IxQMgrQId qId,
1183 UINT32 numEntries,
1184 UINT32 *entries)
1185 *
1186 * @brief Read a number of entries from an AQM queue.
1187 *
1188 * This function will burst read a number of entries from the specified queue.
1189 * The entry size of queue is auto-detected. The function will attempt to
1190 * read as many entries as specified by the numEntries parameter and will
1191 * return an UNDERFLOW if any one of the individual entry reads fail.
1192 *
1193 * @warning
1194 * IX_QMGR_Q_UNDERFLOW is only returned for queues 0-31 as queues 32-63
1195 * do not have an underflow status maintained, hence there is a potential for
1196 * silent failure here. This function must be used with caution.
1197 *
1198 * @note
1199 * This function is intended for fast draining of queues, so to make it
1200 * as efficient as possible, it has the following features:
1201 * - This function is inlined, to reduce unnecessary function call overhead.
1202 * - It does not perform any parameter checks, or update any statistics.
1203 * - It does not check that the queue specified by qId has been configured.
1204 * - It does not check that the queue has the number of full entries that
1205 * have been specified to be read. It will read until it finds a NULL entry or
1206 * until the number of specified entries have been read. It always checks for
1207 * underflow after all the reads have been performed.
1208 * Therefore, the client should ensure before calling this function that there
1209 * are enough entries in the queue to read. ixQMgrQNumEntriesGet() will
1210 * provide the number of full entries in a queue.
1211 * ixQMgrQRead() or ixQMgrQReadWithChecks(), which only reads
1212 * a single queue entry per call, should be used instead if the user requires
1213 * checks for UNDERFLOW after each entry read.
1214 *
1215 * @param qId @ref IxQMgrQId [in] - the queue identifier.
1216 * @param numEntries unsigned [in] - the number of entries to read.
1217 * This number should be greater than 0
1218 * @param *entries UINT32 [out] - the word(s) read.
1219 *
1220 * @return @li IX_SUCCESS, entries were successfully read.
1221 * @return @li IX_QMGR_Q_UNDERFLOW, attempt to read from an empty queue
1222 *
1223 */
1224#ifdef NO_INLINE_APIS
1225PUBLIC IX_STATUS
1226ixQMgrQBurstRead (IxQMgrQId qId,
1227 UINT32 numEntries,
1228 UINT32 *entries);
1229#else
1230IX_QMGR_INLINE PUBLIC IX_STATUS
1231ixQMgrQBurstRead (IxQMgrQId qId,
1232 UINT32 numEntries,
1233 UINT32 *entries);
1234#endif /* endif NO_INLINE_APIS */
1235
1236IX_QMGR_INLINE PUBLIC IX_STATUS
1237ixQMgrQBurstRead (IxQMgrQId qId,
1238 UINT32 numEntries,
1239 UINT32 *entries)
1240#ifdef NO_INLINE_APIS
1241;
1242#else
1243{
1244 IxQMgrQInlinedReadWriteInfo *infoPtr = &ixQMgrQInlinedReadWriteInfo[qId];
1245 UINT32 nullCheckEntry;
1246
1247 if (infoPtr->qEntrySizeInWords == IX_QMGR_Q_ENTRY_SIZE1)
1248 {
1249 volatile UINT32 *qAccRegAddr = infoPtr->qAccRegAddr;
1250
1251 /* the code is optimized to take care of data dependencies:
1252 * Durig a read, there are a few cycles needed to get the
1253 * read complete. During these cycles, it is poossible to
1254 * do some CPU, e.g. increment pointers and decrement
1255 * counters.
1256 */
1257
1258 /* fetch a queue entry */
1259 nullCheckEntry = IX_QMGR_INLINE_READ_LONG(infoPtr->qAccRegAddr);
1260
1261 /* iterate the specified number of queue entries */
1262 while (--numEntries)
1263 {
1264 /* check the result of the previous read */
1265 if (nullCheckEntry == 0)
1266 {
1267 /* if we read a NULL entry, stop. We have underflowed */
1268 break;
1269 }
1270 else
1271 {
1272 /* write the entry */
1273 *entries = nullCheckEntry;
1274 /* fetch next entry */
1275 nullCheckEntry = IX_QMGR_INLINE_READ_LONG(qAccRegAddr);
1276 /* increment the write address */
1277 entries++;
1278 }
1279 }
1280 /* write the pre-fetched entry */
1281 *entries = nullCheckEntry;
1282 }
1283 else
1284 {
1285 IxQMgrQEntrySizeInWords entrySizeInWords = infoPtr->qEntrySizeInWords;
1286 /* read the specified number of queue entries */
1287 nullCheckEntry = 0;
1288 while (numEntries--)
1289 {
1290 UINT32 i;
1291
1292 for (i = 0; i < (UINT32)entrySizeInWords; i++)
1293 {
1294 *entries = IX_QMGR_INLINE_READ_LONG(infoPtr->qAccRegAddr + i);
1295 nullCheckEntry |= *entries++;
1296 }
1297
1298 /* if we read a NULL entry, stop. We have underflowed */
1299 if (nullCheckEntry == 0)
1300 {
1301 break;
1302 }
1303 nullCheckEntry = 0;
1304 }
1305 }
1306
1307 /* reset the current read count : next access to the read function
1308 * will force a underflow status check
1309 */
1310 infoPtr->qReadCount = 0;
1311
1312 /* Check if underflow occurred on the read */
1313 if (nullCheckEntry == 0 && qId < IX_QMGR_MIN_QUEUPP_QID)
1314 {
1315 /* get the queue status */
1316 UINT32 status = IX_QMGR_INLINE_READ_LONG(infoPtr->qUOStatRegAddr);
1317
1318 if (status & infoPtr->qUflowStatBitMask)
1319 {
1320 /* clear the underflow status bit if it was set */
1321 IX_QMGR_INLINE_WRITE_LONG(infoPtr->qUOStatRegAddr,
1322 status & ~infoPtr->qUflowStatBitMask);
1323 return IX_QMGR_Q_UNDERFLOW;
1324 }
1325 }
1326
1327 return IX_SUCCESS;
1328}
1329#endif
1330
1331/**
1332 * @ingroup IxQMgrAPI
1333 *
1334 * @fn ixQMgrQPeek (IxQMgrQId qId,
1335 unsigned int entryIndex,
1336 UINT32 *entry)
1337 *
1338 * @brief Read an entry from a queue without moving the read pointer.
1339 *
1340 * This function inspects an entry in a queue. The entry is inspected directly
1341 * in AQM SRAM and is not read from queue access registers. The entry is NOT removed
1342 * from the queue and the read/write pointers are unchanged.
1343 * N.B: The queue should not be accessed when this function is called.
1344 *
1345 * @param qId @ref IxQMgrQId [in] - the queue identifier.
1346 * @param entryIndex unsigned int [in] - index of entry in queue in the range
1347 * [0].......[current number of entries in queue].
1348 * @param *entry UINT32 [out] - pointer to the entry word(s).
1349 *
1350 * @return @li IX_SUCCESS, entry was successfully inspected.
1351 * @return @li IX_QMGR_PARAMETER_ERROR, invalid paramter(s).
1352 * @return @li IX_QMGR_Q_NOT_CONFIGURED, queue not configured for this QId.
1353 * @return @li IX_QMGR_ENTRY_INDEX_OUT_OF_BOUNDS, an entry does not exist at
1354 * specified index.
1355 * @return @li IX_FAIL, failed to inpected the queue entry.
1356 */
1357PUBLIC IX_STATUS
1358ixQMgrQPeek (IxQMgrQId qId,
1359 unsigned int entryIndex,
1360 UINT32 *entry);
1361
1362/**
1363 *
1364 * @ingroup IxQMgrAPI
1365 *
1366 * @fn ixQMgrQWriteWithChecks (IxQMgrQId qId,
1367 UINT32 *entry)
1368 *
1369 * @brief Write an entry to an AQM queue.
1370 *
1371 * This function will write the entry size number of words pointed to by entry to
1372 * the queue specified by qId. The queue configuration word is read to
1373 * determine the entry size of queue and the corresponding number of words is
1374 * then written to the queue.
1375 *
1376 * @note - IX_QMGR_Q_OVERFLOW is only returned for queues 0-31 as queues 32-63
1377 * do not have an overflow status maintained.
1378 *
1379 * @param qId @ref IxQMgrQId [in] - the queue identifier.
1380 * @param *entry UINT32 [in] - the word(s) to write.
1381 *
1382 * @return @li IX_SUCCESS, value was successfully written.
1383 * @return @li IX_QMGR_PARAMETER_ERROR, invalid paramter(s).
1384 * @return @li IX_QMGR_Q_NOT_CONFIGURED, queue not configured for this QId
1385 * @return @li IX_QMGR_Q_OVERFLOW, attempt to write to a full queue
1386 *
1387 */
1388PUBLIC IX_STATUS
1389ixQMgrQWriteWithChecks (IxQMgrQId qId,
1390 UINT32 *entry);
1391
1392/**
1393 *
1394 * @ingroup IxQMgrAPI
1395 *
1396 * @fn ixQMgrQWrite (IxQMgrQId qId,
1397 UINT32 *entry)
1398 *
1399 * @brief Fast write of an entry to a queue.
1400 *
1401 * This function is a heavily streamlined version of ixQMgrQWriteWithChecks(),
1402 * but performs essentially the same task. It will write the entry size number
1403 * of words pointed to by entry to the queue specified by qId.
1404 *
1405 * @note - This function is inlined, to reduce unnecessary function call
1406 * overhead. It does not perform any parameter checks, or update any
1407 * statistics. Also, it does not check that the queue specified by qId has
1408 * been configured. It simply writes an entry to the queue, and checks for
1409 * overflow.
1410 *
1411 * @note - IX_QMGR_Q_OVERFLOW is only returned for queues 0-31 as queues 32-63
1412 * do not have an overflow status maintained.
1413 *
1414 * @param qId @ref IxQMgrQId [in] - the queue identifier.
1415 * @param *entry UINT32 [in] - pointer to the entry word(s).
1416 *
1417 * @return @li IX_SUCCESS, entry was successfully read.
1418 * @return @li IX_QMGR_Q_OVERFLOW, attempt to write to a full queue
1419 *
1420 */
1421#ifdef NO_INLINE_APIS
1422PUBLIC IX_STATUS
1423ixQMgrQWrite (IxQMgrQId qId,
1424 UINT32 *entry);
1425#else
1426IX_QMGR_INLINE PUBLIC IX_STATUS
1427ixQMgrQWrite (IxQMgrQId qId,
1428 UINT32 *entry);
1429#endif /* NO_INLINE_APIS */
1430
1431IX_QMGR_INLINE PUBLIC IX_STATUS
1432ixQMgrQWrite (IxQMgrQId qId,
1433 UINT32 *entry)
1434#ifdef NO_INLINE_APIS
1435 ;
1436#else
1437{
1438 IxQMgrQInlinedReadWriteInfo *infoPtr = &ixQMgrQInlinedReadWriteInfo[qId];
1439 UINT32 entrySize;
1440
1441 /* write the entry */
1442 IX_QMGR_INLINE_WRITE_LONG(infoPtr->qAccRegAddr, *entry);
1443 entrySize = infoPtr->qEntrySizeInWords;
1444
1445 if (entrySize != IX_QMGR_Q_ENTRY_SIZE1)
1446 {
1447 /* process the remaining part of the entry */
1448 volatile UINT32 *qAccRegAddr = infoPtr->qAccRegAddr;
1449 while (--entrySize)
1450 {
1451 ++entry;
1452 IX_QMGR_INLINE_WRITE_LONG(++qAccRegAddr, *entry);
1453 }
Wolfgang Denk53677ef2008-05-20 16:00:29 +02001454 entrySize = infoPtr->qEntrySizeInWords;
Wolfgang Denkba94a1b2006-05-30 15:56:48 +02001455 }
1456
1457 /* overflow is available for lower queues only */
1458 if (qId < IX_QMGR_MIN_QUEUPP_QID)
1459 {
1460 UINT32 qSize = infoPtr->qSizeInEntries;
1461 /* increment the current number of entries in the queue
1462 * and check for overflow
1463 */
1464 if (infoPtr->qWriteCount++ == qSize)
1465 {
1466 /* the queue may have overflow */
1467 UINT32 qPtrs; /* queue internal pointers */
1468
1469 /* get the queue status */
1470 UINT32 status = IX_QMGR_INLINE_READ_LONG(infoPtr->qUOStatRegAddr);
1471
1472 /* read the status twice because the status may
1473 * not be immediately ready after the write operation
1474 */
1475 if ((status & infoPtr->qOflowStatBitMask) ||
1476 ((status = IX_QMGR_INLINE_READ_LONG(infoPtr->qUOStatRegAddr))
1477 & infoPtr->qOflowStatBitMask))
1478 {
1479 /* the queue is full, clear the overflow status
1480 * bit if it was set
1481 */
1482 IX_QMGR_INLINE_WRITE_LONG(infoPtr->qUOStatRegAddr,
1483 status & ~infoPtr->qOflowStatBitMask);
1484 infoPtr->qWriteCount = infoPtr->qSizeInEntries;
1485 return IX_QMGR_Q_OVERFLOW;
1486 }
1487 /* No overflow occured : someone is draining the queue
1488 * and the current counter needs to be
1489 * updated from the current number of entries in the queue
1490 */
1491
1492 /* get q pointer snapshot */
1493 qPtrs = IX_QMGR_INLINE_READ_LONG(infoPtr->qConfigRegAddr);
1494
1495 /* Mod subtraction of pointers to get number of words in Q. */
1496 qPtrs = (qPtrs - (qPtrs >> 7)) & 0x7f;
1497
1498 if (qPtrs == 0)
1499 {
1500 /* the queue may be full at the time of the
1501 * snapshot. Next access will check
1502 * the overflow status again.
1503 */
1504 infoPtr->qWriteCount = qSize;
1505 }
1506 else
1507 {
1508 /* convert the number of words to a number of entries */
1509 if (entrySize == IX_QMGR_Q_ENTRY_SIZE1)
1510 {
1511 infoPtr->qWriteCount = qPtrs & (qSize - 1);
1512 }
1513 else
1514 {
1515 infoPtr->qWriteCount = (qPtrs / entrySize) & (qSize - 1);
1516 }
1517 }
1518 }
1519 }
1520 return IX_SUCCESS;
1521}
1522#endif
1523
1524/**
1525 *
1526 * @ingroup IxQMgrAPI
1527 *
1528 * @fn ixQMgrQBurstWrite (IxQMgrQId qId,
1529 unsigned numEntries,
1530 UINT32 *entries)
1531 *
1532 * @brief Write a number of entries to an AQM queue.
1533 *
1534 * This function will burst write a number of entries to the specified queue.
1535 * The entry size of queue is auto-detected. The function will attempt to
1536 * write as many entries as specified by the numEntries parameter and will
1537 * return an OVERFLOW if any one of the individual entry writes fail.
1538 *
1539 * @warning
1540 * IX_QMGR_Q_OVERFLOW is only returned for queues 0-31 as queues 32-63
1541 * do not have an overflow status maintained, hence there is a potential for
1542 * silent failure here. This function must be used with caution.
1543 *
1544 * @note
1545 * This function is intended for fast population of queues, so to make it
1546 * as efficient as possible, it has the following features:
1547 * - This function is inlined, to reduce unnecessary function call overhead.
1548 * - It does not perform any parameter checks, or update any statistics.
1549 * - It does not check that the queue specified by qId has been configured.
1550 * - It does not check that the queue has enough free space to hold the entries
1551 * before writing, and only checks for overflow after all writes have been
1552 * performed. Therefore, the client should ensure before calling this function
1553 * that there is enough free space in the queue to hold the number of entries
1554 * to be written. ixQMgrQWrite() or ixQMgrQWriteWithChecks(), which only writes
1555 * a single queue entry per call, should be used instead if the user requires
1556 * checks for OVERFLOW after each entry written.
1557 *
1558 * @param qId @ref IxQMgrQId [in] - the queue identifier.
1559 * @param numEntries unsigned [in] - the number of entries to write.
1560 * @param *entries UINT32 [in] - the word(s) to write.
1561 *
1562 * @return @li IX_SUCCESS, value was successfully written.
1563 * @return @li IX_QMGR_Q_OVERFLOW, attempt to write to a full queue
1564 *
1565 */
1566#ifdef NO_INLINE_APIS
1567PUBLIC IX_STATUS
1568ixQMgrQBurstWrite (IxQMgrQId qId,
1569 unsigned numEntries,
1570 UINT32 *entries);
1571#else
1572IX_QMGR_INLINE PUBLIC IX_STATUS
1573ixQMgrQBurstWrite (IxQMgrQId qId,
1574 unsigned numEntries,
1575 UINT32 *entries);
1576#endif /* NO_INLINE_APIS */
1577
1578IX_QMGR_INLINE PUBLIC IX_STATUS
1579ixQMgrQBurstWrite (IxQMgrQId qId,
1580 unsigned numEntries,
1581 UINT32 *entries)
1582#ifdef NO_INLINE_APIS
1583;
1584#else
1585{
1586 IxQMgrQInlinedReadWriteInfo *infoPtr = &ixQMgrQInlinedReadWriteInfo[qId];
1587 UINT32 status;
1588
1589 /* update the current write count */
1590 infoPtr->qWriteCount += numEntries;
1591
1592 if (infoPtr->qEntrySizeInWords == IX_QMGR_Q_ENTRY_SIZE1)
1593 {
1594 volatile UINT32 *qAccRegAddr = infoPtr->qAccRegAddr;
1595 while (numEntries--)
1596 {
1597 IX_QMGR_INLINE_WRITE_LONG(qAccRegAddr, *entries);
1598 entries++;
1599 }
1600 }
1601 else
1602 {
1603 IxQMgrQEntrySizeInWords entrySizeInWords = infoPtr->qEntrySizeInWords;
1604 UINT32 i;
1605
1606 /* write each queue entry */
1607 while (numEntries--)
1608 {
1609 /* write the queueEntrySize number of words for each entry */
1610 for (i = 0; i < (UINT32)entrySizeInWords; i++)
1611 {
1612 IX_QMGR_INLINE_WRITE_LONG((infoPtr->qAccRegAddr + i), *entries);
1613 entries++;
1614 }
1615 }
1616 }
1617
1618 /* check if the write count overflows */
1619 if (infoPtr->qWriteCount > infoPtr->qSizeInEntries)
1620 {
1621 /* reset the current write count */
1622 infoPtr->qWriteCount = infoPtr->qSizeInEntries;
1623 }
1624
1625 /* Check if overflow occurred on the write operation */
1626 if (qId < IX_QMGR_MIN_QUEUPP_QID)
1627 {
1628 /* get the queue status */
1629 status = IX_QMGR_INLINE_READ_LONG(infoPtr->qUOStatRegAddr);
1630
1631 /* read the status twice because the status may
1632 * not be ready at the time of the write
1633 */
1634 if ((status & infoPtr->qOflowStatBitMask) ||
1635 ((status = IX_QMGR_INLINE_READ_LONG(infoPtr->qUOStatRegAddr))
1636 & infoPtr->qOflowStatBitMask))
1637 {
1638 /* clear the underflow status bit if it was set */
1639 IX_QMGR_INLINE_WRITE_LONG(infoPtr->qUOStatRegAddr,
1640 status & ~infoPtr->qOflowStatBitMask);
1641 return IX_QMGR_Q_OVERFLOW;
1642 }
1643 }
1644
1645 return IX_SUCCESS;
1646}
1647#endif
1648
1649/**
1650 * @ingroup IxQMgrAPI
1651 *
1652 * @fn ixQMgrQPoke (IxQMgrQId qId,
1653 unsigned int entryIndex,
1654 UINT32 *entry)
1655 *
1656 * @brief Write an entry to a queue without moving the write pointer.
1657 *
1658 * This function modifies an entry in a queue. The entry is modified directly
1659 * in AQM SRAM and not using the queue access registers. The entry is NOT added to the
1660 * queue and the read/write pointers are unchanged.
1661 * N.B: The queue should not be accessed when this function is called.
1662 *
1663 * @param qId @ref IxQMgrQId [in] - the queue identifier.
1664 * @param entryIndex unsigned int [in] - index of entry in queue in the range
1665 * [0].......[current number of entries in queue].
1666 * @param *entry UINT32 [in] - pointer to the entry word(s).
1667 *
1668 * @return @li IX_SUCCESS, entry was successfully modified.
1669 * @return @li IX_QMGR_PARAMETER_ERROR, invalid paramter(s).
1670 * @return @li IX_QMGR_Q_NOT_CONFIGURED, queue not configured for this QId.
1671 * @return @li IX_QMGR_ENTRY_INDEX_OUT_OF_BOUNDS, an entry does not exist at
1672 * specified index.
1673 * @return @li IX_FAIL, failed to modify the queue entry.
1674 */
1675PUBLIC IX_STATUS
1676ixQMgrQPoke (IxQMgrQId qId,
1677 unsigned int entryIndex,
1678 UINT32 *entry);
1679
1680/**
1681 *
1682 * @ingroup IxQMgrAPI
1683 *
1684 * @fn ixQMgrQNumEntriesGet (IxQMgrQId qId,
1685 unsigned *numEntries)
1686 *
1687 * @brief Get a snapshot of the number of entries in a queue.
1688 *
1689 * This function gets the number of entries in a queue.
1690 *
1691 * @param qId @ref IxQMgrQId [in] qId - the queue idenfifier
1692 * @param *numEntries unsigned [out] - the number of entries in a queue
1693 *
1694 * @return @li IX_SUCCESS, got the number of entries for the queue
1695 * @return @li IX_QMGR_PARAMETER_ERROR, invalid paramter(s).
1696 * @return @li IX_QMGR_Q_NOT_CONFIGURED, the specified qId has not been configured
1697 * @return @li IX_QMGR_WARNING, could not determine num entries at this time
1698 *
1699 */
1700PUBLIC IX_STATUS
1701ixQMgrQNumEntriesGet (IxQMgrQId qId,
1702 unsigned *numEntries);
1703
1704/**
1705 *
1706 * @ingroup IxQMgrAPI
1707 *
1708 * @fn ixQMgrQStatusGetWithChecks (IxQMgrQId qId,
1709 IxQMgrQStatus *qStatus)
1710 *
1711 * @brief Get a queues status.
1712 *
1713 * This function reads the specified queues status. A queues status is defined
1714 * by its status flags. For queues 0-31 these flags are E,NE,NF,F. For
1715 * queues 32-63 these flags are NE and F.
1716 *
1717 * @param qId @ref IxQMgrQId [in] - the queue identifier.
1718 * @param &qStatus @ref IxQMgrQStatus [out] - the status of the specified queue.
1719 *
1720 * @return @li IX_SUCCESS, queue status was successfully read.
1721 * @return @li IX_QMGR_Q_NOT_CONFIGURED, the specified qId has not been configured
1722 * @return @li IX_QMGR_PARAMETER_ERROR, invalid paramter.
1723 *
1724 */
1725PUBLIC IX_STATUS
1726ixQMgrQStatusGetWithChecks (IxQMgrQId qId,
1727 IxQMgrQStatus *qStatus);
1728
1729/**
1730 *
1731 * @ingroup IxQMgrAPI
1732 *
1733 * @fn ixQMgrQStatusGet (IxQMgrQId qId,
1734 IxQMgrQStatus *qStatus)
1735 *
1736 * @brief Fast get of a queue's status.
1737 *
1738 * This function is a streamlined version of ixQMgrQStatusGetWithChecks(), but
1739 * performs essentially the same task. It reads the specified queue's status.
1740 * A queues status is defined by its status flags. For queues 0-31 these flags
1741 * are E,NE,NF,F. For queues 32-63 these flags are NE and F.
1742 *
1743 * @note - This function is inlined, to reduce unnecessary function call
1744 * overhead. It does not perform any parameter checks, or update any
1745 * statistics. Also, it does not check that the queue specified by qId has
1746 * been configured. It simply reads the specified queue's status.
1747 *
1748 * @param qId @ref IxQMgrQId [in] - the queue identifier.
1749 * @param *qStatus @ref IxQMgrQStatus [out] - the status of the specified queue.
1750 *
1751 * @return @li void.
1752 *
1753 */
1754
1755#ifdef NO_INLINE_APIS
1756PUBLIC IX_STATUS
1757ixQMgrQStatusGet (IxQMgrQId qId,
1758 IxQMgrQStatus *qStatus);
1759#else
1760extern UINT32 ixQMgrAqmIfQueLowStatRegAddr[];
1761extern UINT32 ixQMgrAqmIfQueLowStatBitsOffset[];
1762extern UINT32 ixQMgrAqmIfQueLowStatBitsMask;
1763extern UINT32 ixQMgrAqmIfQueUppStat0RegAddr;
1764extern UINT32 ixQMgrAqmIfQueUppStat1RegAddr;
1765extern UINT32 ixQMgrAqmIfQueUppStat0BitMask[];
1766extern UINT32 ixQMgrAqmIfQueUppStat1BitMask[];
1767
1768IX_QMGR_INLINE PUBLIC IX_STATUS
1769ixQMgrQStatusGet (IxQMgrQId qId,
1770 IxQMgrQStatus *qStatus);
1771#endif /* endif NO_INLINE_APIS */
1772
1773IX_QMGR_INLINE PUBLIC IX_STATUS
1774ixQMgrQStatusGet (IxQMgrQId qId,
1775 IxQMgrQStatus *qStatus)
1776#ifdef NO_INLINE_APIS
1777 ;
1778#else
1779{
1780 /* read the status of a queue in the range 0-31 */
1781 if (qId < IX_QMGR_MIN_QUEUPP_QID)
1782 {
1783 volatile UINT32 *lowStatRegAddr = (UINT32*)ixQMgrAqmIfQueLowStatRegAddr[qId];
1784
1785 UINT32 lowStatBitsOffset = ixQMgrAqmIfQueLowStatBitsOffset[qId];
1786 UINT32 lowStatBitsMask = ixQMgrAqmIfQueLowStatBitsMask;
1787
1788 /* read the status register for this queue */
1789 *qStatus = IX_QMGR_INLINE_READ_LONG(lowStatRegAddr);
1790
1791 /* mask out the status bits relevant only to this queue */
1792 *qStatus = (*qStatus >> lowStatBitsOffset) & lowStatBitsMask;
1793
1794 }
1795 else /* read status of a queue in the range 32-63 */
1796 {
1797
1798 volatile UINT32 *qNearEmptyStatRegAddr = (UINT32*)ixQMgrAqmIfQueUppStat0RegAddr;
1799 volatile UINT32 *qFullStatRegAddr = (UINT32*)ixQMgrAqmIfQueUppStat1RegAddr;
1800 int maskIndex = qId - IX_QMGR_MIN_QUEUPP_QID;
1801 UINT32 qNearEmptyStatBitMask = ixQMgrAqmIfQueUppStat0BitMask[maskIndex];
1802 UINT32 qFullStatBitMask = ixQMgrAqmIfQueUppStat1BitMask[maskIndex];
1803
1804 /* Reset the status bits */
1805 *qStatus = 0;
1806
1807 /* Check if the queue is nearly empty */
1808 if (IX_QMGR_INLINE_READ_LONG(qNearEmptyStatRegAddr) & qNearEmptyStatBitMask)
1809 {
1810 *qStatus |= IX_QMGR_Q_STATUS_NE_BIT_MASK;
1811 }
1812
1813 /* Check if the queue is full */
1814 if (IX_QMGR_INLINE_READ_LONG(qFullStatRegAddr) & qFullStatBitMask)
1815 {
1816 *qStatus |= IX_QMGR_Q_STATUS_F_BIT_MASK;
1817 }
1818 }
1819 return IX_SUCCESS;
1820}
1821#endif
1822
1823/* ------------------------------------------------------------
1824 Queue dispatch related functions
1825 ---------------------------------------------------------- */
1826
1827/**
1828 *
1829 * @ingroup IxQMgrAPI
1830 *
1831 * @fn ixQMgrDispatcherPrioritySet (IxQMgrQId qId,
1832 IxQMgrPriority priority)
1833 *
1834 * @brief Set the dispatch priority of a queue.
1835 *
1836 * This function is called to set the dispatch priority of queue. The effect of
1837 * this function is to add a priority change request to a queue. This queue is
1838 * serviced by @a ixQMgrDispatcherLoopRunA0, @a ixQMgrDispatcherLoopRunB0 or
1839 * @a ixQMgrDispatcherLoopRunB0LLP.
1840 *
1841 * This function is re-entrant. and can be used from an interrupt context
1842 *
1843 * @param qId @ref IxQMgrQId [in] - the queue identifier
1844 * @param priority @ref IxQMgrPriority [in] - the new queue dispatch priority
1845 *
1846 * @return @li IX_SUCCESS, priority change request is queued
1847 * @return @li IX_QMGR_Q_NOT_CONFIGURED, the specified qId has not been configured
1848 * @return @li IX_QMGR_Q_INVALID_PRIORITY, specified priority is invalid
1849 *
1850 */
1851PUBLIC IX_STATUS
1852ixQMgrDispatcherPrioritySet (IxQMgrQId qId,
1853 IxQMgrPriority priority);
1854/**
1855 *
1856 * @ingroup IxQMgrAPI
1857 *
1858 * @fn ixQMgrNotificationEnable (IxQMgrQId qId,
1859 IxQMgrSourceId sourceId)
1860 *
1861 * @brief Enable notification on a queue for a specified queue source flag.
1862 *
1863 * This function is called by a client of the QMgr to enable notifications on a
1864 * specified condition.
1865 * If the condition for the notification is set after the client has called this
1866 * function but before the function has enabled the interrupt source, then the
1867 * notification will not occur.
1868 * For queues 32-63 the notification source is fixed to the NE(Nearly Empty) flag
1869 * and cannot be changed so the sourceId parameter is ignored for these queues.
1870 * The status register is read before the notofication is enabled and is read again
1871 * after the notification has been enabled, if they differ then the warning status
1872 * is returned.
1873 *
1874 * This function is re-entrant. and can be used from an interrupt context
1875 *
1876 * @param qId @ref IxQMgrQId [in] - the queue identifier
1877 * @param sourceId @ref IxQMgrSourceId [in] - the interrupt src condition identifier
1878 *
1879 * @return @li IX_SUCCESS, the interrupt has been enabled for the specified source
1880 * @return @li IX_QMGR_Q_NOT_CONFIGURED, the specified qId has not been configured
1881 * @return @li IX_QMGR_INVALID_INT_SOURCE_ID, interrupt source invalid for this queue
1882 * @return @li IX_QMGR_WARNING, the status register may not be constistent
1883 *
1884 */
1885PUBLIC IX_STATUS
1886ixQMgrNotificationEnable (IxQMgrQId qId,
1887 IxQMgrSourceId sourceId);
1888
1889/**
1890 * @ingroup IxQMgrAPI
1891 *
1892 * @fn ixQMgrNotificationDisable (IxQMgrQId qId)
1893 *
1894 * @brief Disable notifications on a queue.
1895 *
1896 * This function is called to disable notifications on a specified queue.
1897 *
1898 * This function is re-entrant. and can be used from an interrupt context
1899 *
1900 * @param qId @ref IxQMgrQId [in] - the queue identifier
1901 *
1902 * @return @li IX_SUCCESS, the interrupt has been disabled
1903 * @return @li IX_QMGR_Q_NOT_CONFIGURED, the specified qId has not been configured
1904 *
1905 */
1906PUBLIC IX_STATUS
1907ixQMgrNotificationDisable (IxQMgrQId qId);
1908
1909/**
1910 *
1911 * @ingroup IxQMgrAPI
1912 *
1913 * @fn ixQMgrDispatcherLoopRunA0 (IxQMgrDispatchGroup group)
1914 *
1915 * @brief Run the callback dispatcher.
1916 *
1917 * This function runs the dispatcher for a group of queues.
1918 * Callbacks are made for interrupts that have occurred on queues within
1919 * the group that have registered callbacks. The order in which queues are
1920 * serviced depends on the queue priorities set by the client.
1921 * This function may be called from interrupt or task context.
1922 * For optimisations that were introduced in IXP42X B0 and supported IXP46X
1923 * the @a ixQMgrDispatcherLoopRunB0, or @a ixQMgrDispatcherLoopRunB0LLP
1924 * should be used.
1925 *
1926 * This function is not re-entrant.
1927 *
1928 * @param group @ref IxQMgrDispatchGroup [in] - the group of queues over which the
1929 * dispatcher will run
1930 *
1931 * @return @li void
1932 *
1933 * @note This function may be called from interrupt or task context.
1934 * However, for optimal performance the choice of context depends also on the
1935 * operating system used.
1936 *
1937 */
1938PUBLIC void
1939ixQMgrDispatcherLoopRunA0 (IxQMgrDispatchGroup group);
1940
1941/**
1942 *
1943 * @ingroup IxQMgrAPI
1944 *
1945 * @fn ixQMgrDispatcherLoopRunB0 (IxQMgrDispatchGroup group)
1946 *
1947 * @brief Run the callback dispatcher.
1948 *
1949 * The enhanced version of @a ixQMgrDispatcherLoopRunA0 that is optimised for
1950 * features introduced in IXP42X B0 silicon and supported on IXP46X.
1951 * This is the default dispatcher for IXP42X B0 and IXP46X silicon.
1952 * The function runs the dispatcher for a group of queues.
1953 * Callbacks are made for interrupts that have occurred on queues within
1954 * the group that have registered callbacks. The order in which queues are
1955 * serviced depends on the queue priorities set by the client.
1956 * This function may be called from interrupt or task context.
1957 *
1958 * This function is not re-entrant.
1959 *
1960 * @param group @ref IxQMgrDispatchGroup [in] - the group of queues over which the
1961 * dispatcher will run
1962 *
1963 * @return @li void
1964 *
1965 *
1966 * @note This function may be called from interrupt or task context.
1967 * However, for optimal performance the choice of context depends also on the
1968 * operating system used.
1969 *
1970 */
1971PUBLIC void
1972ixQMgrDispatcherLoopRunB0 (IxQMgrDispatchGroup group);
1973
1974/**
1975 *
1976 * @ingroup IxQMgrAPI
1977 *
1978 * @fn ixQMgrDispatcherLoopRunB0LLP (IxQMgrDispatchGroup group)
1979 *
1980 * @brief Run the callback dispatcher.
1981 *
1982 * This is a version of the optimised dispatcher for IXP42X B0 and IXP46X,
1983 * @a ixQMgrDispatcherLoopRunB0, with added support for livelock prevention.
1984 * This dispatcher will only be used for the IXP42X B0 or IXP46X silicon if
1985 * feature control indicates that IX_FEATURECTRL_ORIGB0_DISPATCHER is set to
1986 * IX_FEATURE_CTRL_SWCONFIG_DISABLED. Otherwise the @a ixQMgrDispatcherLoopRunB0
1987 * dispatcher will be used (Default).
1988 *
1989 * When this dispatcher notifies for a queue that is type
1990 * IX_QMGR_TYPE_REALTIME_PERIODIC, notifications for queues that are set
1991 * as type IX_QMGR_REALTIME_SPORADIC are not processed and disabled.
1992 * This helps prevent any tasks resulting from the notification of the
1993 * IX_QMGR_TYPE_REALTIME_PERIODIC type queue to being subject to livelock.
1994 * The function runs the dispatcher for a group of queues.
1995 * Callbacks are made for interrupts that have occurred on queues within
1996 * the group that have registered callbacks. The order in which queues are
1997 * serviced depends on their type along with the queue priorities set by the
1998 * client. This function may be called from interrupt or task context.
1999 *
2000 * This function is not re-entrant.
2001 *
2002 * @param group @ref IxQMgrDispatchGroup [in] - the group of queues over which
2003 * the dispatcher will run
2004 *
2005 * @return @li void
2006 *
2007 * @note This function may be called from interrupt or task context.
2008 * However, for optimal performance the choice of context depends also on the
2009 * operating system used.
2010 *
2011 */
2012PUBLIC void
2013ixQMgrDispatcherLoopRunB0LLP (IxQMgrDispatchGroup group);
2014
2015/**
2016 *
2017 * @ingroup IxQMgrAPI
2018 *
2019 * @fn ixQMgrNotificationCallbackSet (IxQMgrQId qId,
2020 IxQMgrCallback callback,
2021 IxQMgrCallbackId callbackId)
2022 *
2023 * @brief Set the notification callback for a queue.
2024 *
2025 * This function sets the callback for the specified queue. This callback will
2026 * be called by the dispatcher, and may be called in the context of a interrupt
2027 * If callback has a value of NULL the previously registered callback, if one
2028 * exists will be unregistered.
2029 *
2030 * @param qId @ref IxQMgrQId [in] - the queue idenfifier
2031 * @param callback @ref IxQMgrCallback [in] - the callback registered for this queue
2032 * @param callbackId @ref IxQMgrCallbackId [in] - the callback identifier
2033 *
2034 * @return @li IX_SUCCESS, the callback for the specified queue has been set
2035 * @return @li IX_QMGR_Q_NOT_CONFIGURED, the specified qId has not been configured
2036 *
2037 */
2038PUBLIC IX_STATUS
2039ixQMgrNotificationCallbackSet (IxQMgrQId qId,
2040 IxQMgrCallback callback,
2041 IxQMgrCallbackId callbackId);
2042
2043/**
2044 *
2045 * @ingroup IxQMgrAPI
2046 *
2047 * @fn ixQMgrDispatcherLoopGet (IxQMgrDispatcherFuncPtr *qDispatcherFuncPtr)
2048 *
2049 * @brief Get QMgr DispatcherLoopRun for respective silicon device
2050 *
2051 * This function gets a function pointer to ixQMgrDispatcherLoopRunA0() for IXP42X A0
2052 * Silicon. If the IXP42X B0 or 46X Silicon, the default is the ixQMgrDispatcherLoopRunB0()
2053 * function, however if live lock prevention is enabled a function pointer to
2054 * ixQMgrDispatcherLoopRunB0LLP() is given.
2055 *
2056 * @param *qDispatchFuncPtr @ref IxQMgrDispatcherFuncPtr [out] -
2057 * the function pointer of QMgr Dispatcher
2058 *
2059 */
2060PUBLIC void
2061ixQMgrDispatcherLoopGet (IxQMgrDispatcherFuncPtr *qDispatcherFuncPtr);
2062
2063/**
2064 *
2065 * @ingroup IxQMgrAPI
2066 *
2067 * @fn ixQMgrStickyInterruptRegEnable(void)
2068 *
2069 * @brief Enable AQM's sticky interrupt register behaviour only available
2070 * on B0 Silicon.
2071 *
2072 * When AQM's sticky interrupt register is enabled, interrupt register bit will
2073 * only be cleared when a '1' is written to interrupt register bit and the
2074 * interrupting condition is satisfied, i.e.queue condition does not exist.
2075 *
2076 * @note This function must be called before any queue is enabled.
2077 * Calling this function after queue is enabled will cause
2078 * undefined results.
2079 *
2080 * @return none
2081 *
2082 */
2083PUBLIC void
2084ixQMgrStickyInterruptRegEnable(void);
2085
2086
2087/**
2088 * @ingroup IxQMgrAPI
2089 *
2090 * @fn ixQMgrCallbackTypeSet(IxQMgrQId qId,
2091 IxQMgrType type)
2092 *
2093 * @brief Set the Callback Type of a queue.
2094 *
2095 * This function is only used for live lock prevention.
2096 * This function allows the callback type of a queue to be set. The default for
2097 * all queues is IX_QMGR_TYPE_REALTIME_OTHER. Setting the type to
2098 * IX_QMGR_TYPE_REALTIME_SPORADIC means that this queue will have it's
2099 * notifications disabled while there is a task associated with a
2100 * queue of type IX_QMGR_TYPE_REALTIME_PERIODIC running. As live lock
2101 * prevention operates on lower queues, this function should
2102 * be called for lower queues only.
2103 * This function is not re-entrant.
2104 *
2105 * @param qId @ref IxQMgrQId [in] - the queue identifier
2106 * @param type @ref IxQMgrType [in] - the type of callback
2107 *
2108 * @return @li IX_SUCCESS, successfully set callback type for the queue entry
2109 * @return @li IX_QMGR_Q_NOT_CONFIGURED, queue not configured for this QId
2110 * @return @li IX_QMGR_PARAMETER_ERROR, invalid parameter(s).
2111 *
2112 */
2113PUBLIC IX_STATUS
2114ixQMgrCallbackTypeSet(IxQMgrQId qId,
2115 IxQMgrType type);
2116
2117/**
2118 * @ingroup IxQMgrAPI
2119 *
2120 * @fn ixQMgrCallbackTypeGet(IxQMgrQId qId,
2121 IxQMgrType *type)
2122 *
2123 * @brief Get the Callback Type of a queue.
2124 *
2125 * This function allows the callback type of a queue to be got. As live lock
2126 * prevention operates on lower queues, this function should
2127 * be called for lower queues only.
2128 * This function is re-entrant.
2129 *
2130 * @param qId @ref IxQMgrQId [in] - the queue identifier
2131 * @param *type @ref IxQMgrType [out] - the type of callback
2132 *
2133 * @return @li IX_SUCCESS, successfully set callback type for the queue entry
2134 * @return @li IX_QMGR_Q_NOT_CONFIGURED, queue not configured for this QId
2135 * @return @li IX_QMGR_PARAMETER_ERROR, invalid parameter(s)
2136 *
2137 */
2138PUBLIC IX_STATUS
2139ixQMgrCallbackTypeGet(IxQMgrQId qId,
2140 IxQMgrType *type);
2141
2142/**
2143 * @ingroup IxQMgrAPI
2144 *
2145 * @fn ixQMgrPeriodicDone(void)
2146 *
2147 * @brief Indicate that the Periodic task is completed for LLP
2148 *
2149 * This function is used as part of live lock prevention.
2150 * A periodic task is a task that results from a queue that
2151 * is set as type IX_QMGR_TYPE_REALTIME_PERIODIC. This function
2152 * should be called to indicate to the dispatcher that the
2153 * the periodic task is completed. This ensures that the notifications
2154 * for queues set as type sporadic queues are re-enabled.
2155 * This function is re-entrant.
2156 *
2157 */
2158PUBLIC void
2159ixQMgrPeriodicDone(void);
2160
2161
2162/**
2163 * @ingroup IxQMgrAPI
2164 *
2165 * @fn ixQMgrLLPShow(int resetStats)
2166 *
2167 * @brief Print out the live lock prevention statistics when in debug mode.
2168 *
2169 * This function prints out statistics related to the livelock. These
2170 * statistics are only collected in debug mode.
2171 * This function is not re-entrant.
2172 *
2173 * @param resetStats @ref int [in] - if set the the stats are reset.
2174 *
2175 */
2176PUBLIC void
2177ixQMgrLLPShow(int resetStats);
2178
2179
2180#endif /* IXQMGR_H */
2181
2182/**
2183 * @} defgroup IxQMgrAPI
2184 */
2185
2186