arch/s3c2440/mmu.c File Reference

Go to the source code of this file.

Functions

static void cpu_arm920_cache_clean_invalidate_all (void)
void cache_clean_invalidate (void)
static void cpu_arm920_tlb_invalidate_all (void)
void MMU_SetFastBusMode (void)
void MMU_SetAsyncBusMode (void)
void tlb_invalidate (void)
static void arm920_setup (void)
void mmu_init (void)
static void copy_vivi_to_ram (void)
static void mem_mapping_linear (void)
static void nor_flash_mapping (void)
static void nor_flash_remapping (void)
void mem_map_nand_boot (void)
void mem_map_nor (void)
void mem_map_init (void)
void F_MmuInitial (void)
void F_MemoryMapInitial (void)

Variables

static unsigned longmmu_tlb_base = (unsigned long *) MMU_TABLE_BASE


Function Documentation

static void arm920_setup ( void   )  [inline, static]

Definition at line 87 of file mmu.c.

00088 {
00089     unsigned long ttb = MMU_TABLE_BASE;
00090 
00091 __asm__(
00092     /* Invalidate caches */
00093     "mov    r0, #0\n"
00094     "mcr    p15, 0, r0, c7, c7, 0\n"    /* invalidate I,D caches on v4 */
00095     "mcr    p15, 0, r0, c7, c10, 4\n"   /* drain write buffer on v4 */
00096     "mcr    p15, 0, r0, c8, c7, 0\n"    /* invalidate I,D TLBs on v4 */
00097     /* Load page table pointer */
00098     "mov    r4, %0\n"
00099     "mcr    p15, 0, r4, c2, c0, 0\n"    /* load page table pointer */
00100     /* Write domain id (cp15_r3) */
00101     "mvn    r0, #0\n"           /* Domains 0, 1 = client */
00102     "mcr    p15, 0, r0, c3, c0, 0\n"    /* load domain access register */
00103     /* Set control register v4 */
00104     "mrc    p15, 0, r0, c1, c0, 0\n"    /* get control register v4 */
00105     /* Clear out 'unwanted' bits (then put them in if we need them) */
00106                         /* .RVI ..RS B... .CAM */ 
00107     "bic    r0, r0, #0x3000\n"      /* ..11 .... .... .... */
00108     "bic    r0, r0, #0x0300\n"      /* .... ..11 .... .... */
00109     "bic    r0, r0, #0x0087\n"      /* .... .... 1... .111 */
00110     /* Turn on what we want */
00111     /* Fault checking enabled */
00112     "orr    r0, r0, #0x0002\n"      /* .... .... .... ..1. */
00113 #ifdef CONFIG_CPU_D_CACHE_ON
00114     "orr    r0, r0, #0x0004\n"      /* .... .... .... .1.. */
00115 #endif  
00116 #ifdef CONFIG_CPU_I_CACHE_ON 
00117     "orr    r0, r0, #0x1000\n"      /* ...1 .... .... .... */
00118 #endif  
00119     /* MMU enabled */
00120     "orr    r0, r0, #0x0001\n"      /* .... .... .... ...1 */
00121     "mcr    p15, 0, r0, c1, c0, 0\n"    /* write control register */
00122     : /* no outputs */
00123     : "r" (ttb) );
00124 }

void cache_clean_invalidate ( void   ) 

Definition at line 39 of file mmu.c.

00040 {
00041     cpu_arm920_cache_clean_invalidate_all();
00042 }

static void copy_vivi_to_ram ( void   )  [static]

Definition at line 132 of file mmu.c.

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 }

static void cpu_arm920_cache_clean_invalidate_all ( void   )  [inline, static]

Definition at line 23 of file mmu.c.

00024 {
00025 __asm__(
00026     "   mov r1, #0\n"
00027     "   mov r1, #7 << 5\n"        /* 8 segments */
00028     "1: orr r3, r1, #63 << 26\n"      /* 64 entries */
00029     "2: mcr p15, 0, r3, c7, c14, 2\n" /* clean & invalidate D index */
00030     "   subs    r3, r3, #1 << 26\n"
00031     "   bcs 2b\n"             /* entries 64 to 0 */
00032     "   subs    r1, r1, #1 << 5\n"
00033     "   bcs 1b\n"             /* segments 7 to 0 */
00034     "   mcr p15, 0, r1, c7, c5, 0\n"  /* invalidate I cache */
00035     "   mcr p15, 0, r1, c7, c10, 4\n" /* drain WB */
00036     );
00037 }

static void cpu_arm920_tlb_invalidate_all ( void   )  [inline, static]

Definition at line 49 of file mmu.c.

00050 {
00051     __asm__(
00052         "mov    r0, #0\n"
00053         "mcr    p15, 0, r0, c7, c10, 4\n"   /* drain WB */
00054         "mcr    p15, 0, r0, c8, c7, 0\n"    /* invalidate I & D TLBs */
00055         );
00056 }

void F_MemoryMapInitial ( void   ) 

Definition at line 229 of file mmu.c.

00230 {
00231     mem_map_nand_boot();
00232     cache_clean_invalidate();
00233     tlb_invalidate();
00234 }

void F_MmuInitial ( void   ) 

Definition at line 225 of file mmu.c.

00226 {
00227     arm920_setup();
00228 }

void mem_map_init ( void   ) 

Definition at line 215 of file mmu.c.

00216 {
00217 //#ifdef CONFIG_S3C2440_NAND_BOOT
00218     mem_map_nand_boot();
00219 //#else
00220 //  mem_map_nor();
00221 //#endif
00222     cache_clean_invalidate();
00223     tlb_invalidate();
00224 }

void mem_map_nand_boot ( void   ) 

Definition at line 197 of file mmu.c.

00198 {
00199     mem_mapping_linear();
00200 #ifdef CONFIG_MTD_AMDSTD
00201     nor_flash_mapping();
00202 #endif
00203 }

void mem_map_nor ( void   ) 

Definition at line 206 of file mmu.c.

00207 {
00208     copy_vivi_to_ram();
00209     mem_mapping_linear();
00210     nor_flash_mapping();
00211     nor_flash_remapping();
00212 }

static void mem_mapping_linear ( void   )  [inline, static]

Definition at line 139 of file mmu.c.

00140 {
00141     unsigned long pageoffset, sectionNumber;
00142 
00143     //putstr_hex("\n\r MMU table base address = 0x", (unsigned long)mmu_tlb_base);
00144     /* 4G  not cacacheable, not bufferable */
00145     for (sectionNumber = 0; sectionNumber < 4096; sectionNumber++) {
00146         pageoffset = (sectionNumber << 20);
00147         *(mmu_tlb_base + sectionNumber) = pageoffset | MMU_SECDESC;
00148     }
00149 
00150     /* make dram cacheable */
00151     for (pageoffset = DRAM_BASE; pageoffset < (DRAM_BASE+DRAM_SIZE); pageoffset += SZ_1M) {
00152         //DPRINTK(3, "Make DRAM section cacheable: 0x%08lx\n", pageoffset);
00153         *(mmu_tlb_base + (pageoffset >> 20)) = pageoffset | MMU_SECDESC | MMU_CACHEABLE; 
00154     }
00155 }

void mmu_init ( void   ) 

Definition at line 126 of file mmu.c.

00127 {
00128     arm920_setup();
00129 }

void MMU_SetAsyncBusMode ( void   ) 

Definition at line 71 of file mmu.c.

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 }

void MMU_SetFastBusMode ( void   ) 

Definition at line 61 of file mmu.c.

00062 {
00063     /* R1_nF|R1_iA */
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 }

static void nor_flash_mapping ( void   )  [inline, static]

Definition at line 158 of file mmu.c.

00159 {
00160     unsigned long offset, cached_addr, uncached_addr;
00161 
00162     cached_addr = FLASH_BASE;
00163     uncached_addr = FLASH_UNCACHED_BASE;
00164 
00165     /*for (offset = 0; offset < FLASH_SIZE; offset += MMU_SECTION_SIZE) { 
00166         cached_addr += offset;
00167         uncached_addr += offset;
00168         *(mmu_tlb_base + (cached_addr >> 20)) = \
00169                 (cached_addr | MMU_SECDESC | MMU_CACHEABLE);
00170         *(mmu_tlb_base + (uncached_addr >> 20)) = \
00171                 (cached_addr | MMU_SECDESC);
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 }

static void nor_flash_remapping ( void   )  [inline, static]

Definition at line 189 of file mmu.c.

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 }

void tlb_invalidate ( void   ) 

Definition at line 82 of file mmu.c.

00083 {
00084     cpu_arm920_tlb_invalidate_all();
00085 }


Variable Documentation

unsigned long* mmu_tlb_base = (unsigned long *) MMU_TABLE_BASE [static]

Definition at line 15 of file mmu.c.


Generated on Tue Sep 2 08:45:41 2008 for A Simple operation System using S3C2410 by  doxygen 1.5.6