Index: apps/plugins/plugin.lds =================================================================== --- apps/plugins/plugin.lds (revision 20831) +++ 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 20831) +++ firmware/export/as3525.h (working copy) @@ -26,7 +26,12 @@ #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 20831) +++ 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 20831) +++ firmware/target/arm/crt0.S (working copy) @@ -87,6 +87,56 @@ 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 + /* map DRAM */ + ldr r0, =0x30000000 @ DRAM origin + mov r1, r0 @ Flat Mapped + mov r2, #8 + mov r3, #0xc @ writeback cache + 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 20831) +++ 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,25 @@ DMAC_CH_LLI(channel) = 0; /* we use contigous memory, so don't use the LLI */ +#if USE_MMU /** **************MMU & Mapping module *************************/ + + /* cache coherence */ + /* clean_dcache_range for transfers from system mem */ + if((flow_controller == DMAC_FLOWCTRL_DMAC_MEM_TO_MEM) || + (flow_controller == DMAC_FLOWCTRL_DMAC_MEM_TO_PERI) || + (flow_controller == DMAC_FLOWCTRL_PERI_MEM_TO_PERI) ) + clean_dcache_range((void *)src, size); + /* invalidate_dcache_range for transfers to system mem */ + if((flow_controller == DMAC_FLOWCTRL_DMAC_MEM_TO_MEM) || + (flow_controller == DMAC_FLOWCTRL_PERI_PERI_TO_MEM) || + (flow_controller == DMAC_FLOWCTRL_DMAC_PERI_TO_MEM) ) + invalidate_dcache_range((void *)dst, size); + +#endif /** **************MMU & Mapping module *************************/ + + if(flow_controller > 3) /* Size must be 0 for peripheral flow control */ + size = 0; + /* specify address increment */ if(src_inc) control |= (1<<26); Index: firmware/target/arm/as3525/system-as3525.c =================================================================== --- firmware/target/arm/as3525/system-as3525.c (revision 20831) +++ firmware/target/arm/as3525/system-as3525.c (working copy) @@ -229,11 +229,20 @@ CGU_PROC = 0; /* fclk 24 MHz */ CGU_PERI &= ~0x7f; /* pclk 24 MHz */ + +#if USE_MMU asm volatile( "mrc p15, 0, r0, c1, c0 \n" - "orr r0, r0, #0xC0000000 \n" /* asynchronous clocking */ + "bic r0, r0, #0xC0000000 \n" /* Fast clocking (slower)*/ "mcr p15, 0, r0, c1, c0 \n" : : : "r0" ); +#else + asm volatile( + "mrc p15, 0, r0, c1, c0 \n" + "orr r0, r0, #0xC0000000 \n" /* Async clocking (faster)*/ + "mcr p15, 0, r0, c1, c0 \n" + : : : "r0" ); +#endif CGU_PLLA = AS3525_PLLA_SETTING; while(!(CGU_INTCTRL & (1<<0))); /* wait until PLLA is locked */ @@ -243,7 +252,7 @@ CGU_PERI |= ((CLK_DIV(AS3525_PLLA_FREQ, AS3525_PCLK_FREQ) - 1) << 2) | 1; /* clk_in = PLLA */ - +#ifdef BOOTLOADER /* FIXME: dcache will not be active, since the mmu is not running * See arm922t datasheet */ asm volatile( @@ -255,7 +264,7 @@ "mcr p15, 0, r0, c1, c0 \n" : : : "r0" ); -#ifdef BOOTLOADER + sdram_init(); #endif /* BOOTLOADER */ Index: firmware/target/arm/as3525/app.lds =================================================================== --- firmware/target/arm/as3525/app.lds (revision 20831) +++ 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 20831) +++ firmware/target/arm/as3525/ata_sd_as3525.c (working copy) @@ -743,11 +743,13 @@ if(write) dma_enable_channel(0, dma_buf, MCI_FIFO(drive), (drive == INTERNAL_AS3525) ? DMA_PERI_SD : DMA_PERI_SD_SLOT, - DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, 0, DMA_S8, NULL); + DMAC_FLOWCTRL_PERI_MEM_TO_PERI, true, false, + (transfer * SECTOR_SIZE), DMA_S8, NULL); else dma_enable_channel(0, MCI_FIFO(drive), dma_buf, (drive == INTERNAL_AS3525) ? DMA_PERI_SD : DMA_PERI_SD_SLOT, - DMAC_FLOWCTRL_PERI_PERI_TO_MEM, false, true, 0, DMA_S8, NULL); + DMAC_FLOWCTRL_PERI_PERI_TO_MEM, false, true, + (transfer * SECTOR_SIZE), DMA_S8, NULL); MCI_DATA_TIMER(drive) = 0x1000000; /* FIXME: arbitrary */ MCI_DATA_LENGTH(drive) = transfer * card_info[drive].block_size;