summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2009-06-29 18:14:26 +0000
committerRafaël Carré <rafael.carre@gmail.com>2009-06-29 18:14:26 +0000
commited75cc09f1243cff5eec0ea99f3c0805b8834c36 (patch)
tree36bbd66483027ef47a064932427315339d24e889
parenteaa9df37e061de4bfbdd75c45034ad86afc97c65 (diff)
downloadrockbox-ed75cc09f1243cff5eec0ea99f3c0805b8834c36.tar.gz
rockbox-ed75cc09f1243cff5eec0ea99f3c0805b8834c36.zip
Sansa AMS : use the aligned buffer in bss for all DMA transfers
This was only used for data transfers, now use it also for card data transfers in sd_select_bank, to save runtime alignement and stack usage. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21564 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/as3525/ata_sd_as3525.c27
1 files changed, 11 insertions, 16 deletions
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c
index 9ef8226019..a184e9fead 100644
--- a/firmware/target/arm/as3525/ata_sd_as3525.c
+++ b/firmware/target/arm/as3525/ata_sd_as3525.c
@@ -122,6 +122,10 @@ static bool sd_enabled = false;
122static struct wakeup transfer_completion_signal; 122static struct wakeup transfer_completion_signal;
123static volatile bool retry; 123static volatile bool retry;
124 124
125#define UNALIGNED_NUM_SECTORS 10
126static unsigned char aligned_buffer[UNALIGNED_NUM_SECTORS* SECTOR_SIZE] __attribute__((aligned(32))); /* align on cache line size */
127static unsigned char *uncached_buffer = UNCACHED_ADDR(&aligned_buffer[0]);
128
125static inline void mci_delay(void) { int i = 0xffff; while(i--) ; } 129static inline void mci_delay(void) { int i = 0xffff; while(i--) ; }
126 130
127#ifdef HAVE_HOTSWAP 131#ifdef HAVE_HOTSWAP
@@ -571,11 +575,6 @@ static int sd_wait_for_state(const int drive, unsigned int state)
571 575
572static int sd_select_bank(signed char bank) 576static int sd_select_bank(signed char bank)
573{ 577{
574 /* allocate card data buffer on the stack */
575 unsigned char card_data[512 + 31];
576 /* align it on cache line size */
577 unsigned char *aligned_card_data = (void*)(((int)&card_data[0] + 31) & ~31);
578 unsigned char *uncached_card_data = UNCACHED_ADDR(aligned_card_data);
579 int ret; 578 int ret;
580 579
581 do { 580 do {
@@ -596,20 +595,20 @@ static int sd_select_bank(signed char bank)
596 595
597 mci_delay(); 596 mci_delay();
598 597
599 memset(uncached_card_data, 0, 512); 598 memset(uncached_buffer, 0, 512);
600 if(bank == -1) 599 if(bank == -1)
601 { /* enable bank switching */ 600 { /* enable bank switching */
602 uncached_card_data[0] = 16; 601 uncached_buffer[0] = 16;
603 uncached_card_data[1] = 1; 602 uncached_buffer[1] = 1;
604 uncached_card_data[2] = 10; 603 uncached_buffer[2] = 10;
605 } 604 }
606 else 605 else
607 uncached_card_data[0] = bank; 606 uncached_buffer[0] = bank;
608 607
609 dma_retain(); 608 dma_retain();
610 /* we don't use the uncached card data for DMA, because we need the 609 /* we don't use the uncached buffer here, because we need the
611 * physical memory address for DMA transfers */ 610 * physical memory address for DMA transfers */
612 dma_enable_channel(0, aligned_card_data, MCI_FIFO(INTERNAL_AS3525), 611 dma_enable_channel(0, aligned_buffer, MCI_FIFO(INTERNAL_AS3525),
613 DMA_PERI_SD, DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, 612 DMA_PERI_SD, DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8,
614 NULL); 613 NULL);
615 614
@@ -636,10 +635,6 @@ static int sd_select_bank(signed char bank)
636 return 0; 635 return 0;
637} 636}
638 637
639#define UNALIGNED_NUM_SECTORS 10
640static unsigned char aligned_buffer[UNALIGNED_NUM_SECTORS* SECTOR_SIZE] __attribute__((aligned(32))); /* align on cache line size */
641static unsigned char *uncached_buffer = UNCACHED_ADDR(&aligned_buffer[0]);
642
643static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, 638static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start,
644 int count, void* buf, const bool write) 639 int count, void* buf, const bool write)
645{ 640{