
# PLIC（Platform-Level Interrupt Controller）に関するメモ
- 作成者: 本田晋也
- 最終更新: 2024年04月18日

## メモの位置づけ

このメモは，PLIC（Platform-Level Interrupt Controller）に関して，FMP3カーネルをポーティングするにあたって必要となる事項をまとめたものである．


## 参考文献

[1]https://github.com/riscv/riscv-plic-spec/blob/master/riscv-plic.adoc


## 割込みターゲット

割込みを入れる対象をハートコンテキスト（hart contexts）と呼ぶ．仕様書では単にコンテキストやターゲットと呼ぶ場合もある（統一されていない）．
実際には，コンテキスト=ハートではない．例えば，U54-MCでは，E51のM-mode割込みがコンテキスト0，U54_1のM-mode割込みがコンテキスト1，U54_1のS-mode割込みがコンテキスト2となる．


## 割込みゲートウェイ

グローバルな割込み信号を標準的な割込み要求に変換する．

## 割込み番号

割込み番号は1から開始し，0は割込みが発生していないとみなす．

## 割込み処理の流れ

- 割込み信号をゲートウェイに流す
- ゲートウェイはレベル・エッジ変換をしてPLIC Coreに割込みを伝える
- PLIC Core は，割込みが許可され，優先度がターゲットのしきい値以上の場合，そのターゲットに対して，割込み通知をを送る．
- ターゲットは割込みクレームによりPLIC Core より最高優先度の割込みの割込み番号を得る．
- PLIC Core は対象の割込みの要求をクリアする
- ターゲットはゲートウェイに割込み完了メッセージを送る
- ゲートウェイは同じ割込みの割込み要求を送れるようになる．

## レジスタ

- Interrupt Priorities registers
	- 割込み優先度をセットするレジスタ．

- Interrupt Pending Bits registers
	- ペンディングしている割込みは'1'となる．

- Interrupt Enables registers:
	- コンテキスト毎に存在
	- 割込みを許可するレジスタ．

- Priority Thresholds registers:
	- コンテキスト毎に存在
	- コンテキストの割込み優先度を設定するレジスタ．

- Interrupt Claim registers:
	- コンテキスト毎に存在
	- 割込み要求が発生している最高優先度の割込みのIDを取得するレジスタ
	- コンテキストが割込み処理を開始したことを通知する

- Interrupt Completion registers:
	- コンテキスト毎に存在
	- コンテキストからゲートウェイに割込み処理が終了したことを通知するレジスタ

## 割込み優先度

1から値が大きいほど優先度が高い．0は割込みが発生していないことを示す．

## 割込みペンディングビット

ペンディングビットのクリアは，該当の割込みを許可してクレームする（クレームレジスターを読む）．

## 割込み許可ビット

コンテキスト毎に存在．

以上
