Software APIs
irq.c
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include "sw/device/lib/runtime/irq.h"
6 
8 
9 static const uint32_t IRQ_EXT_ENABLE_OFFSET = 11;
10 static const uint32_t IRQ_TIMER_ENABLE_OFFSET = 7;
11 static const uint32_t IRQ_SW_ENABLE_OFFSET = 3;
12 
13 void irq_set_vector_offset(uintptr_t address) {
14  CSR_WRITE(CSR_REG_MTVEC, (uint32_t)address);
15 }
16 
17 void irq_global_ctrl(bool en) {
18  if (en) {
19  CSR_SET_BITS(CSR_REG_MSTATUS, 0x8);
20  } else {
21  CSR_CLEAR_BITS(CSR_REG_MSTATUS, 0x8);
22  }
23 }
24 
25 void irq_external_ctrl(bool en) {
26  const uint32_t mask = 1 << IRQ_EXT_ENABLE_OFFSET;
27  if (en) {
28  CSR_SET_BITS(CSR_REG_MIE, mask);
29  } else {
30  CSR_CLEAR_BITS(CSR_REG_MIE, mask);
31  }
32 }
33 
34 void irq_timer_ctrl(bool en) {
35  const uint32_t mask = 1 << IRQ_TIMER_ENABLE_OFFSET;
36  if (en) {
37  CSR_SET_BITS(CSR_REG_MIE, mask);
38  } else {
39  CSR_CLEAR_BITS(CSR_REG_MIE, mask);
40  }
41 }
42 
43 void irq_software_ctrl(bool en) {
44  const uint32_t mask = 1 << IRQ_SW_ENABLE_OFFSET;
45  if (en) {
46  CSR_SET_BITS(CSR_REG_MIE, mask);
47  } else {
48  CSR_CLEAR_BITS(CSR_REG_MIE, mask);
49  }
50 }