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