* [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
[parent not found: <1300026862-1179-1-git-send-email-michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>]
* [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
[parent not found: <1300026862-1179-2-git-send-email-michael.williamson-wZX4cNJlHJ2sVWG7oymsAA@public.gmane.org>]
* 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
[parent not found: <4D7DED07.7020000-Igf4POYTYCDQT0dZR+AlfA@public.gmane.org>]
* 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).