FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-V Advanced Platform Interrupt Controller (APLIC) の概観 (2.必要なレジスタ群)

RISC-VのAdvanced Platform Interrupt Controller (APLIC) について勉強してみようと思う。

まずは以下のブログを読んで概観を掴もう。

blog.stephenmarz.com

今回はレジスタの構成についてまとめてみた。必要なのはだいたいこんな感じかなと思う。

Name Address Description
domaincfg 0x0000 - [0] : Big-Endian
- [2] Delivery mode: 0=direct delivery mode, 1=MSI delivery mode
- [8] IE Interrupt Enable
sourcecfg[1-1023] 0x0004 - 0x0ffc - [2 : 0] source mode (SM): Inactive/Detached/Edge1/Edge0/Level1/Level0
- [10] : delegate:
mmsiaddrcfg 0x1bc0
mmsiaddrcfgh 0x1bc4
smsiaddrcfg 0x1bc8
smsiaddrcfgh 0x1bcc
setip[0-31] 0x1c00 - 0x1c7c Sourceの割り込み要因に明示的に割り込みを挿入するためのレジスタ
setipnum 0x1cdc setipと同様のことが可能だが、割り込み要因IDを用いて割り込みを挿入することができるレジスタ
clrip 0x1d00 - 0x1d7c Sourceの割り込み要因を明示的にクリアすることができるレジスタ
clripnum 0x1ddc clripと同様のことが可能だが、割り込み要因IDを用いて割り込みをクリアすることのできるレジスタ
setie[0-31] 0x1e00 - 0x1e7c 割り込みEnable Bitを設定するためのレジスタ
setienum 0x1edc 割り込みSource番号を使ってEnable Bitを有効化するためのレジスタ
clrie[0-31] 0x1f00 - 0x1f7c 割り込みEnable Bitをクリアするためのレジスタ
clrenum 0x1fdc 割り込みSource番号を使ってEnable Bitをクリアするためのレジスタ
setipnum_le 0x2000
setipnum_be 0x2004
genmsi 0x3000 - [10: 0] EIID: External interrupt identifier
- [31:18] Hart Index: Hart index that wants to send an MSI.
target[1-1023] 0x3004 - 0x3ffc Direct delivery modeの場合:
- [31:18] 割り込みを送出するHartのインデックス
- [ 7: 0] Priority
MSI Delivery Mode:
- [31:18] 割り込みを送出するHartのインデックス
- [17:12] Guest Index
- [10:0] EIID

Starting from 0x4000, "interrupt domain control" (IDC) region.

Name Address Description
idelivery 0x0000 - [0] : 1の場合は割り込みを通知する。0の場合は通知しない
iforce 0x0004 - [0] : APLICの割り込みが有効なとき、このレジスタに書き込むと#0の割り込みを強制的に送出する
ithreshold 0x0008 割り込みのスレッショルドを設定する
topi 0x0018 現在ペンディングの最も高いPriorityの割り込み番号を格納する
claimi 0x001c topiと同じものが参照できるが、読むことによって当該割り込みのpendingビットを下げることができる