1 /* See LICENSE file for licence details */
2 
3 #ifndef N200_FUNC_H
4 #define N200_FUNC_H
5 
6 
7 #include <stddef.h>
8 #include "n200_timer.h"
9 #include "n200_eclic.h"
10 
11 #define	ECLIC_GROUP_LEVEL0_PRIO4        0
12 #define	ECLIC_GROUP_LEVEL1_PRIO3        1
13 #define	ECLIC_GROUP_LEVEL2_PRIO2        2
14 #define	ECLIC_GROUP_LEVEL3_PRIO1        3
15 #define	ECLIC_GROUP_LEVEL4_PRIO0        4
16 
17 void pmp_open_all_space(void);
18 
19 void switch_m2u_mode(void);
20 
21 uint32_t get_mtime_freq(void);
22 
23 uint32_t mtime_lo(void);
24 
25 uint32_t mtime_hi(void);
26 
27 uint64_t get_mtime_value(void);
28 
29 uint64_t get_instret_value(void);
30 
31 uint64_t get_cycle_value(void);
32 
33 uint32_t get_cpu_freq(void);
34 
35 uint32_t __attribute__((noinline)) measure_cpu_freq(size_t n);
36 
37 /* ECLIC relevant functions */
38 void eclic_init ( uint32_t num_irq );
39 uint64_t get_timer_value(void);
40 void eclic_enable_interrupt (uint32_t source);
41 void eclic_disable_interrupt (uint32_t source);
42 
43 void eclic_set_pending(uint32_t source);
44 void eclic_clear_pending(uint32_t source);
45 
46 void eclic_set_intctrl (uint32_t source, uint8_t intctrl);
47 uint8_t eclic_get_intctrl  (uint32_t source);
48 
49 void eclic_set_intattr (uint32_t source, uint8_t intattr);
50 uint8_t eclic_get_intattr  (uint32_t source);
51 
52 void eclic_set_cliccfg (uint8_t cliccfg);
53 uint8_t eclic_get_cliccfg (void);
54 
55 void eclic_set_mth (uint8_t mth);
56 uint8_t eclic_get_mth(void);
57 
58 /* sets nlbits */
59 void eclic_set_nlbits(uint8_t nlbits);
60 
61 
62 /* get nlbits */
63 uint8_t eclic_get_nlbits(void);
64 
65 void eclic_set_irq_lvl(uint32_t source, uint8_t lvl);
66 uint8_t eclic_get_irq_lvl(uint32_t source);
67 
68 void eclic_set_irq_lvl_abs(uint32_t source, uint8_t lvl_abs);
69 uint8_t eclic_get_irq_lvl_abs(uint32_t source);
70 
71 uint8_t eclic_set_irq_priority(uint32_t source, uint8_t priority);
72 uint8_t eclic_get_irq_priority(uint32_t source);
73 
74 void eclic_mode_enable(void);
75 
76 void eclic_set_vmode(uint32_t source);
77 void eclic_set_nonvmode(uint32_t source);
78 
79 void eclic_set_level_trig(uint32_t source);
80 void eclic_set_posedge_trig(uint32_t source);
81 void eclic_set_negedge_trig(uint32_t source);
82 
83 
84 /** \brief  Wait For Interrupt
85 
86     Wait For Interrupt is a hint instruction that suspends execution
87     until one of a number of events occurs.
88  */
__WFI(void)89 __attribute__( ( always_inline ) ) static inline void __WFI(void) {
90     __asm volatile ("wfi");
91 }
92 
93 /** \brief  Wait For Event
94 
95     Wait For Event is a hint instruction that permits the processor to enter
96     a low-power state until one of a number of events occurs.
97  */
__WFE(void)98 __attribute__( ( always_inline ) ) static inline  void __WFE(void) {
99     __asm volatile ("csrs 0x810, 0x1");
100     __asm volatile ("wfi");
101     __asm volatile ("csrc 0x810, 0x1");
102 }
103 
104 
105 #endif
106