-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathplic.c
53 lines (41 loc) · 1.23 KB
/
plic.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "plic.h"
#include "memory_map.h"
#include "smp.h"
bool init_plic(const struct memory_map_entry *plic_entry)
{
uintptr_t priority_register = SIFIVE_PLIC_PRIORITY_BASE;
uintptr_t enable_register = SIFIVE_PLIC_S_ENABLE_BASE;
// uintptr_t priority_thresholds = SIFIVE_PLIC_PRIORITY_THRESHOLD;
// uint32_t* claim_complete = (uint32_t*)SIFIVE_PLIC_CLAIM_COMPLETE;
uint32_t *address = (uint32_t *)(priority_register + 10 * 4);
// irq of uart0 is 10.
//*(priority_register + 10) = 1;
*address = 1;
// for(int i=0; i<5; ++i)
//{
// *(priority_register + i) = 0;
//}
*(uint32_t *)enable_register = (1 << 10);
// for(int i=0; i<5; ++i)
//{
// *(enable_register + i) = 0;
//}
*(uint32_t *)priority_register = 0;
return true;
}
uint64_t plic_claim(void)
{
uint64_t cpu_id = get_cpu_id();
// 64bit ? 32bit?
uint64_t *claim_address =
(uint64_t *)SIFIVE_PLIC_S_CLAIM_COMPLETE + cpu_id * 0x2000;
uint64_t irq = *claim_address;
return irq;
}
void plic_complete(uint64_t irq)
{
uint64_t cpu_id = get_cpu_id();
uint64_t *complete_address =
(uint64_t *)SIFIVE_PLIC_S_CLAIM_COMPLETE + cpu_id * 0x2000;
*complete_address = irq;
}