/** @file
  The default version of EFI_PEI_CPU_IO_PPI support published by PeiServices in
  PeiCore initialization phase.

  EFI_PEI_CPU_IO_PPI is installed by some platform or chipset-specific PEIM that
  abstracts the processor-visible I/O operations. When PeiCore is started, the
  default version of EFI_PEI_CPU_IO_PPI will be assigned to PeiServices table.

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

**/

#include "PeiMain.h"

///
/// This default instance of EFI_PEI_CPU_IO_PPI install assigned to EFI_PEI_SERVICE.CpuIo
/// when PeiCore's initialization.
///
EFI_PEI_CPU_IO_PPI gPeiDefaultCpuIoPpi = {
  {
    PeiDefaultMemRead,
    PeiDefaultMemWrite
  },
  {
    PeiDefaultIoRead,
    PeiDefaultIoWrite
  },
  PeiDefaultIoRead8,
  PeiDefaultIoRead16,
  PeiDefaultIoRead32,
  PeiDefaultIoRead64,
  PeiDefaultIoWrite8,
  PeiDefaultIoWrite16,
  PeiDefaultIoWrite32,
  PeiDefaultIoWrite64,
  PeiDefaultMemRead8,
  PeiDefaultMemRead16,
  PeiDefaultMemRead32,
  PeiDefaultMemRead64,
  PeiDefaultMemWrite8,
  PeiDefaultMemWrite16,
  PeiDefaultMemWrite32,
  PeiDefaultMemWrite64
};

/**
  Memory-based read services.

  This function is to perform the Memory Access Read service based on installed
  instance of the EFI_PEI_CPU_IO_PPI.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return EFI_NOT_YET_AVAILABLE.

  @param  PeiServices           An indirect pointer to the PEI Services Table
                                published by the PEI Foundation.
  @param  This                  Pointer to local data for the interface.
  @param  Width                 The width of the access. Enumerated in bytes.
  @param  Address               The physical address of the access.
  @param  Count                 The number of accesses to perform.
  @param  Buffer                A pointer to the buffer of data.

  @retval EFI_SUCCESS           The function completed successfully.
  @retval EFI_NOT_YET_AVAILABLE The service has not been installed.
**/
EFI_STATUS
EFIAPI
PeiDefaultMemRead (
  IN  CONST EFI_PEI_SERVICES            **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI          *This,
  IN  EFI_PEI_CPU_IO_PPI_WIDTH          Width,
  IN  UINT64                            Address,
  IN  UINTN                             Count,
  IN  OUT VOID                          *Buffer
  )
{
  return EFI_NOT_AVAILABLE_YET;
}

/**
  Memory-based write services.

  This function is to perform the Memory Access Write service based on installed
  instance of the EFI_PEI_CPU_IO_PPI.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return EFI_NOT_YET_AVAILABLE.

  @param  PeiServices           An indirect pointer to the PEI Services Table
                                published by the PEI Foundation.
  @param  This                  Pointer to local data for the interface.
  @param  Width                 The width of the access. Enumerated in bytes.
  @param  Address               The physical address of the access.
  @param  Count                 The number of accesses to perform.
  @param  Buffer                A pointer to the buffer of data.

  @retval EFI_SUCCESS           The function completed successfully.
  @retval EFI_NOT_YET_AVAILABLE The service has not been installed.
**/
EFI_STATUS
EFIAPI
PeiDefaultMemWrite (
  IN  CONST EFI_PEI_SERVICES            **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI          *This,
  IN  EFI_PEI_CPU_IO_PPI_WIDTH          Width,
  IN  UINT64                            Address,
  IN  UINTN                             Count,
  IN  OUT VOID                          *Buffer
  )
{
  return EFI_NOT_AVAILABLE_YET;
}

/**
  IO-based read services.

  This function is to perform the IO-base read service for the EFI_PEI_CPU_IO_PPI.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return EFI_NOT_YET_AVAILABLE.

  @param  PeiServices           An indirect pointer to the PEI Services Table
                                published by the PEI Foundation.
  @param  This                  Pointer to local data for the interface.
  @param  Width                 The width of the access. Enumerated in bytes.
  @param  Address               The physical address of the access.
  @param  Count                 The number of accesses to perform.
  @param  Buffer                A pointer to the buffer of data.

  @retval EFI_SUCCESS           The function completed successfully.
  @retval EFI_NOT_YET_AVAILABLE The service has not been installed.
**/
EFI_STATUS
EFIAPI
PeiDefaultIoRead (
  IN      CONST EFI_PEI_SERVICES          **PeiServices,
  IN      CONST EFI_PEI_CPU_IO_PPI        *This,
  IN      EFI_PEI_CPU_IO_PPI_WIDTH        Width,
  IN      UINT64                          Address,
  IN      UINTN                           Count,
  IN OUT  VOID                            *Buffer
  )
{
  return EFI_NOT_AVAILABLE_YET;
}

/**
  IO-based write services.

  This function is to perform the IO-base write service for the EFI_PEI_CPU_IO_PPI.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return EFI_NOT_YET_AVAILABLE.

  @param  PeiServices           An indirect pointer to the PEI Services Table
                                published by the PEI Foundation.
  @param  This                  Pointer to local data for the interface.
  @param  Width                 The width of the access. Enumerated in bytes.
  @param  Address               The physical address of the access.
  @param  Count                 The number of accesses to perform.
  @param  Buffer                A pointer to the buffer of data.

  @retval EFI_SUCCESS           The function completed successfully.
  @retval EFI_NOT_YET_AVAILABLE The service has not been installed.
**/
EFI_STATUS
EFIAPI
PeiDefaultIoWrite (
  IN      CONST EFI_PEI_SERVICES          **PeiServices,
  IN      CONST EFI_PEI_CPU_IO_PPI        *This,
  IN      EFI_PEI_CPU_IO_PPI_WIDTH        Width,
  IN      UINT64                          Address,
  IN      UINTN                           Count,
  IN OUT  VOID                            *Buffer
  )
{
  return EFI_NOT_AVAILABLE_YET;
}

/**
  8-bit I/O read operations.

  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return 0.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.

  @return An 8-bit value returned from the I/O space.
**/
UINT8
EFIAPI
PeiDefaultIoRead8 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address
  )
{
  return 0;
}

/**
  Reads an 16-bit I/O port.

  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return 0.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.

  @return A 16-bit value returned from the I/O space.
**/
UINT16
EFIAPI
PeiDefaultIoRead16 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address
  )
{
  return 0;
}

/**
  Reads an 32-bit I/O port.

  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return 0.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.

  @return A 32-bit value returned from the I/O space.
**/
UINT32
EFIAPI
PeiDefaultIoRead32 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address
  )
{
  return 0;
}

/**
  Reads an 64-bit I/O port.

  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return 0.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.

  @return A 64-bit value returned from the I/O space.
**/
UINT64
EFIAPI
PeiDefaultIoRead64 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address
  )
{
  return 0;
}

/**
  8-bit I/O write operations.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then do
  nothing.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.
  @param  Data           The data to write.
**/
VOID
EFIAPI
PeiDefaultIoWrite8 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address,
  IN  UINT8                       Data
  )
{
}

/**
  16-bit I/O write operations.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then do
  nothing.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.
  @param  Data           The data to write.
**/
VOID
EFIAPI
PeiDefaultIoWrite16 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address,
  IN  UINT16                      Data
  )
{
}

/**
  32-bit I/O write operations.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then do
  nothing.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.
  @param  Data           The data to write.
**/
VOID
EFIAPI
PeiDefaultIoWrite32 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address,
  IN  UINT32                      Data
  )
{
}

/**
  64-bit I/O write operations.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then do
  nothing.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.
  @param  Data           The data to write.
**/
VOID
EFIAPI
PeiDefaultIoWrite64 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address,
  IN  UINT64                      Data
  )
{
}

/**
  8-bit memory read operations.

  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return 0.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.

  @return An 8-bit value returned from the memory space.

**/
UINT8
EFIAPI
PeiDefaultMemRead8 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address
  )
{
  return 0;
}

/**
  16-bit memory read operations.

  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return 0.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.

  @return An 16-bit value returned from the memory space.

**/
UINT16
EFIAPI
PeiDefaultMemRead16 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address
  )
{
  return 0;
}

/**
  32-bit memory read operations.

  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return 0.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.

  @return An 32-bit value returned from the memory space.

**/
UINT32
EFIAPI
PeiDefaultMemRead32 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address
  )
{
  return 0;
}

/**
  64-bit memory read operations.

  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then
  return 0.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.

  @return An 64-bit value returned from the memory space.

**/
UINT64
EFIAPI
PeiDefaultMemRead64 (
  IN  CONST EFI_PEI_SERVICES      **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI    *This,
  IN  UINT64                      Address
  )
{
  return 0;
}

/**
  8-bit memory write operations.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then do
  nothing.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.
  @param  Data           The data to write.

**/
VOID
EFIAPI
PeiDefaultMemWrite8 (
  IN  CONST EFI_PEI_SERVICES        **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI      *This,
  IN  UINT64                        Address,
  IN  UINT8                         Data
  )
{
}

/**
  16-bit memory write operations.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then do
  nothing.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.
  @param  Data           The data to write.

**/
VOID
EFIAPI
PeiDefaultMemWrite16 (
  IN  CONST EFI_PEI_SERVICES        **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI      *This,
  IN  UINT64                        Address,
  IN  UINT16                        Data
  )
{
}

/**
  32-bit memory write operations.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then do
  nothing.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.
  @param  Data           The data to write.

**/
VOID
EFIAPI
PeiDefaultMemWrite32 (
  IN  CONST EFI_PEI_SERVICES        **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI      *This,
  IN  UINT64                        Address,
  IN  UINT32                        Data
  )
{
}

/**
  64-bit memory write operations.
  If the EFI_PEI_CPU_IO_PPI is not installed by platform/chipset PEIM, then do
  nothing.

  @param  PeiServices    An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This           Pointer to local data for the interface.
  @param  Address        The physical address of the access.
  @param  Data           The data to write.

**/
VOID
EFIAPI
PeiDefaultMemWrite64 (
  IN  CONST EFI_PEI_SERVICES        **PeiServices,
  IN  CONST EFI_PEI_CPU_IO_PPI      *This,
  IN  UINT64                        Address,
  IN  UINT64                        Data
  )
{
}
