/** @file
  EFI MM Access PPI definition.

  This PPI is used to control the visibility of the MMRAM on the platform.
  The EFI_PEI_MM_ACCESS_PPI abstracts the location and characteristics of MMRAM. The
  principal functionality found in the memory controller includes the following:
  - Exposing the MMRAM to all non-MM agents, or the "open" state
  - Shrouding the MMRAM to all but the MM agents, or the "closed" state
  - Preserving the system integrity, or "locking" the MMRAM, such that the settings cannot be
    perturbed by either boot service or runtime agents

  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This PPI is introduced in PI Version 1.5.

**/

#ifndef _MM_ACCESS_PPI_H_
#define _MM_ACCESS_PPI_H_

#define EFI_PEI_MM_ACCESS_PPI_GUID \
  { 0x268f33a9, 0xcccd, 0x48be, { 0x88, 0x17, 0x86, 0x5, 0x3a, 0xc3, 0x2e, 0xd6 }}

typedef struct _EFI_PEI_MM_ACCESS_PPI  EFI_PEI_MM_ACCESS_PPI;

/**
  Opens the MMRAM area to be accessible by a PEIM.

  This function "opens" MMRAM so that it is visible while not inside of MM. The function should
  return EFI_UNSUPPORTED if the hardware does not support hiding of MMRAM. The function
  should return EFI_DEVICE_ERROR if the MMRAM configuration is locked.

  @param  PeiServices            An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This                   The EFI_PEI_MM_ACCESS_PPI instance.
  @param  DescriptorIndex        The region of MMRAM to Open.

  @retval EFI_SUCCESS            The operation was successful.
  @retval EFI_UNSUPPORTED        The system does not support opening and closing of MMRAM.
  @retval EFI_DEVICE_ERROR       MMRAM cannot be opened, perhaps because it is locked.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_OPEN)(
  IN EFI_PEI_SERVICES                **PeiServices,
  IN EFI_PEI_MM_ACCESS_PPI           *This,
  IN UINTN                           DescriptorIndex
  );

/**
  Inhibits access to the MMRAM.

  This function "closes" MMRAM so that it is not visible while outside of MM. The function should
  return EFI_UNSUPPORTED if the hardware does not support hiding of MMRAM.

  @param  PeiServices            An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This                   The EFI_PEI_MM_ACCESS_PPI instance.
  @param  DescriptorIndex        The region of MMRAM to Close.

  @retval EFI_SUCCESS            The operation was successful.
  @retval EFI_UNSUPPORTED        The system does not support opening and closing of MMRAM.
  @retval EFI_DEVICE_ERROR       MMRAM cannot be closed.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_CLOSE)(
  IN EFI_PEI_SERVICES                **PeiServices,
  IN EFI_PEI_MM_ACCESS_PPI           *This,
  IN UINTN                           DescriptorIndex
  );

/**
  This function prohibits access to the MMRAM region. This function is usually implemented such
  that it is a write-once operation.

  @param  PeiServices            An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This                   The EFI_PEI_MM_ACCESS_PPI instance.
  @param  DescriptorIndex        The region of MMRAM to Lock.

  @retval EFI_SUCCESS            The operation was successful.
  @retval EFI_UNSUPPORTED        The system does not support opening and closing of MMRAM.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_LOCK)(
  IN EFI_PEI_SERVICES                **PeiServices,
  IN EFI_PEI_MM_ACCESS_PPI           *This,
  IN UINTN                           DescriptorIndex
  );

/**
  Queries the memory controller for the possible regions that will support MMRAM.

  This function describes the MMRAM regions.
  This data structure forms the contract between the MM_ACCESS and MM_IPL drivers. There is an
  ambiguity when any MMRAM region is remapped. For example, on some chipsets, some MMRAM
  regions can be initialized at one physical address but is later accessed at another processor address.
  There is currently no way for the MM IPL driver to know that it must use two different addresses
  depending on what it is trying to do. As a result, initial configuration and loading can use the
  physical address PhysicalStart while MMRAM is open. However, once the region has been
  closed and needs to be accessed by agents in MM, the CpuStart address must be used.
  This PPI publishes the available memory that the chipset can shroud for the use of installing code.
  These regions serve the dual purpose of describing which regions have been open, closed, or locked.
  In addition, these regions may include overlapping memory ranges, depending on the chipset
  implementation. The latter might include a chipset that supports T-SEG, where memory near the top
  of the physical DRAM can be allocated for MMRAM too.
  The key thing to note is that the regions that are described by the PPI are a subset of the capabilities
  of the hardware.

  @param  PeiServices            An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This                   The EFI_PEI_MM_ACCESS_PPI instance.
  @param  MmramMapSize           A pointer to the size, in bytes, of the MmramMemoryMap buffer. On input, this value is
                                 the size of the buffer that is allocated by the caller. On output, it is the size of the
                                 buffer that was returned by the firmware if the buffer was large enough, or, if the
                                 buffer was too small, the size of the buffer that is needed to contain the map.
  @param MmramMap                A pointer to the buffer in which firmware places the current memory map. The map is
                                 an array of EFI_MMRAM_DESCRIPTORs

  @retval EFI_SUCCESS            The chipset supported the given resource.
  @retval EFI_BUFFER_TOO_SMALL   The MmramMap parameter was too small. The current
                                 buffer size needed to hold the memory map is returned in
                                 MmramMapSize.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_CAPABILITIES)(
  IN EFI_PEI_SERVICES                **PeiServices,
  IN EFI_PEI_MM_ACCESS_PPI           *This,
  IN OUT UINTN                       *MmramMapSize,
  IN OUT EFI_MMRAM_DESCRIPTOR        *MmramMap
  );

///
///  EFI MM Access PPI is used to control the visibility of the MMRAM on the platform.
///  It abstracts the location and characteristics of MMRAM. The platform should report
///  all MMRAM via EFI_PEI_MM_ACCESS_PPI. The expectation is that the north bridge or
///  memory controller would publish this PPI.
///
struct _EFI_PEI_MM_ACCESS_PPI {
  EFI_PEI_MM_OPEN          Open;
  EFI_PEI_MM_CLOSE         Close;
  EFI_PEI_MM_LOCK          Lock;
  EFI_PEI_MM_CAPABILITIES  GetCapabilities;
  BOOLEAN                  LockState;
  BOOLEAN                  OpenState;
};

extern EFI_GUID gEfiPeiMmAccessPpiGuid;

#endif
