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)17void 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