| Index: arch/arm/mach-tegra/nv/include/nvrm_dma.h
|
| diff --git a/arch/arm/mach-tegra/nv/include/nvrm_dma.h b/arch/arm/mach-tegra/nv/include/nvrm_dma.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2ff199ae03f5edd9e44cc630c4ec90474c918e97
|
| --- /dev/null
|
| +++ b/arch/arm/mach-tegra/nv/include/nvrm_dma.h
|
| @@ -0,0 +1,384 @@
|
| +/*
|
| + * Copyright (c) 2009 NVIDIA Corporation.
|
| + * All rights reserved.
|
| + *
|
| + * Redistribution and use in source and binary forms, with or without
|
| + * modification, are permitted provided that the following conditions are met:
|
| + *
|
| + * Redistributions of source code must retain the above copyright notice,
|
| + * this list of conditions and the following disclaimer.
|
| + *
|
| + * Redistributions in binary form must reproduce the above copyright notice,
|
| + * this list of conditions and the following disclaimer in the documentation
|
| + * and/or other materials provided with the distribution.
|
| + *
|
| + * Neither the name of the NVIDIA Corporation nor the names of its contributors
|
| + * may be used to endorse or promote products derived from this software
|
| + * without specific prior written permission.
|
| + *
|
| + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
| + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
| + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
| + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
| + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
| + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
| + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
| + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
| + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
| + * POSSIBILITY OF SUCH DAMAGE.
|
| + *
|
| + */
|
| +
|
| +#ifndef INCLUDED_nvrm_dma_H
|
| +#define INCLUDED_nvrm_dma_H
|
| +
|
| +
|
| +#if defined(__cplusplus)
|
| +extern "C"
|
| +{
|
| +#endif
|
| +
|
| +#include "nvrm_module.h"
|
| +#include "nvrm_init.h"
|
| +
|
| +/**
|
| + * @file
|
| + * @brief <b>nVIDIA Driver Development Kit:
|
| + * DMA Resource manager </b>
|
| + *
|
| + * @b Description: Defines the interface to the NvRM DMA.
|
| + *
|
| + */
|
| +
|
| +/**
|
| + * @defgroup nvrm_dma Direct Memory Access (DMA) Controller API
|
| + *
|
| + * This is the Dma interface. These API provides the data transfer from memory
|
| + * to the selected destination and vice versa. The one end is the memory and
|
| + * other end is the module selected by the dma module Id.
|
| + * This API allocates the channel based on priority request. Higher priority
|
| + * channel can not be shared by other dma requestors. The low priority channel
|
| + * is shared between the different requestors.
|
| + *
|
| + * @ingroup nvddk_rm
|
| + *
|
| + * @{
|
| + */
|
| +
|
| +#include "nvos.h"
|
| +
|
| +/**
|
| + * NvRmDmaHandle is an opaque context to the NvRmDmaRec interface
|
| + */
|
| +
|
| +typedef struct NvRmDmaRec *NvRmDmaHandle;
|
| +
|
| +/**
|
| + * @brief Defines the DMA capability structure for getting the capability of
|
| + * the data transfer and any limitation if the dma manager have.
|
| + */
|
| +
|
| +typedef struct NvRmDmaCapabilitiesRec
|
| +{
|
| +
|
| + /// Holds the granularity of the data length for dma transfer in bytes
|
| + NvU32 DmaGranularitySize;
|
| +
|
| + /// Holds the information if there is any address alignment limitation
|
| + /// is available in term of bytes. if this value is 1 then there is no
|
| + /// limitation, any dma can transfer the data from any address. If this
|
| + /// value is 2 then the address should be 2 byte aligned always to do
|
| + /// the dma transfer. If this value is 4
|
| + /// then the address should be 4 byte aligned always to do the dma
|
| + /// transfer.
|
| + NvU32 DmaAddressAlignmentSize;
|
| +} NvRmDmaCapabilities;
|
| +
|
| +/**
|
| + * @brief Defines the DMA client buffer information which is transferred
|
| + * recently. The direction of data transfer decides based on this address. The
|
| + * source address and destination address should be in line with the source
|
| + * module Id and destination module Id.
|
| + */
|
| +
|
| +typedef struct NvRmDmaClientBufferRec
|
| +{
|
| +
|
| + /// Specifies the dma source buffer physical address for dma transfer.
|
| + NvRmPhysAddr SourceBufferPhyAddress;
|
| +
|
| + /// Specifies the dma destination buffer physical address for dma transfer.
|
| + NvRmPhysAddr DestinationBufferPhyAddress;
|
| +
|
| + /// Source address wrap size in bytes. It tells that after how much bytes,
|
| + /// it will be wrapped.
|
| + /// If it is zero then wrapping for source address is disabled.
|
| + NvU32 SourceAddressWrapSize;
|
| +
|
| + /// Destination address wrap size in bytes. It tells that after how much
|
| + /// bytes, it will be wrapped. If it is zero then wrapping for destination
|
| + /// address is disabled.
|
| + NvU32 DestinationAddressWrapSize;
|
| +
|
| + /// Specifies the size of the buffer in bytes which is requested for
|
| + /// transfer.
|
| + NvU32 TransferSize;
|
| +} NvRmDmaClientBuffer;
|
| +
|
| +/**
|
| + * @brief Specify the name of modules which can be supported by nvrm dma
|
| + * drivers. These dma modules can be either source or destination based on
|
| + * direction.
|
| + */
|
| +
|
| +typedef enum
|
| +{
|
| +
|
| + /// Specifies the dma module Id as Invalid
|
| + NvRmDmaModuleID_Invalid = 0x0,
|
| +
|
| + /// Specifies the dma module Id for memory
|
| + NvRmDmaModuleID_Memory,
|
| +
|
| + /// Specifies the dma module Id for I2s controller.
|
| + NvRmDmaModuleID_I2s,
|
| +
|
| + /// Specifies the dma module Id for Ac97 controller.
|
| + NvRmDmaModuleID_Ac97,
|
| +
|
| + /// Specifies the dma module Id for Spdif controller.
|
| + NvRmDmaModuleID_Spdif,
|
| +
|
| + /// Specifies the dma module Id for uart controller.
|
| + NvRmDmaModuleID_Uart,
|
| +
|
| + /// Specifies the dma module Id for Vfir controller.
|
| + NvRmDmaModuleID_Vfir,
|
| +
|
| + /// Specifies the dma module Id for Mipi controller.
|
| + NvRmDmaModuleID_Mipi,
|
| +
|
| + /// Specifies the dma module Id for spi controller.
|
| + NvRmDmaModuleID_Spi,
|
| +
|
| + /// Specifies the dma module Id for slink controller.
|
| + NvRmDmaModuleID_Slink,
|
| +
|
| + /// Specifies the dma module Id for I2c controller.
|
| + NvRmDmaModuleID_I2c,
|
| +
|
| + /// Specifies the dma module Id for Dvc I2c controller.
|
| + NvRmDmaModuleID_Dvc,
|
| +
|
| + /// Specifies the maximum number of modules supported.
|
| + NvRmDmaModuleID_Max,
|
| + NvRmDmaModuleID_Num,
|
| + NvRmDmaModuleID_Force32 = 0x7FFFFFFF
|
| +} NvRmDmaModuleID;
|
| +
|
| +/**
|
| + * @brief Specify the direction of the transfer, either outbound data
|
| + * (source -> dest) or inboud data (source <- dest)
|
| + */
|
| +
|
| +typedef enum
|
| +{
|
| +
|
| + /// Specifies the direction of the transfer to be srcdevice -> dstdevice
|
| + NvRmDmaDirection_Forward = 0x1,
|
| +
|
| + /// Specifies the direction of the transfer to be dstdevice -> srcdevice
|
| + NvRmDmaDirection_Reverse,
|
| + NvRmDmaDirection_Num,
|
| + NvRmDmaDirection_Force32 = 0x7FFFFFFF
|
| +} NvRmDmaDirection;
|
| +
|
| +/**
|
| + * @brief Specify the priority of the dma either low priority or high priority.
|
| + */
|
| +
|
| +typedef enum
|
| +{
|
| +
|
| + /// Low priority DMA, no guarantee of latency to start transactions
|
| + NvRmDmaPriority_Low = 0x1,
|
| +
|
| + /// High priority DMA guarantees the first buffer you send the
|
| + /// NvRmDmaStartDmaTransfer() will begin immediately.
|
| + NvRmDmaPriority_High,
|
| + NvRmDmaPriority_Num,
|
| + NvRmDmaPriority_Force32 = 0x7FFFFFFF
|
| +} NvRmDmaPriority;
|
| +
|
| +/**
|
| + * @brief Get the capabilities of the dma channels.
|
| + *
|
| + * @param hDevice Handle to RM device.
|
| + * @param pRmDmaCaps Pointer to the capability structure where the cpas value
|
| + * will be stored.
|
| + *
|
| + * @retval NvSuccess Indicates the function completed successfully.
|
| + */
|
| +
|
| + NvError NvRmDmaGetCapabilities(
|
| + NvRmDeviceHandle hDevice,
|
| + NvRmDmaCapabilities * pRmDmaCaps );
|
| +
|
| +/**
|
| + * @brief Allocate the DMA channel for the data transfer. The dma is allocated
|
| + * based on the dma device Id information. Most of the configuration is also
|
| + * done based on the source/destination device Id during the channel
|
| + * allocation. It initializes the channel also with standard configuration
|
| + * based on source/ destination device. The data is transferred from memory to
|
| + * the dma requestor device or vice versa. The dma requestors device can be
|
| + * memory or any peripheral device listed in the NvRmDmaDeviceId.
|
| + *
|
| + * Assert encountered in debug mode if passed parameter is invalid.
|
| + *
|
| + * @param hRmDevice Handle to RM device.
|
| + * @param phDma Pointer to the dma handle where the allocated dma handle
|
| + * will be stored.
|
| + * @param Enable32bitSwap if set to NV_TRUE will unconditionally reverse the
|
| + * memory order of bytes on 4-byte chunks. D3:D2:D1:D0 becomes D0:D1:D2:D3
|
| + * @param Priority Selects either Hi or Low priority. A Low priority
|
| + * allocation will only fail if the system is out of memory, and transfers on a
|
| + * Low priority channel will be intermixed with other clients of that channel.
|
| + * Hi priority allocations may fail if there is not a dedicated channel
|
| + * available for the Hi priority client. Hi priority channels should only be
|
| + * used if you have very specific latency requirements.
|
| + * @param DmaRequestorModuleId Specifies a source module Id.
|
| + * @param DmaRequestorInstanceId Specifies the instance of the source module.
|
| + *
|
| + * @retval NvSuccess Indicates the function completed successfully.
|
| + * @retval NvDMAChannelNotAvailable Indicates that there is no channel
|
| + * available for allocation.
|
| + * @retval NvError_InsufficientMemory Indicates that it will not able to
|
| + * allocate the memory for dma handles.
|
| + * @retval NvDMAInvalidSourceId Indicates that device requested is not the
|
| + * valid device.
|
| + * @retval NvError_MemoryMapFailed Indicates that the memory mapping for
|
| + * controller register failed.
|
| + * @retval NvError_MutexCreateFailed Indicates that the creation of mutex
|
| + * failed. Mutex is required to provide the thread safety.
|
| + * @retval NvError_SemaphoreCreateFailed Indicates that the creation of
|
| + * semaphore failed. Semaphore is required to provide the synchronization and
|
| + * also used in synchronous operation.
|
| + *
|
| + */
|
| +
|
| + NvError NvRmDmaAllocate(
|
| + NvRmDeviceHandle hRmDevice,
|
| + NvRmDmaHandle * phDma,
|
| + NvBool Enable32bitSwap,
|
| + NvRmDmaPriority Priority,
|
| + NvRmDmaModuleID DmaRequestorModuleId,
|
| + NvU32 DmaRequestorInstanceId );
|
| +
|
| +/**
|
| + * Frees the channel so that it can be reused by other clients. This function
|
| + * will block until all currently enqueued transfers complete.
|
| + *
|
| + * @note: We may change the functionality so that Free() returns immediately
|
| + * but internally the channel remains in an alloc'd state until all transfers
|
| + * complete.
|
| + *
|
| + * @param hDma A DMA handle from NvRmDmaAllocate. If hDma is NULL, this API has
|
| + * no effect.
|
| + */
|
| +
|
| + void NvRmDmaFree(
|
| + NvRmDmaHandle hDma );
|
| +
|
| +/**
|
| + * @brief Starts the DMA channel for data transfer.
|
| + *
|
| + * Assert encountered in debug mode if passed parameter is invalid.
|
| + *
|
| + * @param hDma Specifies a DMA handle which is allocated by the Rm dma from
|
| + * NvRmDmaAllocate.
|
| + * @param pClientBuffer Specifies a pointer to the client information which
|
| + * contains the start buffer, destination buffer, and number of bytes
|
| + * transferred.
|
| + * @param DmaDirection Specifies whether the transfer is Forward src->dst or
|
| + * Reverse dst->src direction.
|
| + * @param WaitTimeoutInMilliSecond The time need to wait in milliseconds. If it
|
| + * is zero then it will be returned immediately as asynchronous operation. If
|
| + * is non zero then it will wait for a requested timeout. If it is
|
| + * NV_WAIT_INFINITE then it will wait for infinitely till transaction
|
| + * completes.
|
| + * @param AsynchSemaphoreId The semaphore Id which need to be signal if client
|
| + * is requested for asynchronous operation. Pass NULL if not semaphore should
|
| + * be signalled when the transfer is complete.
|
| + *
|
| + * @retval NvSuccess Indicates the function completed successfully.
|
| + * @retval NvError_InvalidAddress Indicates that the address for source or
|
| + * destination is invalid.
|
| + * @retval NvError_InvalidSize Indicates that the bytes requested is invalid.
|
| + * @retval NvError_Timeout Indicates that transfer is not completed in a
|
| + * expected time and timeout happen.
|
| + */
|
| +
|
| + NvError NvRmDmaStartDmaTransfer(
|
| + NvRmDmaHandle hDma,
|
| + NvRmDmaClientBuffer * pClientBuffer,
|
| + NvRmDmaDirection DmaDirection,
|
| + NvU32 WaitTimeoutInMilliSecond,
|
| + NvOsSemaphoreHandle AsynchSemaphoreId );
|
| +
|
| +/**
|
| + * @brief Aborts the currently running transfer as well as any other transfers
|
| + * that are queued up behind the currently running transfer.
|
| + *
|
| + * @param hDma Specifies a DMA handle which is allocated by the Rm dma from
|
| + * NvRmDmaAllocate.
|
| + */
|
| +
|
| + void NvRmDmaAbort(
|
| + NvRmDmaHandle hDma );
|
| +
|
| +/**
|
| + * @brief Get the number of bytes transferred by the dma in current tranaction
|
| + * from the last.
|
| + *
|
| + * This will tell the number of bytes has been transferred by the dma yet from
|
| + * the last transfer completes.
|
| + *
|
| + * @param hDma Specifies a DMA handle which is allocated by the Rm dma from
|
| + * NvRmDmaAllocate.
|
| + * @param pTransferCount Pointer to the variable where number of bytes transferred
|
| + * by dma will be stored.
|
| + * @param IsTransferStop Tells whether the current transfer is stopped or not.
|
| + *
|
| + * @retval NvSuccess Indicates the function completed successfully.
|
| + * @retval NvError_InvalidState The transfer is not going on.
|
| + */
|
| +
|
| + NvError NvRmDmaGetTransferredCount(
|
| + NvRmDmaHandle hDma,
|
| + NvU32 * pTransferCount,
|
| + NvBool IsTransferStop );
|
| +
|
| +/**
|
| + * @brief Tells whether the transfer is completed or not for the given dma transfer.
|
| + *
|
| + * This will tells the first or second half of the buffer transfer for the requestor
|
| + * who uses the double buffering mechanism like i2s.
|
| + *
|
| + * @param hDma Specifies a DMA handle which is allocated by the Rm dma from
|
| + * NvRmDmaAllocate.
|
| + * @param IsFirstHalfBuffer Tells whether the first half or second half of the dma transfer.
|
| + *
|
| + * @retval NV_TRUE indicates that the transfre has been completed.
|
| + * @retval NV_FALSE Indicates that the transfre is going on.
|
| + */
|
| +
|
| + NvBool NvRmDmaIsDmaTransferCompletes(
|
| + NvRmDmaHandle hDma,
|
| + NvBool IsFirstHalfBuffer );
|
| +
|
| +#if defined(__cplusplus)
|
| +}
|
| +#endif
|
| +
|
| +#endif
|
|
|