summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/nv/include/nvrm_dma.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-tegra/nv/include/nvrm_dma.h')
-rw-r--r--arch/arm/mach-tegra/nv/include/nvrm_dma.h384
1 files changed, 384 insertions, 0 deletions
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 000000000000..2ff199ae03f5
--- /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