Plic 驱动
More...
#include <plic.h>
|
| auto | Which () const -> uint32_t |
| | 向 Plic 询问中断
|
| |
| auto | Done (uint32_t source_id) const -> void |
| | 告知 Plic 已经处理了当前 IRQ
|
| |
| auto | Set (uint32_t hart_id, uint32_t source_id, uint32_t priority, bool enable) const -> void |
| | 设置指定中断源的使能状态
|
| |
| auto | Get (uint32_t hart_id, uint32_t source_id) const -> std::tuple< uint32_t, bool, bool > |
| | 获取指定中断源的状态信息
|
| |
| auto | RegisterInterruptFunc (uint8_t cause, InterruptDelegate func) -> void |
| | 注册外部中断处理函数
|
| |
| auto | Do (uint64_t cause, cpu_io::TrapContext *context) -> void |
| | 执行外部中断处理
|
| |
|
| | Plic (uint64_t dev_addr, size_t ndev, size_t context_count) |
| | 构造函数
|
| |
| | Plic ()=default |
| |
| | Plic (const Plic &)=default |
| |
| | Plic (Plic &&)=default |
| |
| auto | operator= (const Plic &) -> Plic &=default |
| |
| auto | operator= (Plic &&) -> Plic &=default |
| |
| | ~Plic ()=default |
| |
|
| __always_inline auto | GetContextId (uint32_t hart_id, uint32_t mode=1) const -> uint32_t |
| | 计算 context ID
|
| |
| auto | GetEnableBit (uint32_t context_id, uint32_t source_id) const -> bool |
| | 获取使能位寄存器中指定中断源的状态
|
| |
| auto | SetEnableBit (uint32_t context_id, uint32_t source_id, bool value) const -> void |
| | 设置使能位寄存器中指定中断源的状态
|
| |
| auto | SourcePriority (uint32_t source_id) const -> uint32_t & |
| | 获取中断源优先级寄存器
|
| |
| auto | GetPendingBit (uint32_t source_id) const -> bool |
| | 获取挂起位寄存器中指定中断源的状态
|
| |
| auto | SetPendingBit (uint32_t source_id, bool value) const -> void |
| | 设置挂起位寄存器中指定中断源的状态
|
| |
| auto | PriorityThreshold (uint32_t context_id) const -> uint32_t & |
| | 获取优先级阈值寄存器
|
| |
| auto | ClaimComplete (uint32_t context_id) const -> uint32_t & |
| | 获取声明/完成寄存器
|
| |
Plic 驱动
- Copyright
- Copyright The SimpleKernel Contributors
- See also
- https://github.com/riscv/riscv-plic
Definition at line 20 of file plic.h.
◆ InterruptDelegate
◆ Plic() [1/4]
| Plic::Plic |
( |
uint64_t |
dev_addr, |
|
|
size_t |
ndev, |
|
|
size_t |
context_count |
|
) |
| |
|
explicit |
构造函数
- Parameters
-
| dev_addr | 设备地址 |
| ndev | 支持的中断源数量 (riscv,ndev) |
| context_count | 上下文数量 (通常为 2 * core_count) |
Definition at line 24 of file plic.cpp.
26
27 klog::Info(
"Setting all interrupt priorities to 0");
28 for (
size_t source_id = 0; source_id <=
ndev_; source_id++) {
30 }
31
32 klog::Info(
"Disabling all interrupts for all contexts");
33
34 for (
size_t context_id = 0; context_id <
context_count_; context_id++) {
35
37
38 for (
size_t source_id = 0; source_id <=
ndev_; source_id++) {
40 }
41 }
42
44 "PLIC initialization: all interrupts disabled, priorities set to 0");
45
47 h = InterruptDelegate::create<DefaultPlicHandler>();
48 }
49}
auto PriorityThreshold(uint32_t context_id) const -> uint32_t &
获取优先级阈值寄存器
auto SourcePriority(uint32_t source_id) const -> uint32_t &
获取中断源优先级寄存器
auto SetEnableBit(uint32_t context_id, uint32_t source_id, bool value) const -> void
设置使能位寄存器中指定中断源的状态
static std::array< InterruptDelegate, kInterruptMaxCount > interrupt_handlers_
外部中断处理函数数组
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
◆ Plic() [2/4]
◆ Plic() [3/4]
| Plic::Plic |
( |
const Plic & |
| ) |
|
|
default |
◆ Plic() [4/4]
◆ ~Plic()
◆ ClaimComplete()
| auto Plic::ClaimComplete |
( |
uint32_t |
context_id | ) |
const -> uint32_t& |
|
private |
获取声明/完成寄存器
- Parameters
-
- Returns
- uint32_t& 寄存器引用
Definition at line 149 of file plic.cpp.
149 {
153}
static constexpr uint64_t kContextSize
static constexpr uint64_t kContextOffset
static constexpr uint64_t kClaimCompleteOffset
◆ Do()
执行外部中断处理
- Parameters
-
Definition at line 66 of file plic.cpp.
◆ Done()
| auto Plic::Done |
( |
uint32_t |
source_id | ) |
const -> void |
告知 Plic 已经处理了当前 IRQ
- Parameters
-
Definition at line 56 of file plic.cpp.
56 {
59}
auto ClaimComplete(uint32_t context_id) const -> uint32_t &
获取声明/完成寄存器
__always_inline auto GetContextId(uint32_t hart_id, uint32_t mode=1) const -> uint32_t
计算 context ID
auto GetCurrentCoreId() -> size_t
◆ Get()
| auto Plic::Get |
( |
uint32_t |
hart_id, |
|
|
uint32_t |
source_id |
|
) |
| const -> std::tuple<uint32_t, bool, bool> |
获取指定中断源的状态信息
- Parameters
-
| hart_id | hart ID |
| source_id | 中断源 ID (1-1023) |
- Returns
- <优先级, 使能状态, 挂起状态>
Definition at line 80 of file plic.cpp.
81 {
82
84
85
88
89
91
92 return {priority, enabled, pending};
93}
auto GetEnableBit(uint32_t context_id, uint32_t source_id) const -> bool
获取使能位寄存器中指定中断源的状态
auto GetPendingBit(uint32_t source_id) const -> bool
获取挂起位寄存器中指定中断源的状态
◆ GetContextId()
| __always_inline auto Plic::GetContextId |
( |
uint32_t |
hart_id, |
|
|
uint32_t |
mode = 1 |
|
) |
| const -> uint32_t |
|
inlineprivate |
计算 context ID
- Parameters
-
| hart_id | hart ID |
| mode | 模式 (0=M-mode, 1=S-mode) |
- Returns
- uint32_t context ID
- Note
- 2 个模式的 context ID 计算方式为: hart_id * 2 + mode
Definition at line 119 of file plic.h.
121 {
122 return hart_id * 2 + mode;
123 }
◆ GetEnableBit()
| auto Plic::GetEnableBit |
( |
uint32_t |
context_id, |
|
|
uint32_t |
source_id |
|
) |
| const -> bool |
|
private |
获取使能位寄存器中指定中断源的状态
- Parameters
-
| context_id | context ID |
| source_id | 中断源 ID (1-1023,0 保留) |
- Returns
- bool 对应位的状态
Definition at line 95 of file plic.cpp.
95 {
96 uint32_t word_index = source_id / 32;
97 uint32_t bit_index = source_id % 32;
98 uint32_t* word_addr = reinterpret_cast<uint32_t*>(
100 (word_index * 4));
101 return (*word_addr >> bit_index) & 1;
102}
static constexpr uint64_t kEnableSize
static constexpr uint64_t kEnableBitsOffset
◆ GetPendingBit()
| auto Plic::GetPendingBit |
( |
uint32_t |
source_id | ) |
const -> bool |
|
private |
获取挂起位寄存器中指定中断源的状态
- Parameters
-
| source_id | 中断源 ID (1-1023,0 保留) |
- Returns
- bool 对应位的状态
Definition at line 123 of file plic.cpp.
123 {
124 uint32_t word_index = source_id / 32;
125 uint32_t bit_index = source_id % 32;
126 uint32_t* word_addr = reinterpret_cast<uint32_t*>(
128 return (*word_addr >> bit_index) & 1;
129}
static constexpr uint64_t kPendingBitsOffset
◆ operator=() [1/2]
| auto Plic::operator= |
( |
const Plic & |
| ) |
-> Plic &=default |
|
default |
◆ operator=() [2/2]
| auto Plic::operator= |
( |
Plic && |
| ) |
-> Plic &=default |
|
default |
◆ PriorityThreshold()
| auto Plic::PriorityThreshold |
( |
uint32_t |
context_id | ) |
const -> uint32_t& |
|
private |
获取优先级阈值寄存器
- Parameters
-
- Returns
- uint32_t& 寄存器引用
Definition at line 143 of file plic.cpp.
143 {
147}
static constexpr uint64_t kPriorityThresholdOffset
◆ RegisterInterruptFunc()
注册外部中断处理函数
- Parameters
-
Definition at line 61 of file plic.cpp.
◆ Set()
| auto Plic::Set |
( |
uint32_t |
hart_id, |
|
|
uint32_t |
source_id, |
|
|
uint32_t |
priority, |
|
|
bool |
enable |
|
) |
| const -> void |
设置指定中断源的使能状态
- Parameters
-
| hart_id | hart ID |
| source_id | 中断源 ID (1-1023) |
| priority | 中断优先级 (0-7, 0 表示禁用) |
| enable | 是否使能该中断 |
Definition at line 70 of file plic.cpp.
◆ SetEnableBit()
| auto Plic::SetEnableBit |
( |
uint32_t |
context_id, |
|
|
uint32_t |
source_id, |
|
|
bool |
value |
|
) |
| const -> void |
|
private |
设置使能位寄存器中指定中断源的状态
- Parameters
-
| context_id | context ID |
| source_id | 中断源 ID (1-1023,0 保留) |
| value | 要设置的值 |
Definition at line 104 of file plic.cpp.
105 {
106 uint32_t word_index = source_id / 32;
107 uint32_t bit_index = source_id % 32;
108 uint32_t* word_addr = reinterpret_cast<uint32_t*>(
110 (word_index * 4));
111 if (value) {
112 *word_addr |= (1U << bit_index);
113 } else {
114 *word_addr &= ~(1U << bit_index);
115 }
116}
◆ SetPendingBit()
| auto Plic::SetPendingBit |
( |
uint32_t |
source_id, |
|
|
bool |
value |
|
) |
| const -> void |
|
private |
设置挂起位寄存器中指定中断源的状态
- Parameters
-
| source_id | 中断源 ID (1-1023,0 保留) |
| value | 要设置的值 |
Definition at line 131 of file plic.cpp.
131 {
132 uint32_t word_index = source_id / 32;
133 uint32_t bit_index = source_id % 32;
134 uint32_t* word_addr = reinterpret_cast<uint32_t*>(
136 if (value) {
137 *word_addr |= (1U << bit_index);
138 } else {
139 *word_addr &= ~(1U << bit_index);
140 }
141}
◆ SourcePriority()
| auto Plic::SourcePriority |
( |
uint32_t |
source_id | ) |
const -> uint32_t& |
|
private |
获取中断源优先级寄存器
- Parameters
-
| source_id | 中断源 ID (1-1023,0 保留) |
- Returns
- uint32_t& 寄存器引用
Definition at line 118 of file plic.cpp.
118 {
120 (source_id * sizeof(uint32_t)));
121}
static constexpr uint64_t kSourcePriorityOffset
◆ Which()
| auto Plic::Which |
( |
| ) |
const -> uint32_t |
向 Plic 询问中断
- Returns
- uint32_t 中断源 ID (1-1023)
Definition at line 51 of file plic.cpp.
◆ base_addr_
| uint64_t Plic::base_addr_ {0} |
|
private |
◆ context_count_
| size_t Plic::context_count_ {0} |
|
private |
◆ interrupt_handlers_
外部中断处理函数数组
Definition at line 106 of file plic.h.
◆ kClaimCompleteOffset
| constexpr uint64_t Plic::kClaimCompleteOffset = 0x4 |
|
staticconstexprprivate |
◆ kContextOffset
| constexpr uint64_t Plic::kContextOffset = 0x200000 |
|
staticconstexprprivate |
◆ kContextSize
| constexpr uint64_t Plic::kContextSize = 0x1000 |
|
staticconstexprprivate |
◆ kEnableBitsOffset
| constexpr uint64_t Plic::kEnableBitsOffset = 0x002000 |
|
staticconstexprprivate |
◆ kEnableSize
| constexpr uint64_t Plic::kEnableSize = 0x80 |
|
staticconstexprprivate |
◆ kInterruptMaxCount
| constexpr size_t Plic::kInterruptMaxCount = 16 |
|
staticconstexpr |
最大外部中断数量
Definition at line 25 of file plic.h.
◆ kPendingBitsOffset
| constexpr uint64_t Plic::kPendingBitsOffset = 0x001000 |
|
staticconstexprprivate |
◆ kPriorityThresholdOffset
| constexpr uint64_t Plic::kPriorityThresholdOffset = 0x0 |
|
staticconstexprprivate |
◆ kSourcePriorityOffset
| constexpr uint64_t Plic::kSourcePriorityOffset = 0x000000 |
|
staticconstexprprivate |
◆ ndev_
The documentation for this class was generated from the following files:
- /workspaces/SimpleKernel/src/arch/riscv64/plic/include/plic.h
- /workspaces/SimpleKernel/src/arch/riscv64/plic/plic.cpp