00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "../../include/config.h"
00011 #include "../../include/machine.h"
00012 #include "../../include/mmu.h"
00013 #include "../../include/vivi_string.h"
00014
00015 static unsigned long *mmu_tlb_base = (unsigned long *) MMU_TABLE_BASE;
00016
00017
00018
00019
00020
00021
00022
00023 static inline void cpu_arm920_cache_clean_invalidate_all(void)
00024 {
00025 __asm__(
00026 " mov r1, #0\n"
00027 " mov r1, #7 << 5\n"
00028 "1: orr r3, r1, #63 << 26\n"
00029 "2: mcr p15, 0, r3, c7, c14, 2\n"
00030 " subs r3, r3, #1 << 26\n"
00031 " bcs 2b\n"
00032 " subs r1, r1, #1 << 5\n"
00033 " bcs 1b\n"
00034 " mcr p15, 0, r1, c7, c5, 0\n"
00035 " mcr p15, 0, r1, c7, c10, 4\n"
00036 );
00037 }
00038
00039 void cache_clean_invalidate(void)
00040 {
00041 cpu_arm920_cache_clean_invalidate_all();
00042 }
00043
00044
00045
00046
00047
00048
00049 static inline void cpu_arm920_tlb_invalidate_all(void)
00050 {
00051 __asm__(
00052 "mov r0, #0\n"
00053 "mcr p15, 0, r0, c7, c10, 4\n"
00054 "mcr p15, 0, r0, c8, c7, 0\n"
00055 );
00056 }
00057
00058 #if 0
00059
00060
00061 void MMU_SetFastBusMode(void)
00062 {
00063
00064 __asm__(
00065 "mrc p15, 0, r0, c1, c0, #0\n"
00066 "bic r0, r0, #( 3 << 30 )\n"
00067 "mcr p15, 0, r0, c1, c0, 0 \n"
00068 );
00069 }
00070
00071 void MMU_SetAsyncBusMode(void)
00072 {
00073 __asm__(
00074 "mrc p15, 0, r0, c1, c0, #0\n"
00075 "orr r0, r0, #( 3 << 30 )\n"
00076 "mcr p15, 0, r0, c1, c0, 0 \n"
00077 );
00078 }
00079 #endif
00080
00081
00082 void tlb_invalidate(void)
00083 {
00084 cpu_arm920_tlb_invalidate_all();
00085 }
00086
00087 static inline void arm920_setup(void)
00088 {
00089 unsigned long ttb = MMU_TABLE_BASE;
00090
00091 __asm__(
00092
00093 "mov r0, #0\n"
00094 "mcr p15, 0, r0, c7, c7, 0\n"
00095 "mcr p15, 0, r0, c7, c10, 4\n"
00096 "mcr p15, 0, r0, c8, c7, 0\n"
00097
00098 "mov r4, %0\n"
00099 "mcr p15, 0, r4, c2, c0, 0\n"
00100
00101 "mvn r0, #0\n"
00102 "mcr p15, 0, r0, c3, c0, 0\n"
00103
00104 "mrc p15, 0, r0, c1, c0, 0\n"
00105
00106
00107 "bic r0, r0, #0x3000\n"
00108 "bic r0, r0, #0x0300\n"
00109 "bic r0, r0, #0x0087\n"
00110
00111
00112 "orr r0, r0, #0x0002\n"
00113 #ifdef CONFIG_CPU_D_CACHE_ON
00114 "orr r0, r0, #0x0004\n"
00115 #endif
00116 #ifdef CONFIG_CPU_I_CACHE_ON
00117 "orr r0, r0, #0x1000\n"
00118 #endif
00119
00120 "orr r0, r0, #0x0001\n"
00121 "mcr p15, 0, r0, c1, c0, 0\n"
00122 :
00123 : "r" (ttb) );
00124 }
00125
00126 void mmu_init(void)
00127 {
00128 arm920_setup();
00129 }
00130
00131 #if 0
00132 static void copy_vivi_to_ram(void)
00133 {
00134 putstr_hex("Evacuating 1MB of Flash to DRAM at 0x", VIVI_RAM_BASE);
00135 memcpy((void *)VIVI_RAM_BASE, (void *)VIVI_ROM_BASE, VIVI_RAM_SIZE);
00136 }
00137 #endif
00138
00139 static inline void mem_mapping_linear(void)
00140 {
00141 unsigned long pageoffset, sectionNumber;
00142
00143
00144
00145 for (sectionNumber = 0; sectionNumber < 4096; sectionNumber++) {
00146 pageoffset = (sectionNumber << 20);
00147 *(mmu_tlb_base + sectionNumber) = pageoffset | MMU_SECDESC;
00148 }
00149
00150
00151 for (pageoffset = DRAM_BASE; pageoffset < (DRAM_BASE+DRAM_SIZE); pageoffset += SZ_1M) {
00152
00153 *(mmu_tlb_base + (pageoffset >> 20)) = pageoffset | MMU_SECDESC | MMU_CACHEABLE;
00154 }
00155 }
00156
00157 #ifdef CONFIG_MTD_AMDSTD
00158 static inline void nor_flash_mapping(void)
00159 {
00160 unsigned long offset, cached_addr, uncached_addr;
00161
00162 cached_addr = FLASH_BASE;
00163 uncached_addr = FLASH_UNCACHED_BASE;
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 for (offset = 0; offset < FLASH_SIZE; offset += MMU_SECTION_SIZE) {
00175 cached_addr = FLASH_BASE + offset;
00176 uncached_addr = FLASH_UNCACHED_BASE + offset;
00177 *(mmu_tlb_base + (cached_addr >> 20)) = \
00178 (cached_addr | MMU_SECDESC | MMU_CACHEABLE);
00179 *(mmu_tlb_base + (uncached_addr >> 20)) = \
00180 (cached_addr | MMU_SECDESC);
00181 }
00182 }
00183 #endif
00184
00185 #if 0
00186
00187
00188
00189 static inline void nor_flash_remapping(void)
00190 {
00191 putstr_hex("Map flash virtual section to DRAM at 0x", VIVI_RAM_BASE);
00192 *(mmu_tlb_base + (VIVI_ROM_BASE >> 20)) = \
00193 (VIVI_RAM_BASE | MMU_SECDESC | MMU_CACHEABLE);
00194 }
00195 #endif
00196
00197 void mem_map_nand_boot(void)
00198 {
00199 mem_mapping_linear();
00200 #ifdef CONFIG_MTD_AMDSTD
00201 nor_flash_mapping();
00202 #endif
00203 }
00204
00205 #if 0 //#ifndef CONFIG_S3C2440_NAND_BOOT
00206 void mem_map_nor(void)
00207 {
00208 copy_vivi_to_ram();
00209 mem_mapping_linear();
00210 nor_flash_mapping();
00211 nor_flash_remapping();
00212 }
00213 #endif
00214
00215 void mem_map_init(void)
00216 {
00217
00218 mem_map_nand_boot();
00219
00220
00221
00222 cache_clean_invalidate();
00223 tlb_invalidate();
00224 }
00225 void F_MmuInitial(void)
00226 {
00227 arm920_setup();
00228 }
00229 void F_MemoryMapInitial(void)
00230 {
00231 mem_map_nand_boot();
00232 cache_clean_invalidate();
00233 tlb_invalidate();
00234 }
00235