Re: [PATCH 1/3] DMAENGINE: generic slave channel control
From: Dan Williams
Date: Mon Jul 19 2010 - 18:51:31 EST
On Mon, Jul 19, 2010 at 3:44 PM, Linus Walleij
<linus.ml.walleij@xxxxxxxxx> wrote:
> 2010/7/19 Dan Williams <dan.j.williams@xxxxxxxxx>:
>
>> The recently submitted intel_mid driver [1] seems to have a similar structure:
>
> This is very interesting, let's examine this closely as a comparison!
> I'm looking at it from the point of a generic slave control mechanism,
> though I suspect it is designed to be Intel-specific so keep that in mind.
>
>> +/**
>> + * struct intel_mid_dma_slave - DMA slave structure
>> + *
>> + * @dma_dev: DMA master client
>> + * @tx_reg: physical address of data register used for
>> + * memory-to-peripheral transfers
>> + * @rx_reg: physical address of data register used for
>> + * peripheral-to-memory transfers
>> + * @tx_width: tx register width
>> + * @rx_width: rx register width
>> + * @dirn: DMA trf direction
>> + * @cfg_hi: Platform-specific initializer for the CFG_HI register
>> + * @cfg_lo: Platform-specific initializer for the CFG_LO register
>> + * @ tx_width: width of src and dstn
>> + * @ hs_mode: SW or HW handskaking mode
>> + * @ cfg_mode: Mode configuration, DMA mem to mem to dev & mem
>> + */
>> +struct intel_mid_dma_slave {
>> + enum dma_data_direction dirn;
>> + enum intel_mid_dma_width src_width; /*width of DMA src txn*/
>> + enum intel_mid_dma_width dst_width; /*width of DMA dst txn*/
>> + enum intel_mid_dma_hs_mode hs_mode; /*handshaking*/
>> + enum intel_mid_dma_mode cfg_mode; /*mode configuration*/
>> + enum intel_mid_dma_msize src_msize; /*size if src burst*/
>> + enum intel_mid_dma_msize dst_msize; /*size of dst burst*/
>> + dma_async_tx_callback callback; /*callback function*/
>> + void *callback_param; /*param for callback*/
>> + unsigned int device_instance; /*0, 1 for periphral instance*/
>> +};
>> +
>
> kerneldoc and struct members seem to be out-of-sync but I
> see the general idea.
>
> Of these members handshaking, cfg_mode, hs_mode
> and I suspect also device_instance are candidates for
> the private config since they cannot be assumed to
> exist on all DMA engines. (Also goes for cfg_[lo|hi] from
> the kerneldoc)
>
> The callback and callback param are configured
> per-transfer in the current API, so I don't see what they
> are doing here at all.
Yeah, I already pointed that out...
>
> Remains: direction, then register address, burstsize and
> word width of the source and destination.
>
> (Register address present in kerneldoc but not in struct,
> burstsize present in struct but not in kerneldoc, whatever)
>
> I don't have src/dst pairs in my API, because since the
> only data provision mechanisms to slaves are sglists,
> and these provide either source or destination address
> depending on transfer direction.
>
> Also I assume that since sglists will be mem->peripheral
> or peripheral->mem, you know what is required on the
> memory side of things for word width and burstsize, and
> these only affect the device side of things.
>
> So that is why my API is more minimalistic.
>
> If you feel src/dst versions of wordwidth, register address
> and burstsize are a must, I can add them, no big thing,
> just makes for some nonused parameters, mostly.
Unused parameters is what I want to avoid, and getting drivers that
can wrap dma_slave_config to actually do so is the final kicker.
Thoughts Vinod?
Thanks,
Dan
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/