/** @file
  QEMU/KVM Firmware Configuration access
  Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.
  Copyright (C) 2013, Red Hat, Inc.
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef __FW_CFG_LIB__
#define __FW_CFG_LIB__
#include 
/**
  Returns a boolean indicating if the firmware configuration interface
  is available or not.
  This function may change fw_cfg state.
  @retval    TRUE   The interface is available
  @retval    FALSE  The interface is not available
**/
BOOLEAN
EFIAPI
QemuFwCfgIsAvailable (
  VOID
  );
/**
  Selects a firmware configuration item for reading.
  Following this call, any data read from this item will start from
  the beginning of the configuration item's data.
  @param[in] QemuFwCfgItem - Firmware Configuration item to read
**/
VOID
EFIAPI
QemuFwCfgSelectItem (
  IN FIRMWARE_CONFIG_ITEM  QemuFwCfgItem
  );
/**
  Reads firmware configuration bytes into a buffer
  If called multiple times, then the data read will
  continue at the offset of the firmware configuration
  item where the previous read ended.
  @param[in] Size - Size in bytes to read
  @param[in] Buffer - Buffer to store data into
**/
VOID
EFIAPI
QemuFwCfgReadBytes (
  IN UINTN  Size,
  IN VOID   *Buffer  OPTIONAL
  );
/**
  Writes firmware configuration bytes from a buffer
  If called multiple times, then the data written will
  continue at the offset of the firmware configuration
  item where the previous write ended.
  @param[in] Size - Size in bytes to write
  @param[in] Buffer - Buffer to read data from
**/
VOID
EFIAPI
QemuFwCfgWriteBytes (
  IN UINTN  Size,
  IN VOID   *Buffer
  );
/**
  Skip bytes in the firmware configuration item.
  Increase the offset of the firmware configuration item without transferring
  bytes between the item and a caller-provided buffer. Subsequent read, write
  or skip operations will commence at the increased offset.
  @param[in] Size  Number of bytes to skip.
**/
VOID
EFIAPI
QemuFwCfgSkipBytes (
  IN UINTN  Size
  );
/**
  Reads a UINT8 firmware configuration value
  @return    Value of Firmware Configuration item read
**/
UINT8
EFIAPI
QemuFwCfgRead8 (
  VOID
  );
/**
  Reads a UINT16 firmware configuration value
  @return    Value of Firmware Configuration item read
**/
UINT16
EFIAPI
QemuFwCfgRead16 (
  VOID
  );
/**
  Reads a UINT32 firmware configuration value
  @return    Value of Firmware Configuration item read
**/
UINT32
EFIAPI
QemuFwCfgRead32 (
  VOID
  );
/**
  Reads a UINT64 firmware configuration value
  @return    Value of Firmware Configuration item read
**/
UINT64
EFIAPI
QemuFwCfgRead64 (
  VOID
  );
/**
  Find the configuration item corresponding to the firmware configuration file.
  @param[in]  Name - Name of file to look up.
  @param[out] Item - Configuration item corresponding to the file, to be passed
                     to QemuFwCfgSelectItem ().
  @param[out] Size - Number of bytes in the file.
  @return    RETURN_SUCCESS       If file is found.
             RETURN_NOT_FOUND     If file is not found.
             RETURN_UNSUPPORTED   If firmware configuration is unavailable.
**/
RETURN_STATUS
EFIAPI
QemuFwCfgFindFile (
  IN   CONST CHAR8           *Name,
  OUT  FIRMWARE_CONFIG_ITEM  *Item,
  OUT  UINTN                 *Size
  );
#endif