HPM SDK
HPMicro Software Development Kit
hpm_plic_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_PLIC_DRV_H
9 #define HPM_PLIC_DRV_H
10 
17 #define HPM_PLIC_TARGET_M_MODE 0
18 #define HPM_PLIC_TARGET_S_MODE 1
19 
20 /* Feature Register */
21 #define HPM_PLIC_FEATURE_OFFSET (0x00000000UL)
22 #define HPM_PLIC_FEATURE_VECTORED_MODE (0x2UL)
23 #define HPM_PLIC_FEATURE_PREEMPTIVE_PRIORITY_IRQ (0x1UL)
24 
25 /* Priority Register - 32 bits per irq */
26 #define HPM_PLIC_PRIORITY_OFFSET (0x00000004UL)
27 #define HPM_PLIC_PRIORITY_SHIFT_PER_SOURCE 2
28 
29 /* Pending Register - 1 bit per source */
30 #define HPM_PLIC_PENDING_OFFSET (0x00001000UL)
31 #define HPM_PLIC_PENDING_SHIFT_PER_SOURCE 0
32 
33 /* Enable Register - 0x80 per target */
34 #define HPM_PLIC_ENABLE_OFFSET (0x00002000UL)
35 #define HPM_PLIC_ENABLE_SHIFT_PER_TARGET 7
36 
37 /* Priority Threshold Register - 0x1000 per target */
38 #define HPM_PLIC_THRESHOLD_OFFSET (0x00200000UL)
39 #define HPM_PLIC_THRESHOLD_SHIFT_PER_TARGET 12
40 
41 /* Claim Register - 0x1000 per target */
42 #define HPM_PLIC_CLAIM_OFFSET (0x00200004UL)
43 #define HPM_PLIC_CLAIM_SHIFT_PER_TARGET 12
44 
45 #if !defined(__ASSEMBLER__)
46 
54 ATTR_ALWAYS_INLINE static inline void __plic_set_feature(uint32_t base, uint32_t feature)
55 {
56  *(volatile uint32_t *)(base + HPM_PLIC_FEATURE_OFFSET) = feature;
57 }
58 
67 ATTR_ALWAYS_INLINE static inline void __plic_set_threshold(uint32_t base,
68  uint32_t target,
69  uint32_t threshold)
70 {
71  volatile uint32_t *threshold_ptr = (volatile uint32_t *)(base +
74  *threshold_ptr = threshold;
75 }
76 
84 ATTR_ALWAYS_INLINE static inline uint32_t __plic_get_threshold(uint32_t base,
85  uint32_t target)
86 {
87  volatile uint32_t *threshold_ptr = (volatile uint32_t *)(base +
90  return *threshold_ptr;
91 }
100 ATTR_ALWAYS_INLINE static inline void __plic_set_irq_priority(uint32_t base,
101  uint32_t irq,
102  uint32_t priority)
103 {
104  volatile uint32_t *priority_ptr = (volatile uint32_t *)(base +
106  *priority_ptr = priority;
107 }
108 
116 ATTR_ALWAYS_INLINE static inline void __plic_set_irq_pending(uint32_t base, uint32_t irq)
117 {
118  volatile uint32_t *current_ptr = (volatile uint32_t *)(base +
119  HPM_PLIC_PENDING_OFFSET + ((irq >> 5) << 2));
120  *current_ptr = (1 << (irq & 0x1F));
121 }
122 
131 ATTR_ALWAYS_INLINE static inline void __plic_enable_irq(uint32_t base,
132  uint32_t target,
133  uint32_t irq)
134 {
135  volatile uint32_t *current_ptr = (volatile uint32_t *)(base +
138  ((irq >> 5) << 2));
139  uint32_t current = *current_ptr;
140  current = current | (1 << (irq & 0x1F));
141  *current_ptr = current;
142 }
143 
152 ATTR_ALWAYS_INLINE static inline void __plic_disable_irq(uint32_t base,
153  uint32_t target,
154  uint32_t irq)
155 {
156  volatile uint32_t *current_ptr = (volatile uint32_t *)(base +
159  ((irq >> 5) << 2));
160  uint32_t current = *current_ptr;
161  current = current & ~((1 << (irq & 0x1F)));
162  *current_ptr = current;
163 }
164 
172 ATTR_ALWAYS_INLINE static inline uint32_t __plic_claim_irq(uint32_t base, uint32_t target)
173 {
174  volatile uint32_t *claim_addr = (volatile uint32_t *)(base +
176  (target << HPM_PLIC_CLAIM_SHIFT_PER_TARGET));
177  return *claim_addr;
178 }
179 
188 ATTR_ALWAYS_INLINE static inline void __plic_complete_irq(uint32_t base,
189  uint32_t target,
190  uint32_t irq)
191 {
192  volatile uint32_t *claim_addr = (volatile uint32_t *)(base +
194  (target << HPM_PLIC_CLAIM_SHIFT_PER_TARGET));
195  *claim_addr = irq;
196 }
197 #endif /* __ASSEMBLER__ */
201 #endif /* HPM_PLIC_DRV_H */
#define HPM_PLIC_CLAIM_OFFSET
Definition: hpm_plic_drv.h:42
#define HPM_PLIC_ENABLE_SHIFT_PER_TARGET
Definition: hpm_plic_drv.h:35
#define HPM_PLIC_CLAIM_SHIFT_PER_TARGET
Definition: hpm_plic_drv.h:43
#define HPM_PLIC_ENABLE_OFFSET
Definition: hpm_plic_drv.h:34
#define HPM_PLIC_FEATURE_OFFSET
Definition: hpm_plic_drv.h:21
#define HPM_PLIC_PRIORITY_SHIFT_PER_SOURCE
Definition: hpm_plic_drv.h:27
#define HPM_PLIC_THRESHOLD_OFFSET
Definition: hpm_plic_drv.h:38
#define HPM_PLIC_PENDING_OFFSET
Definition: hpm_plic_drv.h:30
#define HPM_PLIC_PRIORITY_OFFSET
Definition: hpm_plic_drv.h:26
#define HPM_PLIC_THRESHOLD_SHIFT_PER_TARGET
Definition: hpm_plic_drv.h:39