RE: [PATCH 3/4] Extend the DMA-engine API.
Hi, Dan, Thanks! I get it. It's so lucky we have the same target. When your patch could be accepted? Cheers, Wei. > -Original Message- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of Dan Williams > Sent: Thursday, July 12, 2007 12:57 AM > To: Zhang Wei-r63237 > Cc: [EMAIL PROTECTED]; [EMAIL PROTECTED]; > [EMAIL PROTECTED]; [EMAIL PROTECTED]; > linux-kernel@vger.kernel.org; [EMAIL PROTECTED] > Subject: Re: [PATCH 3/4] Extend the DMA-engine API. > > On 7/11/07, Zhang Wei-r63237 <[EMAIL PROTECTED]> wrote: > > Hi, Dan, > > > > Do you mention here: > http://marc.info/?l=linux-raid&m=118290909614463&w=2 ? > > I see the async_tx is located at crypto/ of the above page, > but my patch is for DMA engine in drivers/dma and for DMA > engine driver. > > > > Thanks! > > Wei. > > Hi Wei, > > I was referring to: > http://marc.info/?l=linux-raid&m=118290909528910&w=2 > > async_tx is an api that exploits the raw capabilities of the new > dmaengine interface. For your case when the existing api calls do not > provide the proper interface you can open code something like the > following: > > tx = dev->device_prep_dma_(chan, len, int_flag) > tx->tx_set_src(dma_addr_t, tx, index /* for multi-source ops */) > tx->tx_set_dest(dma_addr_t, tx, index) > tx->tx_submit(tx) > > The expectation is that the most common usages of dmaengines will use > async_tx calls, or the 'dma_async_memcpy_foo_to_bar' helper routines. > > -- > Dan > - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 3/4] Extend the DMA-engine API.
On 7/11/07, Zhang Wei-r63237 <[EMAIL PROTECTED]> wrote: Hi, Dan, Do you mention here: http://marc.info/?l=linux-raid&m=118290909614463&w=2 ? I see the async_tx is located at crypto/ of the above page, but my patch is for DMA engine in drivers/dma and for DMA engine driver. Thanks! Wei. Hi Wei, I was referring to: http://marc.info/?l=linux-raid&m=118290909528910&w=2 async_tx is an api that exploits the raw capabilities of the new dmaengine interface. For your case when the existing api calls do not provide the proper interface you can open code something like the following: tx = dev->device_prep_dma_(chan, len, int_flag) tx->tx_set_src(dma_addr_t, tx, index /* for multi-source ops */) tx->tx_set_dest(dma_addr_t, tx, index) tx->tx_submit(tx) The expectation is that the most common usages of dmaengines will use async_tx calls, or the 'dma_async_memcpy_foo_to_bar' helper routines. -- Dan - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
RE: [PATCH 3/4] Extend the DMA-engine API.
Hi, Dan, Do you mention here: http://marc.info/?l=linux-raid&m=118290909614463&w=2 ? I see the async_tx is located at crypto/ of the above page, but my patch is for DMA engine in drivers/dma and for DMA engine driver. Thanks! Wei. > -Original Message- > Subject: Re: [PATCH 3/4] Extend the DMA-engine API. > > On 7/10/07, Zhang Wei <[EMAIL PROTECTED]> wrote: > > Add channel wait queue and transfer callback dma_xfer_callback(). > > If the DMA controller and driver support interrupt, when the > > transfer is finished, it will wakeup the wait queue > > and call the callback function of the channel. > > > > Add dma_async_raw_xfer() to API and device_raw_xfer() to > struct dma_device > > for RAW physical address DMA transfer, which will be used > at transfer > > between I/O address and memory address. > > > > Please review the async_tx API patch series[1], it should meet your > needs. What you call "raw" mode support is now default for the > dmaengine driver interface. I plan to request that this series be > merged for 2.6.23. > > Regards, > Dan > > [1]http://marc.info/?l=linux-raid&w=2&r=1&s=md-accel&q=b > - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 3/4] Extend the DMA-engine API.
On 7/10/07, Zhang Wei <[EMAIL PROTECTED]> wrote: Add channel wait queue and transfer callback dma_xfer_callback(). If the DMA controller and driver support interrupt, when the transfer is finished, it will wakeup the wait queue and call the callback function of the channel. Add dma_async_raw_xfer() to API and device_raw_xfer() to struct dma_device for RAW physical address DMA transfer, which will be used at transfer between I/O address and memory address. Please review the async_tx API patch series[1], it should meet your needs. What you call "raw" mode support is now default for the dmaengine driver interface. I plan to request that this series be merged for 2.6.23. Regards, Dan [1]http://marc.info/?l=linux-raid&w=2&r=1&s=md-accel&q=b - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 3/4] Extend the DMA-engine API.
On Tue, 10 Jul 2007 17:45:11 +0800 Zhang Wei wrote: > Add channel wait queue and transfer callback dma_xfer_callback(). > If the DMA controller and driver support interrupt, when the > transfer is finished, it will wakeup the wait queue > and call the callback function of the channel. > > Add dma_async_raw_xfer() to API and device_raw_xfer() to struct dma_device > for RAW physical address DMA transfer, which will be used at transfer > between I/O address and memory address. > > Signed-off-by: Zhang Wei <[EMAIL PROTECTED]> > --- > include/linux/dmaengine.h | 35 +++ > 1 files changed, 35 insertions(+), 0 deletions(-) > /** > + * dma_async_raw_xfer - transfor data between physical addresses with > callback transfer > + * @chan: DMA channel to be used > + * @dest: destination address (physical) > + * @src: source address (physical) > + * @len: length > + */ > +static inline dma_cookie_t dma_async_raw_xfer(struct dma_chan *chan, > + dma_addr_t dest, dma_addr_t src, size_t len, > + dma_xfer_callback cb, void *data) > +{ --- ~Randy *** Remember to use Documentation/SubmitChecklist when testing your code *** - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 3/4] Extend the DMA-engine API.
Add channel wait queue and transfer callback dma_xfer_callback(). If the DMA controller and driver support interrupt, when the transfer is finished, it will wakeup the wait queue and call the callback function of the channel. Add dma_async_raw_xfer() to API and device_raw_xfer() to struct dma_device for RAW physical address DMA transfer, which will be used at transfer between I/O address and memory address. Signed-off-by: Zhang Wei <[EMAIL PROTECTED]> --- include/linux/dmaengine.h | 35 +++ 1 files changed, 35 insertions(+), 0 deletions(-) diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index c94d8f1..d9dfc57 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -28,6 +28,7 @@ #include #include #include +#include /** * enum dma_event - resource PNP/power managment events @@ -108,6 +109,8 @@ struct dma_chan { struct list_head client_node; struct list_head device_node; struct dma_chan_percpu *local; + + wait_queue_head_t wait_q; }; void dma_chan_cleanup(struct kref *kref); @@ -138,6 +141,12 @@ static inline void dma_chan_put(struct dma_chan *chan) typedef void (*dma_event_callback) (struct dma_client *client, struct dma_chan *chan, enum dma_event event); +/* + * typedef dma_xfer_callback + * - function pointer to a DMA transfer callback when finished + */ +typedef void (*dma_xfer_callback) (struct dma_chan *chan, void *data); + /** * struct dma_client - info on the entity making use of DMA services * @event_callback: func ptr to call when something happens @@ -187,6 +196,9 @@ struct dma_device { int (*device_alloc_chan_resources)(struct dma_chan *chan); void (*device_free_chan_resources)(struct dma_chan *chan); + dma_cookie_t (*device_raw_xfer)(struct dma_chan *chan, + dma_addr_t dest, dma_addr_t src, size_t len, + dma_xfer_callback cb, void *data); dma_cookie_t (*device_memcpy_buf_to_buf)(struct dma_chan *chan, void *dest, void *src, size_t len); dma_cookie_t (*device_memcpy_buf_to_pg)(struct dma_chan *chan, @@ -209,6 +221,29 @@ void dma_async_client_chan_request(struct dma_client *client, unsigned int number); /** + * dma_async_raw_xfer - transfor data between physical addresses with callback + * @chan: DMA channel to be used + * @dest: destination address (physical) + * @src: source address (physical) + * @len: length + */ +static inline dma_cookie_t dma_async_raw_xfer(struct dma_chan *chan, + dma_addr_t dest, dma_addr_t src, size_t len, + dma_xfer_callback cb, void *data) +{ + int cpu = get_cpu(); + per_cpu_ptr(chan->local, cpu)->bytes_transferred += len; + per_cpu_ptr(chan->local, cpu)->memcpy_count++; + put_cpu(); + + if (chan->device->device_raw_xfer) + return chan->device->device_raw_xfer(chan, dest, src, len, + cb, data); + else + return -EPERM; +} + +/** * dma_async_memcpy_buf_to_buf - offloaded copy between virtual addresses * @chan: DMA channel to offload copy to * @dest: destination address (virtual) -- 1.5.1 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/