1 /*
2  * Copyright (c) 2021 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 
9 #include "hpm_common.h"
10 #include "hpm_soc.h"
11 #include "hpm_l1c_drv.h"
12 
13 #ifndef CONFIG_DISABLE_GLOBAL_IRQ_ON_STARTUP
14 #define CONFIG_DISABLE_GLOBAL_IRQ_ON_STARTUP 0
15 #endif
16 
enable_plic_feature(void)17 void enable_plic_feature(void)
18 {
19     uint32_t plic_feature = 0;
20 #if !defined(USE_NONVECTOR_MODE) || (USE_NONVECTOR_MODE == 0)
21     /* enabled vector mode and preemptive priority interrupt */
22     plic_feature |= HPM_PLIC_FEATURE_VECTORED_MODE;
23 #endif
24 #if !defined(DISABLE_IRQ_PREEMPTIVE) || (DISABLE_IRQ_PREEMPTIVE == 0)
25     /* enabled preemptive priority interrupt */
26     plic_feature |= HPM_PLIC_FEATURE_PREEMPTIVE_PRIORITY_IRQ;
27 #endif
28     __plic_set_feature(HPM_PLIC_BASE, plic_feature);
29 }
30 
system_init(void)31 __attribute__((weak)) void system_init(void)
32 {
33     disable_global_irq(CSR_MSTATUS_MIE_MASK);
34     disable_irq_from_intc();
35     enable_plic_feature();
36     enable_irq_from_intc();
37 #if !CONFIG_DISABLE_GLOBAL_IRQ_ON_STARTUP
38     enable_global_irq(CSR_MSTATUS_MIE_MASK);
39 #endif
40 
41 #ifndef CONFIG_NOT_ENALBE_ACCESS_TO_CYCLE_CSR
42     uint32_t mcounteren = read_csr(CSR_MCOUNTEREN);
43     write_csr(CSR_MCOUNTEREN, mcounteren | 1); /* Enable MCYCLE */
44 #endif
45 }
46