Skip to content

Commit 5482794

Browse files
authored
Merge pull request #3392 from bigmagic123/fix_mmu
[bsp/raspi3] raspi3 mmu
2 parents 4bec714 + 2d3ae92 commit 5482794

File tree

4 files changed

+255
-336
lines changed

4 files changed

+255
-336
lines changed

bsp/raspberry-pi/raspi3-64/driver/SConscript

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ src = Split('''
77
board.c
88
bcm283x.c
99
drv_uart.c
10-
mbox.c
1110
''')
1211
CPPPATH = [cwd]
1312

bsp/raspberry-pi/raspi3-64/driver/board.c

Lines changed: 7 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "drv_timer.h"
1717

1818
#include "cp15.h"
19+
#include "mmu.h"
1920

2021
#ifdef RT_USING_SMP
2122
extern void rt_hw_ipi_handler_install(int ipi_vector, rt_isr_handler_t ipi_isr_handler);
@@ -57,156 +58,17 @@ void idle_wfi(void)
5758
asm volatile ("wfi");
5859
}
5960

60-
#define MMU_LEVEL_MASK 0x1ffUL
61-
#define MMU_MAP_ERROR_VANOTALIGN -1
62-
#define MMU_MAP_ERROR_PANOTALIGN -2
63-
#define MMU_MAP_ERROR_NOPAGE -3
64-
#define MMU_MAP_ERROR_CONFLICT -4
65-
66-
unsigned char main_tbl[4096] __attribute__((aligned (4096)));
67-
unsigned char __page_start[4096*100] __attribute__((aligned (4096)));
68-
unsigned long __page_off = 0;
69-
unsigned long get_free_page(void) {
70-
__page_off += 4096;
71-
return (unsigned long)(__page_start + __page_off - 4096);
72-
}
73-
74-
#define MEM_ATTR_MEM ((0x1UL << 10) | (0x2UL << 8) | (0x0UL << 6) | (0x1UL << 2))
75-
#define MEM_ATTR_IO ((0x1UL << 10) | (0x2UL << 8) | (0x0UL << 6) | (0x2UL << 2))
76-
77-
static int map_single_page_2M(unsigned long* lv0_tbl, unsigned long va, unsigned long pa, unsigned long attr) {
78-
int level;
79-
unsigned long* cur_lv_tbl = lv0_tbl;
80-
unsigned long page;
81-
unsigned long off;
82-
int level_shift = 39;
83-
84-
if (va & (0x200000UL - 1)) {
85-
return MMU_MAP_ERROR_VANOTALIGN;
86-
}
87-
if (pa & (0x200000UL - 1)) {
88-
return MMU_MAP_ERROR_PANOTALIGN;
89-
}
90-
for (level = 0; level < 2; level++) {
91-
off = (va >> level_shift);
92-
off &= MMU_LEVEL_MASK;
93-
if ((cur_lv_tbl[off] & 1) == 0) {
94-
page = get_free_page();
95-
if (!page) {
96-
return MMU_MAP_ERROR_NOPAGE;
97-
}
98-
rt_memset((void *)page, 0, 4096);
99-
cur_lv_tbl[off] = page | 0x3UL;
100-
}
101-
page = cur_lv_tbl[off];
102-
if (!(page & 0x2)) {
103-
//is block! error!
104-
return MMU_MAP_ERROR_CONFLICT;
105-
}
106-
cur_lv_tbl = (unsigned long*)(page & 0x0000fffffffff000UL);
107-
level_shift -= 9;
108-
}
109-
attr &= 0xfff0000000000ffcUL;
110-
pa |= (attr | 0x1UL); //block
111-
off = (va >> 21);
112-
off &= MMU_LEVEL_MASK;
113-
cur_lv_tbl[off] = pa;
114-
return 0;
115-
}
116-
117-
int armv8_map_2M(unsigned long* lv0_tbl, unsigned long va, unsigned long pa, int count, unsigned long attr)
118-
{
119-
int i;
120-
int ret;
121-
122-
if (va & (0x200000 - 1))
123-
{
124-
return -1;
125-
}
126-
if (pa & (0x200000 - 1))
127-
{
128-
return -1;
129-
}
130-
for (i = 0; i < count; i++)
131-
{
132-
ret = map_single_page_2M(lv0_tbl, va, pa, attr);
133-
va += 0x200000;
134-
pa += 0x200000;
135-
if (ret != 0)
136-
{
137-
return ret;
138-
}
139-
}
140-
return 0;
141-
}
142-
14361
/**
14462
* Initialize the Hardware related stuffs. Called from rtthread_startup()
14563
* after interrupt disabled.
14664
*/
14765
void rt_hw_board_init(void)
14866
{
149-
/* mmu set */
150-
unsigned long val64;
151-
unsigned long val32; //val32不是uint32_t,val32只是表示相关的那个寄存器是32位的
152-
int ret;
153-
154-
val64 = 0x007f6eUL;
155-
asm volatile("msr MAIR_EL1, %0\n dsb sy\n"::"r"(val64));
156-
asm volatile("mrs %0, MAIR_EL1\n dsb sy\n":"=r"(val64));
157-
158-
//TCR_EL1
159-
val32 = (16UL << 0)
160-
| (0x0UL << 6)
161-
| (0x0UL << 7)
162-
| (0x3UL << 8)
163-
| (0x3UL << 10)
164-
| (0x2UL << 12)
165-
| (0x0UL << 14)
166-
| (0x0UL << 16)
167-
| (0x0UL << 22)
168-
| (0x1UL << 23)
169-
| (0x2UL << 30)
170-
| (0x1UL << 32)
171-
| (0x0UL << 35)
172-
| (0x0UL << 36)
173-
| (0x0UL << 37)
174-
| (0x0UL << 38);
175-
asm volatile("msr TCR_EL1, %0\n"::"r"(val32));
176-
asm volatile("mrs %0, TCR_EL1\n":"=r"(val32));
177-
178-
asm volatile("msr TTBR0_EL1, %0\n dsb sy\n"::"r"(main_tbl));
179-
asm volatile("mrs %0, TTBR0_EL1\n dsb sy\n":"=r"(val64));
180-
181-
rt_memset(main_tbl, 0, 4096);
182-
183-
ret = armv8_map_2M((unsigned long *)main_tbl, 0x0, 0x0, 32, MEM_ATTR_MEM); //32*2M = 64M
184-
if (ret)
185-
{
186-
goto skip_mmu;
187-
}
188-
ret = armv8_map_2M((unsigned long *)main_tbl, 0x3f000000, 0x3f000000, 8, MEM_ATTR_IO); //8*2M = 16M
189-
if (ret)
190-
{
191-
goto skip_mmu;
192-
}
193-
194-
//关闭指令cache
195-
__asm__ volatile("mrs %0, SCTLR_EL1\n":"=r"(val64));
196-
val64 &= ~0x1000; //disable I
197-
__asm__ volatile("dmb sy\n msr SCTLR_EL1, %0\n isb sy\n"::"r"(val64));
198-
199-
//清除指令cache
200-
__asm__ volatile("IC IALLUIS\n dsb sy\n isb sy\n");
201-
//清除tlb
202-
__asm__ volatile("tlbi vmalle1\n dsb sy\n isb sy\n");
203-
204-
//SCTLR_EL1, turn on mmu
205-
asm volatile("mrs %0, SCTLR_EL1\n":"=r"(val32));
206-
val32 |= 0x1005; //enable mmu, I C M
207-
asm volatile("dmb sy\n msr SCTLR_EL1, %0\nisb sy\n"::"r"(val32));
208-
209-
skip_mmu:
67+
mmu_init();
68+
armv8_map(0, 0, 0x800000, MEM_ATTR_MEMORY);
69+
armv8_map(0x3f00B000, 0x3f00B000, 0x1000, MEM_ATTR_IO);//timer
70+
armv8_map(0x3f200000, 0x3f200000, 0x16000, MEM_ATTR_IO);//uart
71+
mmu_enable();
21072

21173
/* initialize hardware interrupt */
21274
rt_hw_interrupt_init(); // in libcpu/interrupt.c. Set some data structures, no operation on device
@@ -232,7 +94,7 @@ void rt_hw_board_init(void)
23294
#ifdef RT_USING_COMPONENTS_INIT
23395
rt_components_board_init();
23496
#endif
235-
rt_kprintf("__page_off = %x\n", __page_off);
97+
23698
}
23799

238100
#ifdef RT_USING_SMP

0 commit comments

Comments
 (0)