/** @file
  Protocol of Ipmi for both SMS and SMM.

  Copyright (c) 2009 - 2015, 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
  which 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 _IPMI_PROTOCOL_H_
#define _IPMI_PROTOCOL_H_

typedef struct _IPMI_PROTOCOL IPMI_PROTOCOL;

#define IPMI_PROTOCOL_GUID \
  { \
    0xdbc6381f, 0x5554, 0x4d14, 0x8f, 0xfd, 0x76, 0xd7, 0x87, 0xb8, 0xac, 0xbf \
  }

#define SMM_IPMI_PROTOCOL_GUID \
  { \
    0x5169af60, 0x8c5a, 0x4243, 0xb3, 0xe9, 0x56, 0xc5, 0x6d, 0x18, 0xee, 0x26 \
  }


/**
  This service enables submitting commands via Ipmi.

  @param[in]         This              This point for IPMI_PROTOCOL structure.
  @param[in]         NetFunction       Net function of the command.
  @param[in]         Command           IPMI Command.
  @param[in]         RequestData       Command Request Data.
  @param[in]         RequestDataSize   Size of Command Request Data.
  @param[out]        ResponseData      Command Response Data. The completion code is the first byte of response data.
  @param[in, out]    ResponseDataSize  Size of Command Response Data.

  @retval EFI_SUCCESS            The command byte stream was successfully submit to the device and a response was successfully received.
  @retval EFI_NOT_FOUND          The command was not successfully sent to the device or a response was not successfully received from the device.
  @retval EFI_NOT_READY          Ipmi Device is not ready for Ipmi command access.
  @retval EFI_DEVICE_ERROR       Ipmi Device hardware error.
  @retval EFI_TIMEOUT            The command time out.
  @retval EFI_UNSUPPORTED        The command was not successfully sent to the device.
  @retval EFI_OUT_OF_RESOURCES   The resource allcation is out of resource or data size error.
**/
typedef
EFI_STATUS
(EFIAPI *IPMI_SUBMIT_COMMAND) (
  IN     IPMI_PROTOCOL                 *This,
  IN     UINT8                         NetFunction,
  IN     UINT8                         Command,
  IN     UINT8                         *RequestData,
  IN     UINT32                        RequestDataSize,
     OUT UINT8                         *ResponseData,
  IN OUT UINT32                        *ResponseDataSize
  );

//
// IPMI COMMAND PROTOCOL
//
struct _IPMI_PROTOCOL{
  IPMI_SUBMIT_COMMAND       IpmiSubmitCommand;
};

extern EFI_GUID gIpmiProtocolGuid;
extern EFI_GUID gSmmIpmiProtocolGuid;

#endif
