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 #ifndef CONFIG_NOT_ENALBE_ACCESS_TO_CYCLE_CSR
34     uint32_t mcounteren = read_csr(CSR_MCOUNTEREN);
35     write_csr(CSR_MCOUNTEREN, mcounteren | 1); /* Enable MCYCLE */
36 #endif
37 
38 #ifdef USE_S_MODE_IRQ
39     disable_global_irq(CSR_MSTATUS_MIE_MASK | CSR_MSTATUS_SIE_MASK);
40 #else
41     disable_global_irq(CSR_MSTATUS_MIE_MASK);
42 #endif
43 
44     disable_irq_from_intc();
45 #ifdef USE_S_MODE_IRQ
46     disable_s_irq_from_intc();
47 #endif
48 
49     enable_plic_feature();
50     enable_irq_from_intc();
51 
52 #ifdef USE_S_MODE_IRQ
53     delegate_irq(CSR_MIDELEG_SEI_MASK | CSR_MIDELEG_SSI_MASK | CSR_MIDELEG_STI_MASK);
54     enable_s_irq_from_intc();
55 #if !CONFIG_DISABLE_GLOBAL_IRQ_ON_STARTUP
56     enable_global_irq(CSR_MSTATUS_MIE_MASK | CSR_MSTATUS_SIE_MASK);
57 #endif
58 #else
59 #if !CONFIG_DISABLE_GLOBAL_IRQ_ON_STARTUP
60     enable_global_irq(CSR_MSTATUS_MIE_MASK);
61 #endif
62 #endif
63 }
64