RE: [PATCH 3/4] Extend the DMA-engine API.

2007-07-11 Thread Zhang Wei-r63237
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.

2007-07-11 Thread Dan Williams

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.

2007-07-11 Thread Zhang Wei-r63237
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.

2007-07-10 Thread Dan Williams

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.

2007-07-10 Thread Randy Dunlap
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.

2007-07-10 Thread Zhang Wei
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/