1 ;/*******************************************************************************
\r
3 ;* This software is supplied by Renesas Electronics Corporation and is only
\r
4 ;* intended for use with Renesas products. No other uses are authorized. This
\r
5 ;* software is owned by Renesas Electronics Corporation and is protected under
\r
6 ;* all applicable laws, including copyright laws.
\r
7 ;* THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
\r
8 ;* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
\r
9 ;* LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
\r
10 ;* AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
\r
11 ;* TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
\r
12 ;* ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
\r
13 ;* FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
\r
14 ;* ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
\r
15 ;* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
\r
16 ;* Renesas reserves the right, without notice, to make changes to this software
\r
17 ;* and to discontinue the availability of this software. By using this software,
\r
18 ;* you agree to the additional terms and conditions found by accessing the
\r
20 ;* http://www.renesas.com/disclaimer
\r
22 ;* Copyright (C) 2012 Renesas Electronics Corporation. All rights reserved.
\r
23 ;*******************************************************************************/
\r
24 ;/*******************************************************************************
\r
25 ;* File Name : ttb_init.s
\r
27 ;* Device(s) : Aragon
\r
28 ;* Tool-Chain : DS-5 Ver 5.8
\r
31 ;* H/W Platform : Aragon CPU Board
\r
32 ;* Description : Aragon Sample Program - TTB initialize
\r
33 ;*******************************************************************************/
\r
34 ;/*******************************************************************************
\r
35 ;* History : DD.MM.YYYY Version Description
\r
36 ;* : 23.05.2012 0.01
\r
37 ;*******************************************************************************/
\r
39 ; ---- Parameter setting to level1 descriptor (bits 19:0) ----
\r
40 ; setting for Strongly-ordered memory
\r
41 TTB_PARA_STRGLY EQU 2_00000000000000000000110111100010
\r
42 ; setting for Outer and inner not cache normal memory
\r
43 TTB_PARA_NORMAL_NOT_CACHE EQU 2_00000000000000000001110111100010
\r
44 ; setting for Outer and inner write back, write allocate normal memory (Cacheable)
\r
45 TTB_PARA_NORMAL_CACHE EQU 2_00000000000000000001110111101110
\r
46 ; setting for Outer and inner write back, write allocate normal memory (Cacheable)
\r
47 ;TTB_PARA_NORMAL_CACHE EQU 2_00000000000000000101110111100110
\r
49 ; ---- Memory area size (MB) ----
\r
50 M_SIZE_NOR EQU 128 ; [Area00] CS0, CS1 area (for NOR flash)
\r
51 M_SIZE_SDRAM EQU 128 ; [Area01] CS2, CS3 area (for SDRAM)
\r
52 M_SIZE_CS45 EQU 128 ; [Area02] CS4, CS5 area
\r
53 M_SIZE_SPI EQU 128 ; [Area03] SPI, SP2 area (for Serial flash)
\r
54 M_SIZE_RAM EQU 10 ; [Area04] Internal RAM
\r
55 M_SIZE_IO_1 EQU 502 ; [Area05] I/O area 1
\r
56 M_SIZE_NOR_M EQU 128 ; [Area06] CS0, CS1 area (for NOR flash) (mirror)
\r
57 M_SIZE_SDRAM_M EQU 128 ; [Area07] CS2, CS3 area (for SDRAM) (mirror)
\r
58 M_SIZE_CS45_M EQU 128 ; [Area08] CS4, CS5 area (mirror)
\r
59 M_SIZE_SPI_M EQU 128 ; [Area09] SPI, SP2 area (for Serial flash) (mirror)
\r
60 M_SIZE_RAM_M EQU 10 ; [Area10] Internal RAM (mirror)
\r
61 M_SIZE_IO_2 EQU 2550 ; [Area11] I/O area 2
\r
63 ;==================================================================
\r
64 ; This code provides basic global enable for Cortex-A9 cache.
\r
65 ; It also enables branch prediction
\r
66 ; This code must be run from a privileged mode
\r
67 ;==================================================================
\r
68 AREA INIT_TTB, CODE, READONLY
\r
70 IMPORT ||Image$$TTB$$ZI$$Base|| ;;; From scatter file
\r
76 ;===================================================================
\r
77 ; Cortex-A9 MMU Configuration
\r
78 ; Set translation table base
\r
79 ;===================================================================
\r
80 ;;; Cortex-A9 supports two translation tables
\r
81 ;;; Configure translation table base (TTB) control register cp15,c2
\r
82 ;;; to a value of all zeros, indicates we are using TTB register 0.
\r
84 MCR p15, 0, r0, c2, c0, 2 ;;; TTBCR
\r
86 ;;; write the address of our page table base to TTB register 0
\r
87 LDR r0,=||Image$$TTB$$ZI$$Base||
\r
88 MOV r1, #0x08 ;;; RGN=b01 (outer cacheable write-back cached, write allocate)
\r
89 ;;; S=0 (translation table walk to non-shared memory)
\r
90 ORR r1,r1,#0x40 ;;; IRGN=b01 (inner cacheability for the translation table walk is Write-back Write-allocate)
\r
92 MCR p15, 0, r0, c2, c0, 0 ;;; TTBR0
\r
94 ;===================================================================
\r
95 ; PAGE TABLE generation
\r
96 ; Generate the page tables
\r
97 ; Build a flat translation table for the whole address space.
\r
98 ; ie: Create 4096 1MB sections from 0x000xxxxx to 0xFFFxxxxx
\r
99 ; 31 20 19 18 17 16 15 14 12 11 10 9 8 5 4 3 2 1 0
\r
100 ; |section base address| 0 0 |nG| S |AP2| TEX | AP | P | Domain | XN | C B | 1 0|
\r
102 ; Bits[31:20] - Top 12 bits of VA is pointer into table
\r
103 ; nG[17]=0 - Non global, enables matching against ASID in the TLB when set.
\r
104 ; S[16]=0 - Indicates normal memory is shared when set.
\r
106 ; AP[11:10]=11 - Configure for full read/write access in all modes
\r
108 ; CB[3:2]= 00 - Set attributes to Strongly-ordered memory.
\r
109 ; (except for the descriptor where code segment is based, see below)
\r
110 ; IMPP[9]=0 - Ignored
\r
111 ; Domain[5:8]=1111 - Set all pages to use domain 15
\r
112 ; XN[4]=0 - Execute never disabled
\r
113 ; Bits[1:0]=10 - Indicate entry is a 1MB section
\r
114 ;===================================================================
\r
115 LDR r0,=||Image$$TTB$$ZI$$Base||
\r
122 ;;; r0 contains the address of the translation table base
\r
123 ;;; r1 is loop counter
\r
124 ;;; r2 is target area counter (Initialize value = Last area No.)
\r
125 ;;; r3 is loop counter by area
\r
127 ;;; use loop counter to create 4096 individual table entries.
\r
128 ;;; this writes from address 'Image$$TTB$$ZI$$Base' +
\r
129 ;;; offset 0x3FFC down to offset 0x0 in word steps (4 bytes)
\r
156 setting_area11 ;;; [area11] I/O area 2
\r
157 LDR r3, =M_SIZE_IO_2
\r
158 LDR r4, =TTB_PARA_STRGLY ;;; Strongly-ordered
\r
160 setting_area10 ;;; [area10] Internal RAM (mirror)
\r
161 LDR r3, =M_SIZE_RAM_M
\r
162 LDR r4, =TTB_PARA_NORMAL_NOT_CACHE ;;; Normal (not cache)
\r
164 setting_area9 ;;; [area09] SPI, SP2 area (for Serial flash) (mirror)
\r
165 LDR r3, =M_SIZE_SPI_M
\r
166 LDR r4, =TTB_PARA_NORMAL_NOT_CACHE ;;; Normal (not cache)
\r
168 setting_area8 ;;; [area08] CS4, CS5 area (mirror)
\r
169 LDR r3, =M_SIZE_CS45_M
\r
170 LDR r4, =TTB_PARA_STRGLY ;;; Strongly-ordered
\r
172 setting_area7 ;;; [area07] CS2, CS3 area (for SDRAM) (mirror)
\r
173 LDR r3, =M_SIZE_SDRAM_M
\r
174 LDR r4, =TTB_PARA_NORMAL_NOT_CACHE ;;; Normal (not cache)
\r
176 setting_area6 ;;; [area06] CS0, CS1 area (for NOR flash) (mirror)
\r
177 LDR r3, =M_SIZE_NOR_M
\r
178 LDR r4, =TTB_PARA_NORMAL_NOT_CACHE ;;; Normal (not cache)
\r
180 setting_area5 ;;; [area05] I/O area 1
\r
181 LDR r3, =M_SIZE_IO_1
\r
182 LDR r4, =TTB_PARA_STRGLY ;;; Strongly-ordered
\r
184 setting_area4 ;;; [area04] Internal RAM
\r
185 LDR r3, =M_SIZE_RAM
\r
186 LDR r4, =TTB_PARA_NORMAL_CACHE ;;; Normal (Cacheable)
\r
188 setting_area3 ;;; [area03] SPI, SP2 area (for Serial flash)
\r
189 LDR r3, =M_SIZE_SPI
\r
190 LDR r4, =TTB_PARA_NORMAL_CACHE ;;; Normal (Cacheable)
\r
192 setting_area2 ;;; [area02] CS4, CS5 area
\r
193 LDR r3, =M_SIZE_CS45
\r
194 LDR r4, =TTB_PARA_STRGLY ;;; Strongly-ordered
\r
196 setting_area1 ;;; [area01] CS2, CS3 area (for SDRAM)
\r
197 LDR r3, =M_SIZE_SDRAM
\r
198 LDR r4, =TTB_PARA_NORMAL_CACHE ;;; Normal (Cacheable)
\r
200 setting_area0 ;;; [area00] CS0, CS1 area (for NOR flash)
\r
201 LDR r3, =M_SIZE_NOR
\r
202 LDR r4, =TTB_PARA_NORMAL_CACHE ;;; Normal (Cacheable)
\r
205 SUBS r3, r3, #1 ;;; memory size -> loop counter value
\r
207 ORR r5, r4, r1, LSL#20 ;;; R5 now contains full level1 descriptor to write
\r
208 STR r5, [r0, r1, LSL#2] ;;; Str table entry at TTB base + loopcount*4
\r
209 SUB r1, r1, #1 ;;; Decrement loop counter
\r
210 SUBS r3, r3, #1 ;;; Decrement loop counter by area
\r
212 SUBS r2, r2, #1 ;;; target area counter
\r
213 BPL set_mem_accsess ;;; To the next area
\r