1
1
/*
2
- * Copyright (c) 2006-2021 , RT-Thread Development Team
2
+ * Copyright (c) 2006-2023 , RT-Thread Development Team
3
3
*
4
4
* SPDX-License-Identifier: Apache-2.0
5
5
*
6
6
* Change Logs:
7
7
* Date Author Notes
8
8
* 2021-10-19 JasonHu first version
9
9
* 2021-11-12 JasonHu fix bug that not intr on f133
10
+ * 2023-04-22 flyingcys add plic register ioremap
10
11
*/
11
12
12
13
#include <rtthread.h>
@@ -30,13 +31,23 @@ struct plic_handler
30
31
31
32
rt_inline void plic_toggle (struct plic_handler * handler , int hwirq , int enable );
32
33
struct plic_handler c906_plic_handlers [C906_NR_CPUS ];
34
+ static void * c906_irq_priority [INTERRUPTS_MAX ] = {RT_NULL };
33
35
34
36
rt_inline void plic_irq_toggle (int hwirq , int enable )
35
37
{
36
38
int cpu = 0 ;
39
+ void * priority_addr ;
37
40
38
41
/* set priority of interrupt, interrupt 0 is zero. */
39
- writel (enable , c906_plic_regs + PRIORITY_BASE + hwirq * PRIORITY_PER_ID );
42
+ priority_addr = (void * )((rt_size_t )c906_plic_regs + PRIORITY_BASE + hwirq * PRIORITY_PER_ID );
43
+ #ifdef RT_USING_SMART
44
+ if (c906_irq_priority [hwirq ] == RT_NULL )
45
+ {
46
+ c906_irq_priority [hwirq ] = rt_ioremap (priority_addr , 0x1000 );
47
+ }
48
+ priority_addr = c906_irq_priority [hwirq ];
49
+ #endif
50
+ writel (enable , priority_addr );
40
51
struct plic_handler * handler = & c906_plic_handlers [cpu ];
41
52
42
53
if (handler -> present )
@@ -76,7 +87,7 @@ void plic_complete(int irqno)
76
87
int cpu = 0 ;
77
88
struct plic_handler * handler = & c906_plic_handlers [cpu ];
78
89
79
- writel (irqno , handler -> hart_base + CONTEXT_CLAIM );
90
+ writel (irqno , ( void * )(( rt_size_t ) handler -> hart_base + CONTEXT_CLAIM ) );
80
91
}
81
92
82
93
void plic_disable_irq (int irqno )
@@ -101,7 +112,7 @@ void plic_handle_irq(void)
101
112
unsigned int irq ;
102
113
103
114
struct plic_handler * handler = & c906_plic_handlers [cpu ];
104
- void * claim = handler -> hart_base + CONTEXT_CLAIM ;
115
+ void * claim = ( void * )(( rt_size_t ) handler -> hart_base + CONTEXT_CLAIM ) ;
105
116
106
117
if (c906_plic_regs == RT_NULL || !handler -> present )
107
118
{
@@ -128,7 +139,7 @@ void plic_handle_irq(void)
128
139
129
140
rt_inline void plic_toggle (struct plic_handler * handler , int hwirq , int enable )
130
141
{
131
- uint32_t * reg = handler -> enable_base + (hwirq / 32 ) * sizeof (uint32_t );
142
+ uint32_t * reg = ( uint32_t * )(( rt_size_t ) handler -> enable_base + (hwirq / 32 ) * sizeof (uint32_t ) );
132
143
uint32_t hwirq_mask = 1 << (hwirq % 32 );
133
144
134
145
if (enable )
@@ -188,11 +199,15 @@ void plic_init(void)
188
199
}
189
200
190
201
handler -> present = RT_TRUE ;
191
- handler -> hart_base = c906_plic_regs + CONTEXT_BASE + i * CONTEXT_PER_HART ;
192
- handler -> enable_base = c906_plic_regs + ENABLE_BASE + i * ENABLE_PER_HART ;
202
+ handler -> hart_base = (void * )((rt_size_t )c906_plic_regs + CONTEXT_BASE + i * CONTEXT_PER_HART );
203
+ handler -> enable_base = (void * )((rt_size_t )c906_plic_regs + ENABLE_BASE + i * ENABLE_PER_HART );
204
+ #ifdef RT_USING_SMART
205
+ handler -> hart_base = rt_ioremap (handler -> hart_base , 0x1000 );
206
+ handler -> enable_base = rt_ioremap (handler -> enable_base , 0x1000 );
207
+ #endif
193
208
done :
194
209
/* priority must be > threshold to trigger an interrupt */
195
- writel (threshold , handler -> hart_base + CONTEXT_THRESHOLD );
210
+ writel (threshold , ( void * )(( rt_size_t ) handler -> hart_base + CONTEXT_THRESHOLD ) );
196
211
for (hwirq = 1 ; hwirq <= nr_irqs ; hwirq ++ )
197
212
{
198
213
plic_toggle (handler , hwirq , 0 );
0 commit comments