Index: apps/plugins/plugin.lds =================================================================== --- apps/plugins/plugin.lds (revision 20865) +++ apps/plugins/plugin.lds (working copy) @@ -47,10 +47,11 @@ #define DRAMSIZE (MEMORYSIZE * 0x100000) - STUBOFFSET - PLUGIN_BUFFER_SIZE - CODEC_SIZE - LCD_BUFFER_SIZE - TTB_SIZE #elif CONFIG_CPU==AS3525 +#define TTB_SIZE (0x4000) #if MEMORYSIZE <= 2 -#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGIN_BUFFER_SIZE - STUBOFFSET +#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGIN_BUFFER_SIZE - STUBOFFSET - TTB_SIZE #else -#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGIN_BUFFER_SIZE - STUBOFFSET - CODEC_SIZE +#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGIN_BUFFER_SIZE - STUBOFFSET - CODEC_SIZE - TTB_SIZE #endif #endif Index: firmware/export/as3525.h =================================================================== --- firmware/export/as3525.h (revision 20865) +++ firmware/export/as3525.h (working copy) @@ -26,6 +26,10 @@ #define ECCSIZE 512 #define ECCBYTES 3 +/* AS352X MMU Page Table Entries */ +#define TTB_SIZE 0x4000 /* Mimics OF */ +#define TTB_BASE_ADDR (0x30000000 + (MEM*0x100000) - TTB_SIZE) +#define USE_MMU 0 /*1*/ /* AS352X device base addresses */ Index: firmware/SOURCES =================================================================== --- firmware/SOURCES (revision 20865) +++ firmware/SOURCES (working copy) @@ -361,6 +361,7 @@ target/arm/as3525/usb-as3525.c target/arm/as3525/dma-pl081.c target/arm/as3525/ascodec-as3525.c +target/arm/mmu-arm.S #ifndef BOOTLOADER drivers/generic_i2c.c target/arm/adc-as3514.c Index: firmware/target/arm/crt0.S =================================================================== --- firmware/target/arm/crt0.S (revision 20865) +++ firmware/target/arm/crt0.S (working copy) @@ -87,6 +87,61 @@ ldrhi r5, [r2], #4 strhi r5, [r3], #4 bhi 1b + +#if USE_MMU /****************MMU & Mapping module *************************/ + /* Setup the MMU, start by disabling */ + + mrc p15, 0, r0, c1, c0, 0 @read control reg + bic r0, r0, #1 @disable mmu + bic r0, r0, #1<<2 @disable dcache + bic r0, r0, #1<<12 @disable icache + mcr p15, 0, r0, c1, c0, 0 @make it so + + /* Set up page table. Access perm bits set to 10(su r/w, user NA) */ + bl ttb_init + + /* + * void map_section(unsigned int pa, unsigned int va, int mb, int flags); + */ + @ CACHE_ALL 0x0C + @ CACHE_NONE 0 + @ BUFFERED 0x04 + + /* map all memory locations to themselves uncached */ + ldr r0, =0x0 @ Start Map location + ldr r1, =0x0 @ Flat Mapped + ldr r2, =0x1000 @ Num MB + mov r3, #0 @ Cache Flags + bl map_section + /* map IRAM */ + ldr r0, =0x0 @ IRAM origin + mov r1, r0 @ Flat Mapped + mov r2, #1 + mov r3, #0xc @ writeback cache + bl map_section + /* Mirror IRAM */ + ldr r0, =0x0 @ IRAM origin + ldr r1, =0x00100000 @ Mirror IRAM for noncache use + mov r2, #1 + mov r3, #0 @ uncached + bl map_section + /* map DRAM */ + ldr r0, =0x30000000 @ DRAM origin + mov r1, r0 @ Flat Mapped + mov r2, #8 + mov r3, #0xc @ writeback cache + bl map_section + /* Mirror DRAM */ + ldr r0, =0x30000000 @ DRAM origin + ldr r1, =0x40000000 @ Mirror DRAM for noncache use + mov r2, #8 + mov r3, #0 @ uncached + bl map_section + + bl enable_mmu + +#endif /**********************MMU & Mapping module *************************/ + #endif /* Initialise bss section to zero */ Index: firmware/target/arm/as3525/dma-pl081.c =================================================================== --- firmware/target/arm/as3525/dma-pl081.c (revision 20865) +++ firmware/target/arm/as3525/dma-pl081.c (working copy) @@ -24,6 +24,7 @@ #include "pl081.h" #include "dma-target.h" #include "panic.h" +#include "mmu-arm.h" static int dma_used = 0; static void (*dma_callback[2])(void); /* 2 channels */ @@ -70,6 +71,21 @@ DMAC_CH_LLI(channel) = 0; /* we use contigous memory, so don't use the LLI */ +#if USE_MMU + /* use mirrored uncached virtual addresses for DMA */ + if((unsigned long)dst >= 0x30000000 && + (unsigned long)dst < (MEM * 0x100000)) /* SDRAM */ + dst += 0x10000000; + else if((unsigned long)dst < 0x00050000) /* IRAM */ + dst += 0x00100000; + + if((unsigned long)src >= 0x30000000 && + (unsigned long)src < (MEM * 0x100000)) /* SDRAM */ + dst += 0x10000000; + else if((unsigned long)src < 0x00050000) /* IRAM */ + dst += 0x00100000; +#endif + /* specify address increment */ if(src_inc) control |= (1<<26); Index: firmware/target/arm/as3525/app.lds =================================================================== --- firmware/target/arm/as3525/app.lds (revision 20865) +++ firmware/target/arm/as3525/app.lds (working copy) @@ -23,11 +23,11 @@ #include "cpu.h" #ifdef LOWMEM -#define DRAMSIZE (MEMORYSIZE * 0x100000) - STUBOFFSET - PLUGINSIZE +#define DRAMSIZE (MEMORYSIZE * 0x100000) - STUBOFFSET - PLUGINSIZE - TTB_SIZE #define CODECORIG (IRAMORIG + 0x50000 - CODEC_SIZE) #define IRAMSIZE (0x50000 - CODEC_SIZE) #else -#define DRAMSIZE (MEMORYSIZE * 0x100000) - STUBOFFSET - PLUGINSIZE - CODECSIZE +#define DRAMSIZE (MEMORYSIZE * 0x100000) - STUBOFFSET - PLUGINSIZE - CODECSIZE - TTB_SIZE #define CODECORIG (ENDAUDIOADDR) #define IRAMSIZE (0x20000) #endif Index: firmware/target/arm/as3525/ata_sd_as3525.c =================================================================== --- firmware/target/arm/as3525/ata_sd_as3525.c (revision 20865) +++ firmware/target/arm/as3525/ata_sd_as3525.c (working copy) @@ -646,7 +646,7 @@ } #define UNALIGNED_NUM_SECTORS 10 -static int32_t aligned_buffer[UNALIGNED_NUM_SECTORS* (SECTOR_SIZE / 4)]; +static unsigned char aligned_buffer[UNALIGNED_NUM_SECTORS * SECTOR_SIZE] __attribute__((aligned(32))); static int sd_transfer_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf, const bool write) @@ -656,7 +656,7 @@ #endif int ret = 0; int bank; - bool unaligned_transfer = (int)buf & 3; + bool unaligned_transfer = true/*(int)buf & 3*/; /* skip SanDisk OF */ if (drive == INTERNAL_AS3525) @@ -710,10 +710,12 @@ while(count) { + unsigned char *uncached_buf = aligned_buffer + 0x10000000; /* 128 * 512 = 2^16, and doesn't fit in the 16 bits of DATA_LENGTH * register, so we have to transfer maximum 127 sectors at a time. */ unsigned int transfer = (count >= 128) ? 127 : count; /* sectors */ void *dma_buf; +// void *uncached_dma_buf = (void *)dma_buf + 0x10000000; /* use uncached mirror */ const int cmd = write ? SD_WRITE_MULTIPLE_BLOCK : SD_READ_MULTIPLE_BLOCK; int arg = start; @@ -729,7 +731,7 @@ if(transfer > UNALIGNED_NUM_SECTORS) transfer = UNALIGNED_NUM_SECTORS; if(write) - memcpy(aligned_buffer, buf, transfer * SECTOR_SIZE); + memcpy(uncached_buf, buf, transfer * SECTOR_SIZE); } else dma_buf = buf; @@ -761,7 +763,7 @@ if(!retry) { if(unaligned_transfer && !write) - memcpy(buf, aligned_buffer, transfer * SECTOR_SIZE); + memcpy(buf, uncached_buf, transfer * SECTOR_SIZE); buf += transfer * SECTOR_SIZE; start += transfer; count -= transfer;