--- /dev/null
+/** @file
+
+ Abstractions for simple OMAP DMA. The DMA functions are modeled on
+ the PCI IO protocol and follow the same rules as outlined in the UEFI specification.
+ OMAP_DMA4 structure elements are described in the OMAP35xx TRM. Currently
+ there is no PCI'less DMA protocol, if one existed it could be used to
+ replace this library.
+
+ 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 __OMAP_DMA_LIB_H__
+#define __OMAP_DMA_LIB_H__
+
+typedef enum {\r
+ ///\r
+ /// A read operation from system memory by a bus master.\r
+ ///\r
+ MapOperationBusMasterRead,\r
+ ///\r
+ /// A write operation from system memory by a bus master.\r
+ ///\r
+ MapOperationBusMasterWrite,\r
+ ///\r
+ /// Provides both read and write access to system memory by both the processor and a\r
+ /// bus master. The buffer is coherent from both the processor's and the bus master's point of view.\r
+ ///\r
+ MapOperationBusMasterCommonBuffer,\r
+ MapOperationMaximum\r
+} DMA_MAP_OPERATION;\r
+
+
+// Example from DMA chapter of the OMAP35xx spec
+typedef struct {\r
+ UINT8 DataType; // DMA4_CSDPi[1:0]\r
+ UINT8 ReadPortAccessType; // DMA4_CSDPi[8:7]\r
+ UINT8 WritePortAccessType; // DMA4_CSDPi[15:14]\r
+ UINT8 SourceEndiansim; // DMA4_CSDPi[21]\r
+ UINT8 DestinationEndianism; // DMA4_CSDPi[19]\r
+ UINT8 WriteMode; // DMA4_CSDPi[17:16]\r
+ UINT8 SourcePacked; // DMA4_CSDPi[6]\r
+ UINT8 DestinationPacked; // DMA4_CSDPi[13]\r
+ UINT32 NumberOfElementPerFrame; // DMA4_CENi\r
+ UINT32 NumberOfFramePerTransferBlock; // DMA4_CFNi\r
+ UINT32 SourceStartAddress; // DMA4_CSSAi\r
+ UINT32 DestinationStartAddress; // DMA4_CDSAi\r
+ UINT32 SourceElementIndex; // DMA4_CSEi\r
+ UINT32 SourceFrameIndex; // DMA4_CSFi\r
+ UINT32 DestinationElementIndex; // DMA4_CDEi\r
+ UINT32 DestinationFrameIndex; // DMA4_CDFi\r
+ UINT8 ReadPortAccessMode; // DMA4_CCRi[13:12]\r
+ UINT8 WritePortAccessMode; // DMA4_CCRi[15:14]\r
+ UINT8 ReadPriority; // DMA4_CCRi[6]\r
+ UINT8 WritePriority; // DMA4_CCRi[23]\r
+ UINT8 ReadRequestNumber; // DMA4_CCRi[4:0]\r
+ UINT8 WriteRequestNumber; // DMA4_CCRi[20:19]
+} OMAP_DMA4;
+
+
+/** \r
+ Configure OMAP DMA Channel\r
+ \r
+ @param Channel DMA Channel to configure\r
+ @param Dma4 Pointer to structure used to initialize DMA registers for the Channel \r
+ \r
+ @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes.\r
+ @retval EFI_INVALID_PARAMETER Channel is not valid\r
+ @retval EFI_DEVICE_ERROR The system hardware could not map the requested information.\r
+ \r
+**/
+EFI_STATUS
+EFIAPI
+EnableDmaChannel (
+ IN UINTN Channel,
+ IN OMAP_DMA4 *Dma4
+ );
+
+/** \r
+ Turn of DMA channel configured by EnableDma().\r
+ \r
+ @param Channel DMA Channel to configure\r
+ \r
+ @retval EFI_SUCCESS DMA hardware disabled\r
+ @retval EFI_INVALID_PARAMETER Channel is not valid\r
+ @retval EFI_DEVICE_ERROR The system hardware could not map the requested information.\r
+ \r
+**/
+EFI_STATUS
+EFIAPI
+DisableDmaChannel (
+ IN UINTN Channel
+ );
+
+
+/** \r
+ Provides the DMA controller-specific addresses needed to access system memory.\r
+ \r
+ Operation is relative to the DMA bus master.\r
+ \r
+ @param Operation Indicates if the bus master is going to read or write to system memory.\r
+ @param HostAddress The system memory address to map to the DMA controller.\r
+ @param NumberOfBytes On input the number of bytes to map. On output the number of bytes\r
+ that were mapped. \r
+ @param DeviceAddress The resulting map address for the bus master controller to use to\r
+ access the hosts HostAddress. \r
+ @param Mapping A resulting value to pass to Unmap().\r
+ \r
+ @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes.\r
+ @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a common buffer. \r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
+ @retval EFI_DEVICE_ERROR The system hardware could not map the requested address.\r
+ \r
+**/
+EFI_STATUS
+EFIAPI
+DmaMap (
+ IN DMA_MAP_OPERATION Operation,
+ IN VOID *HostAddress,\r
+ IN OUT UINTN *NumberOfBytes,\r
+ OUT PHYSICAL_ADDRESS *DeviceAddress,\r
+ OUT VOID **Mapping\r
+ );
+
+
+
+
+/** \r
+ Completes the DmaMapBusMasterRead(), DmaMapBusMasterWrite(), or DmaMapBusMasterCommonBuffer()\r
+ operation and releases any corresponding resources.\r
+ \r
+ @param Mapping The mapping value returned from DmaMap*().\r
+ \r
+ @retval EFI_SUCCESS The range was unmapped.\r
+ @retval EFI_DEVICE_ERROR The data was not committed to the target system memory.\r
+ \r
+**/
+EFI_STATUS
+EFIAPI
+DmaUnmap (
+ IN VOID *Mapping\r
+ );
+
+
+/** \r
+ Allocates pages that are suitable for an DmaMap() of type MapOperationBusMasterCommonBuffer.\r
+ mapping. \r
+ \r
+ @param MemoryType The type of memory to allocate, EfiBootServicesData or\r
+ EfiRuntimeServicesData. \r
+ @param Pages The number of pages to allocate. \r
+ @param HostAddress A pointer to store the base system memory address of the\r
+ allocated range. \r
+\r
+ @retval EFI_SUCCESS The requested memory pages were allocated.\r
+ @retval EFI_UNSUPPORTED Attributes is unsupported. The only legal attribute bits are\r
+ MEMORY_WRITE_COMBINE and MEMORY_CACHED. \r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated. \r
+ \r
+**/
+EFI_STATUS
+EFIAPI
+DmaAllocateBuffer (
+ IN EFI_MEMORY_TYPE MemoryType,
+ IN UINTN Pages,\r
+ OUT VOID **HostAddress\r
+ );\r
+
+
+/** \r
+ Frees memory that was allocated with DmaAllocateBuffer().\r
+ \r
+ @param Pages The number of pages to free. \r
+ @param HostAddress The base system memory address of the allocated range. \r
+ \r
+ @retval EFI_SUCCESS The requested memory pages were freed.\r
+ @retval EFI_INVALID_PARAMETER The memory range specified by HostAddress and Pages\r
+ was not allocated with DmaAllocateBuffer().\r
+ \r
+**/\r
+EFI_STATUS
+EFIAPI
+DmaFreeBuffer (
+ IN UINTN Pages,\r
+ IN VOID *HostAddress\r
+ );\r
+
+
+#endif
+