/*
 * (C) Copyright IBM Corp. 2007, 2010
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, see <http://www.gnu.org/licenses>.
 *
 * Author: Tom Gooding, IBM
 */


#ifndef _BGCNS_H
#define _BGCNS_H


#ifndef __ASSEMBLY__

/*! @page CNS Common Node Services
 *
 *  @section CNS_S10 Overview
 *
 *  As the name implies, the <b>Common Node Services (CNS)</b> layer provides @b services
 *  to the kernel.  These services may be simple queries abstracting various node
 *  specific data (such as DDR size) or they may be more sophisticated software services,
 *  such as common machine check handling.  Additionally, some services may be implicit,
 *  such as the initialization of various hardware devices unique to Blue Gene, such as
 *  Netbus and SerDes.
 *
 *  Services are not directly linked into the kernel, but rather are invoked from kernel
 *  code via a <b>service directory</b> which is itself part of an overall <b>service
 *  descriptor</b>.  This service descriptor is constructed during initialization and
 *  is passed to the kernel when the kernel is booted.  The service directory is a
 *  collection of <b>service references</b>.
 *
 *  During partition (block) booting, ELF images are loaded onto the compute and I/O nodes.
 *  The bootloader (@i aka microloader) boots first and then transfers control to the Common
 *  Node Services layer so that it, in turn, may boot.
 *
 *  Once the CNS layer has booted, control is transferred to the kernel so that it may also
 *  boot.  All services provided by the CNS layer are immediately available at this time.
 *
 *  @section CNS_S20 Programming Model
 *
 *  A kernel running on top of the CNS layer is not statically linked to the common services.
 *  Instead, the services are called via function pointers provided by the services descriptor,
 *  which is described here:  @ref _BGCNS_ServiceDirectory.
 *
 *  The kernel must operate under the following rules and restrictions:
 *  @li The kernel must not alter the services descriptor.  The descriptor must be treated as a read-only
 *      data structure even though the kernel may have the ability to alter it.  Because CNS trusts the
 *      kernel, this also implies that the kernel must not expose the descriptor to any untrusted
 *      software (such as application code).
 *  @li The kernel must ensure that the CNS virtual memory region is mapped prior to invoking any
 *      service.
 *  @li The kernel must ensure that any data passed to services via parameters is mapped.
 *      Specifically, TLB entries must be mapped as shared (TID = 0) and must be either readable
 *      (input parameters) or readable and writeable (output parameters).
 *  @li The kernel must treat the virtual address range (@ref _BGCNS_Descriptor::baseVirtualAddress ,
 *      _BGCNS_Descriptor::baseVirtualAddress + @ref _BGCNS_Descriptor::size - 1)  as reserved.
 *      That is, the kernel must not use this region of virtual memory for anything besides accessing
 *      the services descriptor.
 *  @li The kernel must treat the physical address range (@ref _BGCNS_Descriptor::basePhysicalAddress,
 *      _BGCNS_Descriptor::basePhysicalAddress + _BGCNS_Descriptor::size - 1) as reserved.  The
 *      kernel must not map this memory for any other use.
 *  @li The kernel must not access any of the reserved virtual address regions with TLB settings that
 *      are different from those used by CNS.  The kernel is allowed to unmap any of the reserved
 *      memory TLBs for its own use.  However, in such a case and per the rule above, the kernel must
 *      ensure that the region is mapped prior to using any CNS facilities (such as invoking a service).
 *  @li CNS may need to map one or more TLB entries in order to access Blue Gene devices.  In such a case,
 *      CNS may borrow TLB entries; the TLB will be returned to its original state before the service returns
 *      control to the invoking kernel.  Kernels may avoid this behavior for specific devices by using
 *      the mapDevice service.
 *  @li The kernel's ELF image must avoid the 256K region of memory between 0x07000000 and 0x0703FFFF.  This
 *      region is used for the pre-relocated CNS image and will be available for general use once CNS boot
 *      is complete.
 *  @li The kernel must not alter any reserved SPRs, DCRs or memory-mapped device registers.
 *
 *  The CNS software may behave unpredictably if any of these rules and restrictions is violated.
 *
 *  Kernels may make the following assumptions about CNS:
 *
 *  @li The data passed in the firmware descriptor (see below) is static.  Specifically, the base addresses,
 *      size and service directory will not change once CNS boot is complete.
 *
 *  @subsection CNS_21 Programming Examples
 *
 *  @subsubsection CNS_211 Obtaining the Personality
 *
 *  The following example shows how to fetch a copy of the Blue Gene personality structure and also
 *  serves as a simple example of invoking a service:
 *
 *  @code
 *
 *      BGCNS_Descriptor* descr = ...; // obtained from CNS at boot time
 *     _BGP_Personality_t* pers = (_BGP_Personality_t*)(*descr->services->getPersonalityData)();
 *     ...
 *  @endcode
 *
 *  The programming model guarantees that the descriptor is static.  Thus, one can provide a
 *  convenience method to make service invocation a little more readable
 *
 *  @code
 *
 *
 *  static BGCNS_Descriptor* _cns_descriptor = ...; // obtained from CNS at boot time
 *
 *  inline BGCNS_ServiceDirectory* cns() { return _cns_descriptor->services; }
 *
 *  void foo() {
 *     _BGP_Personality_t* pers = (_BGP_Personality_t*)cns()->getPersonalityData();
 *     ...
 *  }
 *
 *  @endcode
 *
 *  This style will be used in all of the subsequent examples.
 *
 *  @subsubsection CNS_212 SMP Initialization
 *
 *  Common Node Services will launch the kernel on a single core (typically core 0) and will
 *  leave the remaining cores parked.  The kernel can activate additional cores via the @c takeCPU
 *  service.  Here is a very simple example of such kernel code:
 *
 *  @code
 *
 *    void anEntryPoint(unsigned core, void* arg_not_used) {
 *        // Do whatever your kernel needs to do here.  Typically,
 *        // this function never returns.  You will arrive here
 *        // when takeCPU is invoked (below).
 *    }
 *
 *    void someCodeOnTheMainThread() {
 *
 *        // ...
 *
 *        unsigned N = cns()->getNumberOfCores();
 *
 *        for (core = 1; core < N; core++) {
 *            if ( cns()->takeCPU(core, NULL, &anEntryPoint) != 0 ) {
 *                // error handling goes here
 *            }
 *        }
 *
 *        // ...
 *    }
 *
 *  @endcode
 *
 *  @subsubsection CNS_213 Version Compatibility
 *
 *  Common Node Services structures and APIs should remain compatible within maintenance
 *  releases and e-fixes.  Kernel's may add a runtime check to ensure that the version
 *  of CNS is compatible with the version from compile time.  This is done as follows:
 *
 *  @code
 *
 *      BGCNS_Descriptor* descr = ...; // obtained from CNS at boot time
 *
 *      if ( ! BGCNS_IS_COMPATIBLE(descr) ) {
 *           // incompatible CNS (panic?)
 *      }
 *
 *  @endcode
 *
 *  @subsubsection CNS_23 Interrupts
 *
 *  A kernel wanting to use the CNS interrupt services would first have to enable interrupts
 *  for the appropriate Blue Gene BIC group and IRQ within that group.  This would likely be
 *  done at boot time.  So, for example, such a kernel could enable interrupts for the Universal
 *  Performance Counter (group 5, IRQ 2) to be handled by the non-critical handler of core 0 as
 *  follows:
 *
 *  @code
 *      cns()->enableInterrupt(5, 2, BGCNS_NonCritical, 0);
 *  @endcode
 *
 *  Such a kernel might also maintain a collection of routines that act as subhandlers of the
 *  non-critical interrupt handler.  In this example, we'll assume it is simply a two
 *  dimensional array indexed by group and IRQ:
 *
 *  @code
 *      subhandlers[5][2] = &theUpcSubHandler;
 *  @endcode
 *
 *  That kernel's non-critical interrupt handler would then typically handle all interrupts by
 *  successively invoking the getInterrupt() service to determine the group and IRQ, and then
 *  dispatching the appropriate subhandler.  Additionally, the interrupt will be acknowledged
 *  so to avoid continuous interruption:
 *
 *  @code
 *      unsigned grp, irq;
 *
 *      while ( cns()->getInterrupt(&g, &i, BGCNS_NonCritical) == 0) {
 *          (*subhandlers[g][i])(); // dispatch the handler
 *          cns()->acknowledgeInterrupt(g,i); // ack the interrupt
 *      }
 *  @endcode
 *
 *  @subsubsection CNS_24 Global Barriers and Interrupts
 *
 *  The Blue Gene/P Global Interrupt Controller (aka GLINT) provides 4 independent channels
 *  that may be configured as either a global barrier or a global interrupt.
 *
 *  Barriers are constructed by invoking the barrier service:
 *
 *  @code
 *      unsigned channel = 0;
 *
 *      // synchronize:
 *      int reset = 1;
 *      int rc;
 *      while ( (rc = cns()->globalBarrier_nonBlocking(channel, reset, 1000)) == BGCNS_RC_CONTINUE ) {
 *        reset = 0;
 *      }
 *
 *      if ( rc == BGCNS_RC_COMPLETE ) {
 *        // good path
 *      }
 *      else {
 *        // error
 *      }
 *  @endcode
 *
 *  Similarly, a barrier with a timeout can also be constructed:
 *
 *  @code
 *      unsigned channel = 0;
 *      int reset = 1;
 *      unsigned long long startTime = ...; // obtain current time
 *      int rc;
 *
 *      while ( (rc = cns()->globalBarrier_nonBlocking(channel,reset, 1000)) == BGCNS_RC_CONTINUE ) {
 *         reset = 0;
 *         unsigned long long currentTime = ...; // obtain current time
 *         if ( currentTime - startTime > timeout )
 *           break;
 *      }
 *
 *      if ( rc == BGCNS_RC_COMPLETE )  {
 *        // good path
 *      }
 *      else {
 *        // timeout or error
 *      }
 *  @endcode
 *
 *  A node may opt out of a barrier channel via the disableBarrier service:
 *
 *  @code
 *
 *    // some other synchronization mechanism needs to go here
 *
 *    cns()->disableBarrier(channel);
 *
 *  @endcode
 *
 *  Conversely, it may opt back in:
 *
 *  @code
 *    cns()->enableBarrier(channel, user_mode);
 *  @endcode
 *
 *  By default, CNS reserves the use of channel 2 as a global interrupt for environmental
 *  monitoring.  It also reserves channel 3 for use as a supervisory mode, compute-node
 *  only barrier.  Compute node kernels are free to share this channel for the same
 *  purpose (compute node, supervisory barrier).  The enable/disable barrier services
 *  may return errors if operating on a reserved channel.
 *
 *  NOTE: The standard BG/P software stack, which includes I/O node Linux and Compute Node
 *  Kernel (CNK) uses channel 0 as an I/O node barrier during boot and transforms it to an
 *  compute-node only barrier when jobs execute.
 *
 *
 *  @section CNS_3 DMA Services
 *
 *  The DMA services provided in CNS are low-level services.  Interested readers of this area should
 *  also look at the documentation for the DMA SPIs, which are at a slightly higher level.
 *
 *
 *
 *  @section CNS_4 Reserved and Preferred Addresses
 *
 *
 *  The following virtual memory regions are reserved and must be avoided by
 *  kernels:
 *
 *  @code
 *
 *  +------------+------------+------+----------------------+-----------------------+
 *  | Lower      | Upper      | Size | Usage                | Attributes            |
 *  +------------+------------+------+----------------------+-----------------------+
 *  | CNSlow[1]  | CNShigh[2] | 256K | CNS                  | I, Rs, Ws, Xs         |
 *  +------------+------------+------+----------------------+-----------------------+
 *
 *    [1] CNSlow  = descr->baseVirtualAddress , usually 0xFFF40000
 *    [2] CNShigh = descr->baseVirtualAddress + descr->size - 1;  usually 0xFFF7FFFF
 *
 *  @endcode
 *
 *  The following virtual memory regions are used by default in CNS.  Kernels that wish to have
 *  a different memory map may do so via the mapDevice service.
 *
 *  @code
 *  +------------+------------+------+----------------------+-----------------------+
 *  | Lower      | Upper      | Size | Usage                | Attributes            |
 *  +------------+------------+------+----------------------+-----------------------+
 *  | 0xFFFB0000 | 0xFFFCFFFF |  64K | Torus                | I, G, Rs, Ws, Ru, Wu  |
 *  +------------+------------+------+----------------------+-----------------------+
 *  | 0xFFFD0000 | 0xFFFD3FFF |  16K | DMA                  | I, G, Rs, Ws, Ru, Wu  |
 *  +------------+------------+------+----------------------+-----------------------+
 *  | 0xFFFD9000 | 0xFFFD9FFF |   4K | DevBus               | I, G, Rs, Ws          |
 *  +------------+------------+------+----------------------+-----------------------+
 *  | 0xFFFDA000 | 0xFFFDAFFF |   4K | UPC                  | I, G, Rs, Ws, Ru, Wu  |
 *  +------------+------------+------+----------------------+-----------------------+
 *  | 0xFFFDC000 | 0xFFFDD3FF |   4K | Collective           | I, G, Rs, Ws, Ru, Wu  |
 *  +------------+------------+------+----------------------+-----------------------+
 *  | 0xFFFDE000 | 0xFFFDEFFF |   4K | BIC                  | I, G, Rs, Ws, Xs      |
 *  +------------+------------+------+----------------------+-----------------------+
 *  | 0xFFFF0000 | 0xFFFF3FFF |  16K | Lockbox (supervisor) | I, G, Rs, Ws          |
 *  +------------+------------+------+----------------------+-----------------------+
 *  | 0xFFFF4000 | 0xFFFF7FFF |  16K | Lockbox (user)       | I, G, Rs, Ws, Ru, Wu  |
 *  +------------+------------+------+----------------------+-----------------------+
 *  | 0xFFFF8000 | 0xFFFFFFFF |  32K | SRAM                 | SWOA, WL1, Rs, Ws, Xs |
 *  +------------+------------+------+----------------------+-----------------------+
 *  @endcode
 *
 */


#define BGCNS_VERSION 0x01030000 /* V1R3M0 efix 0 */
#define BGCNS_IS_COMPATIBLE(descr) ( ((descr)->version & 0xFFFF0000) == (BGCNS_VERSION & 0xFFFF0000) ) //!< True iff the given descriptor is compatible with this version of CNS

/* ! @enum  BGCNS_InterruptType */
/* ! @brief Defines the different types of interrupts known to */
/* !        Common Node Services. */
typedef enum  {
    BGCNS_NonCritical,     //!< Non-critical interrupt
    BGCNS_Critical,        //!< Critical interrupt
    BGCNS_MachineCheck,    //!< Machine check
} BGCNS_InterruptType;

/* ! @enum   BGCNS_FifoOperation */
/* ! @brief  Defines the types of FIFO operations */
/* ! @see    _BGCNS_ServiceDirectory::setDmaFifoControls */
/* ! @see    _BGCNS_ServiceDirectory::setDmaLocalCopies */
/* ! @see    _BGCNS_ServiceDirectory::setDmaPriority */
typedef enum {
    BGCNS_Disable = 0,
    BGCNS_Enable = 1,
    BGCNS_Reenable = 2
} BGCNS_FifoOperation;

/* ! @enum BGCNS_FifoFacility */
/* ! @brief Defines the various types of FIFO facilities */
typedef enum {
    BGCNS_InjectionFifo,                 //!< Normal Injection FIFO
    BGCNS_ReceptionFifo,                 //!< Normal Reception FIFO
    BGCNS_ReceptionHeaderFifo,           //!< Reception Header FIFO (typically used only for debugging)
    BGCNS_InjectionFifoInterrupt,
    BGCNS_ReceptionFifoInterrupt,
    BGCNS_ReceptionHeaderFifoInterrupt,
    BGCNS_InjectionCounterInterrupt,
    BGCNS_ReceptionCounterInterrupt
} BGCNS_FifoFacility;

/* ! @enum  BGCNS_LinkType */
/* ! @brief Defines the types of MAC links. */
/* ! @see   _BGCNS_ServiceDirectory::macTestLink */
typedef enum {
    BGCNS_Transmitter,  //!< A transmitter link.
    BGCNS_Receiver      //!< A receiver link.
} BGCNS_LinkType;

/* ! @enum  BGCNS_EnvmonParameter */
/* ! @brief Enumerates the various environmental monitor parameters. */
/* ! @see   _BGCNS_ServiceDirectory::getEnvmonParm */
/* ! @see   _BGCNS_ServiceDirectory::setEnvmonParm */
typedef enum {
    BGCNS_envmon_period  = 0,
    BGCNS_envmon_policy,
    BGCNS_envmon_globintwire,

     /*  temporary */
    BGCNS_envmon_duration,
    BGCNS_envmon_ddrratio,
    BGCNS_envmon_numparms
} BGCNS_EnvmonParameter;


#define BGCNS_RC_COMPLETE  0         //!< Indicates that the operation completed normally.
#define BGCNS_RC_CONTINUE  1         //!< Indicates that the operation is still in progress.
#define BGCNS_RC_TIMEOUT  -1         //!< Indicates that the operation timed out.
#define BGCNS_RC_ERROR    -2         //!< Indicates that the operation failed.

#define BGCNS_NUM_DMA_RECEPTION_GROUPS           4
#define BGCNS_NUM_DMA_RECEPTION_FIFOS_PER_GROUP  8

/* ! @brief Describes the mapping of physical torus reception FIFOs to DMA reception FIFOs (rmFIFOs). */
/* !     The first dimension indexes DMA reception groups, which are a combination of PID0 and PID1 bits */
/* !     from the DMA packet. */
/* ! */
/* !     The second dimension indexes through the different dimensions: X+, X-, Y+, Y-, Z+, Z-, high priority */
/* !     and local copy. */
typedef unsigned char BGCNS_ReceptionMap[BGCNS_NUM_DMA_RECEPTION_GROUPS][BGCNS_NUM_DMA_RECEPTION_FIFOS_PER_GROUP];

/* ! @brief Indicates that an interrupt is to be broadcast on all cores. */
/* ! @see   _BGCNS_ServiceDirectory::enableInterrupt */
#define BGCNS_ALL_CORE_BROADCAST 0xFFFFFFFFu


/* ! @enum   BGCNS_DeviceMasks */
/* ! @brief  Provides a list of masks for various Blue Gene devices */

typedef enum {
    BGCNS_SRAM       = 0x80000000u,
    BGCNS_BIC        = 0x40000000u,
    BGCNS_Torus      = 0x20000000u,
    BGCNS_DevBus     = 0x10000000u,
    BGCNS_XEMAC      = 0x08000000u,
    BGCNS_LockBox    = 0x04000000u,
    BGCNS_Collective = 0x02000000u,
    BGCNS_SRAM_Err   = 0x01000000u,
    BGCNS_DMA        = 0x00800000u,
    BGCNS_UPC        = 0x00400000u
} BGCNS_DeviceMasks;

/* ! @typedef BGCNS_ServiceDirectory */
/* ! @struct  _BGCNS_ServiceDirectory */
/* ! @brief   The service directory is a collection of function pointers to services */
/* !          provided by the Common Node Services. */
typedef struct _BGCNS_ServiceDirectory {

    /*------------------------------------------*/
    /*--- Informational services for the node --*/
    /*------------------------------------------*/


    int (*isIONode)(void);                             //!< Returns 1 if this is an I/O node; 0 if not.


    /*-----------------------------------------------------------------*/
    /*--- Informational services for obtaining Raw personality data ---*/
    /*-----------------------------------------------------------------*/

    unsigned int (*getPersonalitySize)(void);           //!< Returns the size (in bytes) of the Blue Gene personality.
    void* (*getPersonalityData)(void);		      //!< Returns a pointer to the raw personality data.


    /*-----------------------------------------------*/
    /*--- Services for Symmetric Multi-Processing ---*/
    /*-----------------------------------------------*/


    unsigned (*getNumberOfCores)(void);                  //!< Returns the number of CPUs on this node.

     /* ! @brief Called by the kernel to activate a CPU. */
     /* ! @param[in] cpu The index of the cpu (core) to be activated. */
     /* ! @param[in] entry The (kernel) entry point function.  This function will be invoked when */
     /* !            the CPU is actually activated. */
     /* ! @param[in] arg A pointer to the lone argument to be passed to the entry point. */
     /* ! @return Zero (0) if the CPU was succsessfully activated.  Non-zero if the CPU was not */
     /* !            activated (e.g. invalid cpu argument, or the cpu has already been */
     /* !            activated). */
     /* ! @remarks   See Section x of the Common Node Services overview for details. */
    int (*takeCPU)(unsigned cpu, void *arg, void (*entry)(unsigned cpu, void *arg));


    /*--------------------------------------*/
    /*--- Services for Blue Gene devices ---*/
    /*--------------------------------------*/

     /* ! @brief  Checks active devices for a clean termination state and returns 0 */
     /* !         if everything is nominal.  Returns non-zero if any anomaly is */
     /* !         detected and logs violations. */
     /* ! @param[in] job_rc specifies the return code of the job that is terminating. */
    int (*terminationCheck)(int job_rc);

    /*-------------------------------*/
    /*--- Services for interrupts ---*/
    /*-------------------------------*/


     /* ! @brief Enables the specified interrupt.  For all interrupts except inter-processor */
     /* !        interrupts, the interrupt will bendled by the specified core. */
     /* ! @param[in] group Specifies the Blue Gene interrupt group */
     /* ! @param[in] irq  Specifies the interrupt index within the group */
     /* ! @param[in] itype Specifies the type of interrupt that hardware will present */
     /* !            for this group/irq. */
     /* ! @param[in] core Specifies which core will handle the interrupt.  If specified as */
     /* !            BGCNS_ALL_CORE_BROADCAST, then all cores will handle the interrupt. */
     /* ! @return    Returns zero (0) if the interrupt is enabled and returns non-zero if it was not */
     /* !            (including the case of bad arguments). */
    int (*enableInterrupt)(unsigned group, unsigned irq, BGCNS_InterruptType itype, unsigned core);

     /* ! @brief Disables the specified interrupt. */
     /* ! @param[in] group Specifies the Blue Gene interrupt group */
     /* ! @param[in] irq  Specifies the interrupt index within the group */
     /* ! @return    Returns zero (0) if the interrupt is disabled and returns non-zero if it was not */
     /* !            (including the case of bad arguments). */
    int (*disableInterrupt)(unsigned group, unsigned irq);

     /* ! @brief Queries the Blue Gene interrupt hardware for interrupts of the given */
     /* !        type and returns the group/IRQ.  This service is typically used in the */
     /* !        context of an interrupt handler.  Since multiple interrupt conditions */
     /* !        may be present, the service is typically invoked from the handler */
     /* !        (along with corresponding acknowledgement) until the return code */
     /* !        indicates that no more interrupts are present. */
     /* ! @param[out] group Specifies the Blue Gene interrupt group.  The value is valid */
     /* !        only when the return code is 0. */
     /* ! @param[out] irq  Specifies the interrupt index within the group.  The value is */
     /* !        valid only when the reutrn code is zero. */
     /* ! @param[in] itype Specifies the type of interrupt being queried. */
     /* ! @return Returns zero (0) if an interrupt condition of the specified type exists.  Returns -1 */
     /* !        if no such condition exists. */
    int (*getInterrupt)(BGCNS_InterruptType itype, unsigned* group, unsigned* irq);

     /* ! @brief Acknowledges the specified interrupt, thus clearing the interrupt */
     /* !       condition in the interrupt controller hardware. */
     /* ! @param[in] group Specifies the Blue Gene interrupt group */
     /* ! @param[in] irq  Specifies the interrupt index within the group */
     /* ! @return    Returns zero (0) if the interrupt is acknowledged and returns non-zero if it was not */
     /* !            (including the case of bad arguments). */
     /* ! @remarks Note that for some interrupts, it is not sufficient to only acknowledge */
     /* !       the interrupt; the hardware condition that triggered the interrupt may */
     /* !       also need to be cleared. */
    int (*acknowledgeInterrupt)(unsigned group, unsigned irq);

     /* ! @brief Raises the specified interrupt. */
     /* ! @param[in] group Specifies the Blue Gene interrupt group */
     /* ! @param[in] irq  Specifies the interrupt index within the group */
    int (*raiseInterrupt)(unsigned group, unsigned irq);


    /*------------------------*/
    /*--- Mailbox services ---*/
    /*------------------------*/

    unsigned (*getMailboxMaximumConsoleInputSize)(void);   //!< Returns the actual maximum console message input data size.
    unsigned (*getMailboxMaximumConsoleOutputSize)(void);  //!< Returns the actual maximum console message output data size.

     /* ! @brief Writes a text message to the output mailbox. */
     /* ! @param[in] msg a pointer to the message to be written. */
     /* ! @param[in] msglen the length (in bytes) of the message to be written. */
     /* ! @remarks As with all common services, the message data area must be mapped via */
     /* !          the TLB when the service is called.  The behavior is not defined if this */
     /* !          is not the case. */
     /* ! @return Zero (0) if the message was written successfully, non-zero if anything went */
     /*            wrong (including a message that is too large). */
    int (*writeToMailboxConsole)(char *msg, unsigned msglen);

     /* ! @brief Writes a text message to the output mailbox but does not wait for a */
     /* !        response back from the control system.  When this service is used, */
     /* !        the caller must poll for completion using the testForOutboxCompletion */
     /* !        service. */
     /* ! @param[in] msg a pointer to the message to be written. */
     /* ! @param[in] msglen the length (in bytes) of the message to be written. */
     /* ! @remarks As with all common services, the message data area must be mapped via */
     /* !          the TLB when the service is called.  The behavior is not defined if this */
     /* !          is not the case. */
     /* ! @return Zero (0) if the message was written successfully, non-zero if anything went */
     /*            wrong (including a message that is too large). */
    int (*writeToMailboxConsole_nonBlocking)(char* msg, unsigned msglen);

     /* ! @brief Tests the outbox to see if the last message was picked up by the control */
     /* !        system. */
     /* ! @return Zero (0) if the last message was piecked and returns non-zero if it has not. */
     /* ! @remarks Typically the caller will invoke this service after having called */
     /* !        writeToMailboxConsole_nonBlocking and will then invoke this service in a */
     /* !        loop until zero is returned. */
    int (*testForOutboxCompletion)(void);

     /* ! @brief Reads a message from the input mail box. */
     /* ! @param msg a pointer to a data area into which the message will be placed. */
     /* ! @param maxMsgSize gives the size of the data area, i.e. the largest message */
     /* !        that may be safely received into the buffer. */
     /* ! @return The actual length of the message (0 if no message was receieved). */
     /* ! @remarks As with all common services, the message data area must be mapped */
     /* !          via the TLB when this service is called.  The results are not defined if */
     /* !          this is not the case. */
    unsigned (*readFromMailboxConsole)(char *buf, unsigned bufsize);

    int (*testInboxAttention)(void);                      //!< Returns 1 if something is available in the input mailbox.

    int (*_no_longer_in_use_1_)(void); //!< Obsolete ... do not use.

    int (*writeToMailbox)(void* message, unsigned length, unsigned cmd);

    /*------------------------------------*/
    /*---  RAS and diagnostic services ---*/
    /*------------------------------------*/

     /* ! @brief TBD */
    void (*machineCheck)(void *regs);

     /* ! @brief Writes a RAS event to the log. */
     /* ! @param[in] facility The facility (aka component). */
     /* ! @param[in] unit The unit (aka subcomponent). */
     /* ! @param[in] err_code The error code. */
     /* ! @param[in] numDetails The number of additional details. */
     /* ! @param[in] details The list of additional details. */
     /* ! @return Zero if the message was written, non-zero if some error condition occurred. */
     /* ! @see bgp/arch/include/common/bgp_ras.h for details on facility, unit and err_code. */
    int (*writeRASEvent)( unsigned facility, unsigned unit, unsigned short err_code, unsigned numDetails, unsigned details[] );

     /* ! @brief Writes a RAS string to the log. */
     /* ! @param[in] facility The facility (aka component). */
     /* ! @param[in] unit The unit (aka subcomponent). */
     /* ! @param[in] err_code The error code. */
     /* ! @param[in] str The message string being written (ASCII encoded, null-terminated).  Note that the length of this string is */
     /* !     limited to _BGP_RAS_ASCII_MAX_LEN characters.  The implementation may choose to truncate the string if it exceeds this */
     /* !     length. */
     /* ! @return Zero if the entire message was written; non-zero if some error condition occurred (including the case where the */
     /* !      string was truncated). */
     /* ! @see bgp/arch/include/common/bgp_ras.h for details on facility, unit and err_code. */
    int (*writeRASString)( unsigned facility, unsigned unit, unsigned short err_code, char* str );


    /*---------------------------------*/
    /*--- Global Interrupt services ---*/
    /*---------------------------------*/

     /* ! @brief A global (compute node) barrier.  This call will block until all other compute nodes */
     /* !        in the partition also arrive at the barrier. */
    int (*globalBarrier)(void);

     /* ! @brief  A global (compute node) barrier.  This call will block until all other compute nodes */
     /* !         in the partition also arrive at the barrier or until the timeout is reached. */
     /* ! @param  timeoutInMillis specifies the timeout duration.  Units are milliseconds. */
     /* ! @return BGCNS_RC_COMPLETE if the barrier completed.  BGCNS_RC_TIMEOUT if the barrier timed */
     /* !         out.  BGCNS_RC_ERROR if some other error occurred. */
    int (*globalBarrierWithTimeout)(unsigned timeoutInMillis);



    /*-------------------------*/
    /*---  Network services ---*/
    /*-------------------------*/


    void (*initializeNetworks)(void);  //!< @todo Is this is going away??? Talk to Andy

    void (*_no_longer_in_use_381)(void); //!< @warning Do not use

    void (*_no_longer_in_use_384)(void);//!< @warning Do not use


    /*--------------------------*/
    /*---  DMA unit services ---*/
    /*--------------------------*/

#define BGCNS_DMA_CAPTURE_X_PLUS         0   //!< watch the X+ receiver
#define BGCNS_DMA_CAPTURE_X_MINUS        1   //!< watch the X- receiver
#define BGCNS_DMA_CAPTURE_Y_PLUS         2   //!< watch the Y+ receiver
#define BGCNS_DMA_CAPTURE_Y_MINUS        3   //!< watch the Y- receiver
#define BGCNS_DMA_CAPTURE_Z_PLUS         4   //!< watch the Z+ receiver
#define BGCNS_DMA_CAPTURE_Z_MINUS        5   //!< watch the Z- receiver
#define BGCNS_DMA_CAPTURE_DISABLE        7   //!< disable link capturing

     /* ! @brief Sets the link capture facility of the DMA unit to watch the specified */
     /* !        receiver (or disable). */
     /* ! @param[in] link Specifies the link being monitored.  Use the BGCNS_DMA_CAPTURE_* */
     /* !        mnemonics defined above. */
     /* ! @return Zero if the operation succeeded, non-zero if it did not (e.g. an invalid */
     /* !        link was specified). */
    int (*setDmaLinkCapture)(int link);

     /* ! @brief Clears the link capture unit so that another packet can be captured. */
    void (*clearDmaLinkCapture)(void);

#define BGCNS_RC_DMA_NO_PACKET_CAPTURED      0
#define BGCNS_RC_DMA_CAPTURE_UNIT_ERROR     -1
#define BGCNS_RC_DMA_DATA_CONFLICT          -2 //!< if initial read indicates a bad packet is captured but subsequent read shows bad packet not captured
#define BGCNS_RC_DMA_DATA_CONFLICT2         -3 //!< if bad packet is captured, but all the bytes are the same
     /* ! @brief Reads the DMA link capture packets. */
    int (*readDmaLinkCapturePackets)(unsigned char* good_packet, int* good_packet_size, unsigned char* bad_packet, int* bad_packet_size);


#define BGCNS_DMA_ALL_GROUPS 0xFFFFFFFF

     /* ! @brief Sets FIFO controls for the DMA unit. */
     /* ! */
     /* ! An operation on facility BGCNS_InjectionFifo enables or disables a subset of the 128 DMA injection FIFOs. */
     /* ! The FIFOs are organized into four groups of 32.  The mask argument is a bit mask (bit i controls the i-th imFIFO */
     /* ! within that group, that is the (group*32)+i imFIFO. */
     /* ! */
     /* ! An operation on facility BGCNS_ReceptionFifo enables or disables a subset of the 32 DMA reception FIFOs. */
     /* ! The group argument is ignored and the mask argument is a bit mask (bit i controls the i-th reception FIFO). */
     /* ! */
     /* ! An operation on facility BGCNS_ReceptionHeaderFifo enables or disables the header FIFO for the specified */
     /* ! group.  The mask argument is ignored.  Note that the header FIFO is typically used for debugging. */
     /* ! */
     /* ! An operation on facility BGCNS_InjectionFifoInterrupt enables or disables threshold interrupts for the */
     /* ! specified injection FIFO.  Threshold interrupts occur if available space is less than the configured */
     /* ! threshold when the FIFO is used for a remote get operation.  The group and mask arguments are as */
     /* ! described in the BGCNS_InjectionFifo operation (above). */
     /* ! */
     /* ! An operation on facility BGCNS_ReceptionFifoInterrupt enables or disables interrupts for the specified */
     /* ! reception FIFO(s).  If enabled, an interrupt will occur when the reception FIFO's available space drops */
     /* ! below the configured threshold.  The group argument selects the interrupt type (type 0, 1, 2 or 3). */
     /* ! The mask argument is a bit mask selecting one or more of the 32 normal reception FIFOs. */
     /* ! */
     /* ! An operation on facility BGCNS_ReceptionHeaderFifoInterrupt enables or disables interrupts for the specified */
     /* ! reception header FIFO.  Reception header FIFOs are used for debug purposes only. */
     /* ! */
     /* ! An operation on facility BGCNS_InjectionCounterInterrupt enables or disables "Counter Hit Zero" interrupts. */
     /* ! The group argument does not specify counter group, but rather specifies interrupt 0, 1, 2 or 3.  The mask */
     /* ! argument is a bit mask that selects one or more counter subgroups to operate on (the 256 injection counters */
     /* ! are partitioned into 32 subgroups of 8 counters). */
     /* ! */
     /* ! An operation on facility BGCNS_ReceptionCounterInterrupt enables or disables "Counter Hit Zero" interrupts */
     /* ! for reception counters.  The group and mask arguments are the as as described in the the */
     /* ! BGCNS_InjectionCounterInterrupt operation (above). */
     /* ! */
     /* ! The buffer argument is used as a means to save/restore in an opaque manner.  This is achieved by passing */
     /* ! a non-NULL buffer to a disable operation and subsequently passing that buffer during a reenable */
     /* ! operation (the buffer is used to snapshot state). */
     /* ! */
     /* ! */
     /* ! @code */
     /* !   +---------------------------------+-----------+---------+-------+ */
     /* !   | Facility                        | group     | mask    | Notes | */
     /* !   +---------------------------------+-----------+---------+-------+ */
     /* !   | BGCNS_InjectionFifo             | 0..3      | 32 bits | [1]   | */
     /* !   +---------------------------------+-----------+---------+-------+ */
     /* !   | BGCNS_ReceptionFifo             | n/a       | 32 bits | [2]   | */
     /* !   +---------------------------------+-----------+---------+-------+ */
     /* !   | BGCNS_ReceptionHeaderFifo       | 0..3, ALL | N/A     |       | */
     /* !   +---------------------------------+-----------+---------+-------+ */
     /* !   | BGCNS_InjectionFifoInterrupt    | 0..3      | 32 bits | [1]   | */
     /* !   +---------------------------------+-----------+---------+-------+ */
     /* !   | BGCNS_ReceptionFifoInterrupt    | 0..3      | 32 bits | [3]   | */
     /* !   +---------------------------------+-----------+---------+-------+ */
     /* !   | BGCNS_InjectionCounterInterrupt | 0..3      | 32 bits | [3][4]| */
     /* !   +---------------------------------+-----------+---------+-------+ */
     /* !   | BGCNS_ReceptionCounterInterrupt | 0..3      | 32 bits | [3][4]| */
     /* !   +---------------------------------+-----------+---------+-------+ */
     /* ! */
     /* !     [1] There are 128 injection FIFOs partitioned into 4 groups of 32. */
     /* !     [2] There are 32 normal reception FIFOs in BG/P. */
     /* !     [3] There are 4 interrupt lines.  The group argument selects one these 4. */
     /* !     [4] There are 256 counters of each type (injection and reception).  The */
     /* !         32-bit mask partitions them into groups of 8. */
     /* ! */
     /* ! @endcode */
     /* ! */
     /* ! @param[in] operation defines the type of operation being performed (enable, disable, or re-enable). */
     /* ! @param[in] facility defines the type of FIFO being configured. */
     /* ! @param[in] group is interpreted differently based on the facility. */
     /* ! @param[in] mask is interpreted differently based on the facility. */
     /* ! @param[out] buffer is interpreted differently based on the operation and facility.  It is generally used to capture */
     /* !   a copy of the facility's current state in an enable operation (and may be null, in which case it is ignored).  It is */
     /* !   generally used as the value to be loaded in a re-enable operation.  In this manner, a state value captured by an enable */
     /* !   operation may be easily restored by a subsequent re-enable operation.  The buffer argument is generally ignored by */
     /* !   disable operations. */
    int (*setDmaFifoControls)(BGCNS_FifoOperation operation, BGCNS_FifoFacility facility, unsigned group, unsigned mask, unsigned* buffer);

     /* ! @brief Maps injection FIFOs onto physical (torus hardware) FIFOs. */
     /* ! @param[in] group specifies the injection FIFO group. */
     /* ! @param[in] fifoIds is an array of length numberOfFifos whose elements are the identifiers of the imFIFO (within that */
     /* !   given group). */
     /* ! @param[in] injection_map is an array of length numberOfFifos whose elements are 8-bit masks identifying which of the */
     /* !   physical torus injection FIFOs are mapped.  Bits 0-3 correspond to torus group 0, and bits 4-7 correspond to torus */
     /* !   group 1.  Bits 3 and 7 are the high priority FIFOs. */
     /* ! @param[in] numberOfFifos describes the number of elements contained in the fifoIds and injection_map arguments. */
     /* ! @return Zero if the map was properly set.  Non-zero if it was not, including the case of illegal arguments. */
     /* ! @note In BG/P, there are 128 injection FIFOs partitioned into 4 groups of 32.  So the legal range of the group */
     /* !   argument is 0..3 and the legal range for the fifoIds[] elements is 0..31. */

    int (*setDmaInjectionMap)(unsigned group, unsigned fifoIds[], unsigned char injection_map[], unsigned numberOfFifos);

     /* ! @brief Enables or disables "local copy" behavior for the specified injection FIFOs.  A local copy injection FIFO */
     /* !   can be used to perform memory copies within a node via the DMA engine. */
     /* ! @param[in] operation specifies whether local copies is being enabled or disabled on the specified FIFOs.  The BGCNS_Reenable */
     /* !   operation is not supported. */
     /* ! @param[in] group specifies the injection FIFO group. */
     /* ! @param[in] bits selects one or more injection FIFOs from within the group on which to operate. */
     /* ! @return Zero if the operation succeeded; non-zero if it did not. */
     /* ! @note In BG/P, there are 128 injection FIFOs partitioned into 4 groups of 32.  So the legal range of the group */
     /* !   argument is 0..3. */
    int (*setDmaLocalCopies)(BGCNS_FifoOperation operation, unsigned group, unsigned bits);

     /* ! @brief Enables or disables the priority bit for the specified injection FIFOs.  The priority bit */
     /* !   is used by the hardware arbitration (details are not further documented here). */
     /* ! @param[in] operation specifies whether priority bits are being set or cleared. */
     /* ! @param[in] group specifies the injection FIFO group. */
     /* ! @param[in] bits selects one or more injection FIFOs from within the group on which to operate. */
     /* ! @note In BG/P, there are 128 injection FIFOs partitioned into 4 groups of 32.  So the legal range of the group */
     /* !   argument is 0..3. */
    int (*setDmaPriority)(BGCNS_FifoOperation operation, unsigned group, unsigned bits);

     /* ! @brief Sets the mapping from physical (torus hardware) reception FIFOs to reception FIFOs.  The hardware supports */
     /* !   8 torus FIFOs (six torus dimensions plus high priority plus local copy).  Furthermore, the hardware supports */
     /* !   4 groups as derived from the PID0 and PID1 bits of the DMA packet.  Thus the mapping is a 4 x 8 matrix of */
     /* !   reception FIFO ids. */
     /* ! @param[in] torus_reception_map maps {group} X {torus-hardware-FIFOs} --> reception FIFOs. */
     /* ! @param[in] fifo_types is an array of N values specifying the type of each normal reception FIFO (see also threshold).  For BGP, */
     /* !   N=2 (there are 32 normal reception FIFOs). */
     /* ! @param[in] header_types is an array of N values specifying the type of each reception header FIFO (see also threshold).  For */
     /* !   BGP, N=4 (there are 4 reception header FIFOs).  Note that reception header FIFOs are typically only used for debugging purposes. */
     /* ! @param[in] threshold is an array of N threshold values.  The value threshold[i] specifies the threshold value for reception */
     /* !   FIFO type i.  If reception FIFO interrupts are enabled (see setDmaFifoControls) and a reception FIFO's available space drops */
     /* !   below its threshold, an interrupt is driven.  For BGP, N=2 (there are type 0 and type 1 injection FIFOs). */
    int (*setDmaReceptionMap)( BGCNS_ReceptionMap torus_reception_map, unsigned fifo_types[], unsigned header_types[], unsigned threshold[]);

     /* ! @brief Gets the reception map. */
     /* ! @see setDmaReceptionMap for descriptions of the map and arguments. */
    int (*getDmaReceptionMap)( BGCNS_ReceptionMap torus_reception_map, unsigned fifo_types[], unsigned short* store_headers, unsigned header_types[], unsigned threshold[]);


     /* ! @deprecated */
    int (*_used_to_be_clearDmaFullReceptionFifo__removed)(void);


     /* ! @brief Resets the MAC unit's PHY. */
     /* ! @return Zero if the unit was properly reset.  Returns non-zero if some error occurred. */
     /* ! @deprecated See macResetPHY_nonBlocking. */
    int (*macResetPHY)(void);

     /* ! @brief Tests the MAC unit's link. */
     /* ! @param[in] link_type specifies the type of link to be tested. */
     /* ! @return One (1) if the link is active; zero (0) if it is not. */
     /* ! @deprecated See macTestLink_nonBlocking */
    int (*macTestLink)(BGCNS_LinkType link_type);

     /* ! @brief Reads one of the MAC's XGMII registers. */
     /* ! @param[in] device_address */
     /* ! @param[in] port_address */
     /* ! @param[in] register_address */
     /* ! @return The register's value or a negative number if some error occurred. */
     /* ! @deprecated Low level MAC register access is being eliminated. */
    int (*macXgmiiRead)(unsigned device_address, unsigned port_address, unsigned register_address);

     /* ! @brief Writes one of the MAC's XGMII registers. */
     /* ! @param[in] device_address */
     /* ! @param[in] port_address */
     /* ! @param[in] register_address */
     /* ! @param[in] value */
     /* ! @return Zero (0) if the register was successfully written; non-zero if some error occurred. */
     /* ! @deprecated Low level MAC register access is being eliminated. */
    int (*macXgmiiWrite)(unsigned device_address, unsigned port_address, unsigned register_address, unsigned value);


     /* ! @brief Trains SerDes in a non-blocking manner.  The standard usage is to inititate */
     /* !      training with trainSerDes(1), check the return code, and then continue to invoke */
     /* !      trainSerDes(0) as long as the return code is BGCNS_RC_CONTINUE. */
     /* ! @param[in] reset Should be 1 when initiating a retraining sequence and 0 for any */
     /* !      continuations. */
     /* ! @return BGCNS_RC_CONTINUE if training is still ongoing (the caller should re-invoke */
     /* !      the service again (with reset=0).  BGCNS_RC_COMPLETE if training is complete. */
     /* !      BGCNS_ERROR if some error has occurred. */
    int (*trainSerDes)(int reset);

     /* ! @brief Fetches the value of the specified control parameter of the environmental monitor. */
     /* ! @param[in] parameter Parameter to retrieve.  Should be a valid parameter in the BGCNS_EnvmonParameter enumeration */
     /* ! @param[in] value Pointer to the storage location that will contain the parameter's value when the function successfully returns. */
     /* ! @return Zero if the register was successfully fetched; non-zero if some error occurred. */
    int (*getEnvmonParm)(BGCNS_EnvmonParameter parameter, unsigned int* value);

     /* ! @brief Stores a value to the specified control parameter of the environmental monitor */
     /* ! @param[in] parameter Parameter to store.  Should be a valid parameter in the BGCNS_EnvmonParameter enumeration */
     /* ! @param[in] value New value for the parameter */
     /* ! @return Zero if the register was successfully fetched; non-zero if some error occurred. */
    int (*setEnvmonParm)(BGCNS_EnvmonParameter parameter, unsigned int value);

     /* ! @brief Performs checks and ensures that the node will continue to operate within tolerances. */
     /* ! @note MUST be called regularly as indicated by nextCallbackTime parameter */
     /* ! @param[in] nextCallbackTime Upon returning, this will contain the PPC Timebase register value indicating when the next */
     /* !            time the operating system needs to call performEnvMgmt.  Failure to do so may result in poorly performing */
     /* !            nodes or shutdown of the block / rack. */
    int (*performEnvMgmt)(unsigned long long* nextCallbackTime);


     /* ! @brief Writes a RAS message to the output mailbox but does not wait for a */
     /* !        response back from the control system.  When this service is used, */
     /* !        the caller must poll for completion using the testForOutboxCompletion */
     /* !        service. */
     /* ! @param[in] facility The facility (aka component).  See bgp_ras.h for a list of facilities. */
     /* ! @param[in] unit The unit (aka subcomponent).  See bgp_ras.h for a list of units. */
     /* ! @param[in] err_code The error code.  See bgp_ras.h for a list of error code.s */
     /* ! @param[in] numDetails The number of additional details. */
     /* ! @param[in] details The list of additional details. */
     /* ! @return Zero if the message was written, non-zero if some error condition occurred. */
    int (*writeRASEvent_nonBlocking)( unsigned facility, unsigned unit, unsigned short err_code, unsigned numDetails, unsigned details[] );

     /* ! @brief Writes a RAS message to the output mailbox but does not wait for a */
     /* !        response back from the control system.  When this service is used, */
     /* !        the caller must poll for completion using the testForOutboxCompletion */
     /* !        service. */
     /* ! @param[in] facility The facility (aka component).  See bgp_ras.h for a list of facilities. */
     /* ! @param[in] unit The unit (aka subcomponent).  See bgp_ras.h for a list of units. */
     /* ! @param[in] err_code The error code.  See bgp_ras.h for a list of error code.s */
     /* ! @param[in] str The message string being written (ASCII encoded, null-terminated).  Note that the length of this string is */
     /* !     limited to _BGP_RAS_ASCII_MAX_LEN characters.  The implementation may choose to truncate the string if it exceeds this */
     /* !     length. */
     /* ! @return Zero if the entire message was written; non-zero if some error condition occurred (including the case where the */
     /* !      string was truncated). */
     /* ! @return Zero if the message was written, non-zero if some error condition occurred. */
    int (*writeRASString_nonBlocking)( unsigned facility, unsigned unit, unsigned short err_code, char* str );

     /* ! @brief Sets the core's timebase registers to the specified value. */
     /* ! @param[in] newtime The new 64-bit timebase */
     /* ! @return Zero if the timebase was successfully set, non-zero if some error condition occurred. */
     /* ! @deprecated */
    int (*synchronizeTimebase)(unsigned long long newtime);

     /* ! @brief Sets the node's DMA physical protection settings. */
     /* ! @note on BGP, there are a maximum of 8 read ranges and 8 write ranges */
     /* ! @return Zero if the DMA ranges were set, non-zero if some error condition occurred. */
    int (*dmaSetRange)(unsigned numreadranges,  unsigned long long* read_lower_paddr, unsigned long long* read_upper_paddr,
			 unsigned numwriteranges, unsigned long long* write_lower_paddr, unsigned long long* write_upper_paddr);

     /* ! @brief Checks the status of the devices and reports correctible RAS (if any) */
     /* ! @param[in] clear_error_counts If non-zero, function will also reset the hardware error counters after posting any RAS. */
     /* ! @return Zero if successful, non-zero if some error condition occurred. */
    int (*statusCheck)(unsigned clear_error_counts);

     /* ! @brief Stops the DMA and clears any reception unit failure */
    int (*stopDma)(void);

     /* ! @brief Starts the DMA */
    int (*startDma)(void);

     /* ! @brief Performs a hard exit.  The status code is provided to the control system. */
     /* ! @return This service never returns. */
    void (*exit)(int rc);

     /* ! @brief Resets the MAC unit's PHY but does not block. */
     /* ! @param[in] reset indicates whether this is the beginning (1) or a continuation (0) of a */
     /* !     reset sequence.  That is, callers should initiate a reset sequence with reset=1 and then */
     /* !     if receiving a return code of BGCNS_RC_CONTINUE, should invoke this servicate again with */
     /* !     reset=0. */
     /* ! @param[in] timeoutInMillis the (approximate) number of milliseconds that this service can have */
     /* !     before returning.  If the allotted time is not sufficient, the service will return BGCNS_RC_CONTINUE */
     /* !     to indicate that it needs additional time. */
     /* ! @return BGCNS_RC_COMPLETE if the unit was properly reset.  BGCNS_RC_CONTINUE if the reset operation is */
     /* !     not yet complete.  BGCNS_RC_ERROR if the reset operation failed. */
    int (*macResetPHY_nonBlocking)(int reset, unsigned timeoutInMillis);

     /* ! @brief Tests the MAC unit's link but does not block. */
     /* ! @param[in] link_type specifies the type of link to be tested. */
     /* ! @param[out] result points to the link status, which is valid only when the return code is */
     /* !     BGCNS_RC_COMPLETE. A value of one (1) indicates that the link is active; zero (0) */
     /* !     indicates that it is inactive. */
     /* ! @param[in] reset indicates whether this is the beginning (1) or a continuation (0) of a */
     /* !     test link sequence.  That is, callers should initiate a sequence with reset=1 and then */
     /* !     if receiving a return code of BGCNS_RC_CONTINUE, should invoke this service again with */
     /* !     reset=0. */
     /* ! @param[in] timeoutInMillis the (approximate) number of milliseconds that this service can have */
     /* !     before returning.  If the allotted time is not sufficient, the service will return BGCNS_RC_CONTINUE */
     /* !     to indicate that it needs additional time. */
     /* ! @return BGCNS_RC_COMPLETE if the test is complete (result is valid only in this case). BGCNS_RC_CONTINUE */
     /* !     if the reset operation is not yet complete.  BGCNS_RC_ERROR if the reset operation failed. */
    int (*macTestLink_nonBlocking)(BGCNS_LinkType link_type, unsigned* result, int reset, unsigned timeoutInMillis);

    void * _not_in_use_1068;
    void * _not_in_use_1069;


     /* ! @brief Indicates that a new job is about to start. */
     /* ! @return Zero (0) if CNS is ready for a new job to start.  Returns non-zero otherwise. */
    int (*startNextJob)(void);

     /* ! @brief Indicates that the CNS should use the specified virtual address when accessing the */
     /* !     given device.  When a device is remapped, CNS will no longer make any attempt to map */
     /* !     a TLB to access that device -- it is the responsibility of the kernel to handle the */
     /* !     TLB either  proactively or reactively (via a fault). */
     /* ! @param[in] device specifies the device being mapped. */
     /* ! @param[in] base_address is the root virtual address of the device.  The address should be */
     /* !     naturally aligned (relative to the size of the device).  See the seciton Reserved and */
     /* !     Preferred Addresses for more information. */
     /* ! @return Zero (0) if the device was successfully remapped.  Returns non-zero if it was not. */
     /* ! @remarks The lock box is in active use by CNS during early boot and thus it is not */
     /* !    possible to remap the BGCNS_LockBox device until all cores are activated by the kernel */
     /* !    (that is, takeCPU has been called for all cores). */
    int (*mapDevice)(BGCNS_DeviceMasks device, void* base_address);

     /* ! @brief Enables barriers on the specified channel. */
     /* ! @param channel specifies the channel being enabled. */
     /* ! @param user_mode indicates whether the barrier is to be used in user-mode code. */
     /* ! @return Zero if global barriers were enabled.  Returns non-zero if the request could not be */
     /* !        completed, including the case of attempting to enable a reserved channel. */
    int (*enableBarrier)(unsigned int channel, int user_mode);

     /* ! @brief Disables barriers on the specified channel. */
     /* ! @return Zero if global barriers were disabled.  Returnsnon-zero if the request could not be */
     /* !        completed, including the case of attempting to disable a reserved channel. */
    int (*disableBarrier)(unsigned int channel);

     /* ! @brief A global barrier that does not block indefinitely. */
     /* ! @param channel indicates the GLINT hardware channel to use. */
     /* ! @param reset indicates whether this is the beginning (1) or a continuation (0) of a barrier */
     /* !   sequence.  That is, caller should inititate a barrier operation by passing reset=1 and then, */
     /* !   if receiving a return code of BGCNS_RC_CONTINUE, should invoke the service again with */
     /* !   reset=0. */
     /* ! @param timeoutInMillis is the (approximate) number of milliseconds that this service is allowed */
     /* !   to wait for barrier participants before returning to the caller. */
     /* ! @return BGCNS_RC_COMPLETE indicates that all participants have arrived at the barrier.  BGCNS_RC_CONTINUE */
     /* !   indicates that not all partipants arrived within the alloted timeout period.  BGCNS_RC_ERROR */
     /* !   indicates that other problem has been detected. */
     /* ! @remarks This service is not thread safe.  It is considered a programming error to invoke it */
     /* !   from multiple threads concurrently and the behavior is not defined. */
    int (*globalBarrier_nonBlocking)(unsigned channel, int reset, unsigned timeoutInMillis);

     /* ! @brief Restart kernel in cycle reproducibility mode. */
     /* ! @return Zero if no restart was required for reproducibility. */
     /* ! @remarks This service must be called from each core and only after all I/O operations have been completed. */
     /* !   Processors will be reset and kernels will start again. */
    int (*setupReproducibility)(void);

} BGCNS_ServiceDirectory;

/* ! @deprecated */
/* ! @typedef BGCNS_DeprecatedServicesDirectory */
/* ! @struct  _BGCNS_DeprecatedServices */
/* ! @brief   These services exist for historical reasons and are not further documented here. */
/* !          They may not be available in future releases of CNS. */
typedef struct _BGCNS_DeprecatedServices {
    int (*torusTermCheck)(int* nonFatalRc);
    int (*torusLinkErrCheck)(int* nonFatalRc);
    int (*torusCRCExchange)(void);
    int (*collectiveConfigureClassInternal)(unsigned virtualTree, unsigned short specifier);
    int (*collectiveConfigureClass)(unsigned virtualTree, unsigned short specifier);
    unsigned (*collectiveGetClass)(unsigned virtualTree);
    int (*collectiveInit)(void);
    int (*collectiveRelease)(void);
    int (*collectiveHardReset)(void);
    int (*netbusTermCheck)(void);
    unsigned (*getSerDesLinkStatus)(void);
    int  (*dmaTermCheck)(void);
} BGCNS_DeprecatedServicesDirectory;

/* ! @typedef BGCNS_Descriptor */
/* ! @struct  _BGCNS_Descriptor */
/* ! @brief  The Common Node Services descriptor.  This descriptor provides information to the kernel regarding */
/* !         the CNS memory region as well as a service directory.  The descriptor is passed to the kernel */
/* !         upon boot and must not be altered by the kernel. */
typedef struct _BGCNS_Descriptor {
    BGCNS_ServiceDirectory* services;         //!< A pointer to the services directory.
    unsigned baseVirtualAddress;	      //!< The virtual address of the beginning of the CNS memory region.
    unsigned size;			      //!< The size (in bytes) of the CNS memory region.
    unsigned basePhysicalAddress;             //!< The physical address of the CNS memory region.
    unsigned basePhysicalAddressERPN;         //!< The extended real page number of the CNS memory region.
    unsigned bgcns_private_in_use;            //!< Undefined.  This field is for internal use only and may disappear at any time.
    BGCNS_DeprecatedServicesDirectory* deprecatedServices; //!< @deprecated undocumented
    unsigned version;                         //!< The CNS version
} BGCNS_Descriptor;



#endif /* !__ASSEMBLY */
#endif /* _BGCNS_H */
