[PATCH v8 1/2] sDMA: descriptor autoloading feature
Venkatraman S
svenkatr at ti.com
Wed May 5 07:51:51 EDT 2010
On Wed, May 5, 2010 at 3:35 PM, Adrian Hunter <adrian.hunter at nokia.com> wrote:
> Venkatraman S wrote:
>>>
>>> From d46f8a00728cc6c1fbdfce69435759c8cc49f25c Mon Sep 17 00:00:00 2001
>>
>> From: Venkatraman S <svenkatr at ti.com>
>> Date: Thu, 29 Apr 2010 22:34:04 +0530
>> Subject: [PATCH 1/2] sDMA: descriptor autoloading feature
>>
>> Add sDMA driver support for descriptor autoloading feature.
>> Descriptor autoloading is OMAP sDMA v5 hardware capability that can
>> be exploited for scatter gather
>> scenarios, currently available in OMAP3630 and OMAP4430.
>>
>> The feature works as described below.
>> 1) A sDMA channel is programmed to be in 'linked list' mode.
>> 2) The client (sDMA user) provides a list of descriptors in a linked
>> list format.
>> 3) Each of the 'descriptor' (element in the linked list) contains an
>> updated set of DMA
>> configuration register values.
>> 4) Client starts DMA transfer.
>> 5) sDMA controller loads the first element to its register
>> configuration memory and executes the
>> transfer.
>> 6) After completion, loads the next element (in linked list) to
>> configuration memory and executes
>> the transfer, without MCU intervention.
>> 7) Interrupt is generated after all transfers are completed; this
>> can be configured to be done
>> differently.
>>
>> Configurations and additional features
>> 1) Fast mode & non-fast mode
>> Fast mode/non-fast decides on how the first transfer begins.
>> In non-fast mode, the first
>> element in the linked list is loaded only after completing the
>> transfer according to the
>> configurations already in the sDMA channel registers. In fast mode,
>> the loading of the first
>> element precedes the transfer.
>>
>> 2) Pause / resume of transfers
>> A transfer can be paused after a descriptor set has been loaded,
>> provided the 'pause
>> bit' is set in the linked list element.
>> An ongoing transfer cannot be paused. If the 'pause bit' is set,
>> transfer is not
>> started after loading the register set from memory.
>> Such a transfer can be resumed later.
>>
>> 3) Descriptor types
>> 3 possible configurations of descriptors (initialized as linked
>> list elements)
>> are possible. Type 1 provides the maximum flexibility, which
>> contains most
>> register definitions of a DMA logical channel. Fewer options are
>> present in type
>> 2. Type 3 can just modify source/destinations address of transfers.
>> In all
>> transfers, unmodified registers settings are maintained for the
>> next transfer.
>>
>> Patch provides options / API for
>> 1) Setting up a descriptor loading for DMA channel for sg type
>> transfers
>> 2) configuration with linked list elements
>> 3) Starting / pause and resume of the said transfers, query
>> state
>> 4) Clearing the sglist mode
>>
>> Signed-off-by: Venkatraman S <svenkatr at ti.com>
>> CC: Adrian Hunter <adrian.hunter at nokia.com>
>> CC: Madhusudhan C <madhu.cr at ti.com>
>> CC: Shilimkar Santosh <santosh.shilimkar at ti.com>
>> CC: Tony Lindgren <tony at atomide.com>
>> ---
>> Changes from v7:
>> * Added wmb() calls between descriptor data structure update and
>> start/resume of transfer
>> * Added proper commit log about the feature
>>
>> arch/arm/plat-omap/dma.c | 289
>> ++++++++++++++++++++++++++++++++-
>> arch/arm/plat-omap/include/plat/dma.h | 170 +++++++++++++++++++
>> 2 files changed, 458 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
>> index f6c9bdc..d8d4df8 100644
>> --- a/arch/arm/plat-omap/dma.c
>> +++ b/arch/arm/plat-omap/dma.c
>> @@ -46,12 +46,40 @@ enum { DMA_CH_ALLOC_DONE, DMA_CH_PARAMS_SET_DONE,
>> DMA_CH_STARTED,
>> enum { DMA_CHAIN_STARTED, DMA_CHAIN_NOTSTARTED };
>> #endif
>>
>> +/* CDP Register bitmaps */
>> +#define DMA_LIST_CDP_DST_VALID (BIT(0))
>> +#define DMA_LIST_CDP_SRC_VALID (BIT(2))
>> +#define DMA_LIST_CDP_TYPE1 (BIT(4))
>> +#define DMA_LIST_CDP_TYPE2 (BIT(5))
>> +#define DMA_LIST_CDP_TYPE3 (BIT(4) | BIT(5))
>> +#define DMA_LIST_CDP_PAUSEMODE (BIT(7))
>> +#define DMA_LIST_CDP_LISTMODE (BIT(8))
>> +#define DMA_LIST_CDP_FASTMODE (BIT(10))
>> +/* CAPS register bitmaps */
>> +#define DMA_CAPS_SGLIST_SUPPORT (BIT(20))
>> +
>> +#define DMA_LIST_DESC_PAUSE (BIT(0))
>> +#define DMA_LIST_DESC_SRC_VALID (BIT(24))
>> +#define DMA_LIST_DESC_DST_VALID (BIT(26))
>> +#define DMA_LIST_DESC_BLK_END (BIT(28))
>> +
>
> The () are not needed around BIT()
OK
>
>> #define OMAP_DMA_ACTIVE 0x01
>> #define OMAP2_DMA_CSR_CLEAR_MASK 0xffe
>>
>> #define OMAP_FUNC_MUX_ARM_BASE (0xfffe1000 + 0xec)
>> +#define OMAP_DMA_INVALID_FRAME_COUNT (0xffff)
>> +#define OMAP_DMA_INVALID_ELEM_COUNT (0xffffff)
>> +#define OMAP_DMA_INVALID_DESCRIPTOR_POINTER (0xfffffffc)
>
> The () are not needed around literals
>
OK
>>
>> static int enable_1510_mode;
>> +static int dma_caps0_status;
>> +
More information about the linux-arm-kernel
mailing list