Ignore:
Timestamp:
Apr 17, 2019, 12:13:00 PM (5 years ago)
Author:
nmir-saito
Message:

modify svn:mimetype of files

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ssp_rpi3/trunk/arch/arm64_gcc/bcm283x/chip_design.txt

    • Property svn:mime-type set to text/plain; charset=utf-8
    r384 r386  
    11=====================================================================
    2                          BCM283x チップ依存部設計メモ
     2                         BCM283x チップ依存部設計メモ
    33                                  Last Modified: 16 Apr 2019
    44=====================================================================
    55
    6 â—‹ã“のドキュメントの位置づけ
     6○このドキュメントの位置づけ
    77
    8 ã“のドキュメントは,TOPPERS/SSPカーネルをBCM283xに移植する際の
    9 ãƒãƒƒãƒ—固有事é 
    10 ã«é–¢ã™ã‚‹è¨­è¨ˆãƒ¡ãƒ¢ã§ã‚る.
     8このドキュメントは,TOPPERS/SSPカーネルをBCM283xに移植する際の
     9チップ固有事項に関する設計メモである.
    1110
    12 (参考)
     11(参考)
    1312
    1413(a) QA7(ARM Quad A7 core)
     
    2019
    2120
    22 [CPUモード]
     21[CPUモード]
    2322
    24 â—ãƒªã‚»ãƒƒãƒˆæ™‚の状æ
    25 ‹
     23●リセット時の状態
    2624
    27 ãƒªã‚»ãƒƒãƒˆæ™‚,BCM283x (Cortex-A53) は,EL3h (使用スタック SP_EL3)で起動する.
     25リセット時,BCM283x (Cortex-A53) は,EL3h (使用スタック SP_EL3)で起動する.
    2826
    2927
    30 [割込み]
     28[割込み]
    3129
    3230
    33 â—å‰²è¾¼ã¿å„ªå
    34 ˆåº¦
     31●割込み優先度
    3532
    36 BCM283x の割込みコントローラは優å
    37 ˆåº¦ãŒå®Ÿè£
    38 ã•ã‚Œã¦ã„ない.そのため
    39ʌ㻌
    40 ˆåº¦ã«åŸºã¥ãå‰²è¾¼ã¿ã®ãƒžã‚¹ã‚¯ã‚’ソフトウェアで擬似的に実è£
    41 ã—ている.
    42 å‰²è¾¼ã¿ã®å†
    43 éƒ¨å„ªå
    44 ˆåº¦ã®å€¤ã¯å¤–部優å
    45 ˆåº¦ã®ç¬¦å·ã‚’反転したものを用いるため,
    46 å€¤ã®å¤§ãã„方が高優å
    47 ˆåº¦ã¨ãªã‚‹ï¼Ž
     33BCM283x の割込みコントローラは優先度が実装されていない.そのため
     34優先度に基づく割込みのマスクをソフトウェアで擬似的に実装している.
     35割込みの内部優先度の値は外部優先度の符号を反転したものを用いるため,
     36値の大きい方が高優先度となる.
    4837
    49ʌ㻌
    50 ˆåº¦ã®ç¯„囲は自由に決めることができる.既定の最高値は15となっている.
     38優先度の範囲は自由に決めることができる.既定の最高値は15となっている.
    5139
    5240
    53 â—å‰²è¾¼ã¿/例外の受付
     41●割込み/例外の受付
    5442
    55 å‰²è¾¼ã¿ä¿¡å·ã‚’受信すると,BCM283xのペンディングレジスタの該当するビットがセットされる.
    56 å‰²è¾¼ã¿ç•ªå·ã¯ã“のレジスタにセットされる値を使用する.
     43割込み信号を受信すると,BCM283xのペンディングレジスタの該当するビットがセットされる.
     44割込み番号はこのレジスタにセットされる値を使用する.
    5745
    58 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ç•ªå·ã¨å‰²è¾¼ã¿ç•ªå·ã¯ï¼ŒBCM2835及びBCM2836の
    59 ãƒšãƒªãƒ•ã‚§ãƒ©ãƒ«ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«(下記a及びb)から,ペンディングレジスタのビット位置に基づいて
    60 0から127の番号を割り当てる.(個ã€
    61 ã®å®šç¾©ã¯ bcm2837.h を参ç
    62 §)
     46割込みハンドラ番号と割込み番号は,BCM2835及びBCM2836の
     47ペリフェラルマニュアル(下記a及びb)から,ペンディングレジスタのビット位置に基づいて
     480から127の番号を割り当てる.(個々の定義は bcm2837.h を参照)
    6349
    64  0 ... 31  Core interrupt (下記aのP16 「Core0 interrupt source」に対応)
    65 32 ... 63  ARM peripherals interrupt(bのP113「Basic pending register」に対応)
    66 64 ... 95  ARM peripherals interrupt(bのP115「GPU pending register 1」に対応)
    67 96 ...127  ARM peripherals interrupt(bのP115「GPU pending register 2」に対応)
     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」に対応)
    6854
    69 å‰²è¾¼ã¿ã‚’受け付けると例外レベルと例外の種類に応じた所定の位置から
    70 å®Ÿè¡Œã‚’開始する点はコア依存部の説明と同様であるが,割込みの優å
    71 ˆåº¦ã®
    72 å‡¦ç†å†
    73 å®¹ã«ã¤ã„ては以下のようになる.
     55割込みを受け付けると例外レベルと例外の種類に応じた所定の位置から
     56実行を開始する点はコア依存部の説明と同様であるが,割込みの優先度の
     57処理内容については以下のようになる.
    7458
    75 ã¾ãšå‰²è¾¼ã¿ã®å
    76 ¥å£å‡¦ç†ã§ã¯ä»¥ä¸‹ã®å‡¦ç†ã‚’行う:
    77 ãƒ»å‰²è¾¼ã¿ç™ºç”Ÿæ™‚,割込み要因をå
    78 ƒã«å„ªå
    79 ˆåº¦ã‚’取得する
    80 ãƒ»å„ªå
    81 ˆåº¦ã‚’å
    82 ƒã«ï¼Œãã®å‰²è¾¼ã¿å„ªå
    83 ˆãƒ¬ãƒ™ãƒ«ã§å½“該の割込み要因をマスクするかどうかを決定する.
    84 ãƒ»ãã®å„ªå
    85 ˆåº¦ã§ãƒžã‚¹ã‚¯ã™ã‚‹å¿
    86 è¦ã®ã‚る割込みをå
    87 ¨ã¦ãƒžã‚¹ã‚¯ã™ã‚‹ï¼Ž
    88 ãƒ»CPUロックを解除し,割込みハンドラを呼び出す.
     59まず割込みの入口処理では以下の処理を行う:
     60・割込み発生時,割込み要因を元に優先度を取得する
     61・優先度を元に,その割込み優先レベルで当該の割込み要因をマスクするかどうかを決定する.
     62・その優先度でマスクする必要のある割込みを全てマスクする.
     63・CPUロックを解除し,割込みハンドラを呼び出す.
    8964
    90 å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã‹ã‚‰ã®ãƒªã‚¿ãƒ¼ãƒ³å¾Œï¼Œå‡ºå£å‡¦ç†ã«å
    91 ¥ã‚‹å‰ã«å„ªå
    92 ˆåº¦ã‚’å
    93 ƒã«æˆ»ã™ï¼š
    94 ãƒ»å‰²è¾¼ã¿ç™ºç”Ÿå‰ã®å‰²è¾¼ã¿å„ªå
    95 ˆåº¦ã‚’スタックから取得する
    96 ãƒ»å‰²è¾¼ã¿ç™ºç”Ÿå‰ã®å„ªå
    97 ˆåº¦ã‚’å
    98 ƒã«ï¼Œãã®å‰²è¾¼ã¿å„ªå
    99 ˆåº¦ã§ãƒžã‚¹ã‚¯è§£é™¤ã®å¯¾è±¡ã¨ãªã‚‹å‰²è¾¼ã¿ã‚’決める
    100 ãƒ»å¯¾è±¡ã¨ãªã‚‹å‰²è¾¼ã¿ã®å‰²è¾¼ã¿ãƒžã‚¹ã‚¯ã‚’すべて解除する.
     65割込みハンドラからのリターン後,出口処理に入る前に優先度を元に戻す:
     66・割込み発生前の割込み優先度をスタックから取得する
     67・割込み発生前の優先度を元に,その割込み優先度でマスク解除の対象となる割込みを決める
     68・対象となる割込みの割込みマスクをすべて解除する.
    10169
    102 å‰²è¾¼ã¿è¦å› ã¨å„ªå
    103 ˆåº¦ã¨ã®å¯¾å¿œï¼ŒãŠã‚ˆã³å„ªå
    104 ˆåº¦ã¨ãƒžã‚¹ã‚¯ãƒ‘ターンとの対応には
    105 ãã‚Œãžã‚Œ intpri_table,及び iipm_mask_table というé
    106 åˆ—を使用する.
    107 ã“れらは CFG_INT の設定値をもとにコンフィギュレータが kernel_cfg.c に出力する.
     70割込み要因と優先度との対応,および優先度とマスクパターンとの対応には
     71それぞれ intpri_table,及び iipm_mask_table という配列を使用する.
     72これらは CFG_INT の設定値をもとにコンフィギュレータが kernel_cfg.c に出力する.
    10873
    10974
    110 CPU例外の例外番号については,コア依存部と同様のため省略する.
     75CPU例外の例外番号については,コア依存部と同様のため省略する.
    11176
    11277
    113 â—ä¾‹å¤–/割込みの受付
     78●例外/割込みの受付
    11479
    115 ãƒ»ä¾‹å¤–/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ
    116   ンテキストを保存する.
     80・例外/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ
     81  ンテキストを保存する.
    11782
    11883   ---------------
    11984  |   GICC_PMR     |  <- new SP
    12085   ----------------
    121   | 割込み/例外番号|
     86  | 割込み/例外番号|
    12287   ----------------
    12388  |    ESR_ELx     |
     
    13196  |      X29       |
    13297   ----------------
    133   |      :        |
    134   |      :        |
     98  |              |
     99  |              |
    135100   ----------------
    136101  |      X1        |
     
    141106
    142107
    143 å‰²è¾¼ã¿/例外発生時の主なシーケンスは次のようになる(遷移å
    144 ˆã®ä¾‹å¤–レベルをELxと表現する)
     108割込み/例外発生時の主なシーケンスは次のようになる(遷移先の例外レベルをELxと表現する)
    145109
    146 ï¼ˆãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®å‡¦ç†ï¼‰
    147   ・PSTATEをSPSR_ELxに保存する
    148   ・リターンアドレスをELR_ELxに保存する
    149   ・PSTATE.{D,A,I,F}を1にセットする
    150   ・同期例外およびSError割込みのとき,例外要因æƒ
    151 å ±ã‚’ESR_ELxに保存する
    152   ・スタックポインタをSP_ELxに切り替える
    153   ・(CPU例外の場合)例外番号をx22に格納
    154   ・ELxへ遷移する
     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へ遷移する
    155118
    156 ï¼ˆã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã®å‡¦ç†ï¼‰
    157   ・(発生時にSP_EL0を使用していた場合)スタックを割込み発生前(SP_EL0)に戻す
    158   ・汎用レジスタ(X0-X30)をスタックに保存
    159   ・SPSR_ELx, ESR_ELx, ELR_ELxをスタックに保存
    160   ・(割込み)ペンディングレジスタから割込み番号を取得
    161     (CPU例外)例外番号をx22から取得
    162   ・割込み番号,例外番号をスタックに保存
    163   ・割込み発生前の割込み優å
    164 ˆåº¦ãƒžã‚¹ã‚¯ã‚’スタックに保存
    165   ・受け付けた割込みの割込み優å
    166 ˆåº¦ã‚’変数 current_intpri にセット
    167   ・(割込みの場合)割込み優å
    168 ˆåº¦ã®å€¤ã‚’å
    169 ƒã«ï¼Œå‰²è¾¼ã¿ã‚’マスクする
    170   ・割込み/例外ネストカウンタのインクリメント
    171   ・(割込みの場合)CPUロック解除
    172     (カーネル管理のCPU例外の場合)例外発生前のPSTATE状æ
    173 ‹ã«è¨­å®š
    174   ・ハンドラのé
    175 åˆ—からアドレスを読み込みハンドラを実行する
     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  ・ハンドラの配列からアドレスを読み込みハンドラを実行する
    176133
    177 â—ä¾‹å¤–/割込みからのリターン
     134●例外/割込みからのリターン
    178135
    179 ï¼ˆã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã®å‡¦ç†ï¼‰
    180   ・CPUロック状æ
    181 ‹ã¸ç§»è¡Œ
    182   ・割込み/例外ネストカウンタのデクリメント
    183   ・(割込みの場合)割込み発生前の優å
    184 ˆåº¦ãƒžã‚¹ã‚¯ã‚’戻し,優å
    185 ˆåº¦ã«å¿œã˜ã¦å‰²è¾¼ã¿ã®ãƒžã‚¹ã‚¯ã‚’解除する
    186     (CPU例外の場合)CPU管理外の例外の場合,例外発生å
    187 ƒã¸ãƒªã‚¿ãƒ¼ãƒ³ã™ã‚‹
    188   ・戻りå
    189 ˆã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚„システム状æ
    190 ‹ã«å¿œã˜ã¦å‰²è¾¼ã¿/例外発生å
    191 ƒã¸ãƒªã‚¿ãƒ¼ãƒ³
    192     またはé
    193 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチを実行する
    194   ・ELR_ELxに戻りå
    195 ˆã‚¢ãƒ‰ãƒ¬ã‚¹ï¼ŒSPSR_ELxにプロセッサ状æ
    196 ‹ãŒãã‚Œãžã‚Œ
    197     セットされている状æ
    198 ‹ã§eret命令を実行し,割込み/例外からリターン
     136(ソフトウェアでの処理)
     137  ・CPUロック状態へ移行
     138  ・割込み/例外ネストカウンタのデクリメント
     139  ・(割込みの場合)割込み発生前の優先度マスクを戻し,優先度に応じて割込みのマスクを解除する
     140    (CPU例外の場合)CPU管理外の例外の場合,例外発生元へリターンする
     141  ・戻り先のコンテキストやシステム状態に応じて割込み/例外発生元へリターン
     142    または遅延ディスパッチを実行する
     143  ・ELR_ELxに戻り先アドレス,SPSR_ELxにプロセッサ状態がそれぞれ
     144    セットされている状態でeret命令を実行し,割込み/例外からリターン
    199145
    200146
    201 â—‹ OSの実è£
     147○ OSの実装
     148
     1491.チップ依存部名称: bcm283x
     150
     151現状では Raspberry Pi3B に搭載されるBCM2837のみサポートするが,
     152Raspberry Pi に搭載されるプロセッサBCM283x (x=5,6,7)は周辺回路について
     153共通する部分が多く,まとめて扱うことにするため依存部名称を bcm283x とした
    202154
    203155
    204 1.チップ依存部名称: bcm283x
     1562. 外部優先度と内部優先度
    205157
    206 ç¾çŠ¶ã§ã¯ Raspberry Pi3B に搭載されるBCM2837のみサポートするが,
    207 Raspberry Pi に搭載されるプロセッサBCM283x (x=5,6,7)は周辺回路について
    208 å
    209 ±é€šã™ã‚‹éƒ¨åˆ†ãŒå¤šãï¼Œã¾ã¨ã‚ã¦æ‰±ã†ã“とにするため依存部名称を bcm283x とした
     158外部優先度とはAPIで指定する割込み優先度(PRI型)のことであり,値が小さい
     159ほど優先度が高い.割込みハンドラには,-1から連続した負の値を設定可能で
     160ある.内部優先度は外部優先度の符号を反転した値とする.
     161外部優先度と内部優先度の変換は以下のマクロで表現される.
    210162
    211 
    212 2. 外部優å
    213 ˆåº¦ã¨å†
    214 éƒ¨å„ªå
    215 ˆåº¦
    216 
    217 å¤–部優å
    218 ˆåº¦ã¨ã¯APIで指定する割込み優å
    219 ˆåº¦(PRI型)のことであり,値が小さい
    220 ã»ã©å„ªå
    221 ˆåº¦ãŒé«˜ã„.割込みハンドラには,-1から連続した負の値を設定可能で
    222 ã‚る.å†
    223 éƒ¨å„ªå
    224 ˆåº¦ã¯å¤–部優å
    225 ˆåº¦ã®ç¬¦å·ã‚’反転した値とする.
    226 å¤–部優å
    227 ˆåº¦ã¨å†
    228 éƒ¨å„ªå
    229 ˆåº¦ã®å¤‰æ›ã¯ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã§è¡¨ç¾ã•ã‚Œã‚‹ï¼Ž
    230 
    231 /* 外部表現への変換 */
     163/* 外部表現への変換 */
    232164#define EXT_IPM(pri) (-pri)
    233165
    234 /* å†
    235 éƒ¨è¡¨ç¾ã¸ã®å¤‰æ› */
     166/* 内部表現への変換 */
    236167#define INT_IPM(ipm) (-ipm)
    237168
    238169
    239 3. カーネル管理å†
    240 ã®æœ€é«˜å„ªå
    241 ˆåº¦(CPUロック状æ
    242 ‹ã§ã®å„ªå
    243 ˆåº¦ãƒžã‚¹ã‚¯)
     1703. カーネル管理内の最高優先度(CPUロック状態での優先度マスク)
    244171
    245 CPUロック状æ
    246 ‹ã®å®Ÿè£
    247 ã«å„ªå
    248 ˆåº¦ã¯ç”¨ã„ていない.
    249 ã¾ãŸå„ªå
    250 ˆåº¦åˆ¶å¾¡ã¯ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§å®Ÿè£
    251 ã—ているため,
    252 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å†
    253 ã®å‰²è¾¼ã¿ã®æœ€é«˜å„ªå
    254 ˆåº¦ã¯è‡ªç”±ã«è¨­å®šå¯èƒ½ã§ã‚る.
     172CPUロック状態の実装に優先度は用いていない.
     173また優先度制御はソフトウェアで実装しているため,
     174カーネル管理内の割込みの最高優先度は自由に設定可能である.
    255175
    256 ãƒãƒƒãƒ—依存部で既定値として-15に定義しているが,å¿
    257 è¦ã«å¿œã˜ã¦
    258 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆæ¯Žã«å¿
    259 è¦ãªå€¤ã‚’設定することができる.
     176チップ依存部で既定値として-15に定義しているが,必要に応じて
     177ターゲット毎に必要な値を設定することができる.
    260178
    261179
    262 ä»¥ä¸Šï¼Ž
     180以上.
Note: See TracChangeset for help on using the changeset viewer.