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