plic_driver.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // See LICENSE for license details.
  2. #include "sifive/devices/plic.h"
  3. #include "plic_driver.h"
  4. #include "platform.h"
  5. #include "encoding.h"
  6. #include <string.h>
  7. // Note that there are no assertions or bounds checking on these
  8. // parameter values.
  9. void volatile_memzero(uint8_t * base, unsigned int size)
  10. {
  11. volatile uint8_t * ptr;
  12. for (ptr = base; ptr < (base + size); ptr++){
  13. *ptr = 0;
  14. }
  15. }
  16. void PLIC_init (
  17. plic_instance_t * this_plic,
  18. uintptr_t base_addr,
  19. uint32_t num_sources,
  20. uint32_t num_priorities
  21. )
  22. {
  23. this_plic->base_addr = base_addr;
  24. this_plic->num_sources = num_sources;
  25. this_plic->num_priorities = num_priorities;
  26. // Disable all interrupts (don't assume that these registers are reset).
  27. unsigned long hart_id = read_csr(mhartid);
  28. volatile_memzero((uint8_t*) (this_plic->base_addr +
  29. PLIC_ENABLE_OFFSET +
  30. (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET)),
  31. (num_sources + 8) / 8);
  32. // Set all priorities to 0 (equal priority -- don't assume that these are reset).
  33. volatile_memzero ((uint8_t *)(this_plic->base_addr +
  34. PLIC_PRIORITY_OFFSET),
  35. (num_sources + 1) << PLIC_PRIORITY_SHIFT_PER_SOURCE);
  36. // Set the threshold to 0.
  37. volatile plic_threshold* threshold = (plic_threshold*)
  38. (this_plic->base_addr +
  39. PLIC_THRESHOLD_OFFSET +
  40. (hart_id << PLIC_THRESHOLD_SHIFT_PER_TARGET));
  41. *threshold = 0;
  42. }
  43. void PLIC_set_threshold (plic_instance_t * this_plic,
  44. plic_threshold threshold){
  45. unsigned long hart_id = read_csr(mhartid);
  46. volatile plic_threshold* threshold_ptr = (plic_threshold*) (this_plic->base_addr +
  47. PLIC_THRESHOLD_OFFSET +
  48. (hart_id << PLIC_THRESHOLD_SHIFT_PER_TARGET));
  49. *threshold_ptr = threshold;
  50. }
  51. void PLIC_enable_interrupt (plic_instance_t * this_plic, plic_source source){
  52. unsigned long hart_id = read_csr(mhartid);
  53. volatile uint8_t * current_ptr = (volatile uint8_t *)(this_plic->base_addr +
  54. PLIC_ENABLE_OFFSET +
  55. (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET) +
  56. (source >> 3));
  57. uint8_t current = *current_ptr;
  58. current = current | ( 1 << (source & 0x7));
  59. *current_ptr = current;
  60. }
  61. void PLIC_disable_interrupt (plic_instance_t * this_plic, plic_source source){
  62. unsigned long hart_id = read_csr(mhartid);
  63. volatile uint8_t * current_ptr = (volatile uint8_t *) (this_plic->base_addr +
  64. PLIC_ENABLE_OFFSET +
  65. (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET) +
  66. (source >> 3));
  67. uint8_t current = *current_ptr;
  68. current = current & ~(( 1 << (source & 0x7)));
  69. *current_ptr = current;
  70. }
  71. void PLIC_set_priority (plic_instance_t * this_plic, plic_source source, plic_priority priority){
  72. if (this_plic->num_priorities > 0) {
  73. volatile plic_priority * priority_ptr = (volatile plic_priority *)
  74. (this_plic->base_addr +
  75. PLIC_PRIORITY_OFFSET +
  76. (source << PLIC_PRIORITY_SHIFT_PER_SOURCE));
  77. *priority_ptr = priority;
  78. }
  79. }
  80. plic_source PLIC_claim_interrupt(plic_instance_t * this_plic){
  81. unsigned long hart_id = read_csr(mhartid);
  82. volatile plic_source * claim_addr = (volatile plic_source * )
  83. (this_plic->base_addr +
  84. PLIC_CLAIM_OFFSET +
  85. (hart_id << PLIC_CLAIM_SHIFT_PER_TARGET));
  86. return *claim_addr;
  87. }
  88. void PLIC_complete_interrupt(plic_instance_t * this_plic, plic_source source){
  89. unsigned long hart_id = read_csr(mhartid);
  90. volatile plic_source * claim_addr = (volatile plic_source *) (this_plic->base_addr +
  91. PLIC_CLAIM_OFFSET +
  92. (hart_id << PLIC_CLAIM_SHIFT_PER_TARGET));
  93. *claim_addr = source;
  94. }