public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [RFC 0/6] DxeBmDmaLib
@ 2017-01-10  0:16 Leo Duran
  2017-01-10  0:16 ` [RFC 1/6] MdeModulePkg: Add DxeBmDmaLib library Leo Duran
                   ` (7 more replies)
  0 siblings, 8 replies; 15+ messages in thread
From: Leo Duran @ 2017-01-10  0:16 UTC (permalink / raw)
  To: edk2-devel
  Cc: brijesh.singh, lersek, jordan.l.justen, feng.tian, star.zeng,
	maurice.ma, prince.agyeman, ard.biesheuvel, Leo Duran

This patch-set provides an abstraction layer for DMA operations implemented
by the PciHostBridgeDxe driver. The intent is to then allow override of this
library as may be required by specific hardware implementations, such as 
AMD's Secure Encrypted Virtualization (SEV).

This new (BmDmaLib class) library is modeled after the existing DmaLib
plus an extra DmaAbove4GB (BOOLEAN) parameter in the Map and Allocate
interfaces, so that decisions can be made about the need to allocate DMA
buffers below the 4GB boundary.

Leo Duran (6):
  MdeModulePkg: Add DxeBmDmaLib library
  ArmVirtPkg: Modify .DSC files that include PciHostBridgeDxe driver
  CorebootPayloadPkg: Modify .DSC files that include PciHostBridgeDxe
    driver
  MdeModulePkg: Modify .DSC files that include PciHostBridgeDxe driver
  OvmfPkg: Modify .DSC files that include PciHostBridgeDxe driver
  MdeModulePkg: Modify PciHostBridgeDxe to use new BmDmaLib library.

 ArmVirtPkg/ArmVirtQemu.dsc                         |   1 +
 ArmVirtPkg/ArmVirtQemuKernel.dsc                   |   1 +
 CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc      |   1 +
 CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc   |   1 +
 .../Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf  |   1 +
 .../Bus/Pci/PciHostBridgeDxe/PciRootBridge.h       |  13 +-
 .../Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c     | 272 ++++------------
 MdeModulePkg/Include/Library/BmDmaLib.h            | 161 ++++++++++
 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c     | 351 +++++++++++++++++++++
 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf   |  41 +++
 MdeModulePkg/MdeModulePkg.dsc                      |   3 +
 OvmfPkg/OvmfPkgIa32.dsc                            |   1 +
 OvmfPkg/OvmfPkgIa32X64.dsc                         |   1 +
 OvmfPkg/OvmfPkgX64.dsc                             |   1 +
 14 files changed, 629 insertions(+), 220 deletions(-)
 create mode 100644 MdeModulePkg/Include/Library/BmDmaLib.h
 create mode 100644 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
 create mode 100644 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf

-- 
1.9.1



^ permalink raw reply	[flat|nested] 15+ messages in thread

* [RFC 1/6] MdeModulePkg: Add DxeBmDmaLib library
  2017-01-10  0:16 [RFC 0/6] DxeBmDmaLib Leo Duran
@ 2017-01-10  0:16 ` Leo Duran
  2017-01-10  0:47   ` Andrew Fish
  2017-01-10  0:16 ` [RFC 2/6] ArmVirtPkg: Modify .DSC files that include PciHostBridgeDxe driver Leo Duran
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 15+ messages in thread
From: Leo Duran @ 2017-01-10  0:16 UTC (permalink / raw)
  To: edk2-devel
  Cc: brijesh.singh, lersek, jordan.l.justen, feng.tian, star.zeng,
	maurice.ma, prince.agyeman, ard.biesheuvel, Leo Duran

This patch provides an abstraction layer for DMA operations implemented
by the PciHostBridgeDxe driver. The intent is to then allow override of
this library as may be required by specific hardware implementations,
such as AMD's Secure Encrypted Virtualization (SEV).

This new (BmDmaLib class) library is modeled after the existing DmaLib
plus an extra DmaAbove4GB (BOOLEAN) parameter in the Map and Allocate
interfaces, so that decisions can be made about the need to allocate DMA
buffers below the 4GB boundary.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Leo Duran  <leo.duran@amd.com>
---
 MdeModulePkg/Include/Library/BmDmaLib.h          | 161 +++++++++++
 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c   | 351 +++++++++++++++++++++++
 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf |  41 +++
 MdeModulePkg/MdeModulePkg.dsc                    |   1 +
 4 files changed, 554 insertions(+)
 create mode 100644 MdeModulePkg/Include/Library/BmDmaLib.h
 create mode 100644 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
 create mode 100644 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf

diff --git a/MdeModulePkg/Include/Library/BmDmaLib.h b/MdeModulePkg/Include/Library/BmDmaLib.h
new file mode 100644
index 0000000..2c0e50f
--- /dev/null
+++ b/MdeModulePkg/Include/Library/BmDmaLib.h
@@ -0,0 +1,161 @@
+/** @file
+  DMA abstraction library APIs. Based on PCI IO protocol DMA abstractions.
+
+  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+  Copyright (c) 2017, AMD Inc. All rights reserved.<BR>
+
+  DMA Bus Master Read Operation:
+    Call BmDmaMap() for DmaOperationBusMasterRead.
+    Program the DMA Bus Master with the DeviceAddress returned by BmDmaMap().
+    Start the DMA Bus Master.
+    Wait for DMA Bus Master to complete the read operation.
+    Call BmDmaUnmap().
+
+  DMA Bus Master Write Operation:
+    Call BmDmaMap() for DmaOperationBusMasterWrite.
+    Program the DMA Bus Master with the DeviceAddress returned by BmDmaMap().
+    Start the DMA Bus Master.
+    Wait for DMA Bus Master to complete the write operation.
+    Call BmDmaUnmap().
+
+  DMA Bus Master Common Buffer Operation:
+    Call BmDmaAllocateBuffer() to allocate a common buffer.
+    Call BmDmaMap() for DmaOperationBusMasterCommonBuffer.
+    Program the DMA Bus Master with the DeviceAddress returned by BmDmaMap().
+    The common buffer can now be accessed equally by the processor and the DMA bus master.
+    Call BmDmaUnmap().
+    Call BmDmaFreeBuffer().
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ Derived from:
+   EmbeddedPkg/Include/Library/DmaLib.h
+
+**/
+
+#ifndef __BM_DMA_LIB_H__
+#define __BM_DMA_LIB_H__
+
+
+typedef enum {
+  ///
+  /// A read operation from system memory by a bus master.
+  ///
+  DmaOperationBusMasterRead,
+  ///
+  /// A write operation from system memory by a bus master.
+  ///
+  DmaOperationBusMasterWrite,
+  ///
+  /// Provides both read and write access to system memory by both the processor and a
+  /// bus master. The buffer is coherent from both the processor's and the bus master's point of view.
+  ///
+  DmaOperationBusMasterCommonBuffer,
+  DmaOperationBusMasterMaximum
+} BM_DMA_OPERATION;
+
+
+/**
+  Provides the DMA controller-specific addresses needed to access system memory.
+
+  Operation is relative to the DMA bus master.
+
+  @param  DmaAbove4GB           Indicates capability of DMA operations above 4GB.
+  @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 DMA 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 controller to use to
+                                access the hosts HostAddress.
+  @param  Mapping               A resulting value to pass to BmDmaUnmap().
+
+  @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.
+
+**/
+EFI_STATUS
+EFIAPI
+BmDmaMap (
+  IN     BOOLEAN           DmaAbove4GB,
+  IN     BM_DMA_OPERATION  Operation,
+  IN     VOID              *HostAddress,
+  IN OUT UINTN             *NumberOfBytes,
+  OUT    PHYSICAL_ADDRESS  *DeviceAddress,
+  OUT    VOID              **Mapping
+  );
+
+
+/**
+  Completes the DmaOperationBusMasterRead/Write/CommonBuffer operation
+  and releases any corresponding resources.
+
+  @param  Mapping               The mapping value returned from BmDmaMap().
+
+  @retval EFI_SUCCESS           The range was unmapped.
+  @retval EFI_DEVICE_ERROR      The data was not committed to the target system memory.
+
+**/
+EFI_STATUS
+EFIAPI
+BmDmaUnmap (
+  IN  VOID                 *Mapping
+  );
+
+
+/**
+  Allocates pages that are suitable for a BmDmaMap() of type DmaOperationBusMasterCommonBuffer.
+
+  @param  DmaAbove4GB           Indicates capability of DMA operations above 4GB.
+  @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.
+
+  @retval EFI_SUCCESS           The requested memory pages were allocated.
+  @retval EFI_UNSUPPORTED       Attributes is unsupported. The only legal attribute bits are
+                                MEMORY_WRITE_COMBINE and MEMORY_CACHED.
+  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
+  @retval EFI_OUT_OF_RESOURCES  The memory pages could not be allocated.
+
+**/
+EFI_STATUS
+EFIAPI
+BmDmaAllocateBuffer (
+  IN  BOOLEAN              DmaAbove4GB,
+  IN  EFI_MEMORY_TYPE      MemoryType,
+  IN  UINTN                Pages,
+  OUT VOID                 **HostAddress
+  );
+
+
+/**
+  Frees memory that was allocated with BmDmaAllocateBuffer().
+
+  @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 BmDmaAllocateBuffer().
+
+**/
+EFI_STATUS
+EFIAPI
+BmDmaFreeBuffer (
+  IN  UINTN                Pages,
+  IN  VOID                 *HostAddress
+  );
+
+
+#endif
+
diff --git a/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
new file mode 100644
index 0000000..824b51f
--- /dev/null
+++ b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
@@ -0,0 +1,351 @@
+/** @file
+  DMA abstraction library APIs. Based on PCI IO protocol DMA abstractions.
+
+  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+  Copyright (c) 2017, AMD Inc. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Derived from:
+   MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
+
+**/
+
+#include <PiDxe.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/DxeServicesTableLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/BmDmaLib.h>
+
+
+#define FORCE_BELOW_4GB_TRUE   TRUE
+#define FORCE_BELOW_4GB_FALSE  FALSE
+#define NO_MAPPING             (VOID *) (UINTN) -1
+
+
+typedef struct {
+  BM_DMA_OPERATION      Operation;
+  UINTN                 NumberOfBytes;
+  UINTN                 NumberOfPages;
+  EFI_PHYSICAL_ADDRESS  HostAddress;
+  EFI_PHYSICAL_ADDRESS  MappedHostAddress;
+} MAP_INFO;
+
+
+EFI_STATUS
+AllocateBounceBuffer (
+  IN     BOOLEAN               ForceBelow4GB,
+  IN     BM_DMA_OPERATION      Operation,
+  IN     EFI_PHYSICAL_ADDRESS  HostAddress,
+  IN OUT UINTN                 *NumberOfBytes,
+  OUT    PHYSICAL_ADDRESS      *DeviceAddress,
+  OUT    VOID                  **Mapping
+  )
+{
+  EFI_STATUS         Status;
+  MAP_INFO           *MapInfo;
+  EFI_ALLOCATE_TYPE  AllocateType;
+
+  //
+  // Allocate a MAP_INFO structure to remember the mapping when Unmap() is
+  // called later.
+  //
+  MapInfo = AllocatePool (sizeof (MAP_INFO));
+  if (MapInfo == NULL) {
+    *NumberOfBytes = 0;
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  //
+  // Initialize the MAP_INFO structure
+  //
+  MapInfo->Operation     = Operation;
+  MapInfo->NumberOfBytes = *NumberOfBytes;
+  MapInfo->NumberOfPages = EFI_SIZE_TO_PAGES (MapInfo->NumberOfBytes);
+  MapInfo->HostAddress   = HostAddress;
+
+  if (ForceBelow4GB) {
+    //
+    // Limit allocations to memory below 4GB
+    //
+    AllocateType = AllocateMaxAddress;
+    MapInfo->MappedHostAddress = SIZE_4GB - 1;
+  } else {
+    AllocateType = AllocateAnyPages;
+  }
+
+  //
+  // Allocate DMA bounce buffer
+  //
+  Status = gBS->AllocatePages (
+                  AllocateType,
+                  EfiBootServicesData,
+                  MapInfo->NumberOfPages,
+                  &MapInfo->MappedHostAddress
+                  );
+
+  if (EFI_ERROR (Status)) {
+    FreePool (MapInfo);
+    *NumberOfBytes = 0;
+    return Status;
+  }
+
+  //
+  // If this is a read operation from the Bus Master's point of view,
+  // then copy the contents of the real buffer into the mapped buffer
+  // so the Bus Master can read the contents of the real buffer.
+  //
+  if (Operation ==  DmaOperationBusMasterRead) {
+    CopyMem (
+      (VOID *) (UINTN) MapInfo->MappedHostAddress,
+      (VOID *) (UINTN) MapInfo->HostAddress,
+      MapInfo->NumberOfBytes
+      );
+  }
+
+  //
+  // The DeviceAddress is the address of the mapped buffer
+  //
+  *DeviceAddress = MapInfo->MappedHostAddress;
+
+  //
+  // Return a pointer to the MAP_INFO structure in Mapping
+  //
+  *Mapping = MapInfo;
+
+  return EFI_SUCCESS;
+}
+
+
+/**
+  Provides the DMA controller-specific addresses needed to access system memory.
+
+  Operation is relative to the DMA bus master.
+
+  @param  DmaAbove4GB           Indicates capability of DMA operations above 4GB.
+  @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 DMA 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 controller to use to
+                                access the hosts HostAddress.
+  @param  Mapping               A resulting value to pass to BmDmaUnmap().
+
+  @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.
+
+**/
+EFI_STATUS
+EFIAPI
+BmDmaMap (
+  IN     BOOLEAN           DmaAbove4GB,
+  IN     BM_DMA_OPERATION  Operation,
+  IN     VOID              *HostAddress,
+  IN OUT UINTN             *NumberOfBytes,
+  OUT    PHYSICAL_ADDRESS  *DeviceAddress,
+  OUT    VOID              **Mapping
+  )
+{
+  EFI_PHYSICAL_ADDRESS  PhysicalAddress;
+
+  //
+  // Check for invalid inputs
+  //
+  if (HostAddress == NULL || NumberOfBytes == NULL || DeviceAddress == NULL ||
+      Mapping == NULL || (UINT32) Operation >= DmaOperationBusMasterMaximum) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress;
+  if (DmaAbove4GB || (PhysicalAddress + *NumberOfBytes) <= SIZE_4GB) {
+    //
+    // If we CAN handle DMA above 4GB or the transfer is below 4GB,
+    // the DeviceAddress is simply the HostAddress
+    //
+    *DeviceAddress = PhysicalAddress;
+    *Mapping       = NO_MAPPING;
+
+    return EFI_SUCCESS;
+  } 
+
+  //
+  // If we cannot handle DMA above 4GB and any part of the DMA transfer
+  // being is above 4GB, then map the DMA transfer to a buffer below 4GB.
+  //
+  if (Operation == DmaOperationBusMasterCommonBuffer) {
+    //
+    // Common Buffer operations cannot be remapped, so return an error.
+    //
+    return EFI_UNSUPPORTED;
+  }
+
+  return AllocateBounceBuffer ( 
+           Operation,
+           FORCE_BELOW_4GB_TRUE,   
+           PhysicalAddress,
+           NumberOfBytes,
+           DeviceAddress,
+           Mapping
+           );
+}
+
+
+/**
+  Completes the DmaOperationBusMasterRead/Write/CommonBuffer operation
+  and releases any corresponding resources.
+
+  @param  Mapping               The mapping value returned from BmDmaMap().
+
+  @retval EFI_SUCCESS           The range was unmapped.
+  @retval EFI_DEVICE_ERROR      The data was not committed to the target system memory.
+
+**/
+EFI_STATUS
+EFIAPI
+BmDmaUnmap (
+  IN  VOID                 *Mapping
+  )
+{
+  MAP_INFO  *MapInfo;
+
+  //
+  // Check for invalid inputs
+  //
+  if (Mapping == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  //
+  // See if the Map() operation associated with this Unmap() required a mapping
+  // buffer. If a mapping buffer was not required, then this function simply
+  // returns EFI_SUCCESS.
+  //
+  if (Mapping == NO_MAPPING) {
+    return EFI_SUCCESS;
+  }
+
+  //
+  // If this is a write operation from the Bus Master's point of view,
+  // then copy the contents of the mapped buffer into the real buffer
+  // so the processor can read the contents of the real buffer.
+  //
+  MapInfo = (MAP_INFO *)Mapping;
+  if (MapInfo->Operation == DmaOperationBusMasterWrite) {
+    CopyMem (
+      (VOID *) (UINTN) MapInfo->HostAddress,
+      (VOID *) (UINTN) MapInfo->MappedHostAddress,
+      MapInfo->NumberOfBytes
+      );
+  }
+
+  //
+  // Free the mapped buffer and the MAP_INFO structure.
+  //
+  gBS->FreePages (MapInfo->MappedHostAddress, MapInfo->NumberOfPages);
+  FreePool (Mapping);
+  return EFI_SUCCESS;
+}
+
+
+/**
+  Allocates pages that are suitable for a BmDmaMap() of type DmaOperationBusMasterCommonBuffer.
+
+  @param  DmaAbove4GB           Indicates capability of DMA operations above 4GB.
+  @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.
+
+  @retval EFI_SUCCESS           The requested memory pages were allocated.
+  @retval EFI_UNSUPPORTED       Attributes is unsupported. The only legal attribute bits are
+                                MEMORY_WRITE_COMBINE and MEMORY_CACHED.
+  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
+  @retval EFI_OUT_OF_RESOURCES  The memory pages could not be allocated.
+
+**/
+EFI_STATUS
+EFIAPI
+BmDmaAllocateBuffer (
+  IN  BOOLEAN              DmaAbove4GB,
+  IN  EFI_MEMORY_TYPE      MemoryType,
+  IN  UINTN                Pages,
+  OUT VOID                 **HostAddress
+  )
+{
+  EFI_STATUS           Status;
+  EFI_PHYSICAL_ADDRESS PhysicalAddress;
+  EFI_ALLOCATE_TYPE    AllocateType;
+
+  //
+  // Check for invalid inputs
+  //
+  if (HostAddress == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  //
+  // The only valid memory types are EfiBootServicesData and
+  // EfiRuntimeServicesData
+  //
+  if (MemoryType != EfiBootServicesData &&
+      MemoryType != EfiRuntimeServicesData) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (DmaAbove4GB) {
+    AllocateType = AllocateAnyPages;
+  } else {
+    //
+    // Limit allocations to memory below 4GB
+    //
+    AllocateType    = AllocateMaxAddress;
+    PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (SIZE_4GB - 1);
+  }
+  Status = gBS->AllocatePages (
+                  AllocateType,
+                  MemoryType,
+                  Pages,
+                  &PhysicalAddress
+                  );
+  if (!EFI_ERROR (Status)) {
+    *HostAddress = (VOID *) (UINTN) PhysicalAddress;
+  }
+
+  return Status;
+}
+
+
+/**
+  Frees memory that was allocated with BmDmaAllocateBuffer().
+
+  @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 BmDmaAllocateBuffer().
+
+**/
+EFI_STATUS
+EFIAPI
+BmDmaFreeBuffer (
+  IN  UINTN                Pages,
+  IN  VOID                 *HostAddress
+  )
+{
+  return gBS->FreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress, Pages);
+}
+
diff --git a/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
new file mode 100644
index 0000000..06bb8b1
--- /dev/null
+++ b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
@@ -0,0 +1,41 @@
+## @file
+#
+# DMA abstraction library APIs. Based on PCI IO protocol DMA abstractions.
+#
+#  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+#  Copyright (c) 2017, AMD Inc. All rights reserved.<BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = DxeBmDmaLib
+  FILE_GUID                      = daa403e0-071d-44ef-95cf-7f2472e4a4d5
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = BmDmaLib
+
+[Sources.common]
+  DxeBmDmaLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+  BaseLib
+  BaseMemoryLib
+  DebugLib
+  DxeServicesTableLib
+  MemoryAllocationLib
+  UefiBootServicesTableLib
+
+
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index 5996fe5..311922e 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -275,6 +275,7 @@ [Components]
   MdeModulePkg/Core/Pei/PeiMain.inf
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
 
+  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
   MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
   MdeModulePkg/Library/UefiMemoryAllocationProfileLib/UefiMemoryAllocationProfileLib.inf
   MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllocationLib.inf
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [RFC 2/6] ArmVirtPkg: Modify .DSC files that include PciHostBridgeDxe driver
  2017-01-10  0:16 [RFC 0/6] DxeBmDmaLib Leo Duran
  2017-01-10  0:16 ` [RFC 1/6] MdeModulePkg: Add DxeBmDmaLib library Leo Duran
@ 2017-01-10  0:16 ` Leo Duran
  2017-01-10  0:16 ` [RFC 3/6] CorebootPayloadPkg: " Leo Duran
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Leo Duran @ 2017-01-10  0:16 UTC (permalink / raw)
  To: edk2-devel
  Cc: brijesh.singh, lersek, jordan.l.justen, feng.tian, star.zeng,
	maurice.ma, prince.agyeman, ard.biesheuvel, Leo Duran

This patch adds the new DxeBmDmaLib (BmDmaLib class) library, which
provides an abstraction layer for DMA operations implemented by the
PciHostBridgeDxe driver.

Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Leo Duran  <leo.duran@amd.com>
---
 ArmVirtPkg/ArmVirtQemu.dsc       | 1 +
 ArmVirtPkg/ArmVirtQemuKernel.dsc | 1 +
 2 files changed, 2 insertions(+)

diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc
index 0cae996..fb781ac 100644
--- a/ArmVirtPkg/ArmVirtQemu.dsc
+++ b/ArmVirtPkg/ArmVirtQemu.dsc
@@ -59,6 +59,7 @@ [LibraryClasses.common]
   TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
   NorFlashPlatformLib|ArmVirtPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf
 
+  BmDmaLib|MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
   BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc
index fe76c22..c03554d 100644
--- a/ArmVirtPkg/ArmVirtQemuKernel.dsc
+++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc
@@ -58,6 +58,7 @@ [LibraryClasses.common]
   TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
   NorFlashPlatformLib|ArmVirtPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf
 
+  BmDmaLib|MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
   BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [RFC 3/6] CorebootPayloadPkg: Modify .DSC files that include PciHostBridgeDxe driver
  2017-01-10  0:16 [RFC 0/6] DxeBmDmaLib Leo Duran
  2017-01-10  0:16 ` [RFC 1/6] MdeModulePkg: Add DxeBmDmaLib library Leo Duran
  2017-01-10  0:16 ` [RFC 2/6] ArmVirtPkg: Modify .DSC files that include PciHostBridgeDxe driver Leo Duran
@ 2017-01-10  0:16 ` Leo Duran
  2017-01-10  3:56   ` Ma, Maurice
  2017-01-10  0:16 ` [RFC 4/6] MdeModulePkg: " Leo Duran
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 15+ messages in thread
From: Leo Duran @ 2017-01-10  0:16 UTC (permalink / raw)
  To: edk2-devel
  Cc: brijesh.singh, lersek, jordan.l.justen, feng.tian, star.zeng,
	maurice.ma, prince.agyeman, ard.biesheuvel, Leo Duran

This patch adds the new DxeBmDmaLib (BmDmaLib class) library, which
provides an abstraction layer for DMA operations implemented by the
PciHostBridgeDxe driver.

Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Prince Agyeman <prince.agyeman@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Leo Duran  <leo.duran@amd.com>
---
 CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc    | 1 +
 CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc | 1 +
 2 files changed, 2 insertions(+)

diff --git a/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc b/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc
index cdfcb75..12fcd3f 100644
--- a/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc
+++ b/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc
@@ -140,6 +140,7 @@ [LibraryClasses]
   PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
   PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
   CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf
+  BmDmaLib|MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
 
   #
   # UEFI & PI
diff --git a/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc b/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc
index c35f261..802347c 100644
--- a/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc
+++ b/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc
@@ -142,6 +142,7 @@ [LibraryClasses]
   PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
   PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
   CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf
+  BmDmaLib|MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
 
   #
   # UEFI & PI
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [RFC 4/6] MdeModulePkg: Modify .DSC files that include PciHostBridgeDxe driver
  2017-01-10  0:16 [RFC 0/6] DxeBmDmaLib Leo Duran
                   ` (2 preceding siblings ...)
  2017-01-10  0:16 ` [RFC 3/6] CorebootPayloadPkg: " Leo Duran
@ 2017-01-10  0:16 ` Leo Duran
  2017-01-10  0:17 ` [RFC 5/6] OvmfPkg: " Leo Duran
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Leo Duran @ 2017-01-10  0:16 UTC (permalink / raw)
  To: edk2-devel
  Cc: brijesh.singh, lersek, jordan.l.justen, feng.tian, star.zeng,
	maurice.ma, prince.agyeman, ard.biesheuvel, Leo Duran

This patch adds the new DxeBmDmaLib (BmDmaLib class) library, which
provides an abstraction layer for DMA operations implemented by the
PciHostBridgeDxe driver.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Leo Duran  <leo.duran@amd.com>
---
 MdeModulePkg/MdeModulePkg.dsc | 1 +
 1 file changed, 1 insertion(+)

diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index 311922e..b343c19 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -48,6 +48,7 @@ [LibraryClasses]
   PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
   PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
   SortLib|MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf
+  BmDmaLib|MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
   #
   # UEFI & PI
   #
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [RFC 5/6] OvmfPkg: Modify .DSC files that include PciHostBridgeDxe driver
  2017-01-10  0:16 [RFC 0/6] DxeBmDmaLib Leo Duran
                   ` (3 preceding siblings ...)
  2017-01-10  0:16 ` [RFC 4/6] MdeModulePkg: " Leo Duran
@ 2017-01-10  0:17 ` Leo Duran
  2017-01-10  0:17 ` [RFC 6/6] MdeModulePkg: Modify PciHostBridgeDxe to use new BmDmaLib library Leo Duran
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 15+ messages in thread
From: Leo Duran @ 2017-01-10  0:17 UTC (permalink / raw)
  To: edk2-devel
  Cc: brijesh.singh, lersek, jordan.l.justen, feng.tian, star.zeng,
	maurice.ma, prince.agyeman, ard.biesheuvel, Leo Duran

This patch adds the new DxeBmDmaLib (BmDmaLib class) library, which
provides an abstraction layer for DMA operations implemented by the
PciHostBridgeDxe driver.

Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Leo Duran  <leo.duran@amd.com>
---
 OvmfPkg/OvmfPkgIa32.dsc    | 1 +
 OvmfPkg/OvmfPkgIa32X64.dsc | 1 +
 OvmfPkg/OvmfPkgX64.dsc     | 1 +
 3 files changed, 3 insertions(+)

diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc
index e97f7f0..e1cf06a 100644
--- a/OvmfPkg/OvmfPkgIa32.dsc
+++ b/OvmfPkg/OvmfPkgIa32.dsc
@@ -89,6 +89,7 @@ [LibraryClasses]
   UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
   HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
   SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
+  BmDmaLib|MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
   BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
   FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc
index 8e3e04c..711bca8 100644
--- a/OvmfPkg/OvmfPkgIa32X64.dsc
+++ b/OvmfPkg/OvmfPkgIa32X64.dsc
@@ -94,6 +94,7 @@ [LibraryClasses]
   UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
   HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
   SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
+  BmDmaLib|MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
   BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
   FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
index 6ec3fe0..bf8bb15 100644
--- a/OvmfPkg/OvmfPkgX64.dsc
+++ b/OvmfPkg/OvmfPkgX64.dsc
@@ -94,6 +94,7 @@ [LibraryClasses]
   UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
   HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
   SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
+  BmDmaLib|MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
   UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
   BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
   FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [RFC 6/6] MdeModulePkg: Modify PciHostBridgeDxe to use new BmDmaLib library.
  2017-01-10  0:16 [RFC 0/6] DxeBmDmaLib Leo Duran
                   ` (4 preceding siblings ...)
  2017-01-10  0:17 ` [RFC 5/6] OvmfPkg: " Leo Duran
@ 2017-01-10  0:17 ` Leo Duran
  2017-01-12  5:43 ` [RFC 0/6] DxeBmDmaLib Ni, Ruiyu
  2017-01-12  9:51 ` Laszlo Ersek
  7 siblings, 0 replies; 15+ messages in thread
From: Leo Duran @ 2017-01-10  0:17 UTC (permalink / raw)
  To: edk2-devel
  Cc: brijesh.singh, lersek, jordan.l.justen, feng.tian, star.zeng,
	maurice.ma, prince.agyeman, ard.biesheuvel, Leo Duran

Cc: Feng Tian <feng.tian@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Leo Duran  <leo.duran@amd.com>
---
 .../Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf  |   1 +
 .../Bus/Pci/PciHostBridgeDxe/PciRootBridge.h       |  13 +-
 .../Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c     | 272 +++++----------------
 MdeModulePkg/MdeModulePkg.dsc                      |   1 +
 4 files changed, 67 insertions(+), 220 deletions(-)

diff --git a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf
index d8b0439..35bb5c4 100644
--- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf
+++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf
@@ -42,6 +42,7 @@ [LibraryClasses]
   BaseLib
   PciSegmentLib
   PciHostBridgeLib
+  BmDmaLib
 
 [Protocols]
   gEfiMetronomeArchProtocolGuid                   ## CONSUMES
diff --git a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h
index 13185b4..c125fcd 100644
--- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h
+++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridge.h
@@ -34,6 +34,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/BaseLib.h>
 #include <Library/PciSegmentLib.h>
+#include <Library/BmDmaLib.h>
 #include "PciHostResource.h"
 
 
@@ -43,17 +44,6 @@ typedef enum {
   PciOperation
 } OPERATION_TYPE;
 
-#define MAP_INFO_SIGNATURE  SIGNATURE_32 ('_', 'm', 'a', 'p')
-typedef struct {
-  UINT32                                    Signature;
-  LIST_ENTRY                                Link;
-  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION Operation;
-  UINTN                                     NumberOfBytes;
-  UINTN                                     NumberOfPages;
-  EFI_PHYSICAL_ADDRESS                      HostAddress;
-  EFI_PHYSICAL_ADDRESS                      MappedHostAddress;
-} MAP_INFO;
-#define MAP_INFO_FROM_LINK(a) CR (a, MAP_INFO, Link, MAP_INFO_SIGNATURE)
 
 #define PCI_ROOT_BRIDGE_SIGNATURE SIGNATURE_32 ('_', 'p', 'r', 'b')
 
@@ -79,7 +69,6 @@ typedef struct {
   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL   RootBridgeIo;
 
   BOOLEAN                           ResourceSubmitted;
-  LIST_ENTRY                        Maps;
 } PCI_ROOT_BRIDGE_INSTANCE;
 
 #define ROOT_BRIDGE_FROM_THIS(a) CR (a, PCI_ROOT_BRIDGE_INSTANCE, RootBridgeIo, PCI_ROOT_BRIDGE_SIGNATURE)
diff --git a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
index 8af131b..8a74bf6 100644
--- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
+++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
@@ -17,7 +17,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "PciRootBridge.h"
 #include "PciHostResource.h"
 
-#define NO_MAPPING  (VOID *) (UINTN) -1
 
 //
 // Lookup table for increment values based on transfer widths
@@ -55,6 +54,39 @@ UINT8 mOutStride[] = {
   0  // EfiPciWidthFillUint64
 };
 
+
+BM_DMA_OPERATION
+ConvertDmaOperation (
+  IN     EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION  RbOperation
+  )
+{
+  BM_DMA_OPERATION BmOperation;
+
+  switch (RbOperation) {
+  case EfiPciOperationBusMasterRead:
+  case EfiPciOperationBusMasterRead64:
+    BmOperation = DmaOperationBusMasterRead;
+    break;
+
+  case EfiPciOperationBusMasterWrite:
+  case EfiPciOperationBusMasterWrite64:
+    BmOperation = DmaOperationBusMasterWrite;
+    break;
+
+  case EfiPciOperationBusMasterCommonBuffer:
+  case EfiPciOperationBusMasterCommonBuffer64:
+    BmOperation = DmaOperationBusMasterCommonBuffer;
+    break;
+
+  default:
+    BmOperation = DmaOperationBusMasterMaximum;
+    break;
+  }
+
+  return BmOperation;
+}
+
+
 /**
   Construct the Pci Root Bridge instance.
 
@@ -168,7 +200,6 @@ CreateRootBridge (
     TypeMax * sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR)
     );
   ASSERT (RootBridge->ConfigBuffer != NULL);
-  InitializeListHead (&RootBridge->Maps);
 
   CopyMem (&RootBridge->Bus, &Bridge->Bus, sizeof (PCI_ROOT_BRIDGE_APERTURE));
   CopyMem (&RootBridge->Io, &Bridge->Io, sizeof (PCI_ROOT_BRIDGE_APERTURE));
@@ -1053,118 +1084,27 @@ RootBridgeIoMap (
   OUT    VOID                                       **Mapping
   )
 {
-  EFI_STATUS                                        Status;
-  PCI_ROOT_BRIDGE_INSTANCE                          *RootBridge;
-  EFI_PHYSICAL_ADDRESS                              PhysicalAddress;
-  MAP_INFO                                          *MapInfo;
-
-  if (HostAddress == NULL || NumberOfBytes == NULL || DeviceAddress == NULL ||
-      Mapping == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Make sure that Operation is valid
-  //
-  if ((UINT32) Operation >= EfiPciOperationMaximum) {
-    return EFI_INVALID_PARAMETER;
-  }
+  PCI_ROOT_BRIDGE_INSTANCE *RootBridge;
+  BOOLEAN                  DmaAbove4GB;
+  BM_DMA_OPERATION         BmOperation;
 
   RootBridge = ROOT_BRIDGE_FROM_THIS (This);
-
-  PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress;
-  if ((!RootBridge->DmaAbove4G ||
-       (Operation != EfiPciOperationBusMasterRead64 &&
-        Operation != EfiPciOperationBusMasterWrite64 &&
-        Operation != EfiPciOperationBusMasterCommonBuffer64)) &&
-      ((PhysicalAddress + *NumberOfBytes) > SIZE_4GB)) {
-
-    //
-    // If the root bridge or the device cannot handle performing DMA above
-    // 4GB but any part of the DMA transfer being mapped is above 4GB, then
-    // map the DMA transfer to a buffer below 4GB.
-    //
-
-    if (Operation == EfiPciOperationBusMasterCommonBuffer ||
-        Operation == EfiPciOperationBusMasterCommonBuffer64) {
-      //
-      // Common Buffer operations can not be remapped.  If the common buffer
-      // if above 4GB, then it is not possible to generate a mapping, so return
-      // an error.
-      //
-      return EFI_UNSUPPORTED;
-    }
-
-    //
-    // Allocate a MAP_INFO structure to remember the mapping when Unmap() is
-    // called later.
-    //
-    MapInfo = AllocatePool (sizeof (MAP_INFO));
-    if (MapInfo == NULL) {
-      *NumberOfBytes = 0;
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    //
-    // Initialize the MAP_INFO structure
-    //
-    MapInfo->Signature         = MAP_INFO_SIGNATURE;
-    MapInfo->Operation         = Operation;
-    MapInfo->NumberOfBytes     = *NumberOfBytes;
-    MapInfo->NumberOfPages     = EFI_SIZE_TO_PAGES (MapInfo->NumberOfBytes);
-    MapInfo->HostAddress       = PhysicalAddress;
-    MapInfo->MappedHostAddress = SIZE_4GB - 1;
-
-    //
-    // Allocate a buffer below 4GB to map the transfer to.
-    //
-    Status = gBS->AllocatePages (
-                    AllocateMaxAddress,
-                    EfiBootServicesData,
-                    MapInfo->NumberOfPages,
-                    &MapInfo->MappedHostAddress
-                    );
-    if (EFI_ERROR (Status)) {
-      FreePool (MapInfo);
-      *NumberOfBytes = 0;
-      return Status;
-    }
-
-    //
-    // If this is a read operation from the Bus Master's point of view,
-    // then copy the contents of the real buffer into the mapped buffer
-    // so the Bus Master can read the contents of the real buffer.
-    //
-    if (Operation == EfiPciOperationBusMasterRead ||
-        Operation == EfiPciOperationBusMasterRead64) {
-      CopyMem (
-        (VOID *) (UINTN) MapInfo->MappedHostAddress,
-        (VOID *) (UINTN) MapInfo->HostAddress,
-        MapInfo->NumberOfBytes
-        );
-    }
-
-    InsertTailList (&RootBridge->Maps, &MapInfo->Link);
-
-    //
-    // The DeviceAddress is the address of the maped buffer below 4GB
-    //
-    *DeviceAddress = MapInfo->MappedHostAddress;
-    //
-    // Return a pointer to the MAP_INFO structure in Mapping
-    //
-    *Mapping       = MapInfo;
-  } else {
-    //
-    // If the root bridge CAN handle performing DMA above 4GB or
-    // the transfer is below 4GB, so the DeviceAddress is simply the
-    // HostAddress
-    //
-    *DeviceAddress = PhysicalAddress;
-    *Mapping       = NO_MAPPING;
-  }
-
-  return EFI_SUCCESS;
+  DmaAbove4GB = RootBridge->DmaAbove4G && (
+                  Operation == EfiPciOperationBusMasterRead64 ||
+                  Operation == EfiPciOperationBusMasterWrite64 ||
+                  Operation == EfiPciOperationBusMasterCommonBuffer64
+                  );
+
+  BmOperation = ConvertDmaOperation (Operation);
+
+  return BmDmaMap (
+           DmaAbove4GB,
+           BmOperation,
+           HostAddress,
+           NumberOfBytes,
+           DeviceAddress,
+           Mapping
+           );
 }
 
 /**
@@ -1191,58 +1131,7 @@ RootBridgeIoUnmap (
   IN VOID                             *Mapping
   )
 {
-  MAP_INFO                 *MapInfo;
-  LIST_ENTRY               *Link;
-  PCI_ROOT_BRIDGE_INSTANCE *RootBridge;
-
-  RootBridge = ROOT_BRIDGE_FROM_THIS (This);
-  //
-  // See if the Map() operation associated with this Unmap() required a mapping
-  // buffer. If a mapping buffer was not required, then this function simply
-  // returns EFI_SUCCESS.
-  //
-  if (Mapping == NO_MAPPING) {
-    return EFI_SUCCESS;
-  }
-
-  MapInfo = NO_MAPPING;
-  for (Link = GetFirstNode (&RootBridge->Maps)
-       ; !IsNull (&RootBridge->Maps, Link)
-       ; Link = GetNextNode (&RootBridge->Maps, Link)
-       ) {
-    MapInfo = MAP_INFO_FROM_LINK (Link);
-    if (MapInfo == Mapping) {
-      break;
-    }
-  }
-  //
-  // Mapping is not a valid value returned by Map()
-  //
-  if (MapInfo != Mapping) {
-    return EFI_INVALID_PARAMETER;
-  }
-  RemoveEntryList (&MapInfo->Link);
-
-  //
-  // If this is a write operation from the Bus Master's point of view,
-  // then copy the contents of the mapped buffer into the real buffer
-  // so the processor can read the contents of the real buffer.
-  //
-  if (MapInfo->Operation == EfiPciOperationBusMasterWrite ||
-      MapInfo->Operation == EfiPciOperationBusMasterWrite64) {
-    CopyMem (
-      (VOID *) (UINTN) MapInfo->HostAddress,
-      (VOID *) (UINTN) MapInfo->MappedHostAddress,
-      MapInfo->NumberOfBytes
-      );
-  }
-
-  //
-  // Free the mapped buffer and the MAP_INFO structure.
-  //
-  gBS->FreePages (MapInfo->MappedHostAddress, MapInfo->NumberOfPages);
-  FreePool (Mapping);
-  return EFI_SUCCESS;
+  return BmDmaUnmap (Mapping);
 }
 
 /**
@@ -1282,56 +1171,23 @@ RootBridgeIoAllocateBuffer (
   IN  UINT64                           Attributes
   )
 {
-  EFI_STATUS                Status;
-  EFI_PHYSICAL_ADDRESS      PhysicalAddress;
-  PCI_ROOT_BRIDGE_INSTANCE  *RootBridge;
-  EFI_ALLOCATE_TYPE         AllocateType;
+  PCI_ROOT_BRIDGE_INSTANCE *RootBridge;
+  BOOLEAN                  DmaAbove4GB;
 
-  //
-  // Validate Attributes
-  //
   if ((Attributes & EFI_PCI_ATTRIBUTE_INVALID_FOR_ALLOCATE_BUFFER) != 0) {
     return EFI_UNSUPPORTED;
   }
 
-  //
-  // Check for invalid inputs
-  //
-  if (HostAddress == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // The only valid memory types are EfiBootServicesData and
-  // EfiRuntimeServicesData
-  //
-  if (MemoryType != EfiBootServicesData &&
-      MemoryType != EfiRuntimeServicesData) {
-    return EFI_INVALID_PARAMETER;
-  }
-
   RootBridge = ROOT_BRIDGE_FROM_THIS (This);
+  DmaAbove4GB = RootBridge->DmaAbove4G &&
+                  (Attributes & EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE) != 0;
 
-  AllocateType = AllocateAnyPages;
-  if (!RootBridge->DmaAbove4G ||
-      (Attributes & EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE) == 0) {
-    //
-    // Limit allocations to memory below 4GB
-    //
-    AllocateType    = AllocateMaxAddress;
-    PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (SIZE_4GB - 1);
-  }
-  Status = gBS->AllocatePages (
-                  AllocateType,
-                  MemoryType,
-                  Pages,
-                  &PhysicalAddress
-                  );
-  if (!EFI_ERROR (Status)) {
-    *HostAddress = (VOID *) (UINTN) PhysicalAddress;
-  }
-
-  return Status;
+  return BmDmaAllocateBuffer (
+           DmaAbove4GB,
+           MemoryType,
+           Pages,
+           HostAddress
+           );
 }
 
 /**
@@ -1356,7 +1212,7 @@ RootBridgeIoFreeBuffer (
   OUT VOID                             *HostAddress
   )
 {
-  return gBS->FreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress, Pages);
+  return BmDmaFreeBuffer (Pages, HostAddress);
 }
 
 /**
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index b343c19..47aa9b9 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -83,6 +83,7 @@ [LibraryClasses]
   PalLib|MdePkg/Library/BasePalLibNull/BasePalLibNull.inf
   CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
   FrameBufferBltLib|MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf
+  BmDmaLib|MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
   #
   # Misc
   #
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [RFC 1/6] MdeModulePkg: Add DxeBmDmaLib library
  2017-01-10  0:16 ` [RFC 1/6] MdeModulePkg: Add DxeBmDmaLib library Leo Duran
@ 2017-01-10  0:47   ` Andrew Fish
  2017-01-10  5:51     ` Duran, Leo
  0 siblings, 1 reply; 15+ messages in thread
From: Andrew Fish @ 2017-01-10  0:47 UTC (permalink / raw)
  To: Leo Duran
  Cc: edk2-devel, Tian, Feng, brijesh.singh, Ard Biesheuvel,
	Jordan Justen, Agyeman, Prince, lersek, star.zeng


> On Jan 9, 2017, at 4:16 PM, Leo Duran <leo.duran@amd.com> wrote:
> 
> This patch provides an abstraction layer for DMA operations implemented
> by the PciHostBridgeDxe driver. The intent is to then allow override of
> this library as may be required by specific hardware implementations,
> such as AMD's Secure Encrypted Virtualization (SEV).
> 
> This new (BmDmaLib class) library is modeled after the existing DmaLib
> plus an extra DmaAbove4GB (BOOLEAN) parameter in the Map and Allocate
> interfaces, so that decisions can be made about the need to allocate DMA
> buffers below the 4GB boundary.
> 

Leo,

Sorry to jump in late, and maybe this is a phase 2 kind of thing, but should we support a generic IOMMU architecture via this library?

I'm not really familiar with AMD's SEV, but in general an IO MMU can restrict a DMA buffer to a specific PCI device, and block other PCI devices from having access to that buffer. That would seem to imply it would be good to have the option of passing the PCI device via these library APIs or I guess we could add an Ex version of the APIs that include the PCI device? You could always implement the Ex versions of the API by ignoring the PCI device (if you don't care about per device IOMMU pertection) and calling the non-Ex version. 

To be honest it is kind of hard to fully implement an IOMMU with the current UEFI spec as is, but I thought it be worth asking the question?

Thanks,

Andrew Fish


> Cc: Feng Tian <feng.tian@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Leo Duran  <leo.duran@amd.com>
> ---
> MdeModulePkg/Include/Library/BmDmaLib.h          | 161 +++++++++++
> MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c   | 351 +++++++++++++++++++++++
> MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf |  41 +++
> MdeModulePkg/MdeModulePkg.dsc                    |   1 +
> 4 files changed, 554 insertions(+)
> create mode 100644 MdeModulePkg/Include/Library/BmDmaLib.h
> create mode 100644 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
> create mode 100644 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> 
> diff --git a/MdeModulePkg/Include/Library/BmDmaLib.h b/MdeModulePkg/Include/Library/BmDmaLib.h
> new file mode 100644
> index 0000000..2c0e50f
> --- /dev/null
> +++ b/MdeModulePkg/Include/Library/BmDmaLib.h
> @@ -0,0 +1,161 @@
> +/** @file
> +  DMA abstraction library APIs. Based on PCI IO protocol DMA abstractions.
> +
> +  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
> +  Copyright (c) 2017, AMD Inc. All rights reserved.<BR>
> +
> +  DMA Bus Master Read Operation:
> +    Call BmDmaMap() for DmaOperationBusMasterRead.
> +    Program the DMA Bus Master with the DeviceAddress returned by BmDmaMap().
> +    Start the DMA Bus Master.
> +    Wait for DMA Bus Master to complete the read operation.
> +    Call BmDmaUnmap().
> +
> +  DMA Bus Master Write Operation:
> +    Call BmDmaMap() for DmaOperationBusMasterWrite.
> +    Program the DMA Bus Master with the DeviceAddress returned by BmDmaMap().
> +    Start the DMA Bus Master.
> +    Wait for DMA Bus Master to complete the write operation.
> +    Call BmDmaUnmap().
> +
> +  DMA Bus Master Common Buffer Operation:
> +    Call BmDmaAllocateBuffer() to allocate a common buffer.
> +    Call BmDmaMap() for DmaOperationBusMasterCommonBuffer.
> +    Program the DMA Bus Master with the DeviceAddress returned by BmDmaMap().
> +    The common buffer can now be accessed equally by the processor and the DMA bus master.
> +    Call BmDmaUnmap().
> +    Call BmDmaFreeBuffer().
> +
> +  This program and the accompanying materials
> +  are licensed and made available under the terms and conditions of the BSD License
> +  which accompanies this distribution.  The full text of the license may be found at
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> + Derived from:
> +   EmbeddedPkg/Include/Library/DmaLib.h
> +
> +**/
> +
> +#ifndef __BM_DMA_LIB_H__
> +#define __BM_DMA_LIB_H__
> +
> +
> +typedef enum {
> +  ///
> +  /// A read operation from system memory by a bus master.
> +  ///
> +  DmaOperationBusMasterRead,
> +  ///
> +  /// A write operation from system memory by a bus master.
> +  ///
> +  DmaOperationBusMasterWrite,
> +  ///
> +  /// Provides both read and write access to system memory by both the processor and a
> +  /// bus master. The buffer is coherent from both the processor's and the bus master's point of view.
> +  ///
> +  DmaOperationBusMasterCommonBuffer,
> +  DmaOperationBusMasterMaximum
> +} BM_DMA_OPERATION;
> +
> +
> +/**
> +  Provides the DMA controller-specific addresses needed to access system memory.
> +
> +  Operation is relative to the DMA bus master.
> +
> +  @param  DmaAbove4GB           Indicates capability of DMA operations above 4GB.
> +  @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 DMA 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 controller to use to
> +                                access the hosts HostAddress.
> +  @param  Mapping               A resulting value to pass to BmDmaUnmap().
> +
> +  @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.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +BmDmaMap (
> +  IN     BOOLEAN           DmaAbove4GB,
> +  IN     BM_DMA_OPERATION  Operation,
> +  IN     VOID              *HostAddress,
> +  IN OUT UINTN             *NumberOfBytes,
> +  OUT    PHYSICAL_ADDRESS  *DeviceAddress,
> +  OUT    VOID              **Mapping
> +  );
> +
> +
> +/**
> +  Completes the DmaOperationBusMasterRead/Write/CommonBuffer operation
> +  and releases any corresponding resources.
> +
> +  @param  Mapping               The mapping value returned from BmDmaMap().
> +
> +  @retval EFI_SUCCESS           The range was unmapped.
> +  @retval EFI_DEVICE_ERROR      The data was not committed to the target system memory.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +BmDmaUnmap (
> +  IN  VOID                 *Mapping
> +  );
> +
> +
> +/**
> +  Allocates pages that are suitable for a BmDmaMap() of type DmaOperationBusMasterCommonBuffer.
> +
> +  @param  DmaAbove4GB           Indicates capability of DMA operations above 4GB.
> +  @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.
> +
> +  @retval EFI_SUCCESS           The requested memory pages were allocated.
> +  @retval EFI_UNSUPPORTED       Attributes is unsupported. The only legal attribute bits are
> +                                MEMORY_WRITE_COMBINE and MEMORY_CACHED.
> +  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> +  @retval EFI_OUT_OF_RESOURCES  The memory pages could not be allocated.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +BmDmaAllocateBuffer (
> +  IN  BOOLEAN              DmaAbove4GB,
> +  IN  EFI_MEMORY_TYPE      MemoryType,
> +  IN  UINTN                Pages,
> +  OUT VOID                 **HostAddress
> +  );
> +
> +
> +/**
> +  Frees memory that was allocated with BmDmaAllocateBuffer().
> +
> +  @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 BmDmaAllocateBuffer().
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +BmDmaFreeBuffer (
> +  IN  UINTN                Pages,
> +  IN  VOID                 *HostAddress
> +  );
> +
> +
> +#endif
> +
> diff --git a/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
> new file mode 100644
> index 0000000..824b51f
> --- /dev/null
> +++ b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
> @@ -0,0 +1,351 @@
> +/** @file
> +  DMA abstraction library APIs. Based on PCI IO protocol DMA abstractions.
> +
> +  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
> +  Copyright (c) 2017, AMD Inc. All rights reserved.<BR>
> +
> +  This program and the accompanying materials
> +  are licensed and made available under the terms and conditions of the BSD License
> +  which accompanies this distribution.  The full text of the license may be found at
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +  Derived from:
> +   MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
> +
> +**/
> +
> +#include <PiDxe.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/DxeServicesTableLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/BmDmaLib.h>
> +
> +
> +#define FORCE_BELOW_4GB_TRUE   TRUE
> +#define FORCE_BELOW_4GB_FALSE  FALSE
> +#define NO_MAPPING             (VOID *) (UINTN) -1
> +
> +
> +typedef struct {
> +  BM_DMA_OPERATION      Operation;
> +  UINTN                 NumberOfBytes;
> +  UINTN                 NumberOfPages;
> +  EFI_PHYSICAL_ADDRESS  HostAddress;
> +  EFI_PHYSICAL_ADDRESS  MappedHostAddress;
> +} MAP_INFO;
> +
> +
> +EFI_STATUS
> +AllocateBounceBuffer (
> +  IN     BOOLEAN               ForceBelow4GB,
> +  IN     BM_DMA_OPERATION      Operation,
> +  IN     EFI_PHYSICAL_ADDRESS  HostAddress,
> +  IN OUT UINTN                 *NumberOfBytes,
> +  OUT    PHYSICAL_ADDRESS      *DeviceAddress,
> +  OUT    VOID                  **Mapping
> +  )
> +{
> +  EFI_STATUS         Status;
> +  MAP_INFO           *MapInfo;
> +  EFI_ALLOCATE_TYPE  AllocateType;
> +
> +  //
> +  // Allocate a MAP_INFO structure to remember the mapping when Unmap() is
> +  // called later.
> +  //
> +  MapInfo = AllocatePool (sizeof (MAP_INFO));
> +  if (MapInfo == NULL) {
> +    *NumberOfBytes = 0;
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  //
> +  // Initialize the MAP_INFO structure
> +  //
> +  MapInfo->Operation     = Operation;
> +  MapInfo->NumberOfBytes = *NumberOfBytes;
> +  MapInfo->NumberOfPages = EFI_SIZE_TO_PAGES (MapInfo->NumberOfBytes);
> +  MapInfo->HostAddress   = HostAddress;
> +
> +  if (ForceBelow4GB) {
> +    //
> +    // Limit allocations to memory below 4GB
> +    //
> +    AllocateType = AllocateMaxAddress;
> +    MapInfo->MappedHostAddress = SIZE_4GB - 1;
> +  } else {
> +    AllocateType = AllocateAnyPages;
> +  }
> +
> +  //
> +  // Allocate DMA bounce buffer
> +  //
> +  Status = gBS->AllocatePages (
> +                  AllocateType,
> +                  EfiBootServicesData,
> +                  MapInfo->NumberOfPages,
> +                  &MapInfo->MappedHostAddress
> +                  );
> +
> +  if (EFI_ERROR (Status)) {
> +    FreePool (MapInfo);
> +    *NumberOfBytes = 0;
> +    return Status;
> +  }
> +
> +  //
> +  // If this is a read operation from the Bus Master's point of view,
> +  // then copy the contents of the real buffer into the mapped buffer
> +  // so the Bus Master can read the contents of the real buffer.
> +  //
> +  if (Operation ==  DmaOperationBusMasterRead) {
> +    CopyMem (
> +      (VOID *) (UINTN) MapInfo->MappedHostAddress,
> +      (VOID *) (UINTN) MapInfo->HostAddress,
> +      MapInfo->NumberOfBytes
> +      );
> +  }
> +
> +  //
> +  // The DeviceAddress is the address of the mapped buffer
> +  //
> +  *DeviceAddress = MapInfo->MappedHostAddress;
> +
> +  //
> +  // Return a pointer to the MAP_INFO structure in Mapping
> +  //
> +  *Mapping = MapInfo;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +/**
> +  Provides the DMA controller-specific addresses needed to access system memory.
> +
> +  Operation is relative to the DMA bus master.
> +
> +  @param  DmaAbove4GB           Indicates capability of DMA operations above 4GB.
> +  @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 DMA 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 controller to use to
> +                                access the hosts HostAddress.
> +  @param  Mapping               A resulting value to pass to BmDmaUnmap().
> +
> +  @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.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +BmDmaMap (
> +  IN     BOOLEAN           DmaAbove4GB,
> +  IN     BM_DMA_OPERATION  Operation,
> +  IN     VOID              *HostAddress,
> +  IN OUT UINTN             *NumberOfBytes,
> +  OUT    PHYSICAL_ADDRESS  *DeviceAddress,
> +  OUT    VOID              **Mapping
> +  )
> +{
> +  EFI_PHYSICAL_ADDRESS  PhysicalAddress;
> +
> +  //
> +  // Check for invalid inputs
> +  //
> +  if (HostAddress == NULL || NumberOfBytes == NULL || DeviceAddress == NULL ||
> +      Mapping == NULL || (UINT32) Operation >= DmaOperationBusMasterMaximum) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress;
> +  if (DmaAbove4GB || (PhysicalAddress + *NumberOfBytes) <= SIZE_4GB) {
> +    //
> +    // If we CAN handle DMA above 4GB or the transfer is below 4GB,
> +    // the DeviceAddress is simply the HostAddress
> +    //
> +    *DeviceAddress = PhysicalAddress;
> +    *Mapping       = NO_MAPPING;
> +
> +    return EFI_SUCCESS;
> +  } 
> +
> +  //
> +  // If we cannot handle DMA above 4GB and any part of the DMA transfer
> +  // being is above 4GB, then map the DMA transfer to a buffer below 4GB.
> +  //
> +  if (Operation == DmaOperationBusMasterCommonBuffer) {
> +    //
> +    // Common Buffer operations cannot be remapped, so return an error.
> +    //
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  return AllocateBounceBuffer ( 
> +           Operation,
> +           FORCE_BELOW_4GB_TRUE,   
> +           PhysicalAddress,
> +           NumberOfBytes,
> +           DeviceAddress,
> +           Mapping
> +           );
> +}
> +
> +
> +/**
> +  Completes the DmaOperationBusMasterRead/Write/CommonBuffer operation
> +  and releases any corresponding resources.
> +
> +  @param  Mapping               The mapping value returned from BmDmaMap().
> +
> +  @retval EFI_SUCCESS           The range was unmapped.
> +  @retval EFI_DEVICE_ERROR      The data was not committed to the target system memory.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +BmDmaUnmap (
> +  IN  VOID                 *Mapping
> +  )
> +{
> +  MAP_INFO  *MapInfo;
> +
> +  //
> +  // Check for invalid inputs
> +  //
> +  if (Mapping == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  //
> +  // See if the Map() operation associated with this Unmap() required a mapping
> +  // buffer. If a mapping buffer was not required, then this function simply
> +  // returns EFI_SUCCESS.
> +  //
> +  if (Mapping == NO_MAPPING) {
> +    return EFI_SUCCESS;
> +  }
> +
> +  //
> +  // If this is a write operation from the Bus Master's point of view,
> +  // then copy the contents of the mapped buffer into the real buffer
> +  // so the processor can read the contents of the real buffer.
> +  //
> +  MapInfo = (MAP_INFO *)Mapping;
> +  if (MapInfo->Operation == DmaOperationBusMasterWrite) {
> +    CopyMem (
> +      (VOID *) (UINTN) MapInfo->HostAddress,
> +      (VOID *) (UINTN) MapInfo->MappedHostAddress,
> +      MapInfo->NumberOfBytes
> +      );
> +  }
> +
> +  //
> +  // Free the mapped buffer and the MAP_INFO structure.
> +  //
> +  gBS->FreePages (MapInfo->MappedHostAddress, MapInfo->NumberOfPages);
> +  FreePool (Mapping);
> +  return EFI_SUCCESS;
> +}
> +
> +
> +/**
> +  Allocates pages that are suitable for a BmDmaMap() of type DmaOperationBusMasterCommonBuffer.
> +
> +  @param  DmaAbove4GB           Indicates capability of DMA operations above 4GB.
> +  @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.
> +
> +  @retval EFI_SUCCESS           The requested memory pages were allocated.
> +  @retval EFI_UNSUPPORTED       Attributes is unsupported. The only legal attribute bits are
> +                                MEMORY_WRITE_COMBINE and MEMORY_CACHED.
> +  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> +  @retval EFI_OUT_OF_RESOURCES  The memory pages could not be allocated.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +BmDmaAllocateBuffer (
> +  IN  BOOLEAN              DmaAbove4GB,
> +  IN  EFI_MEMORY_TYPE      MemoryType,
> +  IN  UINTN                Pages,
> +  OUT VOID                 **HostAddress
> +  )
> +{
> +  EFI_STATUS           Status;
> +  EFI_PHYSICAL_ADDRESS PhysicalAddress;
> +  EFI_ALLOCATE_TYPE    AllocateType;
> +
> +  //
> +  // Check for invalid inputs
> +  //
> +  if (HostAddress == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  //
> +  // The only valid memory types are EfiBootServicesData and
> +  // EfiRuntimeServicesData
> +  //
> +  if (MemoryType != EfiBootServicesData &&
> +      MemoryType != EfiRuntimeServicesData) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (DmaAbove4GB) {
> +    AllocateType = AllocateAnyPages;
> +  } else {
> +    //
> +    // Limit allocations to memory below 4GB
> +    //
> +    AllocateType    = AllocateMaxAddress;
> +    PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (SIZE_4GB - 1);
> +  }
> +  Status = gBS->AllocatePages (
> +                  AllocateType,
> +                  MemoryType,
> +                  Pages,
> +                  &PhysicalAddress
> +                  );
> +  if (!EFI_ERROR (Status)) {
> +    *HostAddress = (VOID *) (UINTN) PhysicalAddress;
> +  }
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  Frees memory that was allocated with BmDmaAllocateBuffer().
> +
> +  @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 BmDmaAllocateBuffer().
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +BmDmaFreeBuffer (
> +  IN  UINTN                Pages,
> +  IN  VOID                 *HostAddress
> +  )
> +{
> +  return gBS->FreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress, Pages);
> +}
> +
> diff --git a/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> new file mode 100644
> index 0000000..06bb8b1
> --- /dev/null
> +++ b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> @@ -0,0 +1,41 @@
> +## @file
> +#
> +# DMA abstraction library APIs. Based on PCI IO protocol DMA abstractions.
> +#
> +#  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
> +#  Copyright (c) 2017, AMD Inc. All rights reserved.<BR>
> +#
> +#  This program and the accompanying materials
> +#  are licensed and made available under the terms and conditions of the BSD License
> +#  which accompanies this distribution.  The full text of the license may be found at
> +#  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = DxeBmDmaLib
> +  FILE_GUID                      = daa403e0-071d-44ef-95cf-7f2472e4a4d5
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = BmDmaLib
> +
> +[Sources.common]
> +  DxeBmDmaLib.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  DebugLib
> +  DxeServicesTableLib
> +  MemoryAllocationLib
> +  UefiBootServicesTableLib
> +
> +
> diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
> index 5996fe5..311922e 100644
> --- a/MdeModulePkg/MdeModulePkg.dsc
> +++ b/MdeModulePkg/MdeModulePkg.dsc
> @@ -275,6 +275,7 @@ [Components]
>   MdeModulePkg/Core/Pei/PeiMain.inf
>   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
> 
> +  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
>   MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
>   MdeModulePkg/Library/UefiMemoryAllocationProfileLib/UefiMemoryAllocationProfileLib.inf
>   MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllocationLib.inf
> -- 
> 1.9.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC 3/6] CorebootPayloadPkg: Modify .DSC files that include PciHostBridgeDxe driver
  2017-01-10  0:16 ` [RFC 3/6] CorebootPayloadPkg: " Leo Duran
@ 2017-01-10  3:56   ` Ma, Maurice
  0 siblings, 0 replies; 15+ messages in thread
From: Ma, Maurice @ 2017-01-10  3:56 UTC (permalink / raw)
  To: Leo Duran
  Cc: edk2-devel@lists.01.org, brijesh.singh@amd.com, lersek@redhat.com,
	Justen, Jordan L, Tian, Feng, Zeng, Star, Agyeman, Prince,
	ard.biesheuvel@linaro.org

Looks good to me.
Reviewed-by: Maurice Ma <maurice.ma@intel.com>

Thanks,
Maurice

-----Original Message-----
From: Leo Duran [mailto:leo.duran@amd.com] 
Sent: Monday, January 9, 2017 4:17 PM
To: edk2-devel@lists.01.org
Cc: brijesh.singh@amd.com; lersek@redhat.com; Justen, Jordan L <jordan.l.justen@intel.com>; Tian, Feng <feng.tian@intel.com>; Zeng, Star <star.zeng@intel.com>; Ma, Maurice <maurice.ma@intel.com>; Agyeman, Prince <prince.agyeman@intel.com>; ard.biesheuvel@linaro.org; Leo Duran <leo.duran@amd.com>
Subject: [RFC 3/6] CorebootPayloadPkg: Modify .DSC files that include PciHostBridgeDxe driver

This patch adds the new DxeBmDmaLib (BmDmaLib class) library, which provides an abstraction layer for DMA operations implemented by the PciHostBridgeDxe driver.

Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Prince Agyeman <prince.agyeman@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Leo Duran  <leo.duran@amd.com>
---
 CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc    | 1 +
 CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc | 1 +
 2 files changed, 2 insertions(+)

diff --git a/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc b/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc
index cdfcb75..12fcd3f 100644
--- a/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc
+++ b/CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc
@@ -140,6 +140,7 @@ [LibraryClasses]
   PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
   PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
   CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf
+  BmDmaLib|MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
 
   #
   # UEFI & PI
diff --git a/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc b/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc
index c35f261..802347c 100644
--- a/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc
+++ b/CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc
@@ -142,6 +142,7 @@ [LibraryClasses]
   PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
   PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
   CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf
+  BmDmaLib|MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
 
   #
   # UEFI & PI
--
1.9.1



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [RFC 1/6] MdeModulePkg: Add DxeBmDmaLib library
  2017-01-10  0:47   ` Andrew Fish
@ 2017-01-10  5:51     ` Duran, Leo
  0 siblings, 0 replies; 15+ messages in thread
From: Duran, Leo @ 2017-01-10  5:51 UTC (permalink / raw)
  To: afish@apple.com
  Cc: edk2-devel, Tian, Feng, Singh, Brijesh, Ard Biesheuvel,
	Jordan Justen, Agyeman, Prince, lersek@redhat.com,
	star.zeng@intel.com


> -----Original Message-----
> From: afish@apple.com [mailto:afish@apple.com]
> Sent: Monday, January 09, 2017 6:47 PM
> To: Duran, Leo <leo.duran@amd.com>
> Cc: edk2-devel <edk2-devel@lists.01.org>; Tian, Feng
> <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Ard
> Biesheuvel <ard.biesheuvel@linaro.org>; Jordan Justen
> <jordan.l.justen@intel.com>; Agyeman, Prince
> <prince.agyeman@intel.com>; lersek@redhat.com; star.zeng@intel.com
> Subject: Re: [edk2] [RFC 1/6] MdeModulePkg: Add DxeBmDmaLib library
> 
> 
> > On Jan 9, 2017, at 4:16 PM, Leo Duran <leo.duran@amd.com> wrote:
> >
> > This patch provides an abstraction layer for DMA operations
> > implemented by the PciHostBridgeDxe driver. The intent is to then
> > allow override of this library as may be required by specific hardware
> > implementations, such as AMD's Secure Encrypted Virtualization (SEV).
> >
> > This new (BmDmaLib class) library is modeled after the existing DmaLib
> > plus an extra DmaAbove4GB (BOOLEAN) parameter in the Map and
> Allocate
> > interfaces, so that decisions can be made about the need to allocate
> > DMA buffers below the 4GB boundary.
> >
[Duran, Leo] 
Hi Andrew,

Yes, I believe a version of this library class could be used for IOMMU mappings.
The DMA API in the Linux kernel does exactly that.

Regards,
Leo.

> 
> Leo,
> 
> Sorry to jump in late, and maybe this is a phase 2 kind of thing, but should we
> support a generic IOMMU architecture via this library?
> 
> I'm not really familiar with AMD's SEV, but in general an IO MMU can restrict
> a DMA buffer to a specific PCI device, and block other PCI devices from
> having access to that buffer. That would seem to imply it would be good to
> have the option of passing the PCI device via these library APIs or I guess we
> could add an Ex version of the APIs that include the PCI device? You could
> always implement the Ex versions of the API by ignoring the PCI device (if
> you don't care about per device IOMMU pertection) and calling the non-Ex
> version.
> 
> To be honest it is kind of hard to fully implement an IOMMU with the current
> UEFI spec as is, but I thought it be worth asking the question?
> 
> Thanks,
> 
> Andrew Fish
> 
> 
> > Cc: Feng Tian <feng.tian@intel.com>
> > Cc: Star Zeng <star.zeng@intel.com>
> > Contributed-under: TianoCore Contribution Agreement 1.0
> > Signed-off-by: Leo Duran  <leo.duran@amd.com>
> > ---
> > MdeModulePkg/Include/Library/BmDmaLib.h          | 161 +++++++++++
> > MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c   | 351
> +++++++++++++++++++++++
> > MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf |  41 +++
> > MdeModulePkg/MdeModulePkg.dsc                    |   1 +
> > 4 files changed, 554 insertions(+)
> > create mode 100644 MdeModulePkg/Include/Library/BmDmaLib.h
> > create mode 100644
> MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
> > create mode 100644
> MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> >
> > diff --git a/MdeModulePkg/Include/Library/BmDmaLib.h
> > b/MdeModulePkg/Include/Library/BmDmaLib.h
> > new file mode 100644
> > index 0000000..2c0e50f
> > --- /dev/null
> > +++ b/MdeModulePkg/Include/Library/BmDmaLib.h
> > @@ -0,0 +1,161 @@
> > +/** @file
> > +  DMA abstraction library APIs. Based on PCI IO protocol DMA abstractions.
> > +
> > +  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
> > + Copyright (c) 2017, AMD Inc. All rights reserved.<BR>
> > +
> > +  DMA Bus Master Read Operation:
> > +    Call BmDmaMap() for DmaOperationBusMasterRead.
> > +    Program the DMA Bus Master with the DeviceAddress returned by
> BmDmaMap().
> > +    Start the DMA Bus Master.
> > +    Wait for DMA Bus Master to complete the read operation.
> > +    Call BmDmaUnmap().
> > +
> > +  DMA Bus Master Write Operation:
> > +    Call BmDmaMap() for DmaOperationBusMasterWrite.
> > +    Program the DMA Bus Master with the DeviceAddress returned by
> BmDmaMap().
> > +    Start the DMA Bus Master.
> > +    Wait for DMA Bus Master to complete the write operation.
> > +    Call BmDmaUnmap().
> > +
> > +  DMA Bus Master Common Buffer Operation:
> > +    Call BmDmaAllocateBuffer() to allocate a common buffer.
> > +    Call BmDmaMap() for DmaOperationBusMasterCommonBuffer.
> > +    Program the DMA Bus Master with the DeviceAddress returned by
> BmDmaMap().
> > +    The common buffer can now be accessed equally by the processor and
> the DMA bus master.
> > +    Call BmDmaUnmap().
> > +    Call BmDmaFreeBuffer().
> > +
> > +  This program and the accompanying materials  are licensed and made
> > + available under the terms and conditions of the BSD License  which
> > + accompanies this distribution.  The full text of the license may be
> > + found at  http://opensource.org/licenses/bsd-license.php
> > +
> > +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS,  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > + Derived from:
> > +   EmbeddedPkg/Include/Library/DmaLib.h
> > +
> > +**/
> > +
> > +#ifndef __BM_DMA_LIB_H__
> > +#define __BM_DMA_LIB_H__
> > +
> > +
> > +typedef enum {
> > +  ///
> > +  /// A read operation from system memory by a bus master.
> > +  ///
> > +  DmaOperationBusMasterRead,
> > +  ///
> > +  /// A write operation from system memory by a bus master.
> > +  ///
> > +  DmaOperationBusMasterWrite,
> > +  ///
> > +  /// Provides both read and write access to system memory by both
> > +the processor and a
> > +  /// bus master. The buffer is coherent from both the processor's and the
> bus master's point of view.
> > +  ///
> > +  DmaOperationBusMasterCommonBuffer,
> > +  DmaOperationBusMasterMaximum
> > +} BM_DMA_OPERATION;
> > +
> > +
> > +/**
> > +  Provides the DMA controller-specific addresses needed to access system
> memory.
> > +
> > +  Operation is relative to the DMA bus master.
> > +
> > +  @param  DmaAbove4GB           Indicates capability of DMA operations
> above 4GB.
> > +  @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
> DMA 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 controller to use to
> > +                                access the hosts HostAddress.
> > +  @param  Mapping               A resulting value to pass to BmDmaUnmap().
> > +
> > +  @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.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +BmDmaMap (
> > +  IN     BOOLEAN           DmaAbove4GB,
> > +  IN     BM_DMA_OPERATION  Operation,
> > +  IN     VOID              *HostAddress,
> > +  IN OUT UINTN             *NumberOfBytes,
> > +  OUT    PHYSICAL_ADDRESS  *DeviceAddress,
> > +  OUT    VOID              **Mapping
> > +  );
> > +
> > +
> > +/**
> > +  Completes the DmaOperationBusMasterRead/Write/CommonBuffer
> > +operation
> > +  and releases any corresponding resources.
> > +
> > +  @param  Mapping               The mapping value returned from
> BmDmaMap().
> > +
> > +  @retval EFI_SUCCESS           The range was unmapped.
> > +  @retval EFI_DEVICE_ERROR      The data was not committed to the target
> system memory.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +BmDmaUnmap (
> > +  IN  VOID                 *Mapping
> > +  );
> > +
> > +
> > +/**
> > +  Allocates pages that are suitable for a BmDmaMap() of type
> DmaOperationBusMasterCommonBuffer.
> > +
> > +  @param  DmaAbove4GB           Indicates capability of DMA operations
> above 4GB.
> > +  @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.
> > +
> > +  @retval EFI_SUCCESS           The requested memory pages were allocated.
> > +  @retval EFI_UNSUPPORTED       Attributes is unsupported. The only legal
> attribute bits are
> > +                                MEMORY_WRITE_COMBINE and MEMORY_CACHED.
> > +  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> > +  @retval EFI_OUT_OF_RESOURCES  The memory pages could not be
> allocated.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +BmDmaAllocateBuffer (
> > +  IN  BOOLEAN              DmaAbove4GB,
> > +  IN  EFI_MEMORY_TYPE      MemoryType,
> > +  IN  UINTN                Pages,
> > +  OUT VOID                 **HostAddress
> > +  );
> > +
> > +
> > +/**
> > +  Frees memory that was allocated with BmDmaAllocateBuffer().
> > +
> > +  @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 BmDmaAllocateBuffer().
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +BmDmaFreeBuffer (
> > +  IN  UINTN                Pages,
> > +  IN  VOID                 *HostAddress
> > +  );
> > +
> > +
> > +#endif
> > +
> > diff --git a/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
> > b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
> > new file mode 100644
> > index 0000000..824b51f
> > --- /dev/null
> > +++ b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
> > @@ -0,0 +1,351 @@
> > +/** @file
> > +  DMA abstraction library APIs. Based on PCI IO protocol DMA abstractions.
> > +
> > +  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
> > + Copyright (c) 2017, AMD Inc. All rights reserved.<BR>
> > +
> > +  This program and the accompanying materials  are licensed and made
> > + available under the terms and conditions of the BSD License  which
> > + accompanies this distribution.  The full text of the license may be
> > + found at  http://opensource.org/licenses/bsd-license.php
> > +
> > +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > + BASIS,  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +
> > +  Derived from:
> > +   MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
> > +
> > +**/
> > +
> > +#include <PiDxe.h>
> > +#include <Library/BaseLib.h>
> > +#include <Library/BaseMemoryLib.h>
> > +#include <Library/DebugLib.h>
> > +#include <Library/DxeServicesTableLib.h> #include
> > +<Library/MemoryAllocationLib.h> #include
> > +<Library/UefiBootServicesTableLib.h>
> > +#include <Library/BmDmaLib.h>
> > +
> > +
> > +#define FORCE_BELOW_4GB_TRUE   TRUE
> > +#define FORCE_BELOW_4GB_FALSE  FALSE
> > +#define NO_MAPPING             (VOID *) (UINTN) -1
> > +
> > +
> > +typedef struct {
> > +  BM_DMA_OPERATION      Operation;
> > +  UINTN                 NumberOfBytes;
> > +  UINTN                 NumberOfPages;
> > +  EFI_PHYSICAL_ADDRESS  HostAddress;
> > +  EFI_PHYSICAL_ADDRESS  MappedHostAddress; } MAP_INFO;
> > +
> > +
> > +EFI_STATUS
> > +AllocateBounceBuffer (
> > +  IN     BOOLEAN               ForceBelow4GB,
> > +  IN     BM_DMA_OPERATION      Operation,
> > +  IN     EFI_PHYSICAL_ADDRESS  HostAddress,
> > +  IN OUT UINTN                 *NumberOfBytes,
> > +  OUT    PHYSICAL_ADDRESS      *DeviceAddress,
> > +  OUT    VOID                  **Mapping
> > +  )
> > +{
> > +  EFI_STATUS         Status;
> > +  MAP_INFO           *MapInfo;
> > +  EFI_ALLOCATE_TYPE  AllocateType;
> > +
> > +  //
> > +  // Allocate a MAP_INFO structure to remember the mapping when
> > + Unmap() is  // called later.
> > +  //
> > +  MapInfo = AllocatePool (sizeof (MAP_INFO));  if (MapInfo == NULL) {
> > +    *NumberOfBytes = 0;
> > +    return EFI_OUT_OF_RESOURCES;
> > +  }
> > +
> > +  //
> > +  // Initialize the MAP_INFO structure  //
> > +  MapInfo->Operation     = Operation;
> > +  MapInfo->NumberOfBytes = *NumberOfBytes;  MapInfo-
> >NumberOfPages =
> > + EFI_SIZE_TO_PAGES (MapInfo->NumberOfBytes);
> > +  MapInfo->HostAddress   = HostAddress;
> > +
> > +  if (ForceBelow4GB) {
> > +    //
> > +    // Limit allocations to memory below 4GB
> > +    //
> > +    AllocateType = AllocateMaxAddress;
> > +    MapInfo->MappedHostAddress = SIZE_4GB - 1;  } else {
> > +    AllocateType = AllocateAnyPages;
> > +  }
> > +
> > +  //
> > +  // Allocate DMA bounce buffer
> > +  //
> > +  Status = gBS->AllocatePages (
> > +                  AllocateType,
> > +                  EfiBootServicesData,
> > +                  MapInfo->NumberOfPages,
> > +                  &MapInfo->MappedHostAddress
> > +                  );
> > +
> > +  if (EFI_ERROR (Status)) {
> > +    FreePool (MapInfo);
> > +    *NumberOfBytes = 0;
> > +    return Status;
> > +  }
> > +
> > +  //
> > +  // If this is a read operation from the Bus Master's point of view,
> > + // then copy the contents of the real buffer into the mapped buffer
> > + // so the Bus Master can read the contents of the real buffer.
> > +  //
> > +  if (Operation ==  DmaOperationBusMasterRead) {
> > +    CopyMem (
> > +      (VOID *) (UINTN) MapInfo->MappedHostAddress,
> > +      (VOID *) (UINTN) MapInfo->HostAddress,
> > +      MapInfo->NumberOfBytes
> > +      );
> > +  }
> > +
> > +  //
> > +  // The DeviceAddress is the address of the mapped buffer  //
> > + *DeviceAddress = MapInfo->MappedHostAddress;
> > +
> > +  //
> > +  // Return a pointer to the MAP_INFO structure in Mapping  //
> > + *Mapping = MapInfo;
> > +
> > +  return EFI_SUCCESS;
> > +}
> > +
> > +
> > +/**
> > +  Provides the DMA controller-specific addresses needed to access system
> memory.
> > +
> > +  Operation is relative to the DMA bus master.
> > +
> > +  @param  DmaAbove4GB           Indicates capability of DMA operations
> above 4GB.
> > +  @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
> DMA 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 controller to use to
> > +                                access the hosts HostAddress.
> > +  @param  Mapping               A resulting value to pass to BmDmaUnmap().
> > +
> > +  @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.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +BmDmaMap (
> > +  IN     BOOLEAN           DmaAbove4GB,
> > +  IN     BM_DMA_OPERATION  Operation,
> > +  IN     VOID              *HostAddress,
> > +  IN OUT UINTN             *NumberOfBytes,
> > +  OUT    PHYSICAL_ADDRESS  *DeviceAddress,
> > +  OUT    VOID              **Mapping
> > +  )
> > +{
> > +  EFI_PHYSICAL_ADDRESS  PhysicalAddress;
> > +
> > +  //
> > +  // Check for invalid inputs
> > +  //
> > +  if (HostAddress == NULL || NumberOfBytes == NULL || DeviceAddress
> == NULL ||
> > +      Mapping == NULL || (UINT32) Operation >=
> DmaOperationBusMasterMaximum) {
> > +    return EFI_INVALID_PARAMETER;
> > +  }
> > +
> > +  PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress;  if
> > + (DmaAbove4GB || (PhysicalAddress + *NumberOfBytes) <= SIZE_4GB) {
> > +    //
> > +    // If we CAN handle DMA above 4GB or the transfer is below 4GB,
> > +    // the DeviceAddress is simply the HostAddress
> > +    //
> > +    *DeviceAddress = PhysicalAddress;
> > +    *Mapping       = NO_MAPPING;
> > +
> > +    return EFI_SUCCESS;
> > +  }
> > +
> > +  //
> > +  // If we cannot handle DMA above 4GB and any part of the DMA
> > + transfer  // being is above 4GB, then map the DMA transfer to a buffer
> below 4GB.
> > +  //
> > +  if (Operation == DmaOperationBusMasterCommonBuffer) {
> > +    //
> > +    // Common Buffer operations cannot be remapped, so return an error.
> > +    //
> > +    return EFI_UNSUPPORTED;
> > +  }
> > +
> > +  return AllocateBounceBuffer (
> > +           Operation,
> > +           FORCE_BELOW_4GB_TRUE,
> > +           PhysicalAddress,
> > +           NumberOfBytes,
> > +           DeviceAddress,
> > +           Mapping
> > +           );
> > +}
> > +
> > +
> > +/**
> > +  Completes the DmaOperationBusMasterRead/Write/CommonBuffer
> > +operation
> > +  and releases any corresponding resources.
> > +
> > +  @param  Mapping               The mapping value returned from
> BmDmaMap().
> > +
> > +  @retval EFI_SUCCESS           The range was unmapped.
> > +  @retval EFI_DEVICE_ERROR      The data was not committed to the target
> system memory.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +BmDmaUnmap (
> > +  IN  VOID                 *Mapping
> > +  )
> > +{
> > +  MAP_INFO  *MapInfo;
> > +
> > +  //
> > +  // Check for invalid inputs
> > +  //
> > +  if (Mapping == NULL) {
> > +    return EFI_INVALID_PARAMETER;
> > +  }
> > +
> > +  //
> > +  // See if the Map() operation associated with this Unmap() required
> > + a mapping  // buffer. If a mapping buffer was not required, then
> > + this function simply  // returns EFI_SUCCESS.
> > +  //
> > +  if (Mapping == NO_MAPPING) {
> > +    return EFI_SUCCESS;
> > +  }
> > +
> > +  //
> > +  // If this is a write operation from the Bus Master's point of
> > + view,  // then copy the contents of the mapped buffer into the real
> > + buffer  // so the processor can read the contents of the real buffer.
> > +  //
> > +  MapInfo = (MAP_INFO *)Mapping;
> > +  if (MapInfo->Operation == DmaOperationBusMasterWrite) {
> > +    CopyMem (
> > +      (VOID *) (UINTN) MapInfo->HostAddress,
> > +      (VOID *) (UINTN) MapInfo->MappedHostAddress,
> > +      MapInfo->NumberOfBytes
> > +      );
> > +  }
> > +
> > +  //
> > +  // Free the mapped buffer and the MAP_INFO structure.
> > +  //
> > +  gBS->FreePages (MapInfo->MappedHostAddress,
> > +MapInfo->NumberOfPages);
> > +  FreePool (Mapping);
> > +  return EFI_SUCCESS;
> > +}
> > +
> > +
> > +/**
> > +  Allocates pages that are suitable for a BmDmaMap() of type
> DmaOperationBusMasterCommonBuffer.
> > +
> > +  @param  DmaAbove4GB           Indicates capability of DMA operations
> above 4GB.
> > +  @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.
> > +
> > +  @retval EFI_SUCCESS           The requested memory pages were allocated.
> > +  @retval EFI_UNSUPPORTED       Attributes is unsupported. The only legal
> attribute bits are
> > +                                MEMORY_WRITE_COMBINE and MEMORY_CACHED.
> > +  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> > +  @retval EFI_OUT_OF_RESOURCES  The memory pages could not be
> allocated.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +BmDmaAllocateBuffer (
> > +  IN  BOOLEAN              DmaAbove4GB,
> > +  IN  EFI_MEMORY_TYPE      MemoryType,
> > +  IN  UINTN                Pages,
> > +  OUT VOID                 **HostAddress
> > +  )
> > +{
> > +  EFI_STATUS           Status;
> > +  EFI_PHYSICAL_ADDRESS PhysicalAddress;
> > +  EFI_ALLOCATE_TYPE    AllocateType;
> > +
> > +  //
> > +  // Check for invalid inputs
> > +  //
> > +  if (HostAddress == NULL) {
> > +    return EFI_INVALID_PARAMETER;
> > +  }
> > +
> > +  //
> > +  // The only valid memory types are EfiBootServicesData and  //
> > + EfiRuntimeServicesData  //  if (MemoryType != EfiBootServicesData &&
> > +      MemoryType != EfiRuntimeServicesData) {
> > +    return EFI_INVALID_PARAMETER;
> > +  }
> > +
> > +  if (DmaAbove4GB) {
> > +    AllocateType = AllocateAnyPages;
> > +  } else {
> > +    //
> > +    // Limit allocations to memory below 4GB
> > +    //
> > +    AllocateType    = AllocateMaxAddress;
> > +    PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (SIZE_4GB - 1);  }
> > + Status = gBS->AllocatePages (
> > +                  AllocateType,
> > +                  MemoryType,
> > +                  Pages,
> > +                  &PhysicalAddress
> > +                  );
> > +  if (!EFI_ERROR (Status)) {
> > +    *HostAddress = (VOID *) (UINTN) PhysicalAddress;  }
> > +
> > +  return Status;
> > +}
> > +
> > +
> > +/**
> > +  Frees memory that was allocated with BmDmaAllocateBuffer().
> > +
> > +  @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 BmDmaAllocateBuffer().
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +BmDmaFreeBuffer (
> > +  IN  UINTN                Pages,
> > +  IN  VOID                 *HostAddress
> > +  )
> > +{
> > +  return gBS->FreePages ((EFI_PHYSICAL_ADDRESS) (UINTN)
> HostAddress,
> > +Pages); }
> > +
> > diff --git a/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> > b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> > new file mode 100644
> > index 0000000..06bb8b1
> > --- /dev/null
> > +++ b/MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> > @@ -0,0 +1,41 @@
> > +## @file
> > +#
> > +# DMA abstraction library APIs. Based on PCI IO protocol DMA
> abstractions.
> > +#
> > +#  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR> #
> > +Copyright (c) 2017, AMD Inc. All rights reserved.<BR> # #  This
> > +program and the accompanying materials #  are licensed and made
> > +available under the terms and conditions of the BSD License #  which
> > +accompanies this distribution.  The full text of the license may be
> > +found at #  http://opensource.org/licenses/bsd-license.php
> > +#
> > +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS, #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> > +#
> > +##
> > +
> > +[Defines]
> > +  INF_VERSION                    = 0x00010005
> > +  BASE_NAME                      = DxeBmDmaLib
> > +  FILE_GUID                      = daa403e0-071d-44ef-95cf-7f2472e4a4d5
> > +  MODULE_TYPE                    = DXE_DRIVER
> > +  VERSION_STRING                 = 1.0
> > +  LIBRARY_CLASS                  = BmDmaLib
> > +
> > +[Sources.common]
> > +  DxeBmDmaLib.c
> > +
> > +[Packages]
> > +  MdePkg/MdePkg.dec
> > +  MdeModulePkg/MdeModulePkg.dec
> > +
> > +[LibraryClasses]
> > +  BaseLib
> > +  BaseMemoryLib
> > +  DebugLib
> > +  DxeServicesTableLib
> > +  MemoryAllocationLib
> > +  UefiBootServicesTableLib
> > +
> > +
> > diff --git a/MdeModulePkg/MdeModulePkg.dsc
> > b/MdeModulePkg/MdeModulePkg.dsc index 5996fe5..311922e 100644
> > --- a/MdeModulePkg/MdeModulePkg.dsc
> > +++ b/MdeModulePkg/MdeModulePkg.dsc
> > @@ -275,6 +275,7 @@ [Components]
> >   MdeModulePkg/Core/Pei/PeiMain.inf
> >   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
> >
> > +  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> >   MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
> >
> MdeModulePkg/Library/UefiMemoryAllocationProfileLib/UefiMemoryAlloca
> tionProfileLib.inf
> >
> >
> MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllo
> catio
> > nLib.inf
> > --
> > 1.9.1
> >
> > _______________________________________________
> > edk2-devel mailing list
> > edk2-devel@lists.01.org
> > https://lists.01.org/mailman/listinfo/edk2-devel



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC 0/6] DxeBmDmaLib
  2017-01-10  0:16 [RFC 0/6] DxeBmDmaLib Leo Duran
                   ` (5 preceding siblings ...)
  2017-01-10  0:17 ` [RFC 6/6] MdeModulePkg: Modify PciHostBridgeDxe to use new BmDmaLib library Leo Duran
@ 2017-01-12  5:43 ` Ni, Ruiyu
  2017-01-12 15:55   ` Duran, Leo
  2017-01-12  9:51 ` Laszlo Ersek
  7 siblings, 1 reply; 15+ messages in thread
From: Ni, Ruiyu @ 2017-01-12  5:43 UTC (permalink / raw)
  To: Leo Duran, edk2-devel@lists.01.org
  Cc: Tian, Feng, brijesh.singh@amd.com, ard.biesheuvel@linaro.org,
	Justen, Jordan L, Agyeman, Prince, lersek@redhat.com, Zeng, Star

Leo,
1. What does "Bm" stand for in "BmDmaLib"?
2. Include/Library/BmDmaLib.h says
    " DMA abstraction library APIs. Based on PCI IO protocol DMA abstractions."
    I think that means the BmDmaLib library class knows the PCI IO concept.
    If so, why not directly use the EFI_PCI_ROT_BRIDGE_IO_PROTOCOL_OPERATION
    enum in this library class API, but invent a new BM_DMA_OPERATION enum type?
3. Can you explain more about AMD's SEV? What will a new instance of this library
    class look like for AMD's SEV? And what will ... for Andrew's usage model?
    I am asking this question because I try to understand the needs of the additional
    layer of abstraction. I want to make sure the additional layer is generic enough
    not just to meet one silicon feature, but can meet a more wide range of silicon
    features.


Thanks/Ray

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Leo Duran
> Sent: Tuesday, January 10, 2017 8:17 AM
> To: edk2-devel@lists.01.org
> Cc: Tian, Feng <feng.tian@intel.com>; brijesh.singh@amd.com;
> ard.biesheuvel@linaro.org; Justen, Jordan L <jordan.l.justen@intel.com>;
> Leo Duran <leo.duran@amd.com>; Agyeman, Prince
> <prince.agyeman@intel.com>; lersek@redhat.com; Zeng, Star
> <star.zeng@intel.com>
> Subject: [edk2] [RFC 0/6] DxeBmDmaLib
> 
> This patch-set provides an abstraction layer for DMA operations
> implemented by the PciHostBridgeDxe driver. The intent is to then allow
> override of this library as may be required by specific hardware
> implementations, such as AMD's Secure Encrypted Virtualization (SEV).
> 
> This new (BmDmaLib class) library is modeled after the existing DmaLib plus
> an extra DmaAbove4GB (BOOLEAN) parameter in the Map and Allocate
> interfaces, so that decisions can be made about the need to allocate DMA
> buffers below the 4GB boundary.
> 
> Leo Duran (6):
>   MdeModulePkg: Add DxeBmDmaLib library
>   ArmVirtPkg: Modify .DSC files that include PciHostBridgeDxe driver
>   CorebootPayloadPkg: Modify .DSC files that include PciHostBridgeDxe
>     driver
>   MdeModulePkg: Modify .DSC files that include PciHostBridgeDxe driver
>   OvmfPkg: Modify .DSC files that include PciHostBridgeDxe driver
>   MdeModulePkg: Modify PciHostBridgeDxe to use new BmDmaLib library.
> 
>  ArmVirtPkg/ArmVirtQemu.dsc                         |   1 +
>  ArmVirtPkg/ArmVirtQemuKernel.dsc                   |   1 +
>  CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc      |   1 +
>  CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc   |   1 +
>  .../Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf  |   1 +
>  .../Bus/Pci/PciHostBridgeDxe/PciRootBridge.h       |  13 +-
>  .../Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c     | 272 ++++------------
>  MdeModulePkg/Include/Library/BmDmaLib.h            | 161 ++++++++++
>  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c     | 351
> +++++++++++++++++++++
>  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf   |  41 +++
>  MdeModulePkg/MdeModulePkg.dsc                      |   3 +
>  OvmfPkg/OvmfPkgIa32.dsc                            |   1 +
>  OvmfPkg/OvmfPkgIa32X64.dsc                         |   1 +
>  OvmfPkg/OvmfPkgX64.dsc                             |   1 +
>  14 files changed, 629 insertions(+), 220 deletions(-)  create mode 100644
> MdeModulePkg/Include/Library/BmDmaLib.h
>  create mode 100644
> MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
>  create mode 100644
> MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> 
> --
> 1.9.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC 0/6] DxeBmDmaLib
  2017-01-10  0:16 [RFC 0/6] DxeBmDmaLib Leo Duran
                   ` (6 preceding siblings ...)
  2017-01-12  5:43 ` [RFC 0/6] DxeBmDmaLib Ni, Ruiyu
@ 2017-01-12  9:51 ` Laszlo Ersek
  2017-01-12 16:04   ` Duran, Leo
  7 siblings, 1 reply; 15+ messages in thread
From: Laszlo Ersek @ 2017-01-12  9:51 UTC (permalink / raw)
  To: Leo Duran, edk2-devel
  Cc: feng.tian, brijesh.singh, ard.biesheuvel, jordan.l.justen,
	prince.agyeman, star.zeng

On 01/10/17 01:16, Leo Duran wrote:
> This patch-set provides an abstraction layer for DMA operations implemented
> by the PciHostBridgeDxe driver. The intent is to then allow override of this
> library as may be required by specific hardware implementations, such as 
> AMD's Secure Encrypted Virtualization (SEV).
> 
> This new (BmDmaLib class) library is modeled after the existing DmaLib
> plus an extra DmaAbove4GB (BOOLEAN) parameter in the Map and Allocate
> interfaces, so that decisions can be made about the need to allocate DMA
> buffers below the 4GB boundary.

* Ard, I remember you worked on >=4GB DMA stuff before, can you please
look over this series?

* Leo, can you confirm that patches #1 and #6 implement nothing more
than code movement? If they implement more than that (judging from the
new DmaAbove4GB parameter above), can you specify how exactly?

The source code changes in patches #2 and #5 look okay, but before I'm
comfortable acking them, I'd like to understand the scope of the code
movement between #1 and #6.

* Also, I suggest the following subject line template for patches #2
through #5:

  XxxPkg: resolve BmDmaLib class for PciHostBridgeDxe driver

* For patch #1, I suggest restricting the client module types to
DXE_DRIVER in the INF file:

  LIBRARY_CLASS                  = BmDmaLib|DXE_DRIVER

Thanks
Laszlo


> 
> Leo Duran (6):
>   MdeModulePkg: Add DxeBmDmaLib library
>   ArmVirtPkg: Modify .DSC files that include PciHostBridgeDxe driver
>   CorebootPayloadPkg: Modify .DSC files that include PciHostBridgeDxe
>     driver
>   MdeModulePkg: Modify .DSC files that include PciHostBridgeDxe driver
>   OvmfPkg: Modify .DSC files that include PciHostBridgeDxe driver
>   MdeModulePkg: Modify PciHostBridgeDxe to use new BmDmaLib library.
> 
>  ArmVirtPkg/ArmVirtQemu.dsc                         |   1 +
>  ArmVirtPkg/ArmVirtQemuKernel.dsc                   |   1 +
>  CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc      |   1 +
>  CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc   |   1 +
>  .../Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf  |   1 +
>  .../Bus/Pci/PciHostBridgeDxe/PciRootBridge.h       |  13 +-
>  .../Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c     | 272 ++++------------
>  MdeModulePkg/Include/Library/BmDmaLib.h            | 161 ++++++++++
>  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c     | 351 +++++++++++++++++++++
>  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf   |  41 +++
>  MdeModulePkg/MdeModulePkg.dsc                      |   3 +
>  OvmfPkg/OvmfPkgIa32.dsc                            |   1 +
>  OvmfPkg/OvmfPkgIa32X64.dsc                         |   1 +
>  OvmfPkg/OvmfPkgX64.dsc                             |   1 +
>  14 files changed, 629 insertions(+), 220 deletions(-)
>  create mode 100644 MdeModulePkg/Include/Library/BmDmaLib.h
>  create mode 100644 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
>  create mode 100644 MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> 



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC 0/6] DxeBmDmaLib
  2017-01-12  5:43 ` [RFC 0/6] DxeBmDmaLib Ni, Ruiyu
@ 2017-01-12 15:55   ` Duran, Leo
  0 siblings, 0 replies; 15+ messages in thread
From: Duran, Leo @ 2017-01-12 15:55 UTC (permalink / raw)
  To: 'Ni, Ruiyu', edk2-devel@lists.01.org
  Cc: Tian, Feng, Singh, Brijesh, ard.biesheuvel@linaro.org,
	Justen, Jordan L, Agyeman, Prince, lersek@redhat.com, Zeng, Star



> -----Original Message-----
> From: Ni, Ruiyu [mailto:ruiyu.ni@intel.com]
> Sent: Wednesday, January 11, 2017 11:44 PM
> To: Duran, Leo <leo.duran@amd.com>; edk2-devel@lists.01.org
> Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh
> <brijesh.singh@amd.com>; ard.biesheuvel@linaro.org; Justen, Jordan L
> <jordan.l.justen@intel.com>; Agyeman, Prince
> <prince.agyeman@intel.com>; lersek@redhat.com; Zeng, Star
> <star.zeng@intel.com>
> Subject: RE: [edk2] [RFC 0/6] DxeBmDmaLib
> 
> Leo,
> 1. What does "Bm" stand for in "BmDmaLib"?
[Duran, Leo] "Bm" stands for "Bus-master", as in "Bus-master" DMA.

> 2. Include/Library/BmDmaLib.h says
>     " DMA abstraction library APIs. Based on PCI IO protocol DMA
> abstractions."
>     I think that means the BmDmaLib library class knows the PCI IO concept.
>     If so, why not directly use the
> EFI_PCI_ROT_BRIDGE_IO_PROTOCOL_OPERATION
>     enum in this library class API, but invent a new BM_DMA_OPERATION
> enum type?
[Duran, Leo] 
It's based on the PCI model, but it's not dependent on or specifically for PCI.
I cloned the existing "Dmalib.h", but added an extra/new parameter, else I'd have used the existing class.
Please see: EmbeddedPkg/Include/Library/DmaLib.h

> 3. Can you explain more about AMD's SEV? What will a new instance of this
> library
>     class look like for AMD's SEV? And what will ... for Andrew's usage model?
>     I am asking this question because I try to understand the needs of the
> additional
>     layer of abstraction. I want to make sure the additional layer is generic
> enough
>     not just to meet one silicon feature, but can meet a more wide range of
> silicon
>     features. 
[Duran, Leo] 
On instances of SEV guests, the allocated DMA buffer require no encryption.
Our intent is to override the library to then make runtime decisions if SEV is enabled.
Please refer to the RFC discussion here:
http://marc.info/?l=linux-mm&m=147190814023863&w=2

> 
> Thanks/Ray
> 
> > -----Original Message-----
> > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> > Leo Duran
> > Sent: Tuesday, January 10, 2017 8:17 AM
> > To: edk2-devel@lists.01.org
> > Cc: Tian, Feng <feng.tian@intel.com>; brijesh.singh@amd.com;
> > ard.biesheuvel@linaro.org; Justen, Jordan L
> > <jordan.l.justen@intel.com>; Leo Duran <leo.duran@amd.com>;
> Agyeman,
> > Prince <prince.agyeman@intel.com>; lersek@redhat.com; Zeng, Star
> > <star.zeng@intel.com>
> > Subject: [edk2] [RFC 0/6] DxeBmDmaLib
> >
> > This patch-set provides an abstraction layer for DMA operations
> > implemented by the PciHostBridgeDxe driver. The intent is to then
> > allow override of this library as may be required by specific hardware
> > implementations, such as AMD's Secure Encrypted Virtualization (SEV).
> >
> > This new (BmDmaLib class) library is modeled after the existing DmaLib
> > plus an extra DmaAbove4GB (BOOLEAN) parameter in the Map and
> Allocate
> > interfaces, so that decisions can be made about the need to allocate
> > DMA buffers below the 4GB boundary.
> >
> > Leo Duran (6):
> >   MdeModulePkg: Add DxeBmDmaLib library
> >   ArmVirtPkg: Modify .DSC files that include PciHostBridgeDxe driver
> >   CorebootPayloadPkg: Modify .DSC files that include PciHostBridgeDxe
> >     driver
> >   MdeModulePkg: Modify .DSC files that include PciHostBridgeDxe driver
> >   OvmfPkg: Modify .DSC files that include PciHostBridgeDxe driver
> >   MdeModulePkg: Modify PciHostBridgeDxe to use new BmDmaLib library.
> >
> >  ArmVirtPkg/ArmVirtQemu.dsc                         |   1 +
> >  ArmVirtPkg/ArmVirtQemuKernel.dsc                   |   1 +
> >  CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc      |   1 +
> >  CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc   |   1 +
> >  .../Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf  |   1 +
> >  .../Bus/Pci/PciHostBridgeDxe/PciRootBridge.h       |  13 +-
> >  .../Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c     | 272 ++++------------
> >  MdeModulePkg/Include/Library/BmDmaLib.h            | 161 ++++++++++
> >  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c     | 351
> > +++++++++++++++++++++
> >  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf   |  41 +++
> >  MdeModulePkg/MdeModulePkg.dsc                      |   3 +
> >  OvmfPkg/OvmfPkgIa32.dsc                            |   1 +
> >  OvmfPkg/OvmfPkgIa32X64.dsc                         |   1 +
> >  OvmfPkg/OvmfPkgX64.dsc                             |   1 +
> >  14 files changed, 629 insertions(+), 220 deletions(-)  create mode
> > 100644 MdeModulePkg/Include/Library/BmDmaLib.h
> >  create mode 100644
> > MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
> >  create mode 100644
> > MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> >
> > --
> > 1.9.1
> >
> > _______________________________________________
> > edk2-devel mailing list
> > edk2-devel@lists.01.org
> > https://lists.01.org/mailman/listinfo/edk2-devel


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC 0/6] DxeBmDmaLib
  2017-01-12  9:51 ` Laszlo Ersek
@ 2017-01-12 16:04   ` Duran, Leo
  2017-01-12 16:44     ` Laszlo Ersek
  0 siblings, 1 reply; 15+ messages in thread
From: Duran, Leo @ 2017-01-12 16:04 UTC (permalink / raw)
  To: 'Laszlo Ersek', edk2-devel@ml01.01.org
  Cc: feng.tian@intel.com, Singh, Brijesh, ard.biesheuvel@linaro.org,
	jordan.l.justen@intel.com, prince.agyeman@intel.com,
	star.zeng@intel.com



> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Thursday, January 12, 2017 3:51 AM
> To: Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
> Cc: feng.tian@intel.com; Singh, Brijesh <brijesh.singh@amd.com>;
> ard.biesheuvel@linaro.org; jordan.l.justen@intel.com;
> prince.agyeman@intel.com; star.zeng@intel.com
> Subject: Re: [edk2] [RFC 0/6] DxeBmDmaLib
> 
> On 01/10/17 01:16, Leo Duran wrote:
> > This patch-set provides an abstraction layer for DMA operations
> > implemented by the PciHostBridgeDxe driver. The intent is to then
> > allow override of this library as may be required by specific hardware
> > implementations, such as AMD's Secure Encrypted Virtualization (SEV).
> >
> > This new (BmDmaLib class) library is modeled after the existing DmaLib
> > plus an extra DmaAbove4GB (BOOLEAN) parameter in the Map and
> Allocate
> > interfaces, so that decisions can be made about the need to allocate
> > DMA buffers below the 4GB boundary.
> 
> * Ard, I remember you worked on >=4GB DMA stuff before, can you please
> look over this series?
> 
> * Leo, can you confirm that patches #1 and #6 implement nothing more than
> code movement? If they implement more than that (judging from the new
> DmaAbove4GB parameter above), can you specify how exactly?
> 
> The source code changes in patches #2 and #5 look okay, but before I'm
> comfortable acking them, I'd like to understand the scope of the code
> movement between #1 and #6.
[Duran, Leo] 
Laszlo, it's more than just code movement.
- Patch#1 clones the existing implementation from PciHostBridgeDxe,
 but the ported code is simplified a bit by the addition of the 'DmaAbove4GB' parameter.
- Patch#6 removes the ported code from PciHostBridgeDxe to leverage the library.

> 
> * Also, I suggest the following subject line template for patches #2 through
> #5:
> 
>   XxxPkg: resolve BmDmaLib class for PciHostBridgeDxe driver
> 
> * For patch #1, I suggest restricting the client module types to DXE_DRIVER in
> the INF file:
> 
>   LIBRARY_CLASS                  = BmDmaLib|DXE_DRIVER
> 
> Thanks
> Laszlo
[Duran, Leo] 
OK,  sounds good to me. Thanks.

> 
> 
> >
> > Leo Duran (6):
> >   MdeModulePkg: Add DxeBmDmaLib library
> >   ArmVirtPkg: Modify .DSC files that include PciHostBridgeDxe driver
> >   CorebootPayloadPkg: Modify .DSC files that include PciHostBridgeDxe
> >     driver
> >   MdeModulePkg: Modify .DSC files that include PciHostBridgeDxe driver
> >   OvmfPkg: Modify .DSC files that include PciHostBridgeDxe driver
> >   MdeModulePkg: Modify PciHostBridgeDxe to use new BmDmaLib library.
> >
> >  ArmVirtPkg/ArmVirtQemu.dsc                         |   1 +
> >  ArmVirtPkg/ArmVirtQemuKernel.dsc                   |   1 +
> >  CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc      |   1 +
> >  CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc   |   1 +
> >  .../Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf  |   1 +
> >  .../Bus/Pci/PciHostBridgeDxe/PciRootBridge.h       |  13 +-
> >  .../Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c     | 272 ++++------------
> >  MdeModulePkg/Include/Library/BmDmaLib.h            | 161 ++++++++++
> >  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c     | 351
> +++++++++++++++++++++
> >  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf   |  41 +++
> >  MdeModulePkg/MdeModulePkg.dsc                      |   3 +
> >  OvmfPkg/OvmfPkgIa32.dsc                            |   1 +
> >  OvmfPkg/OvmfPkgIa32X64.dsc                         |   1 +
> >  OvmfPkg/OvmfPkgX64.dsc                             |   1 +
> >  14 files changed, 629 insertions(+), 220 deletions(-)  create mode
> > 100644 MdeModulePkg/Include/Library/BmDmaLib.h
> >  create mode 100644
> MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
> >  create mode 100644
> MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
> >



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC 0/6] DxeBmDmaLib
  2017-01-12 16:04   ` Duran, Leo
@ 2017-01-12 16:44     ` Laszlo Ersek
  0 siblings, 0 replies; 15+ messages in thread
From: Laszlo Ersek @ 2017-01-12 16:44 UTC (permalink / raw)
  To: Duran, Leo, edk2-devel@ml01.01.org
  Cc: feng.tian@intel.com, Singh, Brijesh, ard.biesheuvel@linaro.org,
	jordan.l.justen@intel.com, prince.agyeman@intel.com,
	star.zeng@intel.com

On 01/12/17 17:04, Duran, Leo wrote:
> 
> 
>> -----Original Message-----
>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>> Sent: Thursday, January 12, 2017 3:51 AM
>> To: Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
>> Cc: feng.tian@intel.com; Singh, Brijesh <brijesh.singh@amd.com>;
>> ard.biesheuvel@linaro.org; jordan.l.justen@intel.com;
>> prince.agyeman@intel.com; star.zeng@intel.com
>> Subject: Re: [edk2] [RFC 0/6] DxeBmDmaLib
>>
>> On 01/10/17 01:16, Leo Duran wrote:
>>> This patch-set provides an abstraction layer for DMA operations
>>> implemented by the PciHostBridgeDxe driver. The intent is to then
>>> allow override of this library as may be required by specific hardware
>>> implementations, such as AMD's Secure Encrypted Virtualization (SEV).
>>>
>>> This new (BmDmaLib class) library is modeled after the existing DmaLib
>>> plus an extra DmaAbove4GB (BOOLEAN) parameter in the Map and
>> Allocate
>>> interfaces, so that decisions can be made about the need to allocate
>>> DMA buffers below the 4GB boundary.
>>
>> * Ard, I remember you worked on >=4GB DMA stuff before, can you please
>> look over this series?
>>
>> * Leo, can you confirm that patches #1 and #6 implement nothing more than
>> code movement? If they implement more than that (judging from the new
>> DmaAbove4GB parameter above), can you specify how exactly?
>>
>> The source code changes in patches #2 and #5 look okay, but before I'm
>> comfortable acking them, I'd like to understand the scope of the code
>> movement between #1 and #6.
> [Duran, Leo] 
> Laszlo, it's more than just code movement.
> - Patch#1 clones the existing implementation from PciHostBridgeDxe,
>  but the ported code is simplified a bit by the addition of the 'DmaAbove4GB' parameter.
> - Patch#6 removes the ported code from PciHostBridgeDxe to leverage the library.

Okay, thanks. Makes sense.

I'm aware that the exact library interfaces are still under discussion
(wrt. generality for example), but as long as we keep the above scheme,
you can add (and carry forward), to patches #2 and #5, my

Reviewed-by: Laszlo Ersek <lersek@redhat.com>

Thanks!
Laszlo



> 
>>
>> * Also, I suggest the following subject line template for patches #2 through
>> #5:
>>
>>   XxxPkg: resolve BmDmaLib class for PciHostBridgeDxe driver
>>
>> * For patch #1, I suggest restricting the client module types to DXE_DRIVER in
>> the INF file:
>>
>>   LIBRARY_CLASS                  = BmDmaLib|DXE_DRIVER
>>
>> Thanks
>> Laszlo
> [Duran, Leo] 
> OK,  sounds good to me. Thanks.
> 
>>
>>
>>>
>>> Leo Duran (6):
>>>   MdeModulePkg: Add DxeBmDmaLib library
>>>   ArmVirtPkg: Modify .DSC files that include PciHostBridgeDxe driver
>>>   CorebootPayloadPkg: Modify .DSC files that include PciHostBridgeDxe
>>>     driver
>>>   MdeModulePkg: Modify .DSC files that include PciHostBridgeDxe driver
>>>   OvmfPkg: Modify .DSC files that include PciHostBridgeDxe driver
>>>   MdeModulePkg: Modify PciHostBridgeDxe to use new BmDmaLib library.
>>>
>>>  ArmVirtPkg/ArmVirtQemu.dsc                         |   1 +
>>>  ArmVirtPkg/ArmVirtQemuKernel.dsc                   |   1 +
>>>  CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc      |   1 +
>>>  CorebootPayloadPkg/CorebootPayloadPkgIa32X64.dsc   |   1 +
>>>  .../Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf  |   1 +
>>>  .../Bus/Pci/PciHostBridgeDxe/PciRootBridge.h       |  13 +-
>>>  .../Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c     | 272 ++++------------
>>>  MdeModulePkg/Include/Library/BmDmaLib.h            | 161 ++++++++++
>>>  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c     | 351
>> +++++++++++++++++++++
>>>  MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf   |  41 +++
>>>  MdeModulePkg/MdeModulePkg.dsc                      |   3 +
>>>  OvmfPkg/OvmfPkgIa32.dsc                            |   1 +
>>>  OvmfPkg/OvmfPkgIa32X64.dsc                         |   1 +
>>>  OvmfPkg/OvmfPkgX64.dsc                             |   1 +
>>>  14 files changed, 629 insertions(+), 220 deletions(-)  create mode
>>> 100644 MdeModulePkg/Include/Library/BmDmaLib.h
>>>  create mode 100644
>> MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.c
>>>  create mode 100644
>> MdeModulePkg/Library/DxeBmDmaLib/DxeBmDmaLib.inf
>>>
> 



^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2017-01-12 16:44 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-10  0:16 [RFC 0/6] DxeBmDmaLib Leo Duran
2017-01-10  0:16 ` [RFC 1/6] MdeModulePkg: Add DxeBmDmaLib library Leo Duran
2017-01-10  0:47   ` Andrew Fish
2017-01-10  5:51     ` Duran, Leo
2017-01-10  0:16 ` [RFC 2/6] ArmVirtPkg: Modify .DSC files that include PciHostBridgeDxe driver Leo Duran
2017-01-10  0:16 ` [RFC 3/6] CorebootPayloadPkg: " Leo Duran
2017-01-10  3:56   ` Ma, Maurice
2017-01-10  0:16 ` [RFC 4/6] MdeModulePkg: " Leo Duran
2017-01-10  0:17 ` [RFC 5/6] OvmfPkg: " Leo Duran
2017-01-10  0:17 ` [RFC 6/6] MdeModulePkg: Modify PciHostBridgeDxe to use new BmDmaLib library Leo Duran
2017-01-12  5:43 ` [RFC 0/6] DxeBmDmaLib Ni, Ruiyu
2017-01-12 15:55   ` Duran, Leo
2017-01-12  9:51 ` Laszlo Ersek
2017-01-12 16:04   ` Duran, Leo
2017-01-12 16:44     ` Laszlo Ersek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox