/** @file
  The Esrt Management Protocol used to register/set/update an updatable firmware resource .

Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

#include <Guid/SystemResourceTable.h>

///
/// Global ID for the ESRT_MANAGEMENT_PROTOCOL.
///
#define ESRT_MANAGEMENT_PROTOCOL_GUID \
  { \
    0xa340c064, 0x723c, 0x4a9c, { 0xa4, 0xdd, 0xd5, 0xb4, 0x7a, 0x26, 0xfb, 0xb0 } \
  }

///
/// Forward declaration for the _ESRT_MANAGEMENT_PROTOCOL.
///
typedef struct _ESRT_MANAGEMENT_PROTOCOL ESRT_MANAGEMENT_PROTOCOL;

/**
  Get Variable name and data by Esrt Entry FwClass

  @param[in]       FwClass                FwClass of Esrt entry to get
  @param[in out]  Entry                   Esrt entry returned

  @retval EFI_SUCCESS                  The variable saving this Esrt Entry exists.
  @retval EF_NOT_FOUND                   No correct variable found.

**/
typedef
EFI_STATUS
(EFIAPI *GET_ESRT_ENTRY)(
  IN     EFI_GUID                  *FwClass,
  IN OUT EFI_SYSTEM_RESOURCE_ENTRY *Entry
  );

/**
  Update one ESRT entry in ESRT Cache.

  @param[in]  Entry                         Esrt entry to be updated

  @retval EFI_SUCCESS                   Successfully update an ESRT entry in cache.
  @retval EFI_INVALID_PARAMETER  Entry does't exist in ESRT Cache
  @retval EFI_WRITE_PROTECTED     ESRT Cache repositoy is locked

**/
typedef
EFI_STATUS
(EFIAPI *UPDATE_ESRT_ENTRY)(
  IN EFI_SYSTEM_RESOURCE_ENTRY *Entry
  );

/**
  Non-FMP instance to unregister Esrt Entry from ESRT Cache.

  @param[in]    FwClass                FwClass of Esrt entry to Unregister

  @retval EFI_SUCCESS         Insert all entries Successfully
  @retval EFI_NOT_FOUND     FwClass does not exsit

**/
typedef
EFI_STATUS
(EFIAPI *UNREGISTER_ESRT_ENTRY)(
  IN  EFI_GUID        *FwClass
  );

/**
  Non-FMP instance to register one ESRT entry into ESRT Cache.

  @param[in]  Entry                Esrt entry to be set

  @retval EFI_SUCCESS                   Successfully set a variable.
  @retval EFI_INVALID_PARAMETER  ESRT Entry is already exist
  @retval EFI_OUT_OF_RESOURCES  Non-FMP ESRT repository is full

**/
typedef
EFI_STATUS
(EFIAPI *REGISTER_ESRT_ENTRY)(
  IN EFI_SYSTEM_RESOURCE_ENTRY *Entry
  );

/**
  This function syn up Cached ESRT with data from FMP instances
  Function should be called after Connect All in order to locate all FMP protocols
  installed

  @retval EFI_SUCCESS                      Successfully sync cache repository from FMP instances
  @retval EFI_NOT_FOUND                   No FMP Instance are found
  @retval EFI_OUT_OF_RESOURCES     Resource allocaton fail

**/
typedef
EFI_STATUS
(EFIAPI *SYNC_ESRT_FMP)(
  VOID
  );

/**
  This function locks up Esrt repository to be readonly. It should be called
  before gEfiEndOfDxeEventGroupGuid event signaled

  @retval EFI_SUCCESS              Locks up FMP Non-FMP repository successfully

**/
typedef
EFI_STATUS
(EFIAPI *LOCK_ESRT_REPOSITORY)(
  VOID
  );

struct _ESRT_MANAGEMENT_PROTOCOL {
  GET_ESRT_ENTRY           GetEsrtEntry;
  UPDATE_ESRT_ENTRY        UpdateEsrtEntry;
  REGISTER_ESRT_ENTRY      RegisterEsrtEntry;
  UNREGISTER_ESRT_ENTRY    UnRegisterEsrtEntry;
  SYNC_ESRT_FMP            SyncEsrtFmp;
  LOCK_ESRT_REPOSITORY     LockEsrtRepository;
};

extern EFI_GUID  gEsrtManagementProtocolGuid;
