/** @file
  IPMI Command - NetFnStorage.

  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#include <PiPei.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/IpmiLib.h>

#include <IndustryStandard/Ipmi.h>

/**
  This function is used to retrieve FRU Inventory Area

  @param [in]  GetFruInventoryAreaInfoRequest   Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST.
  @param [out] GetFruInventoryAreaInfoResponse  Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiGetFruInventoryAreaInfo (
  IN  IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST   *GetFruInventoryAreaInfoRequest,
  OUT IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE  *GetFruInventoryAreaInfoResponse
  )
{
  EFI_STATUS  Status;
  UINT32      DataSize;

  DataSize = sizeof (*GetFruInventoryAreaInfoResponse);
  Status   = IpmiSubmitCommand (
               IPMI_NETFN_STORAGE,
               IPMI_STORAGE_GET_FRU_INVENTORY_AREAINFO,
               (VOID *)GetFruInventoryAreaInfoRequest,
               sizeof (*GetFruInventoryAreaInfoRequest),
               (VOID *)GetFruInventoryAreaInfoResponse,
               &DataSize
               );
  return Status;
}

/**
  This function returns specified data from the FRU Inventory Info area.

  @param [in]  ReadFruDataRequest       Pointer to IPMI_READ_FRU_DATA_REQUEST.
  @param [out] ReadFruDataResponse      Pointer to IPMI_READ_FRU_DATA_RESPONSE.
  @param [in, out] ReadFruDataResponseSize  Returns the size of ReadFruDataResponse.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiReadFruData (
  IN  IPMI_READ_FRU_DATA_REQUEST   *ReadFruDataRequest,
  OUT IPMI_READ_FRU_DATA_RESPONSE  *ReadFruDataResponse,
  IN OUT UINT32                    *ReadFruDataResponseSize
  )
{
  EFI_STATUS  Status;

  Status = IpmiSubmitCommand (
             IPMI_NETFN_STORAGE,
             IPMI_STORAGE_READ_FRU_DATA,
             (VOID *)ReadFruDataRequest,
             sizeof (*ReadFruDataRequest),
             (VOID *)ReadFruDataResponse,
             ReadFruDataResponseSize
             );
  return Status;
}

/**
  This function writes specified data from the FRU Inventory Info area.

  @param [in]  WriteFruDataRequest      Pointer to IPMI_WRITE_FRU_DATA_REQUEST.
  @param [in]  WriteFruDataRequestSize  Size of WriteFruDataRequest.
  @param [out] WriteFruDataResponse     Pointer to receive IPMI_WRITE_FRU_DATA_RESPONSE.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiWriteFruData (
  IN  IPMI_WRITE_FRU_DATA_REQUEST   *WriteFruDataRequest,
  IN  UINT32                        WriteFruDataRequestSize,
  OUT IPMI_WRITE_FRU_DATA_RESPONSE  *WriteFruDataResponse
  )
{
  EFI_STATUS  Status;
  UINT32      DataSize;

  DataSize = sizeof (*WriteFruDataResponse);
  Status   = IpmiSubmitCommand (
               IPMI_NETFN_STORAGE,
               IPMI_STORAGE_WRITE_FRU_DATA,
               (VOID *)WriteFruDataRequest,
               WriteFruDataRequestSize,
               (VOID *)WriteFruDataResponse,
               &DataSize
               );
  return Status;
}

/**
  This function returns the number of entries in the SEL

  @param [out] GetSelInfoResponse     Pointer to receive IPMI_GET_SEL_INFO_RESPONSE.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiGetSelInfo (
  OUT IPMI_GET_SEL_INFO_RESPONSE  *GetSelInfoResponse
  )
{
  EFI_STATUS  Status;
  UINT32      DataSize;

  DataSize = sizeof (*GetSelInfoResponse);
  Status   = IpmiSubmitCommand (
               IPMI_NETFN_STORAGE,
               IPMI_STORAGE_GET_SEL_INFO,
               NULL,
               0,
               (VOID *)GetSelInfoResponse,
               &DataSize
               );
  return Status;
}

/**
  This function retrieves entries from the SEL

  @param [in]  GetSelEntryRequest       Pointer to IPMI_GET_SEL_ENTRY_REQUEST.
  @param [out] GetSelEntryResponse      Pointer to receive IPMI_GET_SEL_ENTRY_RESPONSE.
  @param [in, out]  GetSelEntryResponseSize  Size of entire GetSelEntryResponse.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiGetSelEntry (
  IN IPMI_GET_SEL_ENTRY_REQUEST    *GetSelEntryRequest,
  OUT IPMI_GET_SEL_ENTRY_RESPONSE  *GetSelEntryResponse,
  IN OUT UINT32                    *GetSelEntryResponseSize
  )
{
  EFI_STATUS  Status;

  Status = IpmiSubmitCommand (
             IPMI_NETFN_STORAGE,
             IPMI_STORAGE_GET_SEL_ENTRY,
             (VOID *)GetSelEntryRequest,
             sizeof (*GetSelEntryRequest),
             (VOID *)GetSelEntryResponse,
             GetSelEntryResponseSize
             );
  return Status;
}

/**
  This function adds an entry in the SEL

  @param [in]  AddSelEntryRequest       Pointer to IPMI_ADD_SEL_ENTRY_REQUEST.
  @param [out] AddSelEntryResponse      Pointer to receive IPMI_ADD_SEL_ENTRY_RESPONSE.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiAddSelEntry (
  IN IPMI_ADD_SEL_ENTRY_REQUEST    *AddSelEntryRequest,
  OUT IPMI_ADD_SEL_ENTRY_RESPONSE  *AddSelEntryResponse
  )
{
  EFI_STATUS  Status;
  UINT32      DataSize;

  DataSize = sizeof (*AddSelEntryResponse);
  Status   = IpmiSubmitCommand (
               IPMI_NETFN_STORAGE,
               IPMI_STORAGE_ADD_SEL_ENTRY,
               (VOID *)AddSelEntryRequest,
               sizeof (*AddSelEntryRequest),
               (VOID *)AddSelEntryResponse,
               &DataSize
               );
  return Status;
}

/**
  This function adds SEL Entry command that allows the record to be incrementally
  added to the SEL.

  @param [in]  PartialAddSelEntryRequest       Pointer to IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST.
  @param [in]  PartialAddSelEntryRequestSize   Size of entire PartialAddSelEntryRequest.
  @param [out] PartialAddSelEntryResponse      Pointer to receive IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiPartialAddSelEntry (
  IN IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST    *PartialAddSelEntryRequest,
  IN UINT32                                PartialAddSelEntryRequestSize,
  OUT IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE  *PartialAddSelEntryResponse
  )
{
  EFI_STATUS  Status;
  UINT32      DataSize;

  DataSize = sizeof (*PartialAddSelEntryResponse);
  Status   = IpmiSubmitCommand (
               IPMI_NETFN_STORAGE,
               IPMI_STORAGE_PARTIAL_ADD_SEL_ENTRY,
               (VOID *)PartialAddSelEntryRequest,
               PartialAddSelEntryRequestSize,
               (VOID *)PartialAddSelEntryResponse,
               &DataSize
               );
  return Status;
}

/**
  This function erases all contents of the System Event Log.

  @param [in]  ClearSelRequest       Pointer to IPMI_CLEAR_SEL_REQUEST.
  @param [out] ClearSelResponse      Pointer to receive IPMI_CLEAR_SEL_RESPONSE.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiClearSel (
  IN IPMI_CLEAR_SEL_REQUEST    *ClearSelRequest,
  OUT IPMI_CLEAR_SEL_RESPONSE  *ClearSelResponse
  )
{
  EFI_STATUS  Status;
  UINT32      DataSize;

  DataSize = sizeof (*ClearSelResponse);
  Status   = IpmiSubmitCommand (
               IPMI_NETFN_STORAGE,
               IPMI_STORAGE_CLEAR_SEL,
               (VOID *)ClearSelRequest,
               sizeof (*ClearSelRequest),
               (VOID *)ClearSelResponse,
               &DataSize
               );
  return Status;
}

/**
  This function returns the time from the SEL Device.

  @param [out]  GetSelTimeResponse       Pointer to IPMI_GET_SEL_TIME_RESPONSE.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiGetSelTime (
  OUT IPMI_GET_SEL_TIME_RESPONSE  *GetSelTimeResponse
  )
{
  EFI_STATUS  Status;
  UINT32      DataSize;

  DataSize = sizeof (*GetSelTimeResponse);
  Status   = IpmiSubmitCommand (
               IPMI_NETFN_STORAGE,
               IPMI_STORAGE_GET_SEL_TIME,
               NULL,
               0,
               (VOID *)GetSelTimeResponse,
               &DataSize
               );
  return Status;
}

/**
  This function set the time in the SEL Device.

  @param [in]  SetSelTimeRequest       Pointer to IPMI_SET_SEL_TIME_REQUEST.
  @param [out] CompletionCode         IPMI completetion code, refer to Ipmi.h.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiSetSelTime (
  IN IPMI_SET_SEL_TIME_REQUEST  *SetSelTimeRequest,
  OUT UINT8                     *CompletionCode
  )
{
  EFI_STATUS  Status;
  UINT32      DataSize;

  DataSize = sizeof (*CompletionCode);
  Status   = IpmiSubmitCommand (
               IPMI_NETFN_STORAGE,
               IPMI_STORAGE_SET_SEL_TIME,
               (VOID *)SetSelTimeRequest,
               sizeof (*SetSelTimeRequest),
               (VOID *)CompletionCode,
               &DataSize
               );
  return Status;
}

/**
  This function returns the SDR command version for the SDR Repository

  @param [out] GetSdrRepositoryInfoResp      Pointer to receive IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiGetSdrRepositoryInfo (
  OUT IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE  *GetSdrRepositoryInfoResp
  )
{
  EFI_STATUS  Status;
  UINT32      DataSize;

  DataSize = sizeof (*GetSdrRepositoryInfoResp);
  Status   = IpmiSubmitCommand (
               IPMI_NETFN_STORAGE,
               IPMI_STORAGE_GET_SDR_REPOSITORY_INFO,
               NULL,
               0,
               (VOID *)GetSdrRepositoryInfoResp,
               &DataSize
               );
  return Status;
}

/**
  This function returns the sensor record specified by Record ID.

  @param [in]  GetSdrRequest       Pointer to IPMI_GET_SDR_REQUEST.
  @param [out] GetSdrResponse      Pointer to receive IPMI_GET_SDR_RESPONSE.
  @param [in, out]  GetSdrResponseSize  Size of entire GetSdrResponse.

  @retval EFI_STATUS   See the return values of IpmiSubmitCommand () function.

**/
EFI_STATUS
EFIAPI
IpmiGetSdr (
  IN  IPMI_GET_SDR_REQUEST   *GetSdrRequest,
  OUT IPMI_GET_SDR_RESPONSE  *GetSdrResponse,
  IN OUT UINT32              *GetSdrResponseSize
  )
{
  EFI_STATUS  Status;

  Status = IpmiSubmitCommand (
             IPMI_NETFN_STORAGE,
             IPMI_STORAGE_GET_SDR,
             (VOID *)GetSdrRequest,
             sizeof (*GetSdrRequest),
             (VOID *)GetSdrResponse,
             GetSdrResponseSize
             );
  return Status;
}
