/** @file

  Abstractions for simple OMAP DMA.
  OMAP_DMA4 structure elements are described in the OMAP35xx TRM.

  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__


// Example from DMA chapter of the OMAP35xx spec
typedef struct {
  UINT8     DataType;                      // DMA4_CSDPi[1:0]
  UINT8     ReadPortAccessType;            // DMA4_CSDPi[8:7]
  UINT8     WritePortAccessType;           // DMA4_CSDPi[15:14]
  UINT8     SourceEndiansim;               // DMA4_CSDPi[21]
  UINT8     DestinationEndianism;          // DMA4_CSDPi[19]
  UINT8     WriteMode;                     // DMA4_CSDPi[17:16]
  UINT8     SourcePacked;                  // DMA4_CSDPi[6]
  UINT8     DestinationPacked;             // DMA4_CSDPi[13]
  UINT32    NumberOfElementPerFrame;       // DMA4_CENi
  UINT32    NumberOfFramePerTransferBlock; // DMA4_CFNi
  UINT32    SourceStartAddress;            // DMA4_CSSAi
  UINT32    DestinationStartAddress;       // DMA4_CDSAi
  UINT32    SourceElementIndex;            // DMA4_CSEi
  UINT32    SourceFrameIndex;              // DMA4_CSFi
  UINT32    DestinationElementIndex;       // DMA4_CDEi
  UINT32    DestinationFrameIndex;         // DMA4_CDFi
  UINT8     ReadPortAccessMode;            // DMA4_CCRi[13:12]
  UINT8     WritePortAccessMode;           // DMA4_CCRi[15:14]
  UINT8     ReadPriority;                  // DMA4_CCRi[6]
  UINT8     WritePriority;                 // DMA4_CCRi[23]
  UINT8     ReadRequestNumber;             // DMA4_CCRi[4:0]
  UINT8     WriteRequestNumber;            // DMA4_CCRi[20:19]
} OMAP_DMA4;


/**
  Configure OMAP DMA Channel

  @param  Channel               DMA Channel to configure
  @param  Dma4                  Pointer to structure used to initialize DMA registers for the Channel

  @retval EFI_SUCCESS           The range was mapped for the returned NumberOfBytes.
  @retval EFI_INVALID_PARAMETER Channel is not valid
  @retval EFI_DEVICE_ERROR      The system hardware could not map the requested information.

**/
EFI_STATUS
EFIAPI
EnableDmaChannel (
  IN  UINTN       Channel,
  IN  OMAP_DMA4   *Dma4
  );

/**
  Turn of DMA channel configured by EnableDma().

  @param  Channel               DMA Channel to configure
  @param  SuccesMask            Bits in DMA4_CSR register indicate EFI_SUCCESS
  @param  ErrorMask             Bits in DMA4_CSR register indicate EFI_DEVICE_ERROR

  @retval EFI_SUCCESS           DMA hardware disabled
  @retval EFI_INVALID_PARAMETER Channel is not valid
  @retval EFI_DEVICE_ERROR      The system hardware could not map the requested information.

**/
EFI_STATUS
EFIAPI
DisableDmaChannel (
  IN  UINTN       Channel,
  IN  UINT32      SuccessMask,
  IN  UINT32      ErrorMask
  );



#endif

