https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
		
			
				
	
	
		
			202 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			202 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  PEI IOMMU PPI.
 | 
						|
 | 
						|
Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
 | 
						|
SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
 | 
						|
#ifndef __PEI_IOMMU_H__
 | 
						|
#define __PEI_IOMMU_H__
 | 
						|
 | 
						|
//
 | 
						|
// for EFI_ALLOCATE_TYPE
 | 
						|
//
 | 
						|
#include <Uefi.h>
 | 
						|
 | 
						|
//
 | 
						|
// Include protocol for common definition
 | 
						|
//   EDKII_IOMMU_ACCESS_xxx
 | 
						|
//   EDKII_IOMMU_OPERATION
 | 
						|
//
 | 
						|
#include <Protocol/IoMmu.h>
 | 
						|
 | 
						|
//
 | 
						|
// IOMMU Ppi GUID value
 | 
						|
//
 | 
						|
#define EDKII_IOMMU_PPI_GUID \
 | 
						|
    { \
 | 
						|
      0x70b0af26, 0xf847, 0x4bb6, { 0xaa, 0xb9, 0xcd, 0xe8, 0x4f, 0xc6, 0x14, 0x31 } \
 | 
						|
    }
 | 
						|
 | 
						|
//
 | 
						|
// Forward reference for pure ANSI compatability
 | 
						|
//
 | 
						|
typedef struct _EDKII_IOMMU_PPI  EDKII_IOMMU_PPI;
 | 
						|
 | 
						|
//
 | 
						|
// Revision The revision to which the IOMMU interface adheres.
 | 
						|
//          All future revisions must be backwards compatible.
 | 
						|
//          If a future version is not back wards compatible it is not the same GUID.
 | 
						|
//
 | 
						|
#define EDKII_IOMMU_PPI_REVISION 0x00010000
 | 
						|
 | 
						|
/**
 | 
						|
  Set IOMMU attribute for a system memory.
 | 
						|
 | 
						|
  If the IOMMU PPI exists, the system memory cannot be used
 | 
						|
  for DMA by default.
 | 
						|
 | 
						|
  When a device requests a DMA access for a system memory,
 | 
						|
  the device driver need use SetAttribute() to update the IOMMU
 | 
						|
  attribute to request DMA access (read and/or write).
 | 
						|
 | 
						|
  @param[in]  This              The PPI instance pointer.
 | 
						|
  @param[in]  Mapping           The mapping value returned from Map().
 | 
						|
  @param[in]  IoMmuAccess       The IOMMU access.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The IoMmuAccess is set for the memory range specified by DeviceAddress and Length.
 | 
						|
  @retval EFI_INVALID_PARAMETER  Mapping is not a value that was returned by Map().
 | 
						|
  @retval EFI_INVALID_PARAMETER  IoMmuAccess specified an illegal combination of access.
 | 
						|
  @retval EFI_UNSUPPORTED        The bit mask of IoMmuAccess is not supported by the IOMMU.
 | 
						|
  @retval EFI_UNSUPPORTED        The IOMMU does not support the memory range specified by Mapping.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES   There are not enough resources available to modify the IOMMU access.
 | 
						|
  @retval EFI_DEVICE_ERROR       The IOMMU device reported an error while attempting the operation.
 | 
						|
  @retval EFI_NOT_AVAILABLE_YET  DMA protection has been enabled, but DMA buffer are
 | 
						|
                                 not available to be allocated yet.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EDKII_PEI_IOMMU_SET_ATTRIBUTE)(
 | 
						|
  IN EDKII_IOMMU_PPI       *This,
 | 
						|
  IN VOID                  *Mapping,
 | 
						|
  IN UINT64                IoMmuAccess
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Provides the controller-specific addresses required to access system memory from a
 | 
						|
  DMA bus master.
 | 
						|
 | 
						|
  @param  This                  The PPI instance pointer.
 | 
						|
  @param  Operation             Indicates if the bus master is going to read or write to system memory.
 | 
						|
  @param  HostAddress           The system memory address to map to the PCI controller.
 | 
						|
  @param  NumberOfBytes         On input the number of bytes to map. On output the number of bytes
 | 
						|
                                that were mapped.
 | 
						|
  @param  DeviceAddress         The resulting map address for the bus master PCI controller to use to
 | 
						|
                                access the hosts HostAddress.
 | 
						|
  @param  Mapping               A resulting value to pass to Unmap().
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The range was mapped for the returned NumberOfBytes.
 | 
						|
  @retval EFI_UNSUPPORTED       The HostAddress cannot be mapped as a common buffer.
 | 
						|
  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
 | 
						|
  @retval EFI_DEVICE_ERROR      The system hardware could not map the requested address.
 | 
						|
  @retval EFI_NOT_AVAILABLE_YET DMA protection has been enabled, but DMA buffer are
 | 
						|
                                not available to be allocated yet.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EDKII_PEI_IOMMU_MAP)(
 | 
						|
  IN     EDKII_IOMMU_PPI                            *This,
 | 
						|
  IN     EDKII_IOMMU_OPERATION                      Operation,
 | 
						|
  IN     VOID                                       *HostAddress,
 | 
						|
  IN OUT UINTN                                      *NumberOfBytes,
 | 
						|
  OUT    EFI_PHYSICAL_ADDRESS                       *DeviceAddress,
 | 
						|
  OUT    VOID                                       **Mapping
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Completes the Map() operation and releases any corresponding resources.
 | 
						|
 | 
						|
  @param  This                  The PPI instance pointer.
 | 
						|
  @param  Mapping               The mapping value returned from Map().
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The range was unmapped.
 | 
						|
  @retval EFI_INVALID_PARAMETER Mapping is not a value that was returned by Map().
 | 
						|
  @retval EFI_DEVICE_ERROR      The data was not committed to the target system memory.
 | 
						|
  @retval EFI_NOT_AVAILABLE_YET DMA protection has been enabled, but DMA buffer are
 | 
						|
                                not available to be allocated yet.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EDKII_PEI_IOMMU_UNMAP)(
 | 
						|
  IN  EDKII_IOMMU_PPI                          *This,
 | 
						|
  IN  VOID                                     *Mapping
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Allocates pages that are suitable for an OperationBusMasterCommonBuffer or
 | 
						|
  OperationBusMasterCommonBuffer64 mapping.
 | 
						|
 | 
						|
  @param  This                  The PPI instance pointer.
 | 
						|
  @param  MemoryType            The type of memory to allocate, EfiBootServicesData or
 | 
						|
                                EfiRuntimeServicesData.
 | 
						|
  @param  Pages                 The number of pages to allocate.
 | 
						|
  @param  HostAddress           A pointer to store the base system memory address of the
 | 
						|
                                allocated range.
 | 
						|
  @param  Attributes            The requested bit mask of attributes for the allocated range.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The requested memory pages were allocated.
 | 
						|
  @retval EFI_UNSUPPORTED       Attributes is unsupported. The only legal attribute bits are
 | 
						|
                                MEMORY_WRITE_COMBINE, MEMORY_CACHED and DUAL_ADDRESS_CYCLE.
 | 
						|
  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  The memory pages could not be allocated.
 | 
						|
  @retval EFI_NOT_AVAILABLE_YET DMA protection has been enabled, but DMA buffer are
 | 
						|
                                not available to be allocated yet.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EDKII_PEI_IOMMU_ALLOCATE_BUFFER)(
 | 
						|
  IN     EDKII_IOMMU_PPI                          *This,
 | 
						|
  IN     EFI_MEMORY_TYPE                          MemoryType,
 | 
						|
  IN     UINTN                                    Pages,
 | 
						|
  IN OUT VOID                                     **HostAddress,
 | 
						|
  IN     UINT64                                   Attributes
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Frees memory that was allocated with AllocateBuffer().
 | 
						|
 | 
						|
  @param  This                  The PPI instance pointer.
 | 
						|
  @param  Pages                 The number of pages to free.
 | 
						|
  @param  HostAddress           The base system memory address of the allocated range.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The requested memory pages were freed.
 | 
						|
  @retval EFI_INVALID_PARAMETER The memory range specified by HostAddress and Pages
 | 
						|
                                was not allocated with AllocateBuffer().
 | 
						|
  @retval EFI_NOT_AVAILABLE_YET DMA protection has been enabled, but DMA buffer are
 | 
						|
                                not available to be allocated yet.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EDKII_PEI_IOMMU_FREE_BUFFER)(
 | 
						|
  IN  EDKII_IOMMU_PPI                          *This,
 | 
						|
  IN  UINTN                                    Pages,
 | 
						|
  IN  VOID                                     *HostAddress
 | 
						|
  );
 | 
						|
 | 
						|
///
 | 
						|
/// IOMMU PPI structure.
 | 
						|
///
 | 
						|
struct _EDKII_IOMMU_PPI {
 | 
						|
  UINT64                              Revision;
 | 
						|
  EDKII_PEI_IOMMU_SET_ATTRIBUTE       SetAttribute;
 | 
						|
  EDKII_PEI_IOMMU_MAP                 Map;
 | 
						|
  EDKII_PEI_IOMMU_UNMAP               Unmap;
 | 
						|
  EDKII_PEI_IOMMU_ALLOCATE_BUFFER     AllocateBuffer;
 | 
						|
  EDKII_PEI_IOMMU_FREE_BUFFER         FreeBuffer;
 | 
						|
};
 | 
						|
 | 
						|
///
 | 
						|
/// IOMMU PPI GUID variable.
 | 
						|
///
 | 
						|
extern EFI_GUID gEdkiiIoMmuPpiGuid;
 | 
						|
 | 
						|
#endif
 |