tizen 2.4 release
[kernel/u-boot-tm1.git] / arch / arm / cpu / arm926ejs / sc8800g / mmu.c
1
2 #include <asm/arch/sci_types.h>
3 extern void MMU_EnableIDCM (void);
4 /**********************************************************************
5   Section Descriptor:
6   31                   20 19        12 11 10  9  8   5  4  3  2  1  0
7   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8   | section base address |   ZERO     |  AP | 0 | DAC | 1 | C/B | 1 0|
9   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
10
11 AP: Access Permission Bits, it action together with R/S Bits in C1 register[9:8],
12     (R represents ROM protection, S represents System protection.) AP can be b_11,
13     thus Access Control will be done by DA bits.
14     AP  S   R   SVC     USER
15     00  0   0   No Access   No Access
16     00  1   0   Read-Only   No Access
17     00  0   1   Read-Only   Read-Only
18     00  1   1   Unpredictable   Unpredictable
19     01  X   X   Read/Write  No Access
20     10  X   X   Read/Write  Read-Only
21     11  X   X   Read/Write  Read/Write
22
23 DA: Domain Access Bits, it indicate the position of DAC in register C3.
24 C/B:    Cacheable/Bufferable,
25     C:1 Enable, 0 Disable
26     B:1 Enable, 0 Disable
27 ***********************************************************************/
28 #define MMU_SD_CONST    0x00000012
29 #define MMU_AP_B00      0x00000000
30 #define MMU_AP_B01      0x00000400
31 #define MMU_AP_B10      0x00000800
32 #define MMU_AP_B11      0x00000C00
33 #define MMU_C_BIT       0x00000008
34 #define MMU_B_BIT       0x00000004
35
36 //MMU table start address can be configed by specific project! it is in mem_cfg_xxx.c.
37 /*
38 modify from 0x1600000 to 0x3f0000, to avoid memory corruption in RW region 
39 when watchdog reset happen
40 in 8800x series, 0x3f0000--0x400000 is empty
41 in 6800 serirs, maybe has little problem, have risk to overlap the memory!!!!
42 Now, change to 0x008f0000, in reserved region.
43 */
44
45 const uint32 const_MMUTableStartAddr       = 0x008f0000 ;//remap = 0,sdram from 0x0
46
47 const uint32 const_MMUTableStartAddrRemap1 = 0x31600000 - 16*1024;//remap = 1,sdram from 0x3000,0000
48
49 //MMU_TABLE_ADDR must be aligned by 16K-Byte.
50 #define MMU_TABLE_ADDR         ((const_MMUTableStartAddr) & 0xFFFFC000 )
51 #define MMU_TABLE_ADDR_REMAP   ((const_MMUTableStartAddrRemap1) & 0xFFFFC000 )
52
53 // MMU page table starting address to be referred in mmu_asm.s
54 unsigned int *g_mmu_page_table;
55
56 void MMU_Init (void)
57 {
58     unsigned int *page_table;
59     uint32 remap;
60     int i;
61
62 #ifdef PLATFORM_SC6800H
63     remap = * (volatile uint32 *) 0x20900014;
64 #else
65     remap = * (volatile uint32 *) 0x20900218;
66 #endif
67
68     if (remap&0x01)
69     {
70         g_mmu_page_table = (unsigned int *) MMU_TABLE_ADDR_REMAP;
71     }
72     else
73     {
74         g_mmu_page_table = (unsigned int *) MMU_TABLE_ADDR;
75     }
76     // 15Mb physical addr for page table
77     page_table = g_mmu_page_table;
78
79     // Create page table 1mb entries
80     for (i = 0; i < 0x1000; i++)
81     {
82         // SDRAM -> CB (write back):0x0-0x0FFFFFFF
83         if (i < 0xA)
84         {
85             page_table[i] = (MMU_SD_CONST|MMU_AP_B11|MMU_C_BIT|MMU_B_BIT) + (i << 20);
86         }
87         //else if (( i>=0x12 )&&(i <= 0x15)){
88         //  page_table[i] = (MMU_SD_CONST|MMU_AP_B11) + (i << 20);
89         //}
90         else if ( (i>0x14) && (i < 0x100))
91         {
92             page_table[i] = (MMU_SD_CONST|MMU_AP_B11|MMU_C_BIT|MMU_B_BIT) + (i << 20);
93         }
94         // Internal Shared Memeory: 0x1000_0000-0x1FFF_FFFF
95         //else if ((i >= 0x100) && (i < 0x200))
96         //  page_table[i] = 0x00000C1E + (i << 20);
97         // Internal RAM Memeory: CB
98         else if (( (i >= 0x300) && (i <= 0x400)) )//  || (mustSetIramCached == TRUE && i == 0x400) )
99         {
100             page_table[i] = (MMU_SD_CONST|MMU_AP_B11|MMU_C_BIT|MMU_B_BIT) + (i << 20);
101         }
102         // FLASH memory:No CB
103         //else if ((i >= 0x400) && (i < 0x500))
104         //    page_table[i] = 0x00000C12 + (i << 20);
105         // IO: NO CB
106         //else if ((i >= 0x700) && (i < 0x900))
107         //    page_table[i] = 0x00000C12 + (i << 20);
108         // No Access
109         else
110         {
111             page_table[i] = (MMU_SD_CONST|MMU_AP_B11) + (i << 20);
112         }
113     }
114
115     MMU_InvalideICACHEALL();//steve.zhan add.
116     MMU_EnableIDCM();
117         
118     //Delay some time
119     for (i=0; i<1000; i++);
120 }
121