On Wed, Apr 22, 2015 at 04:45:05PM +0530, Jagan Teki wrote: > On 15 July 2014 at 02:07, Tom Rini <tr...@ti.com> wrote: > > On Sat, Jul 12, 2014 at 06:42:31PM +0530, Jagan Teki wrote: > >> On Sat, Jul 12, 2014 at 2:23 AM, Tom Rini <tr...@ti.com> wrote: > >> > From: Vinothkumar Rajendran <vino...@ti.com> > >> > > >> > By default QSPI data through-put in memory mapped mode is ~2.4MB/sec @ > >> > 48MHz. Added edma memory copy functionality in spi flash driver to > >> > improve the data through put to 5.1MB/Sec. > > [snip] > >> > +#include <asm/arch/edma.h> > >> > +#include "../dma/ti_edma.h" > >> > >> This looks odd to me - header inclusion, as .h in drivers even. > > > > I could shove this under arch/arm/include/asm/ti-common I suppose. > > Any changes in code logic or updates?
Since I posted? No, I was waiting for your reply :) > >> > /* ti qpsi register bit masks */ > >> > #define QSPI_TIMEOUT 2000000 > >> > @@ -340,3 +342,72 @@ int spi_xfer(struct spi_slave *slave, unsigned int > >> > bitlen, const void *dout, > >> > > >> > return 0; > >> > } > >> > + > >> > +#if defined(CONFIG_SPL_DMA_SUPPORT) && defined(CONFIG_TI_EDMA) > >> > +void spi_flash_copy_mmap(void *data, void *offset, size_t len) > >> > +{ > >> > + struct edma_param_entry edma_param; > >> > + int b_cnt_value = 1; > >> > + int rem_bytes = 0; > >> > + int a_cnt_value = len; > >> > + unsigned int addr = (unsigned int) (data); > >> > + unsigned int max_acnt = 0x7FFFU; > >> > + unsigned int edma_ch_num = 1; > >> > + > >> > + if (len > max_acnt) > >> > + { > >> > + b_cnt_value = (len / max_acnt); > >> > + rem_bytes = (len % max_acnt); > >> > + a_cnt_value = max_acnt; > >> > + } > >> > + > >> > + /* Compute QSPI address and size */ > >> > + edma_param.opt = 0; > >> > + edma_param.src_addr = ((unsigned int) offset); > >> > + edma_param.dest_addr = addr; > >> > + edma_param.a_cnt = a_cnt_value; > >> > + edma_param.b_cnt = b_cnt_value; > >> > + edma_param.c_cnt = 1; > >> > + edma_param.src_bidx = a_cnt_value; > >> > + edma_param.dest_bidx = a_cnt_value; > >> > + edma_param.src_cidx = 0; > >> > + edma_param.dest_cidx = 0; > >> > + edma_param.link_addr = 0xFFFF; > >> > + edma_param.opt |= > >> > + (EDMA_TPCC_OPT_TCINTEN_MASK | > >> > + ((edma_ch_num << > >> > + EDMA_TPCC_OPT_TCC_SHIFT) & > >> > + EDMA_TPCC_OPT_TCC_MASK) | EDMA_TPCC_OPT_SYNCDIM_MASK); > >> > + > >> > + edma_set_param(edma_ch_num, &edma_param); > >> > + edma_enable_transfer(edma_ch_num); > >> > + > >> > + while (!(edma_get_intr_status() & (1 << edma_ch_num))) ; > >> > + edma_clr_intr(edma_ch_num); > >> > + if (rem_bytes != 0) > >> > + { > >> > + /* Compute QSPI address and size */ > >> > + edma_param.opt = 0; > >> > + edma_param.src_addr = > >> > + (b_cnt_value * max_acnt) + ((unsigned int) > >> > offset); > >> > + edma_param.dest_addr = (addr + (max_acnt * b_cnt_value)); > >> > + edma_param.a_cnt = rem_bytes; > >> > + edma_param.b_cnt = 1; > >> > + edma_param.c_cnt = 1; > >> > + edma_param.src_bidx = rem_bytes; > >> > + edma_param.dest_bidx = rem_bytes; > >> > + edma_param.src_cidx = 0; > >> > + edma_param.dest_cidx = 0; > >> > + edma_param.link_addr = 0xFFFF; > >> > + edma_param.opt |= > >> > + (EDMA_TPCC_OPT_TCINTEN_MASK | > >> > + ((edma_ch_num << EDMA_TPCC_OPT_TCC_SHIFT) & > >> > EDMA_TPCC_OPT_TCC_MASK)); > >> > + edma_set_param(edma_ch_num, &edma_param); > >> > + edma_enable_transfer(edma_ch_num); > >> > + > >> > + while (!(edma_get_intr_status() & (1 << edma_ch_num))) ; > >> > + edma_clr_intr(edma_ch_num); > >> > + } > >> > + *((unsigned int *) offset) += len; > >> > +} > >> > +#endif > >> > >> I'm some how !OK with this memory or flash change in spi driver. > >> Any better approach to move this - may be in DMA driver itself and > >> picking up the > >> memory attributes from sf layer. > >> > >> I'm not much clear about this now, but will come back again. > > > > Well, are you happy with how drivers/spi/mxs_spi.c works (search around > > on mxs_dma)? I can re-jigger things along those lines I suppose. > > thanks! So you're happy with how mxs_spi.c does DMA then? I'll pencil in some time to rework this code using that driver as a model then, thanks. -- Tom
signature.asc
Description: Digital signature
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot