/** @file
  OEM hook status code library. Platform can implement an instance to 
  initialize the OEM devices to report status code information.

Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under 
the terms and conditions of the BSD License that accompanies this distribution.  
The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.                                            

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#ifndef __OEM_HOOK_STATUSCODE_LIB__
#define __OEM_HOOK_STATUSCODE_LIB__

/**

  Initialize OEM status code device.


  @return    Status of initialization of OEM status code device.
 
**/
EFI_STATUS
EFIAPI
OemHookStatusCodeInitialize (
  VOID
  );

/**
  Report status code to OEM device.
 
  @param  CodeType      Indicates the type of status code being reported.  
 
  @param  Value         Describes the current status of a hardware or software entity.  
                        This includes both an operation and classification information 
                        about the class and subclass.
                        For progress codes, the operation is the current activity. 
                        For error codes, it is the exception.  For debug codes, 
                        it is not defined at this time. 
                        Specific values are discussed in the Intel Platform Innovation 
                        Framework for EFI Status Code Specification.
 
  @param  Instance      The enumeration of a hardware or software entity within the system.  
                        A system may contain multiple entities that match a class/subclass 
                        pairing. 
                        The instance differentiates between them.  An instance of 0 
                        indicates that instance information is unavailable, 
                        not meaningful, or not relevant.  Valid instance numbers 
                        start with 1.


  @param  CallerId      This optional parameter may be used to identify the caller. 
                        This parameter allows the status code driver to apply 
                        different rules to different callers. 
                        Type EFI_GUID is defined in InstallProtocolInterface() 
                        in the UEFI 2.0 Specification.


  @param  Data          This optional parameter may be used to pass additional data.
 
  @return               The function always returns EFI_SUCCESS.

**/
EFI_STATUS
EFIAPI
OemHookStatusCodeReport (
  IN EFI_STATUS_CODE_TYPE     CodeType,
  IN EFI_STATUS_CODE_VALUE    Value,
  IN UINT32                   Instance,
  IN EFI_GUID                 *CallerId, OPTIONAL
  IN EFI_STATUS_CODE_DATA     *Data      OPTIONAL
  );

#endif // __OEM_HOOK_STATUSCODE_LIB__

