[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Fujitsu MB87030/MB89352 (SPC) manual



井崎です。

On Sun, 25 May 2003 00:14:21 +0900,
In Re: Fujitsu MB87030/MB89352 (SPC) manual,

> 筒井です。
> 
> > > #ifdef x68k の部分がかなり謎。
> > > #luna68k ではどうなんでしょう……
> > 
> > spc_datain_pio() の #ifdef x68k を外すとカーネル起動時に
> > バスエラーで死にました。で、そのことも Inside には書いて
> > ある (X68000 でなんたらモードでこのビット立てるとバスエラー
> > になるよ、とか) のですが、私ではよく分からないで...。
> 
> うーん。PIO なのに SCMD_PROG_XFR を立てると落ちるんですか……
> hp300 だと名前のとおり DMA するときは SCMD_PROG_XFR なし、
> PIO のときは SCMD_PROG_XFER ありでないと動きません。
> 
> ところで x68k の SCSI って DMA 使える仕様になってるんでしょうか?
> DMAC への信号線の始末が悪くて bus error が出るということなら
> わからないでもないですが、そういうことなら DMA 転送を実装すればよい?

x68k の SCSI は DMA は使ってますが、DMAC との連係に手を
加えてあるようです。噛み砕いて説明できないので、それっぽい
ところを丸写し。

p.469, 2.7 SCSIコントローラとDMA

(略)
  SPCは、DMA転送要求信号を持っていますが、X68000ではこれをDMACには
接続しておらず、DMACは通常のメモリ-メモリ間転送にプログラムします。
このままではDMAとSPCの転送要求の同期がとれませんので、DMAはまるで
意味のないデータを引き取ってしまうことになります。そこでX68000の
SCSIインタフェースでは、SPCのDMA転送要求信号をDTACK信号の作成に
使用することで、DMA転送要求が発生するまでDMAを待たせてしまう方法を
とっています。
  DTACK信号は、CPUやDMAがアクセスにきた時に、アクセスされた側が
データ転送の完了を示す信号で、通常は周辺デバイスがアクセス速度に
ついていけないときにCPUやDMAを待たせるための信号です。SCSIインタ
フェースではSPCのDMA要求信号を、このDTACK信号の作成に使用し、DMA
転送要求がくる前にアクセスされると、DMA転送要求が発生するまで動作を
停止させてしまうようにしているのです。ただこのようにすると、
プログラムのミスなどでDMA転送要求が発生しないようになると、そのまま
ハングアップしてしまいますので、約8μsたってもSPCからのDMA転送要求
が発生しないと、バスエラーを発生させて強制的に回復させるようにして
います(DMACはバスエラーが返されると転送を停止します)。
  イメージとしては、DMACがアクセスに来るとそれを捕まえておき、SCSI
バスからデータが来るとそれを引き取らせて手を離す感じです。ただ捕まえた
ままにしておくと、誰も動けなくなってしまうので、一定期間(8us)たっても
データがこないようなら、エラーとして転送を中断するわけです。

p.477 3.4 SCMDレジスタ

 bit 2: Program Transfer
 '1' にするとDREQ信号を出力しないモードになります。マニュアル転送
の時には、このビットを'1'にしておいたほうがよいでしょう。前にも述べた
通り、X68000ではDREQ信号をDTACK信号の作成に使用しています。このビット
を'1'にするとDREGへのアクセスができなくなってしまう(すべてバスエラー
になる)ので、ハード転送を行なうときには、このビットを必ず'0'にして
DREQ信号を発生させるようにしてください。
---
井崎哲也 <isaki@par.odn.ne.jp / isaki@NetBSD.org>