[alsa-devel] [PATCH v2 1/6] dma: Indicate residue granularity in dma_slave_caps

Lars-Peter Clausen lars at metafoo.de
Fri Jan 10 10:52:22 CET 2014


On 01/09/2014 04:08 PM, Vinod Koul wrote:
> On Mon, Jan 06, 2014 at 11:45:57AM +0100, Lars-Peter Clausen wrote:
>> This patch adds a new field to the dma_slave_caps struct which indicates the
>> granularity with which the driver is able to update the residue field of the
>> dma_tx_state struct. Making this information available to dmaengine users allows
>> them to make better decisions on how to operate. E.g. for audio certain features
>> like wakeup less operation or timer based scheduling only make sense and work
>> correctly if the reported residue is fine-grained enough.
>>
>> Right now four different levels of granularity are supported:
>> 	* DESCRIPTOR: The DMA channel is only able to tell whether a descriptor has
>> 	  been completed or not, which means residue reporting is not supported by
>> 	  this channel. The residue field of the dma_tx_state field will always be
>> 	  0.
>> 	* SEGMENT: The DMA channel updates the residue field after each successfully
>> 	  completed segment of the transfer (For cyclic transfers this is after each
>> 	  period). This is typically implemented by having the hardware generate an
>> 	  interrupt after each transferred segment and then the drivers updates the
>> 	  outstanding residue by the size of the segment. Another possibility is if
>> 	  the hardware supports SG and the segment descriptor has a field which gets
>> 	  set after the segment has been completed. The driver then counts the
>> 	  number of segments without the flag set to compute the residue.
>> 	* BURST: The DMA channel updates the residue field after each transferred
>> 	  burst. This is typically only supported if the hardware has a progress
>> 	  register of some sort (E.g. a register with the current read/write address
>> 	  or a register with the amount of bursts/beats/bytes that have been
>> 	  transferred or still need to be transferred).
>>
>> Signed-off-by: Lars-Peter Clausen <lars at metafoo.de>
>> ---
>> Changes since v1:
>> 	* Drop BYTE granularity level as there has been consent that it is not
>> 	  really useful.
>> ---
>>  include/linux/dmaengine.h | 15 +++++++++++++++
>>  1 file changed, 15 insertions(+)
>>
>> diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
>> index ed92b30..74d5cb2 100644
>> --- a/include/linux/dmaengine.h
>> +++ b/include/linux/dmaengine.h
>> @@ -364,6 +364,19 @@ struct dma_slave_config {
>>  	unsigned int slave_id;
>>  };
>>  
>> +/**
>> + * enum dma_residue_granularity - Granularity of the reported transfer residue
>> + * @DMA_RESIDUE_GRANULATRITY_DESCRIPTOR: Residue reporting is not supported.
>> + * @DMA_RESIDUE_GRANULATRITY_SEGMENT: Residue is updated with each completed
>> + *  segment in the descriptor.
>> + * @DMA_RESIDUE_GRANULATRITY_BURST: Residue is updated with each transfered burst
>> + */
>> +enum dma_residue_granularity {
>> +	DMA_RESIDUE_GRANULARITY_DESCRIPTOR = 0,
>> +	DMA_RESIDUE_GRANULARITY_SEGMENT = 1,
>> +	DMA_RESIDUE_GRANULARITY_BURST = 2,
> This is too longish macro :) Cna we just have DMA_RESIDUE_XXXX. Do we really
> need granularity?

How about DMA_RSD_GRNLRTY? ;)

I'd prefer to keep the name as it is. In my opinion the intuitive meaning
changes completely if you leave out the "granularity".

> 
> Also segment is not too obvious, block is genrally used in DMA controllers for
> this, though not too relgious about it!
> 

I'd like to stick with the kernel terminology.

> Can you also add bit more detail in enum descriptions. Move a bit from patch
> description above :)

Ok.

> 
> 
>> +};
>> +
>>  /* struct dma_slave_caps - expose capabilities of a slave channel only
>>   *
>>   * @src_addr_widths: bit mask of src addr widths the channel supports
>> @@ -374,6 +387,7 @@ struct dma_slave_config {
>>   * 	should be checked by controller as well
>>   * @cmd_pause: true, if pause and thereby resume is supported
>>   * @cmd_terminate: true, if terminate cmd is supported
>> + * @residue_granularity: granularity of the reported transfer residue
>>   */
>>  struct dma_slave_caps {
>>  	u32 src_addr_widths;
>> @@ -381,6 +395,7 @@ struct dma_slave_caps {
>>  	u32 directions;
>>  	bool cmd_pause;
>>  	bool cmd_terminate;
>> +	enum dma_residue_granularity residue_granularity;
> enum dma_residue granularity; would be fine too...
> 
> --
> ~Vinod
> --
> To unsubscribe from this list: send the line "unsubscribe dmaengine" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 



More information about the Alsa-devel mailing list