Add a DMA lib that works like PCI_IO protocl. Add a NULL version that would work with Intel (DMA is coherent no matter what you do). 


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10551 6f19259b-4bc3-4df7-8a09-765794883524
diff --git a/EmbeddedPkg/EmbeddedPkg.dsc b/EmbeddedPkg/EmbeddedPkg.dsc
index 157e536..9bb5b59 100644
--- a/EmbeddedPkg/EmbeddedPkg.dsc
+++ b/EmbeddedPkg/EmbeddedPkg.dsc
@@ -239,14 +239,15 @@
   EmbeddedPkg/Library/EblAddExternalCommandLib/EblAddExternalCommandLib.inf 
   EmbeddedPkg/Library/EblCmdLibNull/EblCmdLibNull.inf
   EmbeddedPkg/Library/EfiFileLib/EfiFileLib.inf
-  EmbeddedPkg/Library/GdbSerialDebugPortLib/GdbSerialDebugPortLib.inf  # ApplePkg
-  EmbeddedPkg/Library/GdbSerialLib/GdbSerialLib.inf                    # ApplePkg
+  EmbeddedPkg/Library/GdbSerialDebugPortLib/GdbSerialDebugPortLib.inf  
+  EmbeddedPkg/Library/GdbSerialLib/GdbSerialLib.inf                    
   EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf
   EmbeddedPkg/Library/PrePiLib/PrePiLib.inf
   EmbeddedPkg/Library/TemplateSerialPortLib/TemplateSerialPortLib.inf
   EmbeddedPkg/Library/TemplateResetSystemLib/TemplateResetSystemLib.inf
   EmbeddedPkg/Library/TemplateRealTimeClockLib/TemplateRealTimeClockLib.inf
   EmbeddedPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf
+  EmbeddedPkg/Library/NullDmaLib/NullDmaLib.inf
 
   EmbeddedPkg/Ebl/Ebl.inf
 ####  EmbeddedPkg/EblExternCmd/EblExternCmd.inf
diff --git a/EmbeddedPkg/Include/Library/DmaLib.h b/EmbeddedPkg/Include/Library/DmaLib.h
new file mode 100755
index 0000000..badaf21
--- /dev/null
+++ b/EmbeddedPkg/Include/Library/DmaLib.h
@@ -0,0 +1,159 @@
+/** @file
+  DMA abstraction library APIs. Based on UEFI PCI IO protocol DMA abstractions.
+  At some point these functions will probably end up in a non PCI protocol 
+  for embedded systems.
+
+  DMA Bus Master Read Operation:

+    Call DmaMap() for MapOperationBusMasterRead. 
+    Program the DMA Bus Master with the DeviceAddress returned by DmaMap(). 
+    Start the DMA Bus Master. 
+    Wait for DMA Bus Master to complete the read operation. 
+    Call DmaUnmap().
+
+  DMA Bus Master Write Operation:
+    Call DmaMap() for MapOperationBusMasterWrite.

+    Program the DMA Bus Master with the DeviceAddress returned by DmaMap().

+    Start the DMA Bus Master.

+    Wait for DMA Bus Master to complete the write operation.

+    Call DmaUnmap().
+
+  DMA Bus Master Common Buffer Operation:
+    Call DmaAllocateBuffer() to allocate a common buffer. 
+    Call DmaMap() for MapOperationBusMasterCommonBuffer. 
+    Program the DMA Bus Master with the DeviceAddress returned by DmaMap(). 
+    The common buffer can now be accessed equally by the processor and the DMA bus master. 
+    Call DmaUnmap(). 
+    Call DmaFreeBuffer().
+
+  Copyright (c) 2008 - 2010, Apple 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.
+
+**/
+
+#ifndef __DMA_LIB_H__
+#define __DMA_LIB_H__
+
+typedef enum {

+  ///

+  /// A read operation from system memory by a bus master.

+  ///

+  MapOperationBusMasterRead,

+  ///

+  /// A write operation from system memory by a bus master.

+  ///

+  MapOperationBusMasterWrite,

+  ///

+  /// 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.

+  ///

+  MapOperationBusMasterCommonBuffer,

+  MapOperationMaximum

+} DMA_MAP_OPERATION;

+
+
+
+
+/**                                                                 

+  Provides the DMA controller-specific addresses needed to access system memory.

+  

+  Operation is relative to the DMA bus master.

+            

+  @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 DmaUnmap().

+                                  

+  @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
+DmaMap (
+  IN     DMA_MAP_OPERATION              Operation,
+  IN     VOID                           *HostAddress,

+  IN OUT UINTN                          *NumberOfBytes,

+  OUT    PHYSICAL_ADDRESS               *DeviceAddress,

+  OUT    VOID                           **Mapping

+  );
+
+
+
+
+/**                                                                 

+  Completes the DmaMapBusMasterRead, DmaMapBusMasterWrite, or DmaMapBusMasterCommonBuffer

+  operation and releases any corresponding resources.

+            

+  @param  Mapping               The mapping value returned from DmaMap().

+                                  

+  @retval EFI_SUCCESS           The range was unmapped.

+  @retval EFI_DEVICE_ERROR      The data was not committed to the target system memory.

+                                   

+**/
+EFI_STATUS
+EFIAPI
+DmaUnmap (
+  IN  VOID                         *Mapping

+  );
+
+
+/**                                                                 

+  Allocates pages that are suitable for an DmaMap() of type MapOperationBusMasterCommonBuffer.

+  mapping.                                                                       

+            

+  @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
+DmaAllocateBuffer (
+  IN  EFI_MEMORY_TYPE              MemoryType,
+  IN  UINTN                        Pages,

+  OUT VOID                         **HostAddress

+  );

+
+
+/**                                                                 

+  Frees memory that was allocated with DmaAllocateBuffer().

+            

+  @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 DmaAllocateBuffer().

+                                     

+**/

+EFI_STATUS
+EFIAPI
+DmaFreeBuffer (
+  IN  UINTN                        Pages,

+  IN  VOID                         *HostAddress

+  );

+
+
+#endif 
+
diff --git a/EmbeddedPkg/Library/NullDmaLib/NullDmaLib.c b/EmbeddedPkg/Library/NullDmaLib/NullDmaLib.c
new file mode 100755
index 0000000..0ea8919
--- /dev/null
+++ b/EmbeddedPkg/Library/NullDmaLib/NullDmaLib.c
@@ -0,0 +1,147 @@
+/** @file

+  Generic ARM implementation of DmaLib.h

+

+  Copyright (c) 2008 - 2010, Apple 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.

+

+**/

+

+#include <Uefi.h>

+#include <Library/DebugLib.h>

+#include <Library/DmaLib.h>

+#include <Library/MemoryAllocationLib.h>

+

+

+

+/**                                                                 

+  Provides the DMA controller-specific addresses needed to access system memory.

+  

+  Operation is relative to the DMA bus master.

+            

+  @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 Unmap().

+                                  

+  @retval EFI_SUCCESS           The range was mapped for the returned NumberOfBytes.

+  @retval EFI_UNSUPPORTED       The HostAddress cannot be mapped as a common buffer.                                

+  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.

+  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.

+  @retval EFI_DEVICE_ERROR      The system hardware could not map the requested address.

+                                   

+**/

+EFI_STATUS

+EFIAPI

+DmaMap (

+  IN     DMA_MAP_OPERATION              Operation,

+  IN     VOID                           *HostAddress,

+  IN OUT UINTN                          *NumberOfBytes,

+  OUT    PHYSICAL_ADDRESS               *DeviceAddress,

+  OUT    VOID                           **Mapping

+  )

+{

+  return EFI_SUCCESS;

+}

+

+

+/**                                                                 

+  Completes the DmaMapBusMasterRead(), DmaMapBusMasterWrite(), or DmaMapBusMasterCommonBuffer()

+  operation and releases any corresponding resources.

+            

+  @param  Mapping               The mapping value returned from DmaMap*().

+                                  

+  @retval EFI_SUCCESS           The range was unmapped.

+  @retval EFI_DEVICE_ERROR      The data was not committed to the target system memory.

+                                   

+**/

+EFI_STATUS

+EFIAPI

+DmaUnmap (

+  IN  VOID                         *Mapping

+  )

+{

+  return EFI_SUCCESS;

+}

+

+/**                                                                 

+  Allocates pages that are suitable for an DmaMap() of type MapOperationBusMasterCommonBuffer.

+  mapping.                                                                       

+            

+  @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

+DmaAllocateBuffer (

+  IN  EFI_MEMORY_TYPE              MemoryType,

+  IN  UINTN                        Pages,

+  OUT VOID                         **HostAddress

+  )

+{

+  if (HostAddress == NULL) {

+    return EFI_INVALID_PARAMETER;

+  }

+

+  //

+  // The only valid memory types are EfiBootServicesData and EfiRuntimeServicesData

+  //

+  // We used uncached memory to keep coherency

+  //

+  if (MemoryType == EfiBootServicesData) {

+    *HostAddress = AllocatePages (Pages);

+  } else if (MemoryType != EfiRuntimeServicesData) {

+    *HostAddress = AllocateRuntimePages (Pages);

+  } else {

+    return EFI_INVALID_PARAMETER;

+  }

+

+  return EFI_SUCCESS;

+}

+

+

+/**                                                                 

+  Frees memory that was allocated with DmaAllocateBuffer().

+            

+  @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 DmaAllocateBuffer().

+                                     

+**/

+EFI_STATUS

+EFIAPI

+DmaFreeBuffer (

+  IN  UINTN                        Pages,

+  IN  VOID                         *HostAddress

+  )

+{

+  if (HostAddress == NULL) {

+     return EFI_INVALID_PARAMETER;

+  } 

+  

+  FreePages (HostAddress, Pages);

+  return EFI_SUCCESS;

+}

+

diff --git a/EmbeddedPkg/Library/NullDmaLib/NullDmaLib.inf b/EmbeddedPkg/Library/NullDmaLib/NullDmaLib.inf
new file mode 100755
index 0000000..4897a8a
--- /dev/null
+++ b/EmbeddedPkg/Library/NullDmaLib/NullDmaLib.inf
@@ -0,0 +1,41 @@
+#/** @file

+#  

+#  Copyright (c) 2008 - 2010, Apple 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                      = NullDmaLib

+  FILE_GUID                      = 0F2A0816-D319-4ee7-A6B8-D58524E4428F

+  MODULE_TYPE                    = BASE

+  VERSION_STRING                 = 1.0

+  LIBRARY_CLASS                  = DmaLib 

+

+[Sources.common]

+  NullDmaLib.c

+

+[Packages]

+  MdePkg/MdePkg.dec

+  EmbeddedPkg/EmbeddedPkg.dec

+

+[LibraryClasses]

+  DebugLib

+  MemoryAllocationLib

+  

+  

+[Protocols]

+  

+[Guids]

+ 

+[Pcd]

+

+[Depex]

+  TRUE
\ No newline at end of file