/** @file

  The common header file for SMM FTW module and SMM FTW DXE Module.

Copyright (c) 2011 - 2024, Intel Corporation. All rights reserved. <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

#include <Protocol/SmmFirmwareVolumeBlock.h>
#include <Protocol/SmmFaultTolerantWrite.h>

#define FTW_FUNCTION_GET_MAX_BLOCK_SIZE  1
#define FTW_FUNCTION_ALLOCATE            2
#define FTW_FUNCTION_WRITE               3
#define FTW_FUNCTION_RESTART             4
#define FTW_FUNCTION_ABORT               5
#define FTW_FUNCTION_GET_LAST_WRITE      6

typedef struct {
  UINTN         Function;
  EFI_STATUS    ReturnStatus;
  UINT8         Data[1];
} SMM_FTW_COMMUNICATE_FUNCTION_HEADER;

///
/// Size of SMM communicate header, without including the payload.
///
#define SMM_COMMUNICATE_HEADER_SIZE  (OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data))

///
/// Size of SMM FTW communicate function header, without including the payload.
///
#define SMM_FTW_COMMUNICATE_HEADER_SIZE  (OFFSET_OF (SMM_FTW_COMMUNICATE_FUNCTION_HEADER, Data))

typedef struct {
  UINTN    BlockSize;
} SMM_FTW_GET_MAX_BLOCK_SIZE_HEADER;

typedef struct {
  EFI_GUID    CallerId;
  UINTN       PrivateDataSize;
  UINTN       NumberOfWrites;
} SMM_FTW_ALLOCATE_HEADER;

typedef struct {
  EFI_LBA                 Lba;
  UINTN                   Offset;
  UINTN                   PrivateDataSize;
  EFI_PHYSICAL_ADDRESS    FvbBaseAddress;
  EFI_FVB_ATTRIBUTES_2    FvbAttributes;
  UINTN                   Length;
  UINT8                   Data[1];
} SMM_FTW_WRITE_HEADER;

typedef struct {
  EFI_PHYSICAL_ADDRESS    FvbBaseAddress;
  EFI_FVB_ATTRIBUTES_2    FvbAttributes;
} SMM_FTW_RESTART_HEADER;

typedef struct {
  EFI_GUID    CallerId;
  EFI_LBA     Lba;
  UINTN       Offset;
  UINTN       Length;
  UINTN       PrivateDataSize;
  BOOLEAN     Complete;
  UINT8       Data[1];
} SMM_FTW_GET_LAST_WRITE_HEADER;

/**
  Shared entry point of the module.

  @retval EFI_SUCCESS           The initialization finished successfully.
  @retval EFI_OUT_OF_RESOURCES  Allocate memory error
  @retval EFI_INVALID_PARAMETER Workspace or Spare block does not exist

**/
EFI_STATUS
MmFaultTolerantWriteInitialize (
  VOID
  );

/**
  This function checks if the Primary Buffer is valid.

  @param Buffer The buffer start address to be checked.
  @param Length The buffer length to be checked.

  @retval TRUE  This buffer is valid.
  @retval FALSE This buffer is not valid.
**/
BOOLEAN
FtwSmmIsPrimaryBufferValid (
  IN EFI_PHYSICAL_ADDRESS  Buffer,
  IN UINT64                Length
  );

/**
  Notify the system that the SMM FTW driver is ready.
**/
VOID
FtwNotifySmmReady (
  VOID
  );
