1 /*
2  * Copyright (c) 2006-2021, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2021-05-20     bigmagic     first version
9  * 2021-10-20     bernard      fix s-mode issue
10  */
11 
12 #ifndef __PLIC_H__
13 #define __PLIC_H__
14 
15 #include <rtconfig.h>
16 #include <rthw.h>
17 
18 #define PLIC_PRIORITY_BASE  0x0
19 #define PLIC_PENDING_BASE   0x1000
20 #define PLIC_ENABLE_BASE    0x2000
21 #define PLIC_CONTEXT_BASE   0x200000
22 
23 extern size_t plic_base;
24 
25 #define VIRT_PLIC_BASE                  (plic_base)
26 
27 #define PLIC_PRIORITY_OFFSET            (0x0)
28 #define PLIC_PENDING_OFFSET             (0x1000)
29 
30 #define PLIC_ENABLE_STRIDE              0x80
31 #define PLIC_CONTEXT_STRIDE             0x1000
32 
33 /* RT-Thread runs in S-mode on virt64 by default */
34 #define RISCV_VIRT64_S_MODE
35 
36 #ifndef RISCV_VIRT64_S_MODE
37 #define PLIC_MENABLE_OFFSET             (0x2000)
38 #define PLIC_MTHRESHOLD_OFFSET          (0x200000)
39 #define PLIC_MCLAIM_OFFSET              (0x200004)
40 #define PLIC_MCOMPLETE_OFFSET           (0x200004)
41 
42 #define PLIC_ENABLE(hart)               (VIRT_PLIC_BASE + PLIC_MENABLE_OFFSET +     (hart * 2) * PLIC_ENABLE_STRIDE)
43 #define PLIC_THRESHOLD(hart)            (VIRT_PLIC_BASE + PLIC_MTHRESHOLD_OFFSET +  (hart * 2) * PLIC_CONTEXT_STRIDE)
44 #define PLIC_CLAIM(hart)                (VIRT_PLIC_BASE + PLIC_MCLAIM_OFFSET +      (hart * 2) * PLIC_CONTEXT_STRIDE)
45 #define PLIC_COMPLETE(hart)             (VIRT_PLIC_BASE + PLIC_MCOMPLETE_OFFSET +   (hart * 2) * PLIC_CONTEXT_STRIDE)
46 
47 #else
48 #define PLIC_SENABLE_OFFSET             (0x2000   + PLIC_ENABLE_STRIDE)
49 #define PLIC_STHRESHOLD_OFFSET          (0x200000 + PLIC_CONTEXT_STRIDE)
50 #define PLIC_SCLAIM_OFFSET              (0x200004 + PLIC_CONTEXT_STRIDE)
51 #define PLIC_SCOMPLETE_OFFSET           (0x200004 + PLIC_CONTEXT_STRIDE)
52 
53 #define PLIC_ENABLE(hart)               (VIRT_PLIC_BASE + PLIC_SENABLE_OFFSET +     (hart * 2) * PLIC_ENABLE_STRIDE)
54 #define PLIC_THRESHOLD(hart)            (VIRT_PLIC_BASE + PLIC_STHRESHOLD_OFFSET +  (hart * 2) * PLIC_CONTEXT_STRIDE)
55 #define PLIC_CLAIM(hart)                (VIRT_PLIC_BASE + PLIC_SCLAIM_OFFSET +      (hart * 2) * PLIC_CONTEXT_STRIDE)
56 #define PLIC_COMPLETE(hart)             (VIRT_PLIC_BASE + PLIC_SCOMPLETE_OFFSET +   (hart * 2) * PLIC_CONTEXT_STRIDE)
57 #endif
58 
59 #define PLIC_PRIORITY(id)               (VIRT_PLIC_BASE + PLIC_PRIORITY_OFFSET + (id) * 4)
60 #define PLIC_PENDING(id)                (VIRT_PLIC_BASE + PLIC_PENDING_OFFSET + ((id) / 32))
61 
62 #define WORD_CNT_BYTE (1024 / 8)
63 
64 /* IRQ config in system, max 1024 (from 0 to 1023) */
65 #define CONFIG_IRQ_NR (128)
66 #define CONFIG_IRQ_WORD (CONFIG_IRQ_NR / 32)
67 
68 void plic_set_priority(int irq, int priority);
69 void plic_irq_enable(int irq);
70 void plic_irq_disable(int irq);
71 void plic_set_threshold(int mthreshold);
72 int  plic_claim(void);
73 void plic_complete(int irq);
74 
75 void plic_set_thresh(rt_uint32_t val);
76 void plic_set_ie(rt_uint32_t word_index,rt_uint32_t val);
77 void plic_init();
78 void plic_handle_irq(void);
79 
80 #endif
81