/**
* @file IxNpeMh.h
*
* @date 14 Dec 2001
*
* @brief This file contains the public API for the IXP400 NPE Message
* Handler component.
*
*
* @par
* IXP400 SW Release version 2.0
*
* -- Copyright Notice --
*
* @par
* Copyright 2001-2005, Intel Corporation.
* All rights reserved.
*
* @par
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* @par
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @par
* -- End of Copyright Notice --
*/
/**
* @defgroup IxNpeMh IXP400 NPE Message Handler (IxNpeMh) API
*
* @brief The public API for the IXP400 NPE Message Handler component.
*
* @{
*/
#ifndef IXNPEMH_H
#define IXNPEMH_H
#include "IxOsalTypes.h"
/*
* #defines for function return types, etc.
*/
#define IX_NPEMH_MIN_MESSAGE_ID (0x00) /**< minimum valid message ID */
#define IX_NPEMH_MAX_MESSAGE_ID (0xFF) /**< maximum valid message ID */
#define IX_NPEMH_SEND_RETRIES_DEFAULT (3) /**< default msg send retries */
/**
* @def IX_NPEMH_CRITICAL_NPE_ERR
*
* @brief NpeMH function return value for a Critical NPE error occuring during
sending/receiving message. Assume NPE hang / halt if this value is
returned.
*/
#define IX_NPEMH_CRITICAL_NPE_ERR 2
/**
* @enum IxNpeMhNpeId
*
* @brief The ID of a particular NPE.
* @note In this context, for IXP425 Silicon (B0):
* - NPE-A has HDLC, HSS, AAL and UTOPIA Coprocessors.
* - NPE-B has Ethernet Coprocessor.
* - NPE-C has Ethernet, AES, DES and HASH Coprocessors.
* - IXP400 Product Line have different combinations of coprocessors.
*/
typedef enum
{
IX_NPEMH_NPEID_NPEA = 0, /**< ID for NPE-A */
IX_NPEMH_NPEID_NPEB, /**< ID for NPE-B */
IX_NPEMH_NPEID_NPEC, /**< ID for NPE-C */
IX_NPEMH_NUM_NPES /**< Number of NPEs */
} IxNpeMhNpeId;
/**
* @enum IxNpeMhNpeInterrupts
*
* @brief Indicator specifying whether or not NPE interrupts should drive
* receiving of messages from the NPEs.
*/
typedef enum
{
IX_NPEMH_NPEINTERRUPTS_NO = 0, /**< Don't use NPE interrupts */
IX_NPEMH_NPEINTERRUPTS_YES /**< Do use NPE interrupts */
} IxNpeMhNpeInterrupts;
/**
* @brief The 2-word message structure to send to and receive from the
* NPEs.
*/
typedef struct
{
UINT32 data[2]; /**< the actual data of the message */
} IxNpeMhMessage;
/** message ID */
typedef UINT32 IxNpeMhMessageId;
/**
* @typedef IxNpeMhCallback
*
* @brief This prototype shows the format of a message callback function.
*
* This prototype shows the format of a message callback function. The
* message callback will be passed the message to be handled and will also
* be told from which NPE the message was received. The message callback
* will either be registered by ixNpeMhUnsolicitedCallbackRegister() or
* passed as a parameter to ixNpeMhMessageWithResponseSend(). It will be
* called from within an ISR triggered by the NPE's "outFIFO not empty"
* interrupt (see ixNpeMhInitialize()). The parameters passed are the ID
* of the NPE that the message was received from, and the message to be
* handled.
Re-entrancy: This function is only a prototype, and * will be implemented by the client. It does not need to be re-entrant. */ typedef void (*IxNpeMhCallback) (IxNpeMhNpeId, IxNpeMhMessage); /* * Prototypes for interface functions. */ /** * @ingroup IxNpeMh * * @fn IX_STATUS ixNpeMhInitialize ( IxNpeMhNpeInterrupts npeInterrupts) * * @brief This function will initialise the IxNpeMh component. * * @param npeInterrupts @ref IxNpeMhNpeInterrupts [in] - This parameter * dictates whether or not the IxNpeMh component will service NPE "outFIFO * not empty" interrupts to trigger receiving and processing of messages * from the NPEs. If not then the client must use ixNpeMhMessagesReceive() * to control message receiving and processing. * * This function will initialise the IxNpeMh component. It should only be * called once, prior to using the IxNpeMh component. The following * actions will be performed by this function:
If an unsolicited callback is already * registered for the specified NPE and message ID then the callback will * be overwritten. Only one client will be responsible for handling a * particular message ID associated with a NPE. Registering a NULL * unsolicited callback will deregister any previously registered * callback.
The callback function will be called from an ISR that will * be triggered by the NPE's "outFIFO not empty" interrupt (see * ixNpeMhInitialize()) to handle any unsolicited messages of the specific * message ID received from the NPE. Unsolicited messages will be handled * in the order they are received.
If no unsolicited callback can be * found for a received message then it is assumed that the message is * solicited.
If more than one client may be interested in a particular * unsolicited message then the suggested strategy is to register a * callback for the message that can itself distribute the message to * multiple clients as necessary.
See also * ixNpeMhUnsolicitedCallbackForRangeRegister().
Re-entrancy: This * function will be callable from any thread at any time. IxOsal * will be used for any necessary resource protection. * * @return The function returns a status indicating success or failure. */ PUBLIC IX_STATUS ixNpeMhUnsolicitedCallbackRegister ( IxNpeMhNpeId npeId, IxNpeMhMessageId messageId, IxNpeMhCallback unsolicitedCallback); /** * @ingroup IxNpeMh * * @fn IX_STATUS ixNpeMhUnsolicitedCallbackForRangeRegister ( IxNpeMhNpeId npeId, IxNpeMhMessageId minMessageId, IxNpeMhMessageId maxMessageId, IxNpeMhCallback unsolicitedCallback) * * @brief This function will register an unsolicited callback for a * particular NPE and range of message IDs. * * @param npeId @ref IxNpeMhNpeId [in] - The ID of the NPE whose messages the * unsolicited callback will handle. * @param minMessageId @ref IxNpeMhMessageId [in] - The minimum message ID in * the range of message IDs the unsolicited callback will handle. * @param maxMessageId @ref IxNpeMhMessageId [in] - The maximum message ID in * the range of message IDs the unsolicited callback will handle. * @param unsolicitedCallback @ref IxNpeMhCallback [in] - The unsolicited * callback function. A value of NULL will deregister any previously * registered callback(s) for this NPE and range of message IDs. * * This function will register an unsolicited callback for a particular NPE * and range of message IDs. It is a convenience function that is * effectively the same as calling ixNpeMhUnsolicitedCallbackRegister() for * each ID in the specified range. See * ixNpeMhUnsolicitedCallbackRegister() for more * information.
Re-entrancy: This function will be callable from * any thread at any time. IxOsal will be used for any necessary * resource protection. * * @return The function returns a status indicating success or failure. */ PUBLIC IX_STATUS ixNpeMhUnsolicitedCallbackForRangeRegister ( IxNpeMhNpeId npeId, IxNpeMhMessageId minMessageId, IxNpeMhMessageId maxMessageId, IxNpeMhCallback unsolicitedCallback); /** * @ingroup IxNpeMh * * @fn IX_STATUS ixNpeMhMessageSend ( IxNpeMhNpeId npeId, IxNpeMhMessage message, UINT32 maxSendRetries) * * @brief This function will send a message to a particular NPE. * * @param npeId @ref IxNpeMhNpeId [in] - The ID of the NPE to send the message * to. * @param message @ref IxNpeMhMessage [in] - The message to send. * @param maxSendRetries UINT32 [in] - Max num. of retries to perform * if the NPE's inFIFO is full. * * This function will send a message to a particular NPE. It will be the * client's responsibility to ensure that the message is properly formed. * The return status will signify to the client if the message was * successfully sent or not.
If the message is sent to the NPE then this * function will return a status of success. Note that this will only mean * the message has been placed in the NPE's inFIFO. There will be no way * of knowing that the NPE has actually read the message, but once in the * incoming message queue it will be safe to assume that the NPE will * process it. *
The inFIFO may fill up sometimes if the Xscale is sending messages * faster than the NPE can handle them. This forces us to retry attempts * to send the message until the NPE services the inFIFO. The client should * specify a ceiling value for the number of retries suitable to their * needs. IX_NPEMH_SEND_RETRIES_DEFAULT can be used as a default value for * the maxSendRetries parameter for this function. Each retry * exceeding this default number will incur a blocking delay of 1 microsecond, * to avoid consuming too much AHB bus bandwidth while performing retries. *
Note this function must only be used for messages. * that do not solicit responses. If the message being sent will solicit a * response then the ixNpeMhMessageWithResponseSend() function must * be used to ensure that the response is correctly * handled.
This function will return timeout status if NPE hang / halt * while sending message. The timeout error is not related to the * maxSendRetries as mentioned above. The timeout error will only occur * if the first word of the message has been sent to NPE (not exceeding * maxSendRetries when sending 1st message word), but the second word of * the message can't be written to NPE's inFIFO due to NPE hang / halt after * maximum waiting time (IX_NPE_MH_MAX_NUM_OF_RETRIES). *
Re-entrancy: This function will be callable from any * thread at any time. IxOsal will be used for any necessary * resource protection. * * @return The function returns a status indicating success, failure or timeout. */ PUBLIC IX_STATUS ixNpeMhMessageSend ( IxNpeMhNpeId npeId, IxNpeMhMessage message, UINT32 maxSendRetries); /** * @ingroup IxNpeMh * * @fn IX_STATUS ixNpeMhMessageWithResponseSend ( IxNpeMhNpeId npeId, IxNpeMhMessage message, IxNpeMhMessageId solicitedMessageId, IxNpeMhCallback solicitedCallback, UINT32 maxSendRetries) * * @brief This function is equivalent to the ixNpeMhMessageSend() function, * but must be used when the message being sent will solicited a response. * * @param npeId @ref IxNpeMhNpeId [in] - The ID of the NPE to send the message * to. * @param message @ref IxNpeMhMessage [in] - The message to send. * @param solicitedMessageId @ref IxNpeMhMessageId [in] - The ID of the * solicited response message. * @param solicitedCallback @ref IxNpeMhCallback [in] - The function to use to * pass the response message back to the client. A value of NULL will * cause the response message to be discarded. * @param maxSendRetries UINT32 [in] - Max num. of retries to perform * if the NPE's inFIFO is full. * * This function is equivalent to the ixNpeMhMessageSend() function, but * must be used when the message being sent will solicited a * response.
The client must specify the ID of the solicited response * message to allow the response to be recognised when it is received. The * client must also specify a callback function to handle the received * response. The IxNpeMh component will not offer the facility to send a * message to a NPE and receive a response within the same context.
Note * if the client is not interested in the response, specifying a NULL * callback will cause the response message to be discarded.
The * solicited callback will be stored and called some time later from an ISR * that will be triggered by the NPE's "outFIFO not empty" interrupt (see * ixNpeMhInitialize()) to handle the response message corresponding to the * message sent. Response messages will be handled in the order they are * received.
*
The inFIFO may fill up sometimes if the Xscale is sending messages * faster than the NPE can handle them. This forces us to retry attempts * to send the message until the NPE services the inFIFO. The client should * specify a ceiling value for the number of retries suitable to their * needs. IX_NPEMH_SEND_RETRIES_DEFAULT can be used as a default value for * the maxSendRetries parameter for this function. Each retry * exceeding this default number will incur a blocking delay of 1 microsecond, * to avoid consuming too much AHB bus bandwidth while performing retries. *
This function will return timeout status if NPE hang / halt * while sending message. The timeout error is not related to the * maxSendRetries as mentioned above. The timeout error will only occur * if the first word of the message has been sent to NPE (not exceeding * maxSendRetries when sending 1st message word), but the second word of * the message can't be written to NPE's inFIFO due to NPE hang / halt after * maximum waiting time (IX_NPE_MH_MAX_NUM_OF_RETRIES). *
Re-entrancy: This function will be callable from any * thread at any time. IxOsal will be used for any necessary * resource protection. * * @return The function returns a status indicating success or failure. */ PUBLIC IX_STATUS ixNpeMhMessageWithResponseSend ( IxNpeMhNpeId npeId, IxNpeMhMessage message, IxNpeMhMessageId solicitedMessageId, IxNpeMhCallback solicitedCallback, UINT32 maxSendRetries); /** * @ingroup IxNpeMh * * @fn IX_STATUS ixNpeMhMessagesReceive ( IxNpeMhNpeId npeId) * * @brief This function will receive messages from a particular NPE and * pass each message to the client via a solicited callback (for solicited * messages) or an unsolicited callback (for unsolicited messages). * * @param npeId @ref IxNpeMhNpeId [in] - The ID of the NPE to receive and * process messages from. * * This function will receive messages from a particular NPE and pass each * message to the client via a solicited callback (for solicited messages) * or an unsolicited callback (for unsolicited messages).
If the IxNpeMh * component is initialised to service NPE "outFIFO not empty" interrupts * (see ixNpeMhInitialize()) then there is no need to call this function. * This function is only provided as an alternative mechanism to control * the receiving and processing of messages from the NPEs.
This function * will return timeout status if NPE hang / halt while receiving message. The * timeout error will only occur if this function has read the first word of * the message and can't read second word of the message from NPE's outFIFO * after maximum retries (IX_NPE_MH_MAX_NUM_OF_RETRIES). *
Note this function cannot be called from within * an ISR as it will use resource protection mechanisms.
Re-entrancy: * This function will be callable from any thread at any time. IxOsal will be * used for any necessary resource protection. * * @return The function returns a status indicating success, failure or timeout. */ PUBLIC IX_STATUS ixNpeMhMessagesReceive ( IxNpeMhNpeId npeId); /** * @ingroup IxNpeMh * * @fn IX_STATUS ixNpeMhShow ( IxNpeMhNpeId npeId) * * @brief This function will display the current state of the IxNpeMh * component. * * Re-entrancy: This function will be callable from * any thread at any time. However, no resource protection will be used * so as not to impact system performance. As this function is only * reading statistical information then this is acceptable. * * @param npeId @ref IxNpeMhNpeId [in] - The ID of the NPE to display state * information for. * * @return The function returns a status indicating success or failure. */ PUBLIC IX_STATUS ixNpeMhShow ( IxNpeMhNpeId npeId); /** * @ingroup IxNpeMh * * @fn IX_STATUS ixNpeMhShowReset ( IxNpeMhNpeId npeId) * * @brief This function will reset the current state of the IxNpeMh * component. * * Re-entrancy: This function will be callable from * any thread at any time. However, no resource protection will be used * so as not to impact system performance. As this function is only * writing statistical information then this is acceptable. * * @param npeId @ref IxNpeMhNpeId [in] - The ID of the NPE to reset state * information for. * * @return The function returns a status indicating success or failure. */ PUBLIC IX_STATUS ixNpeMhShowReset ( IxNpeMhNpeId npeId); #endif /* IXNPEMH_H */ /** * @} defgroup IxNpeMh */