PL330 のレジスタの書き込み順番(うそだった)

今ハードもソフトも動くものを sar, ccr, dar の順で書きこんだらちゃんとうまくった。問題は順番ではなくいろいろあったみたい。DMAWFP と DMSTPB の組み合わせだったり、ready や valid の応答だったり。また、いったん動かなくなると DMA が暴走している(あるいは正常だけど動き続ける)、とまっていてエラー状態、などの時に正しいプログラムでも、動かなくなることがあった。(2015/7/1)

GIC の時もあったので驚かなくなったけど、ARM の純正ペリフェラルレジスタ設定の順番を間違えるとちゃんと動かないことがある。GIC に関しては資料が散逸しているというもんだいがある。まぁこれはおいおいまとめよう。
Qemu や ARM が提供しているソースが見れる GIC のシミュレーションモデルでは通るのだけど、ARM のブラックボックスの GIC (LISA 版。本物と同じシミュレーションをしていると思われる)や本物では GIC のレジスタ書き込み順が問題になる。Linux などが正しいのでそれを見た方がよい。
PL330 も同じ。
PL330 に関してはDMAのインストラクションとして SAR, DAR, CCR の順にする必要がある。手元のシミュレーションモデルではレジスタの番号順 SAR, CCR, DAR の順に設定していた。これがダメだった。
Xilinx の standalone で組み立てられるインストラクションが正しいのでそれをみるべき。
順番を間違うとエラーも発生せず(どこかにその情報が残っているのか?)、チャネルのスレッドのPCは更新されて期待通りのところで止まっているが、実は DMA 転送できていない。
最初キャッシュの問題化と思って CPU のキャッシュをオフにしたりしなかったりして混乱してしまった。
あと、最初はセキュアなアドレスを使ってスタートするのが正しいようだ。おそらくセキュアな状態からノンセキュアな状態にして使うのがよいのだと思う。そのあと、ノンセキュアな方のアドレスを使うのでしょう。しかし、XilinxLinux もノンセキュアな処理をセキュアなレジスタから実行しているようだ。これがだだしいのか?これ”も”できるけど、本当はそうでないのか?はわからない。
この辺を間違えると、インストラクションエラーになる。エラーになるからわかりやすいと言えばわかりやすい。go cmd とか CCR も合わせないといけない(これは仕様書に書いてある)。

動いてしまえば簡単だけど動くまでは「どうして動かないのか、全くわからない」ので困る。