/**
 * @file IxFeatureCtrl.h
 *
 * @date 30-Jan-2003

 * @brief This file contains the public API of the IXP400 Feature Control
 *        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 --
*/
/* ------------------------------------------------------
   Doxygen group definitions
   ------------------------------------------------------ */
/**
 * @defgroup IxFeatureCtrlAPI IXP400 Feature Control (IxFeatureCtrl) API
 *
 * @brief The Public API for the IXP400 Feature Control.
 * 
 * @{
 */

#ifndef IXFEATURECTRL_H
#define IXFEATURECTRL_H

/*
 * User defined include files
 */
#include "IxOsal.h"

/*
 * #defines and macros
 */

/*************************************************************
 * The following are IxFeatureCtrlComponentCheck return values.
 ************************************************************/

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def  IX_FEATURE_CTRL_COMPONENT_DISABLED
 *
 * @brief Hardware Component is disabled/unavailable.
 *        Return status by ixFeatureCtrlComponentCheck()  
 */
#define  IX_FEATURE_CTRL_COMPONENT_DISABLED 0

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def  IX_FEATURE_CTRL_COMPONENT_ENABLED
 *
 * @brief Hardware Component is available. 
 *        Return status by ixFeatureCtrlComponentCheck()  
 */
#define  IX_FEATURE_CTRL_COMPONENT_ENABLED  1

/***********************************************************************************
 * Product ID in XScale CP15 - Register 0
 *  - It contains information on the maximum XScale Core Frequency and
 *    Silicon Stepping.  
 *  - XScale Core Frequency Id indicates only the maximum XScale frequency
 *    achievable and not the running XScale frequency (maybe stepped down).    
 *  - The register is read by using ixFeatureCtrlProductIdRead.
 *  - Usage example: 
 *          productId = ixFeatureCtrlProductIdRead();
 *          if( (productId & IX_FEATURE_CTRL_SILICON_STEPPING_MASK) == 
 *              IX_FEATURE_CTRL_SILICON_TYPE_A0 )
 *          if( (productId & IX_FEATURE_CTRL_XSCALE_FREQ_MASK) == 
 *              IX_FEATURE_CTRL_XSCALE_FREQ_533 )    
 * 
 *  31 28 27 24 23 20 19 16 15 12 11        9 8                   4 3              0  
 *  -------------------------------------------------------------------------------- 
 * | 0x6 | 0x9 | 0x0 | 0x5 | 0x4 | Device ID | XScale Core Freq Id | Si Stepping Id |    
 *  --------------------------------------------------------------------------------
 *
 *   Maximum Achievable XScale Core Frequency Id :  533MHz  - 0x1C 
 *                                                  400MHz  - 0x1D 
 *                                                  266MHz  - 0x1F
 *
 *   <b>THE CORE FREQUENCY ID IS NOT APPLICABLE TO IXP46X <\b>
 *  
 *   The above is applicable to IXP42X only. CP15 in IXP46X does not contain any
 *   Frequency ID. 
 * 
 *  Si Stepping Id            :  A       - 0x0    
 *                               B       - 0x1 
 *  
 *  XScale Core freq Id - Device ID [11:9] : IXP42X - 0x0
 *                                           IXP46X - 0x1
 *************************************************************************************/

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def IX_FEATURE_CTRL_SILICON_TYPE_A0
 *
 * @brief This is the value of A0 Silicon in product ID. 
 */
#define IX_FEATURE_CTRL_SILICON_TYPE_A0   0

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def IX_FEATURE_CTRL_SILICON_TYPE_B0
 *
 * @brief This is the value of B0 Silicon in product ID.
 */
#define IX_FEATURE_CTRL_SILICON_TYPE_B0   1

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def IX_FEATURE_CTRL_SILICON_STEPPING_MASK
 *
 * @brief This is the mask of silicon stepping in product ID. 
 */
#define IX_FEATURE_CTRL_SILICON_STEPPING_MASK  0xF 

/**
 * @ingroup IxFeatureCtrlAPI
 *
 * @def IX_FEATURE_CTRL_DEVICE_TYPE_MASK
 *
 * @brief This is the mask of silicon stepping in product ID.
 */
#define IX_FEATURE_CTRL_DEVICE_TYPE_MASK  (0x7) 

/**
 * @ingroup IxFeatureCtrlAPI
 *
 * @def IX_FEATURE_CTRL_DEVICE_TYPE_OFFSET
 *
 * @brief This is the mask of silicon stepping in product ID.
 */
#define IX_FEATURE_CTRL_DEVICE_TYPE_OFFSET  9


/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def IX_FEATURE_CTRL_XSCALE_FREQ_533
 *
 * @brief This is the value of 533MHz XScale Core in product ID.
 */
#define IX_FEATURE_CTRL_XSCALE_FREQ_533  ((0x1C)<<4)

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def IX_FEATURE_CTRL_XSCALE_FREQ_400
 *
 * @brief This is the value of 400MHz XScale Core in product ID.
 */
#define IX_FEATURE_CTRL_XSCALE_FREQ_400  ((0x1D)<<4)

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def IX_FEATURE_CTRL_XSCALE_FREQ_266
 *
 * @brief This is the value of 266MHz XScale Core in product ID.
 */
#define IX_FEATURE_CTRL_XSCALE_FREQ_266 ((0x1F)<<4)   

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def IX_FEATURE_CTRL_XSCALE_FREQ_MASK
 *
 * @brief This is the mask of XScale Core in product ID.
 */
#define IX_FEATURE_CTRL_XSCALE_FREQ_MASK ((0xFF)<<4)  

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def IX_FEATURECTRL_REG_UTOPIA_32PHY
 *
 * @brief Maximum  UTOPIA PHY available is 32.  
 * 
 */
#define IX_FEATURECTRL_REG_UTOPIA_32PHY  0x0

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def IX_FEATURECTRL_REG_UTOPIA_16PHY
 *
 * @brief Maximum  UTOPIA PHY available is 16.  
 * 
 */
#define IX_FEATURECTRL_REG_UTOPIA_16PHY  0x1

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def IX_FEATURECTRL_REG_UTOPIA_8PHY
 *
 * @brief Maximum  UTOPIA PHY available to is 8.  
 * 
 */
#define IX_FEATURECTRL_REG_UTOPIA_8PHY   0x2

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @def IX_FEATURECTRL_REG_UTOPIA_4PHY
 *
 * @brief Maximum  UTOPIA PHY available to is 4.  
 * 
 */
#define IX_FEATURECTRL_REG_UTOPIA_4PHY   0x3

#ifdef __ixp46X

/**
 * @ingroup IxFeatureCtrlAPI
 *
 * @def IX_FEATURECTRL_REG_XSCALE_533FREQ
 *
 * @brief Maximum  frequency available to IXP46x is 533 MHz.
 *
 */
#define IX_FEATURECTRL_REG_XSCALE_533FREQ   0x0

/**
 * @ingroup IxFeatureCtrlAPI
 *
 * @def IX_FEATURECTRL_REG_XSCALE_667FREQ
 *
 * @brief Maximum  frequency available to IXP46x is 667 MHz.
 *
 */
#define IX_FEATURECTRL_REG_XSCALE_667FREQ   0x1

/**
 * @ingroup IxFeatureCtrlAPI
 *
 * @def IX_FEATURECTRL_REG_XSCALE_400FREQ
 *
 * @brief Maximum  frequency available to IXP46x is 400 MHz.
 *
 */
#define IX_FEATURECTRL_REG_XSCALE_400FREQ   0x2

/**
 * @ingroup IxFeatureCtrlAPI
 *
 * @def IX_FEATURECTRL_REG_XSCALE_266FREQ
 *
 * @brief Maximum  frequency available to IXP46x is 266 MHz.
 *
 */
#define IX_FEATURECTRL_REG_XSCALE_266FREQ   0x3

#endif /* __ixp46X */

/**
 * @ingroup IxFeatureCtrlAPI
 *
 * @def IX_FEATURECTRL_COMPONENT_NOT_AVAILABLE
 *
 * @brief Component selected is not available for device
 *
 */
#define IX_FEATURECTRL_COMPONENT_NOT_AVAILABLE  0x0000

/**
 * @ingroup IxFeatureCtrlAPI
 *
 * @def IX_FEATURECTRL_COMPONENT_ALWAYS_AVAILABLE
 *
 * @brief Component selected is not available for device
 *
 */
#define IX_FEATURECTRL_COMPONENT_ALWAYS_AVAILABLE  0xffff

/**
 * @defgroup IxFeatureCtrlSwConfig Software Configuration for Access Component
 *
 * @ingroup IxFeatureCtrlAPI 
 *
 * @brief This section describes software configuration in access component. The
 *        configuration can be changed at run-time. ixFeatureCtrlSwConfigurationCheck( )
 *        will be used across applicable access component to check the configuration.
 *        ixFeatureCtrlSwConfigurationWrite( ) is used to write the software configuration.
 *
 * @note <b>All software configurations are default to be enabled.</b> 
 *
 * @{
 */
/**
 * @ingroup IxFeatureCtrlSwConfig
 *
 * @def IX_FEATURE_CTRL_SWCONFIG_DISABLED
 *
 * @brief Software configuration is disabled. 
 * 
 */
#define IX_FEATURE_CTRL_SWCONFIG_DISABLED 0  

/**
 * @ingroup IxFeatureCtrlSwConfig
 *
 * @def IX_FEATURE_CTRL_SWCONFIG_ENABLED
 *
 * @brief Software configuration is enabled. 
 * 
 */
#define IX_FEATURE_CTRL_SWCONFIG_ENABLED 1  

/**
 * Section for enums
 **/

/**
 * @ingroup IxFeatureCtrlBuildDevice
 *
 * @enum IxFeatureCtrlBuildDevice
 *
 * @brief Indicates software build type.
 *
 * Default build type is IXP42X
 *
 */
typedef enum
{
    IX_FEATURE_CTRL_SW_BUILD_IXP42X = 0, /**<Build type is IXP42X */
    IX_FEATURE_CTRL_SW_BUILD_IXP46X      /**<Build type is IXP46X */
} IxFeatureCtrlBuildDevice;

/**
 * @ingroup IxFeatureCtrlSwConfig
 *
 * @enum IxFeatureCtrlSwConfig
 *
 * @brief Enumeration for software configuration in access components.
 *
 * Entry for new run-time software configuration should be added here.
 */
typedef enum
{
    IX_FEATURECTRL_ETH_LEARNING = 0,       /**< EthDB Learning Feature */
    IX_FEATURECTRL_ORIGB0_DISPATCHER,  /**< IXP42X B0 and IXP46X dispatcher without 
                                            livelock prevention functionality Feature */
    IX_FEATURECTRL_SWCONFIG_MAX        /**< Maximum boudary for IxFeatureCtrlSwConfig  */
} IxFeatureCtrlSwConfig;


/************************************************************************
 * IXP400 Feature Control Register
 * - It contains the information (available/unavailable) of IXP425&IXP46X
 *   hardware components in their corresponding bit location.
 * - Bit value of 0 means the hardware component is available
 *   or not software disabled. Hardware component that is available
 *   can be software disabled.
 * - Bit value of 1 means the hardware is unavailable or software
 *   disabled.Hardware component that is unavailable cannot be software
 *   enabled.
 * - Use ixFeatureCtrlHwCapabilityRead() to read the hardware component's
 *   availability.
 * - Use ixFeatureCtrlRead() to get the current IXP425/IXP46X feature control
 *   register value.
 *
 *   Bit            Field Description (Hardware Component Availability)
 *   ---            ---------------------------------------------------
 *    0             RComp Circuitry
 *    1             USB Controller
 *    2             Hashing Coprocessor
 *    3             AES Coprocessor
 *    4             DES Coprocessor
 *    5             HDLC Coprocessor
 *    6             AAL Coprocessor         - Always available in IXP46X
 *    7             HSS Coprocesspr
 *    8             Utopia Coprocessor
 *    9             Ethernet 0 Coprocessor
 *   10             Ethernet 1 Coprocessor
 *   11             NPE A
 *   12             NPE B
 *   13             NPE C
 *   14             PCI Controller
 *   15             ECC/TimeSync Coprocessor -  Only applicable to IXP46X
 *  16-17           Utopia PHY Limit Status : 0x0 - 32 PHY
 *                                            0x1 - 16 PHY
 *                                            0x2 -  8 PHY
 *                                            0x3 -  4 PHY
 *
 *  Portions below are only applicable to IXP46X
 *   18             USB Host Coprocessor
 *   19             NPE A Ethernet - 0 for Enable if Utopia = 1
 *   20             NPE B Ethernet coprocessor 1-3.
 *   21             RSA Crypto Block coprocessor.
 *  22-23           Processor frequency : 0x0 - 533 MHz
 *                                        0x1 - 667 MHz
 *                                        0x2 - 400 MHz
 *                                        0x3 - 266 MHz
 *  24-31           Reserved
 *
 ************************************************************************/
/*Section generic to both IXP42X and IXP46X*/

/**
 * @ingroup IxFeatureCtrlAPI
 *
 * @enum IxFeatureCtrlComponentType
 *
 * @brief Enumeration for components availavble
 *
 */
typedef enum
{
    IX_FEATURECTRL_RCOMP = 0, /**<bit location for RComp Circuitry*/
    IX_FEATURECTRL_USB,       /**<bit location for USB Controller*/
    IX_FEATURECTRL_HASH,      /**<bit location for Hashing Coprocessor*/
    IX_FEATURECTRL_AES,       /**<bit location for AES Coprocessor*/
    IX_FEATURECTRL_DES,       /**<bit location for DES Coprocessor*/
    IX_FEATURECTRL_HDLC,      /**<bit location for HDLC Coprocessor*/
    IX_FEATURECTRL_AAL,       /**<bit location for AAL Coprocessor*/
    IX_FEATURECTRL_HSS,       /**<bit location for HSS Coprocessor*/
    IX_FEATURECTRL_UTOPIA,    /**<bit location for UTOPIA Coprocessor*/
    IX_FEATURECTRL_ETH0,      /**<bit location for Ethernet 0 Coprocessor*/
    IX_FEATURECTRL_ETH1,      /**<bit location for Ethernet 1 Coprocessor*/
    IX_FEATURECTRL_NPEA,      /**<bit location for NPE A*/
    IX_FEATURECTRL_NPEB,      /**<bit location for NPE B*/
    IX_FEATURECTRL_NPEC,      /**<bit location for NPE C*/
    IX_FEATURECTRL_PCI,       /**<bit location for PCI Controller*/
    IX_FEATURECTRL_ECC_TIMESYNC,     /**<bit location for TimeSync Coprocessor*/
    IX_FEATURECTRL_UTOPIA_PHY_LIMIT, /**<bit location for Utopia PHY Limit Status*/
    IX_FEATURECTRL_UTOPIA_PHY_LIMIT_BIT2, /**<2nd bit of PHY limit status*/
    IX_FEATURECTRL_USB_HOST_CONTROLLER, /**<bit location for USB host controller*/
    IX_FEATURECTRL_NPEA_ETH,  /**<bit location for NPE-A Ethernet Disable*/
    IX_FEATURECTRL_NPEB_ETH,  /**<bit location for NPE-B Ethernet 1-3 Coprocessors Disable*/
    IX_FEATURECTRL_RSA,       /**<bit location for RSA Crypto block Coprocessors Disable*/
    IX_FEATURECTRL_XSCALE_MAX_FREQ, /**<bit location for XScale max frequency*/
    IX_FEATURECTRL_XSCALE_MAX_FREQ_BIT2, /**<2nd xscale max freq bit NOT TO BE USED */
    IX_FEATURECTRL_MAX_COMPONENTS
} IxFeatureCtrlComponentType;

/**
 * @ingroup IxFeatureCtrlDeviceId
 *
 * @enum IxFeatureCtrlDeviceId
 *
 * @brief Enumeration for device type.
 *
 * @warning This enum is closely related to the npe image. Its format should comply
 *          with formats used in the npe image ImageID. This is indicated by the  
 *          first nibble of the image ID. This should also be in sync with the
 *          with what is defined in CP15.  Current available formats are
 *          - IXP42X - 0000
 *          - IXP46X - 0001
 *
 */
typedef enum
{
    IX_FEATURE_CTRL_DEVICE_TYPE_IXP42X = 0, /**<Device type is IXP42X */
    IX_FEATURE_CTRL_DEVICE_TYPE_IXP46X, /**<Device type is IXP46X */
    IX_FEATURE_CTRL_DEVICE_TYPE_MAX /**<Max devices */
} IxFeatureCtrlDeviceId;


/**
 * @} addtogroup IxFeatureCtrlSwConfig
 */

/*
 * Typedefs
 */

/**
 * @ingroup IxFeatureCtrlAPI 
 * 
 * @typedef IxFeatureCtrlReg
 *
 * @brief Feature Control Register that contains hardware components'
 *        availability information.
 */
typedef UINT32 IxFeatureCtrlReg;

/**
 * @ingroup IxFeatureCtrlAPI 
 * 
 * @typedef IxFeatureCtrlProductId
 *
 * @brief Product ID of Silicon that contains Silicon Stepping and 
 *        Maximum XScale Core Frequency information.  
 */
typedef UINT32 IxFeatureCtrlProductId;

/*
 * Prototypes for interface functions
 */

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @fn IxFeatureCtrlReg ixFeatureCtrlRead (void)
 * 
 * @brief This function reads out the CURRENT value of Feature Control Register.
 *        The current value may not be the same as that of the hardware component 
 *        availability.    
 * 
 * The bit location of each hardware component is defined above. 
 * A value of '1' in bit means the hardware component is not available.  A value of '0'   
 * means the hardware component is available.
 *
 * @return 
 *      - IxFeatureCtrlReg - the current value of IXP400 Feature Control Register
 */ 
PUBLIC IxFeatureCtrlReg
ixFeatureCtrlRead (void);

/**
 * @ingroup IxFeatureCtrlAPI
 *
 * @fn IxFeatureDeviceId ixFeatureCtrlDeviceRead (void)
 *
 * @brief This function gets the type of device that the software is currently running
 *        on
 *
 * This function reads the feature Ctrl register specifically to obtain the device id.
 * The definitions of the avilable IDs are as above.
 *
 * @return
 *      - IxFeatureCtrlDeviceId - the type of device currently running
 */
IxFeatureCtrlDeviceId
ixFeatureCtrlDeviceRead (void);

/**
 * @ingroup IxFeatureCtrlAPI
 *
 * @fn IxFeatureCtrlBuildDevice ixFeatureCtrlSoftwareBuildGet (void)
 *
 * @brief This function refers to  the value set by the compiler flag to determine
 *        the type of device the software is built for.
 *
 * The function reads the compiler flag to determine the device the software is
 * built for. When the user executes build in the command line, 
 * a compile time flag (__ixp42X/__ixp46X is set. This API reads this 
 * flag and returns the software build type to the calling client.
 *
 * @return
 *      - IxFeatureCtrlBuildDevice - the type of device software is built for.
 */
IxFeatureCtrlBuildDevice
ixFeatureCtrlSoftwareBuildGet (void);

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @fn IxFeatureCtrlReg ixFeatureCtrlHwCapabilityRead (void)
 * 
 * @brief This function reads out the hardware capability of a silicon type as defined in 
 * feature control register.This value is different from that returned by 
 * ixFeatureCtrlRead() because this function returns the actual hardware component
 * availability.     
 *
 * The bit location of each hardware component is defined above. 
 * A value of '1' in bit means the hardware component is not available.  A value of '0'   
 * means the hardware component is available.
 *
 * @return 
 *      - IxFeatureCtrlReg - the hardware capability of IXP400. 
 *
 * @warning
 *      - This function must not be called when IXP400 is running as the result
 *        is undefined.    
 */ 
PUBLIC IxFeatureCtrlReg
ixFeatureCtrlHwCapabilityRead (void);

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @fn void ixFeatureCtrlWrite (IxFeatureCtrlReg expUnitReg)
 * 
 * @brief This function write the value stored in IxFeatureCtrlReg expUnitReg  
 *        to the Feature Control Register. 
 * 
 * The bit location of each hardware component is defined above.
 * The write is only effective on available hardware components. Writing '1' in a  
 * bit will software disable the respective hardware component. A '0' will mean that  
 * the hardware component will remain to be operable. 
 *
 * @param expUnitReg @ref IxFeatureCtrlReg [in] - The value to be written to feature control 
 *                                          register.
 *
 * @return none
 *
 */ 
PUBLIC void
ixFeatureCtrlWrite (IxFeatureCtrlReg expUnitReg);

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @fn IX_STATUS ixFeatureCtrlComponentCheck (IxFeatureCtrlComponentType componentType)
 * 
 * @brief This function will check the availability of hardware component specified
 *        as componentType value. 
 *
 *        Usage Example:<br> 
 *         -  if(IX_FEATURE_CTRL_COMPONENT_DISABLED != 
 *              ixFeatureCtrlComponentCheck(IX_FEATURECTRL_ETH0)) <br>
 *         -  if(IX_FEATURE_CTRL_COMPONENT_ENABLED == 
 *              ixFeatureCtrlComponentCheck(IX_FEATURECTRL_PCI)) <br>
 *
 * This function is typically called during component initialization time. 
 *
 * @param componentType @ref IxFeatureCtrlComponentType [in] - the type of a component as
 *        defined above as IX_FEATURECTRL_XXX (Exp: IX_FEATURECTRL_PCI, IX_FEATURECTRL_ETH0)           

 *        
 * @return 
 *      - IX_FEATURE_CTRL_COMPONENT_ENABLED if component is available 
 *      - IX_FEATURE_CTRL_COMPONENT_DISABLED if component is unavailable            
 */ 
PUBLIC IX_STATUS
ixFeatureCtrlComponentCheck (IxFeatureCtrlComponentType componentType);

/**
 * @ingroup IxFeatureCtrlAPI 
 * 
 * @fn IxFeatureCtrlProductId ixFeatureCtrlProductIdRead (void)
 * 
 * @brief This function will return IXP400 product ID i.e. CP15,
 *        Register 0.
 *                                                
 * @return 
 *      - IxFeatureCtrlProductId - the value of product ID.
 *
 */ 
PUBLIC IxFeatureCtrlProductId
ixFeatureCtrlProductIdRead (void) ;

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @fn IX_STATUS ixFeatureCtrlSwConfigurationCheck (IxFeatureCtrlSwConfig swConfigType)
 * 
 * @brief This function checks whether the specified software configuration is
 *        enabled or disabled. 
 *
 *        Usage Example:<br> 
 *        - if(IX_FEATURE_CTRL_SWCONFIG_DISABLED != 
 *            ixFeatureCtrlSwConfigurationCheck(IX_FEATURECTRL_ETH_LEARNING)) <br>
 *        - if(IX_FEATURE_CTRL_SWCONFIG_ENABLED == 
 *            ixFeatureCtrlSwConfigurationCheck(IX_FEATURECTRL_ETH_LEARNING)) <br>
 *
 * This function is typically called during access component initialization time. 
 *
 * @param swConfigType @ref IxFeatureCtrlSwConfig [in] - the type of a software configuration
 *        defined in IxFeatureCtrlSwConfig enumeration.          
 *        
 * @return 
 *      - IX_FEATURE_CTRL_SWCONFIG_ENABLED if software configuration is enabled. 
 *      - IX_FEATURE_CTRL_SWCONFIG_DISABLED if software configuration is disabled.            
 */ 
PUBLIC IX_STATUS
ixFeatureCtrlSwConfigurationCheck (IxFeatureCtrlSwConfig swConfigType);

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @fn void ixFeatureCtrlSwConfigurationWrite (IxFeatureCtrlSwConfig swConfigType, BOOL enabled)
 * 
 * @brief This function enable/disable the specified software configuration.  
 *
 *        Usage Example:<br> 
 *        - ixFeatureCtrlSwConfigurationWrite(IX_FEATURECTRL_ETH_LEARNING, TRUE) is used
 *          to enable Ethernet Learning Feature <br>
 *        - ixFeatureCtrlSwConfigurationWrite(IX_FEATURECTRL_ETH_LEARNING, FALSE) is used
 *          to disable Ethernet Learning Feature <br> 
 *
 * @param swConfigType IxFeatureCtrlSwConfig [in] - the type of a software configuration
 *        defined in IxFeatureCtrlSwConfig enumeration. 
 * @param enabled BOOL [in] - To enable(TRUE) / disable (FALSE) the specified software
 *                           configuration.            
 *
 * @return none
 *          
 */ 
PUBLIC void
ixFeatureCtrlSwConfigurationWrite (IxFeatureCtrlSwConfig swConfigType, BOOL enabled);

/**
 * @ingroup IxFeatureCtrlAPI 
 *
 * @fn void ixFeatureCtrlIxp400SwVersionShow (void)
 * 
 * @brief This function shows the current software release information for IXP400 
 *          
 * @return none
 *          
 */ 
PUBLIC void
ixFeatureCtrlIxp400SwVersionShow (void);

#endif /* IXFEATURECTRL_H */

/**
 * @} defgroup IxFeatureCtrlAPI
 */