* [PATCH] spi: davinci: Use correct length parameter to dma_map_single calls
@ 2011-03-13 14:34 Michael Williamson
[not found] ` <1300026862-1179-1-git-send-email-michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: Michael Williamson @ 2011-03-13 14:34 UTC (permalink / raw)
To: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Cc: grant.likely-s3s/WqlpOiPyB63q8FvJNQ,
davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/,
dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f
The davinci spi driver provides an option to use DMA transfers for
data. In the dma_map_single() call, the driver is passing the
number of words to be transfered for the mapping size. It should
be the number of bytes.
Signed-off-by: Michael Williamson <michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
---
Note: I only have 8 bit devices to test with, so I can only confirm this
patch does not break such a configuration.
drivers/spi/davinci_spi.c | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c
index 166a879..037ba82 100644
--- a/drivers/spi/davinci_spi.c
+++ b/drivers/spi/davinci_spi.c
@@ -591,10 +591,10 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
if (t->tx_buf) {
t->tx_dma = dma_map_single(&spi->dev, (void *)t->tx_buf,
- dspi->wcount, DMA_TO_DEVICE);
+ t->len, DMA_TO_DEVICE);
if (dma_mapping_error(&spi->dev, t->tx_dma)) {
dev_dbg(sdev, "Unable to DMA map %d bytes"
- "TX buffer\n", dspi->wcount);
+ "TX buffer\n", t->len);
return -ENOMEM;
}
}
@@ -624,7 +624,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
if (t->rx_buf) {
rx_buf = t->rx_buf;
- rx_buf_count = dspi->rcount;
+ rx_buf_count = t->len;
} else {
rx_buf = dspi->rx_tmp_buf;
rx_buf_count = sizeof(dspi->rx_tmp_buf);
@@ -636,7 +636,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
dev_dbg(sdev, "Couldn't DMA map a %d bytes RX buffer\n",
rx_buf_count);
if (t->tx_buf)
- dma_unmap_single(NULL, t->tx_dma, dspi->wcount,
+ dma_unmap_single(NULL, t->tx_dma, t->len,
DMA_TO_DEVICE);
return -ENOMEM;
}
@@ -675,7 +675,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
if (spicfg->io_type == SPI_IO_TYPE_DMA) {
if (t->tx_buf)
- dma_unmap_single(NULL, t->tx_dma, dspi->wcount,
+ dma_unmap_single(NULL, t->tx_dma, t->len,
DMA_TO_DEVICE);
dma_unmap_single(NULL, t->rx_dma, rx_buf_count,
--
1.7.0.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH] spi: davinci: Support DMA transfers larger than 65535 words
[not found] ` <1300026862-1179-1-git-send-email-michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
@ 2011-03-13 14:34 ` Michael Williamson
[not found] ` <1300026862-1179-2-git-send-email-michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
2011-03-14 19:18 ` [PATCH] spi: davinci: Use correct length parameter to dma_map_single calls Grant Likely
1 sibling, 1 reply; 6+ messages in thread
From: Michael Williamson @ 2011-03-13 14:34 UTC (permalink / raw)
To: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Cc: grant.likely-s3s/WqlpOiPyB63q8FvJNQ,
davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/,
dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f
The current davinci SPI driver, in DMA mode, is limited to 65535
words for a single transfer. Modify the driver by configuring a
3 dimensional EDMA transfer to support up to 65535x65535
words.
Signed-off-by: Michael Williamson <michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
---
This patch is an attempt to address the issue raised here:
http://comments.gmane.org/gmane.linux.davinci/20581
Tested with:
dd if=/dev/mtd7 of=/tmp/test.1K bs=1024 count=1024
dd if=/dev/mtd7 of=/tmp/test.64K bs=65536 count=16
dd if=/dev/mtd7 of=/tmp/test.128K bs=131072 count=8
md5sum /tmp/test*
drivers/spi/davinci_spi.c | 33 +++++++++++++++++++++++++--------
1 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c
index 037ba82..411cc32 100644
--- a/drivers/spi/davinci_spi.c
+++ b/drivers/spi/davinci_spi.c
@@ -571,6 +571,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
unsigned long tx_reg, rx_reg;
struct edmacc_param param;
void *rx_buf;
+ int b, c;
dma = &dspi->dma;
@@ -599,14 +600,30 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
}
}
+ /*
+ * If number of words is greater than 65535, then we need
+ * to configure a 3 dimension transfer. Use the BCNTRLD
+ * feature to allow for transfers that aren't even multiples
+ * of 65535 (or any other possible b size) by first transferring
+ * the remainder amount then grabbing the next N blocks of
+ * 65535 words.
+ */
+
+ c = dspi->wcount/(SZ_64K-1); /* N 65535 count Blocks */
+ b = dspi->wcount-c*(SZ_64K-1); /* Remainder */
+ if (b)
+ c++;
+ else
+ b = SZ_64K-1;
+
param.opt = TCINTEN | EDMA_TCC(dma->tx_channel);
param.src = t->tx_buf ? t->tx_dma : tx_reg;
- param.a_b_cnt = dspi->wcount << 16 | data_type;
+ param.a_b_cnt = b << 16 | data_type;
param.dst = tx_reg;
param.src_dst_bidx = t->tx_buf ? data_type : 0;
- param.link_bcntrld = 0xffff;
- param.src_dst_cidx = 0;
- param.ccnt = 1;
+ param.link_bcntrld = 0xffffffff;
+ param.src_dst_cidx = t->tx_buf ? data_type : 0;
+ param.ccnt = c;
edma_write_slot(dma->tx_channel, ¶m);
edma_link(dma->tx_channel, dma->dummy_param_slot);
@@ -643,12 +660,12 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
param.opt = TCINTEN | EDMA_TCC(dma->rx_channel);
param.src = rx_reg;
- param.a_b_cnt = dspi->rcount << 16 | data_type;
+ param.a_b_cnt = b << 16 | data_type;
param.dst = t->rx_dma;
param.src_dst_bidx = (t->rx_buf ? data_type : 0) << 16;
- param.link_bcntrld = 0xffff;
- param.src_dst_cidx = 0;
- param.ccnt = 1;
+ param.link_bcntrld = 0xffffffff;
+ param.src_dst_cidx = (t->rx_buf ? data_type : 0) << 16;
+ param.ccnt = c;
edma_write_slot(dma->rx_channel, ¶m);
if (pdata->cshold_bug)
--
1.7.0.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] spi: davinci: Support DMA transfers larger than 65535 words
[not found] ` <1300026862-1179-2-git-send-email-michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
@ 2011-03-14 9:33 ` Stefano Babic
2011-03-14 10:25 ` Sergei Shtylyov
1 sibling, 0 replies; 6+ messages in thread
From: Stefano Babic @ 2011-03-14 9:33 UTC (permalink / raw)
To: Michael Williamson
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/,
dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f
On 03/13/2011 03:34 PM, Michael Williamson wrote:
> The current davinci SPI driver, in DMA mode, is limited to 65535
> words for a single transfer. Modify the driver by configuring a
> 3 dimensional EDMA transfer to support up to 65535x65535
> words.
>
> Signed-off-by: Michael Williamson <michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
> ---
> This patch is an attempt to address the issue raised here:
>
> http://comments.gmane.org/gmane.linux.davinci/20581
>
Thanks to fix this issue ! Tested on a OMAP-L138 board.
Tested-by: Stefano Babic <sbabic-ynQEQJNshbs@public.gmane.org>
Best regards,
Stefano Babic
--
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office-ynQEQJNshbs@public.gmane.org
=====================================================================
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] spi: davinci: Support DMA transfers larger than 65535 words
[not found] ` <1300026862-1179-2-git-send-email-michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
2011-03-14 9:33 ` Stefano Babic
@ 2011-03-14 10:25 ` Sergei Shtylyov
[not found] ` <4D7DED07.7020000-Igf4POYTYCDQT0dZR+AlfA@public.gmane.org>
1 sibling, 1 reply; 6+ messages in thread
From: Sergei Shtylyov @ 2011-03-14 10:25 UTC (permalink / raw)
To: Michael Williamson
Cc: grant.likely-s3s/WqlpOiPyB63q8FvJNQ,
spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/,
dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f
Hello.
On 13-03-2011 17:34, Michael Williamson wrote:
> The current davinci SPI driver, in DMA mode, is limited to 65535
> words for a single transfer. Modify the driver by configuring a
> 3 dimensional EDMA transfer to support up to 65535x65535
> words.
> Signed-off-by: Michael Williamson<michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
[...]
> diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c
> index 037ba82..411cc32 100644
> --- a/drivers/spi/davinci_spi.c
> +++ b/drivers/spi/davinci_spi.c
[...]
> @@ -599,14 +600,30 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
> }
> }
>
> + /*
> + * If number of words is greater than 65535, then we need
> + * to configure a 3 dimension transfer. Use the BCNTRLD
> + * feature to allow for transfers that aren't even multiples
> + * of 65535 (or any other possible b size) by first transferring
> + * the remainder amount then grabbing the next N blocks of
> + * 65535 words.
> + */
> +
> + c = dspi->wcount/(SZ_64K-1); /* N 65535 count Blocks */
> + b = dspi->wcount-c*(SZ_64K-1); /* Remainder */
The driver style (and general Linux kernel style) assumes spaces around
operators.
WRB, Sergei
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] spi: davinci: Support DMA transfers larger than 65535 words
[not found] ` <4D7DED07.7020000-Igf4POYTYCDQT0dZR+AlfA@public.gmane.org>
@ 2011-03-14 11:06 ` Michael Williamson
0 siblings, 0 replies; 6+ messages in thread
From: Michael Williamson @ 2011-03-14 11:06 UTC (permalink / raw)
To: Sergei Shtylyov
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/,
dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f
On 3/14/2011 6:25 AM, Sergei Shtylyov wrote:
> Hello.
>
> On 13-03-2011 17:34, Michael Williamson wrote:
>
>> The current davinci SPI driver, in DMA mode, is limited to 65535
>> words for a single transfer. Modify the driver by configuring a
>> 3 dimensional EDMA transfer to support up to 65535x65535
>> words.
>
>> Signed-off-by: Michael Williamson<michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
> [...]
>
>> diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c
>> index 037ba82..411cc32 100644
>> --- a/drivers/spi/davinci_spi.c
>> +++ b/drivers/spi/davinci_spi.c
> [...]
>> @@ -599,14 +600,30 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
>> }
>> }
>>
>> + /*
>> + * If number of words is greater than 65535, then we need
>> + * to configure a 3 dimension transfer. Use the BCNTRLD
>> + * feature to allow for transfers that aren't even multiples
>> + * of 65535 (or any other possible b size) by first transferring
>> + * the remainder amount then grabbing the next N blocks of
>> + * 65535 words.
>> + */
>> +
>> + c = dspi->wcount/(SZ_64K-1); /* N 65535 count Blocks */
>> + b = dspi->wcount-c*(SZ_64K-1); /* Remainder */
>
> The driver style (and general Linux kernel style) assumes spaces around operators.
Sure enough. I am relying on checkpatch.pl too much. I will fix and
re-post. Thanks for the style check.
>
> WRB, Sergei
------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] spi: davinci: Use correct length parameter to dma_map_single calls
[not found] ` <1300026862-1179-1-git-send-email-michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
2011-03-13 14:34 ` [PATCH] spi: davinci: Support DMA transfers larger than 65535 words Michael Williamson
@ 2011-03-14 19:18 ` Grant Likely
1 sibling, 0 replies; 6+ messages in thread
From: Grant Likely @ 2011-03-14 19:18 UTC (permalink / raw)
To: Michael Williamson
Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
davinci-linux-open-source-VycZQUHpC/PFrsHnngEfi1aTQe2KTcn/,
dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f
On Sun, Mar 13, 2011 at 10:34:21AM -0400, Michael Williamson wrote:
> The davinci spi driver provides an option to use DMA transfers for
> data. In the dma_map_single() call, the driver is passing the
> number of words to be transfered for the mapping size. It should
> be the number of bytes.
>
> Signed-off-by: Michael Williamson <michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
Applied, thanks
g.
> ---
> Note: I only have 8 bit devices to test with, so I can only confirm this
> patch does not break such a configuration.
>
> drivers/spi/davinci_spi.c | 10 +++++-----
> 1 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c
> index 166a879..037ba82 100644
> --- a/drivers/spi/davinci_spi.c
> +++ b/drivers/spi/davinci_spi.c
> @@ -591,10 +591,10 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
>
> if (t->tx_buf) {
> t->tx_dma = dma_map_single(&spi->dev, (void *)t->tx_buf,
> - dspi->wcount, DMA_TO_DEVICE);
> + t->len, DMA_TO_DEVICE);
> if (dma_mapping_error(&spi->dev, t->tx_dma)) {
> dev_dbg(sdev, "Unable to DMA map %d bytes"
> - "TX buffer\n", dspi->wcount);
> + "TX buffer\n", t->len);
> return -ENOMEM;
> }
> }
> @@ -624,7 +624,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
>
> if (t->rx_buf) {
> rx_buf = t->rx_buf;
> - rx_buf_count = dspi->rcount;
> + rx_buf_count = t->len;
> } else {
> rx_buf = dspi->rx_tmp_buf;
> rx_buf_count = sizeof(dspi->rx_tmp_buf);
> @@ -636,7 +636,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
> dev_dbg(sdev, "Couldn't DMA map a %d bytes RX buffer\n",
> rx_buf_count);
> if (t->tx_buf)
> - dma_unmap_single(NULL, t->tx_dma, dspi->wcount,
> + dma_unmap_single(NULL, t->tx_dma, t->len,
> DMA_TO_DEVICE);
> return -ENOMEM;
> }
> @@ -675,7 +675,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
> if (spicfg->io_type == SPI_IO_TYPE_DMA) {
>
> if (t->tx_buf)
> - dma_unmap_single(NULL, t->tx_dma, dspi->wcount,
> + dma_unmap_single(NULL, t->tx_dma, t->len,
> DMA_TO_DEVICE);
>
> dma_unmap_single(NULL, t->rx_dma, rx_buf_count,
> --
> 1.7.0.4
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2011-03-14 19:18 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-03-13 14:34 [PATCH] spi: davinci: Use correct length parameter to dma_map_single calls Michael Williamson
[not found] ` <1300026862-1179-1-git-send-email-michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
2011-03-13 14:34 ` [PATCH] spi: davinci: Support DMA transfers larger than 65535 words Michael Williamson
[not found] ` <1300026862-1179-2-git-send-email-michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>
2011-03-14 9:33 ` Stefano Babic
2011-03-14 10:25 ` Sergei Shtylyov
[not found] ` <4D7DED07.7020000-Igf4POYTYCDQT0dZR+AlfA@public.gmane.org>
2011-03-14 11:06 ` Michael Williamson
2011-03-14 19:18 ` [PATCH] spi: davinci: Use correct length parameter to dma_map_single calls Grant Likely
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).