system.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * Copyright (c) 2021 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #include "hpm_common.h"
  8. #include "hpm_soc.h"
  9. #include "hpm_l1c_drv.h"
  10. #ifndef CONFIG_DISABLE_GLOBAL_IRQ_ON_STARTUP
  11. #define CONFIG_DISABLE_GLOBAL_IRQ_ON_STARTUP 0
  12. #endif
  13. void enable_plic_feature(void)
  14. {
  15. uint32_t plic_feature = 0;
  16. #ifndef USE_NONVECTOR_MODE
  17. /* enabled vector mode and preemptive priority interrupt */
  18. plic_feature |= HPM_PLIC_FEATURE_VECTORED_MODE;
  19. #endif
  20. #if !defined(DISABLE_IRQ_PREEMPTIVE) || (DISABLE_IRQ_PREEMPTIVE == 0)
  21. /* enabled preemptive priority interrupt */
  22. plic_feature |= HPM_PLIC_FEATURE_PREEMPTIVE_PRIORITY_IRQ;
  23. #endif
  24. __plic_set_feature(HPM_PLIC_BASE, plic_feature);
  25. }
  26. __attribute__((weak)) void system_init(void)
  27. {
  28. #ifndef CONFIG_NOT_ENALBE_ACCESS_TO_CYCLE_CSR
  29. uint32_t mcounteren = read_csr(CSR_MCOUNTEREN);
  30. write_csr(CSR_MCOUNTEREN, mcounteren | 1); /* Enable MCYCLE */
  31. #endif
  32. #ifdef USE_S_MODE_IRQ
  33. disable_global_irq(CSR_MSTATUS_MIE_MASK | CSR_MSTATUS_SIE_MASK);
  34. #else
  35. disable_global_irq(CSR_MSTATUS_MIE_MASK);
  36. #endif
  37. disable_irq_from_intc();
  38. #ifdef USE_S_MODE_IRQ
  39. disable_s_irq_from_intc();
  40. #endif
  41. enable_plic_feature();
  42. enable_irq_from_intc();
  43. #ifdef USE_S_MODE_IRQ
  44. delegate_irq(CSR_MIDELEG_SEI_MASK | CSR_MIDELEG_SSI_MASK | CSR_MIDELEG_STI_MASK);
  45. enable_s_irq_from_intc();
  46. #if !CONFIG_DISABLE_GLOBAL_IRQ_ON_STARTUP
  47. enable_global_irq(CSR_MSTATUS_MIE_MASK | CSR_MSTATUS_SIE_MASK);
  48. #endif
  49. #else
  50. #if !CONFIG_DISABLE_GLOBAL_IRQ_ON_STARTUP
  51. enable_global_irq(CSR_MSTATUS_MIE_MASK);
  52. #endif
  53. #endif
  54. #ifndef CONFIG_NOT_ENABLE_ICACHE
  55. l1c_ic_enable();
  56. #endif
  57. #ifndef CONFIG_NOT_ENABLE_DCACHE
  58. l1c_dc_enable();
  59. l1c_dc_invalidate_all();
  60. #endif
  61. }