source: ssp_rpi3/trunk/arch/arm64_gcc/bcm283x/chip_design.txt@ 386

Last change on this file since 386 was 386, checked in by nmir-saito, 5 years ago

modify svn:mimetype of files

  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/plain; charset=utf-8
File size: 7.7 KB
Line 
1=====================================================================
2 BCM283x チップ依存部設計メモ
3 Last Modified: 16 Apr 2019
4=====================================================================
5
6○このドキュメントの位置づけ
7
8このドキュメントは,TOPPERS/SSPカーネルをBCM283xに移植する際の
9チップ固有事項に関する設計メモである.
10
11(参考)
12
13(a) QA7(ARM Quad A7 core)
14https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2836/QA7_rev3.4.pdf
15
16(b) BCM2835 ARM Peripherals
17https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.
18pdf
19
20
21[CPUモード]
22
23●リセット時の状態
24
25リセット時,BCM283x (Cortex-A53) は,EL3h (使用スタック SP_EL3)で起動する.
26
27
28[割込み]
29
30
31●割込み優先度
32
33BCM283x の割込みコントローラは優先度が実装されていない.そのため
34優先度に基づく割込みのマスクをソフトウェアで擬似的に実装している.
35割込みの内部優先度の値は外部優先度の符号を反転したものを用いるため,
36値の大きい方が高優先度となる.
37
38優先度の範囲は自由に決めることができる.既定の最高値は15となっている.
39
40
41●割込み/例外の受付
42
43割込み信号を受信すると,BCM283xのペンディングレジスタの該当するビットがセットされる.
44割込み番号はこのレジスタにセットされる値を使用する.
45
46割込みハンドラ番号と割込み番号は,BCM2835及びBCM2836の
47ペリフェラルマニュアル(下記a及びb)から,ペンディングレジスタのビット位置に基づいて
480から127の番号を割り当てる.(個々の定義は bcm2837.h を参照)
49
50 0 ... 31 Core interrupt (下記aのP16 「Core0 interrupt source」に対応)
5132 ... 63 ARM peripherals interrupt(bのP113「Basic pending register」に対応)
5264 ... 95 ARM peripherals interrupt(bのP115「GPU pending register 1」に対応)
5396 ...127 ARM peripherals interrupt(bのP115「GPU pending register 2」に対応)
54
55割込みを受け付けると例外レベルと例外の種類に応じた所定の位置から
56実行を開始する点はコア依存部の説明と同様であるが,割込みの優先度の
57処理内容については以下のようになる.
58
59まず割込みの入口処理では以下の処理を行う:
60・割込み発生時,割込み要因を元に優先度を取得する
61・優先度を元に,その割込み優先レベルで当該の割込み要因をマスクするかどうかを決定する.
62・その優先度でマスクする必要のある割込みを全てマスクする.
63・CPUロックを解除し,割込みハンドラを呼び出す.
64
65割込みハンドラからのリターン後,出口処理に入る前に優先度を元に戻す:
66・割込み発生前の割込み優先度をスタックから取得する
67・割込み発生前の優先度を元に,その割込み優先度でマスク解除の対象となる割込みを決める
68・対象となる割込みの割込みマスクをすべて解除する.
69
70割込み要因と優先度との対応,および優先度とマスクパターンとの対応には
71それぞれ intpri_table,及び iipm_mask_table という配列を使用する.
72これらは CFG_INT の設定値をもとにコンフィギュレータが kernel_cfg.c に出力する.
73
74
75CPU例外の例外番号については,コア依存部と同様のため省略する.
76
77
78●例外/割込みの受付
79
80・例外/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ
81 ンテキストを保存する.
82
83 ---------------
84 | GICC_PMR | <- new SP
85 ----------------
86 | 割込み/例外番号|
87 ----------------
88 | ESR_ELx |
89 ----------------
90 | ELR_ELx |
91 ----------------
92 | SPSR_ELx |
93 ----------------
94 | X30 |
95 ----------------
96 | X29 |
97 ----------------
98 | : |
99 | : |
100 ----------------
101 | X1 |
102 ----------------
103 | X0 |
104 ----------------
105 | | <- old SP
106
107
108割込み/例外発生時の主なシーケンスは次のようになる(遷移先の例外レベルをELxと表現する)
109
110(ハードウェアの処理)
111 ・PSTATEをSPSR_ELxに保存する
112 ・リターンアドレスをELR_ELxに保存する
113 ・PSTATE.{D,A,I,F}を1にセットする
114 ・同期例外およびSError割込みのとき,例外要因情報をESR_ELxに保存する
115 ・スタックポインタをSP_ELxに切り替える
116 ・(CPU例外の場合)例外番号をx22に格納
117 ・ELxへ遷移する
118
119(ソフトウェアでの処理)
120 ・(発生時にSP_EL0を使用していた場合)スタックを割込み発生前(SP_EL0)に戻す
121 ・汎用レジスタ(X0-X30)をスタックに保存
122 ・SPSR_ELx, ESR_ELx, ELR_ELxをスタックに保存
123 ・(割込み)ペンディングレジスタから割込み番号を取得
124 (CPU例外)例外番号をx22から取得
125 ・割込み番号,例外番号をスタックに保存
126 ・割込み発生前の割込み優先度マスクをスタックに保存
127 ・受け付けた割込みの割込み優先度を変数 current_intpri にセット
128 ・(割込みの場合)割込み優先度の値を元に,割込みをマスクする
129 ・割込み/例外ネストカウンタのインクリメント
130 ・(割込みの場合)CPUロック解除
131 (カーネル管理のCPU例外の場合)例外発生前のPSTATE状態に設定
132 ・ハンドラの配列からアドレスを読み込みハンドラを実行する
133
134●例外/割込みからのリターン
135
136(ソフトウェアでの処理)
137 ・CPUロック状態へ移行
138 ・割込み/例外ネストカウンタのデクリメント
139 ・(割込みの場合)割込み発生前の優先度マスクを戻し,優先度に応じて割込みのマスクを解除する
140 (CPU例外の場合)CPU管理外の例外の場合,例外発生元へリターンする
141 ・戻り先のコンテキストやシステム状態に応じて割込み/例外発生元へリターン
142 または遅延ディスパッチを実行する
143 ・ELR_ELxに戻り先アドレス,SPSR_ELxにプロセッサ状態がそれぞれ
144 セットされている状態でeret命令を実行し,割込み/例外からリターン
145
146
147○ OSの実装
148
1491.チップ依存部名称: bcm283x
150
151現状では Raspberry Pi3B に搭載されるBCM2837のみサポートするが,
152Raspberry Pi に搭載されるプロセッサBCM283x (x=5,6,7)は周辺回路について
153共通する部分が多く,まとめて扱うことにするため依存部名称を bcm283x とした
154
155
1562. 外部優先度と内部優先度
157
158外部優先度とはAPIで指定する割込み優先度(PRI型)のことであり,値が小さい
159ほど優先度が高い.割込みハンドラには,-1から連続した負の値を設定可能で
160ある.内部優先度は外部優先度の符号を反転した値とする.
161外部優先度と内部優先度の変換は以下のマクロで表現される.
162
163/* 外部表現への変換 */
164#define EXT_IPM(pri) (-pri)
165
166/* 内部表現への変換 */
167#define INT_IPM(ipm) (-ipm)
168
169
1703. カーネル管理内の最高優先度(CPUロック状態での優先度マスク)
171
172CPUロック状態の実装に優先度は用いていない.
173また優先度制御はソフトウェアで実装しているため,
174カーネル管理内の割込みの最高優先度は自由に設定可能である.
175
176チップ依存部で既定値として-15に定義しているが,必要に応じて
177ターゲット毎に必要な値を設定することができる.
178
179
180以上.
Note: See TracBrowser for help on using the repository browser.