JP2011070372A - Dma転送制御装置 - Google Patents
Dma転送制御装置 Download PDFInfo
- Publication number
- JP2011070372A JP2011070372A JP2009220526A JP2009220526A JP2011070372A JP 2011070372 A JP2011070372 A JP 2011070372A JP 2009220526 A JP2009220526 A JP 2009220526A JP 2009220526 A JP2009220526 A JP 2009220526A JP 2011070372 A JP2011070372 A JP 2011070372A
- Authority
- JP
- Japan
- Prior art keywords
- transfer
- page
- dma
- control device
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Bus Control (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
【課題】ユーザー空間で確保されたメインメモリ領域であって、物理アドレス空間においては離散的にマッピングされるメインメモリ領域に高速に取り溢しなくデータを転送する。
【解決手段】ユーザー空間でデータの転送先となるメモリ領域を確保した時点でその領域に対応する物理アドレスをカーネル空間で取得し、DMA転送制御装置300が具備するディスクリプタ格納メモリ304に予め総ページ数、各ページの先頭物理アドレス、各ページの転送サイズ情報をデータの転送に必要な転送情報として記録してからDMA転送を開始する。DMA転送制御装置300はページ単位の転送が完了したタイミングで残りページ数をデクリメントするとともに、次ページの転送情報をディスクリプタ格納メモリ304から取得できるので、CPUがページ単位の転送完了を認識する必要はなく、高速なデータ転送が可能となる。
【選択図】図3
【解決手段】ユーザー空間でデータの転送先となるメモリ領域を確保した時点でその領域に対応する物理アドレスをカーネル空間で取得し、DMA転送制御装置300が具備するディスクリプタ格納メモリ304に予め総ページ数、各ページの先頭物理アドレス、各ページの転送サイズ情報をデータの転送に必要な転送情報として記録してからDMA転送を開始する。DMA転送制御装置300はページ単位の転送が完了したタイミングで残りページ数をデクリメントするとともに、次ページの転送情報をディスクリプタ格納メモリ304から取得できるので、CPUがページ単位の転送完了を認識する必要はなく、高速なデータ転送が可能となる。
【選択図】図3
Description
本発明はDMA(Direct Memory Access)転送制御装置に関し、特にスキャッタギャザ(Scatter Gather)DMA転送制御装置に関する。
メインメモリと周辺機器との間でのデータ転送では、データの受け渡しをCPUの管理下で行うのが一般的である。しかし、データの受け渡しを常にCPUを介して行おうとすると、CPUの負荷が重くなるため、データ転送に時間を要することになる。
そこで、高速な機器とのデータの受け渡しを行う際には、CPUを介さずに周辺機器のインターフェース装置に制御権を渡して直接メインメモリとのデータの受け渡しを行う方式、即ちDMA転送が用いられる。
そこで、高速な機器とのデータの受け渡しを行う際には、CPUを介さずに周辺機器のインターフェース装置に制御権を渡して直接メインメモリとのデータの受け渡しを行う方式、即ちDMA転送が用いられる。
このDMA転送において、DMA転送制御装置内に転送内容を示す転送情報(ディスクリプタ)を複数格納しておき、この複数の転送情報に基づいて連続的にデータ転送を行うのがチェーンDMA転送である(特許文献1)。また、このチェーンDMA転送の一種としてスキャッタギャザDMA転送が知られている。
スキャッタギャザDMA転送は図1に示すように、メインメモリ100上に複数の転送情報を格納しておく転送情報領域101を持つ一方、DMA転送制御装置12がメインメモリ100上の転送情報領域101からバス13を介して転送情報を取得し、この取得した転送情報に基づいてDMA転送制御装置12にDMA開始命令を発行し、バス13を介してメインメモリ100にデータを転送し、当該メモリ100内のデータ領域102に書き込む、という動作を繰り返すことによってデータ転送を行うものである。
ここで、データ領域103とは、malloc等の一般的な領域確保の関数でユーザー空間から確保されたメモリ領域であるとする。
Windows(登録商標)やLinuxのように、仮想記憶方式を採用するOS環境下では、このメモリ領域は、仮想アドレス空間では連続アドレスにマッピングされるが、物理アドレス空間ではページ単位で離散的にマッピングされる。
ページとは、仮想アドレス空間にマッピングできる物理メモリの最小単位のことをいうが、今日では4Kバイトのものが多い。
Windows(登録商標)やLinuxのように、仮想記憶方式を採用するOS環境下では、このメモリ領域は、仮想アドレス空間では連続アドレスにマッピングされるが、物理アドレス空間ではページ単位で離散的にマッピングされる。
ページとは、仮想アドレス空間にマッピングできる物理メモリの最小単位のことをいうが、今日では4Kバイトのものが多い。
例えば、mallocで20Kバイトのメモリ領域を確保した場合、その先頭アドレスの下位12ビットが0、つまり、先頭アドレスが4Kバイトのページ境界に割り当てられることは稀であり、大抵の場合はページの途中アドレスに割り当てられ、合計6ページ分のページをまたぐことになる。
一方、DMA転送制御装置12がメインメモリ100にアクセスするには、転送先アドレスとして、メインメモリ100の物理アドレスを指定する必要がある。
図2の例では、1ページ目の領域にデータ転送するために、先頭物理アドレス0x12792048、転送サイズ0x0FB8をセットしてDMA転送制御装置にDMA開始命令を発行し、1ページ目の転送が完了したら、2ページ目の転送条件である先頭物理アドレス0x12B94000、転送サイズ0x1000をセットしてDMA開始命令を発行し、2ページ目の転送が完了したら、次ページの転送条件をセットして転送を開始して完了を待つ。最終的に6ページ目の転送条件をセットしてDMA転送を開始し、この転送が完了した時点で全データの転送が完了したことになる。
図2の例では、1ページ目の領域にデータ転送するために、先頭物理アドレス0x12792048、転送サイズ0x0FB8をセットしてDMA転送制御装置にDMA開始命令を発行し、1ページ目の転送が完了したら、2ページ目の転送条件である先頭物理アドレス0x12B94000、転送サイズ0x1000をセットしてDMA開始命令を発行し、2ページ目の転送が完了したら、次ページの転送条件をセットして転送を開始して完了を待つ。最終的に6ページ目の転送条件をセットしてDMA転送を開始し、この転送が完了した時点で全データの転送が完了したことになる。
ここで問題になるのは、DMA転送制御装置12のページ単位の転送完了を知るための手段と、DMA転送制御装置12に次ページの転送情報をどのようなタイミングで与えるか、である。
即ち、DMA転送制御装置12のページ単位の転送完了を一定周期で監視するポーリング手段を適用すると、その分CPUに負荷がかかるため、CPUを介さずにデータ転送を行うことでCPUにかかる負荷を軽減するというDMA転送の利点を享受できなくなるばかりでなく、リアルタイム性に乏しいポーリングでは、DMA転送制御装置12が実際にページ単位の転送を完了してからCPUがそれを認識するまでにはタイムラグが発生し、このタイムラグに伴い、次ページの転送情報をDMA転送制御装置12にセットするタイミングも遅れ、さらに、次ページの転送開始命令を発行するタイミングも遅れてしまう。
そこで、DMA転送制御装置12のページ単位の転送完了で割り込みを発生させ、デバイスドライバの割り込みルーチン内で次ページの転送情報をDMA転送制御装置12に書き込む方法もあるが、例えばバス13がPCIバスのように割り込み共有型のバスである場合、割り込みが発生したとしてもその発生源が複数箇所の可能性があるため、割り込み線を共有している全てのハードウェアについて割り込み発生の有無を調べなければならず、転送速度が重要視されるアプリケーションにおいては最適な方法とはいえない。
本発明は、上記の問題を鑑みてなされたものであり、その課題とするところは、ユーザー空間で確保されたメインメモリ領域であって、物理アドレス空間においては離散的にマッピングされるメインメモリ領域に高速に取り溢しなくデータを転送することにある。
また、DMA転送制御装置から転送するデータは、DMA転送制御装置が備える同期書き込み、同期読み出し方式のメモリに予め格納されているものとして、このデータを、PCIバスを介してメインメモリにDMA転送する際のバスプロトコルについても本発明の課題とする。
上記の課題を解決するための手段として、請求項1に記載の発明は、仮想記憶方式を採用するOS環境下で動作するDMA転送制御装置であって、ユーザー空間でデータの転送先となるメモリ領域を確保した時点でその領域に対応する物理アドレスをカーネル空間で取得する手段と、前記DMA転送制御装置が具備するメモリに予め総ページ数、各ページの先頭物理アドレス、各ページの転送サイズ情報を前記データの転送に必要な転送情報として記録してからDMA転送を開始する手段とを備えることを特徴とする。
これにより、DMA転送制御装置はページ単位の転送が完了したタイミングで残りページ数をデクリメントするとともに、次ページの転送情報をDMA転送制御装置自身が備えるメモリから取得できるので、CPUがページ単位の転送完了を認識する必要はなく、高速なデータ転送が可能となる。
これにより、DMA転送制御装置はページ単位の転送が完了したタイミングで残りページ数をデクリメントするとともに、次ページの転送情報をDMA転送制御装置自身が備えるメモリから取得できるので、CPUがページ単位の転送完了を認識する必要はなく、高速なデータ転送が可能となる。
請求項2に記載の発明は、同期読み出しメモリを有し、該同期読み出しメモリに格納されているデータをPCIバスを介してメインメモリに転送するDMA転送制御装置であって、前記PCIバスのターゲットレディ信号(TRDY#)がアサートされた次の1クロックだけ前記PCIバスのイニシエータレディ信号(IRDY#)をディアサートする手段と、前記イニシエータレディ信号(IRDY#)をディアサートしている1クロックの間に前記同期読み出しメモリのアドレスを確定しておく手段とを備えることを特徴とする。
これにより、アドレスを指定しても次のクロックが来ないと当該アドレスに格納されているデータを取り出すことができない同期読み出しメモリに格納されているデータを取り溢すことなくPCIバスを介してメインメモリに転送することができる。
請求項3に記載の発明は、前記データの前記メインメモリへの転送は、前記DMA転送制御装置がイニシエータデバイスとして動作し、かつ、前記メインメモリを含むチップセットがターゲットデバイスとして動作することでなされることを特徴とする。
これにより、アドレスを指定しても次のクロックが来ないと当該アドレスに格納されているデータを取り出すことができない同期読み出しメモリに格納されているデータを取り溢すことなくPCIバスを介してメインメモリに転送することができる。
請求項3に記載の発明は、前記データの前記メインメモリへの転送は、前記DMA転送制御装置がイニシエータデバイスとして動作し、かつ、前記メインメモリを含むチップセットがターゲットデバイスとして動作することでなされることを特徴とする。
本発明によれば、同期読み出しメモリに格納されているデータを取り溢しなく高速にメインメモリに転送することができる。
以下、本発明の実施例を説明する。
図3は、本発明に係るDMA転送制御装置の構成例を示す図である。
DMA転送制御装置300は、ターゲットシーケンサ301と、レジスタインターフェース302(コンフィグレーションレジスタ3021とDMAコントロール/ステータスレジスタ3022を有する)と、イニシエータシーケンサ303と、ディスクリプタ格納メモリ304と、外部データ格納メモリ305と、パリティチェッカ/ジェネレータ306とで構成されており、PCIバス310を介して、チップセット320内のI/Oコントロールハブ(ICH)3202に接続されている。
チップセット320は、高速信号を授受するためのメモリコントロールハブ(MCH)3201と、ICH3202とで構成されており、MCH3201は、専用バスを介して、CPU330と、メインメモリ340に接続される。
図3は、本発明に係るDMA転送制御装置の構成例を示す図である。
DMA転送制御装置300は、ターゲットシーケンサ301と、レジスタインターフェース302(コンフィグレーションレジスタ3021とDMAコントロール/ステータスレジスタ3022を有する)と、イニシエータシーケンサ303と、ディスクリプタ格納メモリ304と、外部データ格納メモリ305と、パリティチェッカ/ジェネレータ306とで構成されており、PCIバス310を介して、チップセット320内のI/Oコントロールハブ(ICH)3202に接続されている。
チップセット320は、高速信号を授受するためのメモリコントロールハブ(MCH)3201と、ICH3202とで構成されており、MCH3201は、専用バスを介して、CPU330と、メインメモリ340に接続される。
次に、DMA転送制御装置300の構成要素について説明する。
ターゲットシーケンサ301は、CPU330がPCIバス310の制御権を有するイニシエータデバイス、DMA転送制御装置300がターゲットデバイスとして動作するためのステートマシンであって、イニシエータが発行するコンフィグレーションサイクルやメモリサイクルに応対する。
ターゲットシーケンサ301は、CPU330がPCIバス310の制御権を有するイニシエータデバイス、DMA転送制御装置300がターゲットデバイスとして動作するためのステートマシンであって、イニシエータが発行するコンフィグレーションサイクルやメモリサイクルに応対する。
レジスタインターフェース302は、コンフィグレーションレジスタ3021と、DMAコントロール/ステータスレジスタ3022とで構成されている。
コンフィグレーションレジスタ3021は、DMA転送制御装置300が使用するメモリアドレス、割り込み線等のシステムハードウェアリソースを決定したり、PCIエージェントとしての各種機能のイネーブル/ディセーブルを決定したり、PCIエージェントとしての現在のステータスを示したり、デバイス固有の特性についての初期設定を行なったりする。
DMAコントロール/ステータスレジスタ3022は、DMA転送制御装置300に対して、DMA転送開始のコントロールをしたり、DMA転送制御装置300のDMA転送完了ステータスを示したり、CPU330から、PCIバス310を介して渡されるDMA転送情報を後述するディスクリプタ格納メモリ304に格納したりする。
コンフィグレーションレジスタ3021は、DMA転送制御装置300が使用するメモリアドレス、割り込み線等のシステムハードウェアリソースを決定したり、PCIエージェントとしての各種機能のイネーブル/ディセーブルを決定したり、PCIエージェントとしての現在のステータスを示したり、デバイス固有の特性についての初期設定を行なったりする。
DMAコントロール/ステータスレジスタ3022は、DMA転送制御装置300に対して、DMA転送開始のコントロールをしたり、DMA転送制御装置300のDMA転送完了ステータスを示したり、CPU330から、PCIバス310を介して渡されるDMA転送情報を後述するディスクリプタ格納メモリ304に格納したりする。
イニシエータシーケンサ303は、DMA転送制御装置300がPCIバス310の制御権を有するイニシエータデバイスとして動作するためのステートマシンである。詳細については後述する。
ディスクリプタ格納メモリ304は、DMA転送制御装置300がハードマクロとして備える同期書き込み/同期読み出し方式のメモリであって、データ転送先となるメインメモリの先頭物理アドレス、および、転送サイズについての情報を格納する。
本実施の形態では、ディスクリプタ格納メモリ304が、特許請求の範囲のDMA転送制御装置が具備するメモリを構成している。
本実施の形態では、ディスクリプタ格納メモリ304が、特許請求の範囲のDMA転送制御装置が具備するメモリを構成している。
外部データ格納メモリ305は、DMA転送制御装置300がハードマクロとして備える同期書き込み/同期読み出し方式のメモリであって、外部からのデータをバッファリングし、イニシエータシーケンサ303から出力されるアドレスに基づき、バッファリングしてあるデータをPCIバス310に出力する。なお、外部データ格納メモリ305のデータビット幅は32ビットとし、1つのアドレスに4バイトのデータを格納することができる。
本実施の形態では、外部データ格納メモリ305が、特許請求の範囲の同期読み出しメモリを構成している。
本実施の形態では、外部データ格納メモリ305が、特許請求の範囲の同期読み出しメモリを構成している。
ここで、同期書き込み/同期読み出し方式のメモリについて、図4を用いて説明する。
同期書き込みとは、図4(a)に示すように、クロックの立ち上がりにおけるアドレスバスの値をアドレスとして、このアドレスに、同クロックの立ち上がりにおけるデータバスの値がデータとして書き込まれる。
同期読み出しとは、図4(b)に示すように、アドレスを指定して、指定したアドレスのデータを読み出すことができるのは、次のクロックが来てからのものをいう。
なお、非同期読み出しとは、図4(c)に示すように、アドレスを指定して、次のクロックが来る前に指定したアドレスのデータを読み出すことができるものである。
したがって、あるタイミングで同期読み出し方式のメモリからデータを読み出す場合には、少なくともその1クロック前のタイミングで当該データが格納されているアドレスを確定しておく必要がある。
同期書き込みとは、図4(a)に示すように、クロックの立ち上がりにおけるアドレスバスの値をアドレスとして、このアドレスに、同クロックの立ち上がりにおけるデータバスの値がデータとして書き込まれる。
同期読み出しとは、図4(b)に示すように、アドレスを指定して、指定したアドレスのデータを読み出すことができるのは、次のクロックが来てからのものをいう。
なお、非同期読み出しとは、図4(c)に示すように、アドレスを指定して、次のクロックが来る前に指定したアドレスのデータを読み出すことができるものである。
したがって、あるタイミングで同期読み出し方式のメモリからデータを読み出す場合には、少なくともその1クロック前のタイミングで当該データが格納されているアドレスを確定しておく必要がある。
パリティチェッカ/ジェネレータ306は、DMA転送制御装置300がターゲットデバイスとして振る舞う際のライトサイクル応答時、または、イニシエータデバイスとして振る舞う際のリードサイクル応答時、つまり、DMA転送制御装置300が受信側となる場合に送信側が生成するパリティをチェックし、パリティ異常検出時にはコンフィグレーションレジスタ3021にその旨を書き込むと共に、PERR#(パリティエラー信号)をアサートする一方、DMA転送制御装置300がターゲットデバイスとして振る舞う際のリードサイクル応答時、または、イニシエータデバイスとして振る舞う際のライトサイクル応答時、つまり、DMA転送制御装置300が送信側となる場合にパリティを生成してPAR(パリティ信号)として出力する。
次に、DMA転送制御装置300の動作について、図5に示すフローチャートを用いて説明する。
ステップS1では、mallocでデータ転送先となるメインメモリ領域を確保する。具体例を示すため、ここでは20Kバイトの領域を確保したものとする。
ステップS2では、ステップS1で確保した領域がスワップアウトされないようにデバイスドライバに要求する。つまり、カーネル空間においてノンページドプールメモリを割り当てる。
ステップS3では、ステップS1で確保した領域に対応する物理アドレスを取得する。物理アドレスはユーザー空間では取得できないため、カーネル空間で動作するデバイスドライバにアクセスすることによって取得される。
ステップS4では、ステップS3で取得した物理アドレスに基づいて、ディスクリプタを生成する。このステップで、総ページ数、各ページの先頭物理アドレス、各ページの転送サイズ情報を含む図2に示すようなディスクリプタ(転送情報)が生成される。
図中の数値は発明者のテスト環境において実際に得られた例である。
この例では、ユーザー空間で確保したメモリ領域の先頭仮想アドレスが0x00900048であり、ページ境界から0x48だけオフセットしているため、1ページ目における転送サイズは4Kバイト(0x1000)から0x48を差し引いた0x0FB8となる。続く2ページ目から5ページ目までは、転送サイズは4Kバイト(0x1000)であり、最後の6ページ目における転送サイズは0x48となる。
また、各ページの先頭仮想アドレス0x00900048、0x00901000、0x00902000、0x00903000、0x00904000、0x00905000に対応する先頭物理アドレスとして、0x12792048、0x12B94000、0x12C55000、0x12496000、0x12621000、0x12922000が得られた。
図中の数値は発明者のテスト環境において実際に得られた例である。
この例では、ユーザー空間で確保したメモリ領域の先頭仮想アドレスが0x00900048であり、ページ境界から0x48だけオフセットしているため、1ページ目における転送サイズは4Kバイト(0x1000)から0x48を差し引いた0x0FB8となる。続く2ページ目から5ページ目までは、転送サイズは4Kバイト(0x1000)であり、最後の6ページ目における転送サイズは0x48となる。
また、各ページの先頭仮想アドレス0x00900048、0x00901000、0x00902000、0x00903000、0x00904000、0x00905000に対応する先頭物理アドレスとして、0x12792048、0x12B94000、0x12C55000、0x12496000、0x12621000、0x12922000が得られた。
ステップS5では、ステップS4で生成したディスクリプタをDMA制御装置300のディスクリプタ格納メモリ304に書き込み、また、総ページ数をDMAコントロール/ステータスレジスタ3022に書き込む。
このとき、PCIバス310の制御権はCPU330が有しており、DMA制御装置300はターゲットデバイスとして振る舞う。即ち、CPU330がイニシエータデバイスとして発行するメモリライトサイクルに対し、ターゲットシーケンサ301が応答することになる。
このとき、PCIバス310の制御権はCPU330が有しており、DMA制御装置300はターゲットデバイスとして振る舞う。即ち、CPU330がイニシエータデバイスとして発行するメモリライトサイクルに対し、ターゲットシーケンサ301が応答することになる。
ステップS6では、ステップS5でCPU330により発行されたメモリライトサイクルにターゲットシーケンサ301が応答することにより、図2に示したディスクリプタ(転送情報)がディスクリプタ格納メモリ304に書き込まれ、また、総ページ数がDMAコントロール/ステータスレジスタ3022に書き込まれる。
ステップS7では、CPU330がDMAコントロール/ステータスレジスタ3022にDMA開始命令を書き込む。
ステップS8において、イニシエータシーケンサ303に対してDMA開始命令が発行され、DMA制御装置300はPCIバス310の制御権を要求、獲得してイニシエータデバイスとして振る舞うようになる。
図5のステップS8からステップS15までが、本発明のDMA転送制御装置のメインとなる部分である。そこで以下、図5のステップS8からステップS15までの詳細について、図6のタイミングチャートを用いて説明する。
図5のステップS8からステップS15までが、本発明のDMA転送制御装置のメインとなる部分である。そこで以下、図5のステップS8からステップS15までの詳細について、図6のタイミングチャートを用いて説明する。
まず、図6(a)のクロックaでDMA開始命令を示すDMA_STARTがアサートされる。
クロックbでは、PCIバス310の制御権を要求するためにREQ#(リクエスト信号)をアサートすると共に、外部データ格納メモリ305に対してアドレス(MEM_ADDR)0x0番地を、残り転送サイズとして1ページ目の転送サイズである0xFB8を、残りページとして総ページ数である0x6をセットする。また、DMA_STARTをディアサートする。
外部データ格納メモリ305の0x0番地のデータは、クロックc以降から出力される。
クロックdでは、バスアービタによってGNT#(グラント信号)がアサートされ(バスの使用が許可され)、DMA制御装置300はPCIバス310の制御権を獲得する。
クロックeでは、既にGNT#がアサートされているので、PCIバス310の制御権を要求するREQ#をディアサートする。
また、1ページ目のアドレスフェーズを発行するために、FRAME#(フレーム信号)をアサートすると共に、ADバスに1ページ目の先頭物理アドレス0x12792048を出力し、C/BE#にメモリライトコマンド0x7を出力する。
また、1ページ目のアドレスフェーズを発行するために、FRAME#(フレーム信号)をアサートすると共に、ADバスに1ページ目の先頭物理アドレス0x12792048を出力し、C/BE#にメモリライトコマンド0x7を出力する。
クロックfでは、イニシエータ(DMA制御装置300)のデータ転送準備は整っているため、IRDY#(イニシエータレディ信号)をアサートすると共に、外部データ格納メモリ305の0x0番地から読み出したデータD(0)をADバスに出力する。
クロックgでは、クロックfでADバスに出力したアドレスをデコードして自分が選択されていることを認識したターゲットデバイス(つまり、チップセット320)がDEVSEL#(デバイスセレクション信号)をアサートする。
クロックhでは、データの受信準備が完了したターゲットデバイスがTRDY#(ターゲットレディ信号)をアサートする。
そして、クロックiにおいて初めてIRDY#とTRDY#が共にアサートされてデータ転送が成立し、ADバスのデータD(0)がターゲットデバイスに渡される。
続くクロックjのタイミングで外部データ格納メモリ305のアドレス0x1番地に格納されているデータD(1)をターゲットデバイスに渡したいのであるが、外部データ格納メモリ305のアドレス0x1番地のデータを読み出すためには、クロックjよりも前のタイミングでアドレス0x1を確定しておく必要がある。
しかし、イニシエータであるDMA制御装置300としては、ターゲットデバイスがデータの受信準備を完了するタイミングを前もって知ることは不可能である。ターゲットデバイスが常にクロックhのタイミングでデータの受信準備を完了するとは限らない。したがって、クロックjよりも前のタイミングでアドレス0x1を確定しておくことも不可能である。
しかし、イニシエータであるDMA制御装置300としては、ターゲットデバイスがデータの受信準備を完了するタイミングを前もって知ることは不可能である。ターゲットデバイスが常にクロックhのタイミングでデータの受信準備を完了するとは限らない。したがって、クロックjよりも前のタイミングでアドレス0x1を確定しておくことも不可能である。
そこで、クロックiでIRDY#をディアサートしてデータ転送が成立しないようにする一方で、外部データ格納メモリ305のアドレス0x1番地を指定する。
すると、クロックjのタイミングでアドレス0x1が確定するので、クロックkのタイミングで外部データ格納メモリ305の0x1番地に格納されたデータD(1)が読み出し可能となる。
よって、クロックiでディアサートしたIRDY#を、クロックjで再びアサートすることで、クロックkのタイミングにてデータD(1)をADバスに出力することができる。
つまり、TRDY#が初めてアサートされた次の1クロック分だけIRDY#をディアサートしておくことによって、同期読み出し方式の外部データ格納メモリ305に格納されているデータを適切なタイミングでADバスに出力できるようになる。
つまり、TRDY#が初めてアサートされた次の1クロック分だけIRDY#をディアサートしておくことによって、同期読み出し方式の外部データ格納メモリ305に格納されているデータを適切なタイミングでADバスに出力できるようになる。
また、イニシエータシーケンサ303が、外部データ格納メモリ305のアドレスMEM_ADDRをインクリメントする条件は、FRAME#とTRDY#がアサートされていることとすればよい。
さらに、残り転送サイズREMAIN_SIZEを(1回当たりのデータ転送容量である)4バイトずつデクリメントするための条件としては、IRDY#とTRDY#がアサートされていることとすればよい。
そして、クロックoでは、次のクロックpでデータフェーズが終了するのでFRAME#をディアサートする。次のクロックpでデータフェーズが終了することは、残り転送サイズREMAIN_SIZEが8になっていることでわかる。
クロックpでは、FRAME#をハイインピーダンスにし、IRDY#をディアサートする。ターゲットデバイスにより、DEVSEL#、TRDY#もディアサートされ、データフェーズが完了する。
つまり、1ページ目の転送が完了するので、次のページの転送情報をディスクリプタ格納メモリ304から要求するため、NEXT_PAGEをアサートする。
もちろん、残りページ数REMAIN_PAGEが1より大きいことをNEXT_PAGEをアサートするための条件に含む。
さらに、ディスクリプタ格納メモリ304の、次ページの転送情報が格納されているアドレスを指定しておく。これにより、次のクロックqでアドレスが確定し、その次のクロックrから次ページの転送情報を読み出すことが可能となる。
なお、ここでは、FRAME#がディアサートされているので外部データ格納メモリ305のアドレスMEM_ADDRはインクリメントしない(0x3EEのまま)。
つまり、1ページ目の転送が完了するので、次のページの転送情報をディスクリプタ格納メモリ304から要求するため、NEXT_PAGEをアサートする。
もちろん、残りページ数REMAIN_PAGEが1より大きいことをNEXT_PAGEをアサートするための条件に含む。
さらに、ディスクリプタ格納メモリ304の、次ページの転送情報が格納されているアドレスを指定しておく。これにより、次のクロックqでアドレスが確定し、その次のクロックrから次ページの転送情報を読み出すことが可能となる。
なお、ここでは、FRAME#がディアサートされているので外部データ格納メモリ305のアドレスMEM_ADDRはインクリメントしない(0x3EEのまま)。
クロックqでは、IRDY#をハイインピーダンスにし、NEXT_PAGEをディアサートする。
クロックrでは、NEXT_PAGEのアサート、つまり、全ページ分のDMA転送が完了していないことを認識し、ディスクリプタ格納メモリ304から読み出される2ページ目の転送サイズ0x1000を残り転送サイズREMAIN_SIZEにセットし、残りページ数REMAIN_PAGEを6から5にデクリメントする。また、REQ#をアサートしてPCIバス310の制御権を要求する。
クロックs、tでは、GNT#のアサートを待つ。
クロックuで、GNT#のアサートを認識し、2ページ目のアドレスフェーズを発行するためにFRAME#をアサートすると共に、ディスクリプタ格納メモリ304から読み出される2ページ目の先頭物理アドレス0x12B94000をADバスに出力し、C/BE#にメモリライトコマンド0x7を出力する。
クロックpにおいて、外部データ格納メモリ305のアドレスMEM_ADDRをインクリメントせず、0x3EEのままにしておいたので、0x3EEに格納されているデータD(3EE)は、クロックqから読み出し可能となる。
つまり、1ページ目の場合と同様に、最初のデータ転送が成立するIRDY#とTRDY#の両方が初めてアサートされるタイミングで、最初に転送するべきデータD(3EE)は前もってADバスに出力する準備はできているが、その次のクロックで次のデータD(3EF)をADバスに出力することはできないので、TRDY#が初めてアサートされた次の1クロックだけIRDY#をディアサートし、その間にMEM_ADDRに0x3EFを書き込んでおくようにする。
つまり、1ページ目の場合と同様に、最初のデータ転送が成立するIRDY#とTRDY#の両方が初めてアサートされるタイミングで、最初に転送するべきデータD(3EE)は前もってADバスに出力する準備はできているが、その次のクロックで次のデータD(3EF)をADバスに出力することはできないので、TRDY#が初めてアサートされた次の1クロックだけIRDY#をディアサートし、その間にMEM_ADDRに0x3EFを書き込んでおくようにする。
以上が、1ページ目のデータ転送開始から1ページ目のデータ転送終了まで、また、1ページ目のデータ転送終了から2ページ目のデータ転送開始までのバスプロトコルの詳細である。
続いて、最後の6ページ目のデータ転送についてのバスプロトコルについて、図6(b)を用いて説明する。
クロックAでは、NEXT_PAGEのアサート、つまり、全ページ分のDMA転送が完了していないことを認識し、ディスクリプタ格納メモリ304から読み出される6ページ目の転送サイズ0x0048を残り転送サイズREMAIN_SIZEにセットし、残りページ数REMAIN_PAGEを2から1にデクリメントする。また、REQ#をアサートしてPCIバス310の制御権を要求する。
クロックB、Cでは、GNT#のアサートを待つ。
クロックDで、GNT#のアサートを認識し、6ページ目のアドレスフェーズを発行するためにFRAME#をアサートすると共に、ディスクリプタ格納メモリ304から読み出される6ページ目の先頭物理アドレス0x12922000をADバスに出力し、C/BE#にメモリライトコマンド0x7を出力する。
クロックEからクロックQまでは説明が重複するので割愛する。
クロックRで、最後のページの、最後のデータ転送が完了する。ここでは、残りページ数REMAIN_PAGEが1なので、NEXT_PAGEがアサートされることはなく、ディスクリプタ格納メモリ304に格納された全ページ分のデータ転送が完了したことを示すDMA_DONEをアサートすると共に、図示しないINTA#(インタラプトA信号)をアサートする(図5ではステップS15)。
以上がDMA制御装置300の、イニシエータとしてのバスプロトコルの説明であり、図5のステップS8からステップS15までの詳細である。
図5のステップS16は、ディスクリプタ格納メモリ304に格納された全ページ分のDMA転送が完了したことをCPU330が認識するためのステップであり、ソフトウェアフローとしては、DMA_DONEの値を定期的に監視してもよいし、INTA#のアサートに対応する割り込みルーチンをデバイスドライバに記述してもよい。
ソフトウェアの開発負荷の観点からは、DMA_DONEの値を定期的に監視する方が簡便であるが、DMA制御装置300がDMA転送のためにPCIバス310の制御権を獲得している最中に、CPU330がPCIバス310の制御権を定期的に要求することになるので、DMA制御装置300のデータ転送速度が遅くなる可能性がある。
よって、DMA_DONEの値を定期的に監視する方法は、DMA制御装置300のロジックのテスト、デバッグを簡便に行なうための非機能要件として捉えるのが妥当である。
転送速度が重要視されるアプリケーションでは、INTA#のアサートに対応する割り込みルーチンをデバイスドライバに記述しておく方が好ましい。
ソフトウェアの開発負荷の観点からは、DMA_DONEの値を定期的に監視する方が簡便であるが、DMA制御装置300がDMA転送のためにPCIバス310の制御権を獲得している最中に、CPU330がPCIバス310の制御権を定期的に要求することになるので、DMA制御装置300のデータ転送速度が遅くなる可能性がある。
よって、DMA_DONEの値を定期的に監視する方法は、DMA制御装置300のロジックのテスト、デバッグを簡便に行なうための非機能要件として捉えるのが妥当である。
転送速度が重要視されるアプリケーションでは、INTA#のアサートに対応する割り込みルーチンをデバイスドライバに記述しておく方が好ましい。
ステップS17では、全ページ分のデータがステップS1で確保したメインメモリ領域に格納されている。
CPU330は、このメインメモリ領域に適宜アクセスすることで、所定のアプリケーションソフトウェア処理を行うことができる。
CPU330は、このメインメモリ領域に適宜アクセスすることで、所定のアプリケーションソフトウェア処理を行うことができる。
ところで、図6の最下行には「図7のステート」と記しているが、ここで、イニシエータシーケンサ303の状態遷移図である図7について説明する。
イニシエータシーケンサ303は、パワーONリセットを受けて(1)IDLEステートに初期化される。
(1)IDLEステートは、DMA転送開始、あるいは、再開の命令を待ち、これらの命令を検出したらトランザクションを開始する。トランザクションを開始するには、コンフィグレーションレジスタのコマンドレジスタに割り当てられているマスタイネーブルビットが有効であることと、バスの制御権が獲得できている(GNT#がアサートされている)ことと、バスがアイドル状態(FRAME#とIRDY#が共にディアサート)であることの確認が必要となる。
GNT#のアサート、FRAME#とIRDY#のディアサートを確認できた場合には、(3)ADDRESS_FASEステートに遷移するが、確認できない場合にはバスの制御権を要求するREQ#をアサートして(2)WAIT_GNTステートに遷移する。
さらに、DMA転送開始、あるいは、再開の命令を検出していないにもかかわらずGNT#がアサートされた場合には、バスパーキング処理を行う。
バスパーキング処理では、どんな値でもかまわないので、ADバスやC/BE#信号を出力状態にしてバスを安定させる。GNT#がディアサートされたら、信号のドライブを解放し、バスパーキング処理を終了する。さらに、エラー処理として、マスタイネーブルビットが無効であるにもかかわらずDMA転送開始、あるいは、再開の命令を検出した場合には、(5)MST_TURN_AROUNDステートに遷移する。
(1)IDLEステートは、DMA転送開始、あるいは、再開の命令を待ち、これらの命令を検出したらトランザクションを開始する。トランザクションを開始するには、コンフィグレーションレジスタのコマンドレジスタに割り当てられているマスタイネーブルビットが有効であることと、バスの制御権が獲得できている(GNT#がアサートされている)ことと、バスがアイドル状態(FRAME#とIRDY#が共にディアサート)であることの確認が必要となる。
GNT#のアサート、FRAME#とIRDY#のディアサートを確認できた場合には、(3)ADDRESS_FASEステートに遷移するが、確認できない場合にはバスの制御権を要求するREQ#をアサートして(2)WAIT_GNTステートに遷移する。
さらに、DMA転送開始、あるいは、再開の命令を検出していないにもかかわらずGNT#がアサートされた場合には、バスパーキング処理を行う。
バスパーキング処理では、どんな値でもかまわないので、ADバスやC/BE#信号を出力状態にしてバスを安定させる。GNT#がディアサートされたら、信号のドライブを解放し、バスパーキング処理を終了する。さらに、エラー処理として、マスタイネーブルビットが無効であるにもかかわらずDMA転送開始、あるいは、再開の命令を検出した場合には、(5)MST_TURN_AROUNDステートに遷移する。
DMA転送開始、あるいは、再開の命令には、以下の場合があり得る。
即ち、(A)最初の1ページ目のDMA開始命令を示すDMA_STARTがアサートされた場合、(B)2ページ目以降のDMA開始命令を示すNEXT_PAGEがアサートされた場合、(C)リトライ(ターゲットデバイスが何らかの理由でトランザクションに対して一時的に対応できない場合に要求される処理)、または、ディスコネクト(何度かデータ転送が成立した後に、何らかの理由でデータ転送が継続できない場合、後でトランザクションを再開してほしいときに要求される処理)により、DMA転送がページ途中で打ち切られ、ページ途中からDMA転送を再開する場合である。
即ち、(A)最初の1ページ目のDMA開始命令を示すDMA_STARTがアサートされた場合、(B)2ページ目以降のDMA開始命令を示すNEXT_PAGEがアサートされた場合、(C)リトライ(ターゲットデバイスが何らかの理由でトランザクションに対して一時的に対応できない場合に要求される処理)、または、ディスコネクト(何度かデータ転送が成立した後に、何らかの理由でデータ転送が継続できない場合、後でトランザクションを再開してほしいときに要求される処理)により、DMA転送がページ途中で打ち切られ、ページ途中からDMA転送を再開する場合である。
(A)、(B)の場合、ディスクリプタ格納メモリ304からページ単位の転送情報を読み出してセットする。
(C)の場合、残り転送サイズとしては、REMAIN_SIZEの値をそのままセットし、残りページとしてはREMAIN_PAGEの値をそのままセットする。
しかし、ページ途中からDMA転送を再開することになるので、転送先メインメモリの物理アドレスについては、ディスクリプタ格納メモリ304の情報をそのまま使うことはできない。
しかし、ページ途中からDMA転送を再開することになるので、転送先メインメモリの物理アドレスについては、ディスクリプタ格納メモリ304の情報をそのまま使うことはできない。
データ転送が1回成立する毎に転送先メインメモリの物理アドレスは0x4だけインクリメントされるはずなので、ディスクリプタ格納メモリ304から読み出した転送サイズと、現在の残り転送サイズであるREMAIN_SIZEの差を取ることで、転送先メインメモリの物理アドレスを求めることができる。
例えば、ディスクリプタ格納メモリ304から読み出した先頭物理アドレスが0x10000000、転送サイズが0x1000バイトで、REMAIN_SIZEが0x400バイトであるなら、0x1000−0x400=0xC00バイト分のデータ転送が成立した時点でDMA転送が打ち切られたことになる。
したがって、DMA転送再開時の転送先メインメモリの物理アドレスは、0x10000000+0xC00=0x10000C00となる。この値をアドレスフェーズでADバスに出力できるようにDMAコントロール/ステータスレジスタ3022に記録しておけばよい。
例えば、ディスクリプタ格納メモリ304から読み出した先頭物理アドレスが0x10000000、転送サイズが0x1000バイトで、REMAIN_SIZEが0x400バイトであるなら、0x1000−0x400=0xC00バイト分のデータ転送が成立した時点でDMA転送が打ち切られたことになる。
したがって、DMA転送再開時の転送先メインメモリの物理アドレスは、0x10000000+0xC00=0x10000C00となる。この値をアドレスフェーズでADバスに出力できるようにDMAコントロール/ステータスレジスタ3022に記録しておけばよい。
(2)WAIT_GNTステートでは、GNT#がアサートされるのを待つステートである。但し、直前のトランザクションが完全には終わっていない場合があるため、GNT#がアサートされたからといって、直ちにFRAME#信号などのアサートを開始することはできない。
そこで、このステートでは、GNT#のアサートだけではなく、FRAME#とIRDY#が共にディアサートされていてバスがアイドル状態にあることを条件に含めている。
この条件が成立したら、REQ#をディアサートし、FRAME#、AD、C/BE#のドライブを開始して(3)ADDRESS_FASEステートに遷移する。
そこで、このステートでは、GNT#のアサートだけではなく、FRAME#とIRDY#が共にディアサートされていてバスがアイドル状態にあることを条件に含めている。
この条件が成立したら、REQ#をディアサートし、FRAME#、AD、C/BE#のドライブを開始して(3)ADDRESS_FASEステートに遷移する。
(3)ADDRESS_FASEステートは、アドレスフェーズを発行するステートである。
最後のデータ転送が成立する1クロック前にFRAME#をディアサートする必要があるので、残り転送サイズREMAIN_SIZEを参照し、この値が0x4以下の場合にはFRAME#をディアサートする。
また、IRDY#をアサートして(4)MST_DATA_FASEに遷移する。
また、本発明の主旨から外れるが、データ転送方向がリード(メインメモリが転送元、DMA制御装置300が転送先)の場合には、ADバスのドライブを解放しておく。
最後のデータ転送が成立する1クロック前にFRAME#をディアサートする必要があるので、残り転送サイズREMAIN_SIZEを参照し、この値が0x4以下の場合にはFRAME#をディアサートする。
また、IRDY#をアサートして(4)MST_DATA_FASEに遷移する。
また、本発明の主旨から外れるが、データ転送方向がリード(メインメモリが転送元、DMA制御装置300が転送先)の場合には、ADバスのドライブを解放しておく。
(4)MST_DATA_FASEは、データフェーズを発行するステートである。
残り転送サイズREMAIN_SIZEを参照し、この値が0x4以下の場合には、FRAME#をハイインピーダンスにし、さらに、DEVSEL#、TRDY#のアサートを確認した場合にはIRDY#をディアサートし、AD、C/BE#のドライブを解放して(5)MST_TURN_AROUNDステートに遷移する。
残り転送サイズREMAIN_SIZEを参照し、この値が0x4以下の場合には、FRAME#をハイインピーダンスにし、さらに、DEVSEL#、TRDY#のアサートを確認した場合にはIRDY#をディアサートし、AD、C/BE#のドライブを解放して(5)MST_TURN_AROUNDステートに遷移する。
DEVSEL#(デバイスセレクション信号)はアサート、TRDY#はディアサートである場合には、STOP#(ストップ信号)の値を確認し、STOP#がアサートされていたら、FRAME#をディアサートして(6)RETRY_OR_DISCONNECTステートに遷移する。STOP#がディアサートであれば、このステートでTRDY#のアサートを待つ。
DEVSEL#がディアサートの場合には、DEVSEL#応答のタイムアウトを検出するためのカウンタ値(初期値は(1)IDLEステートで0x3にセットしておく)を確認し、この値が0x0になっていれば、DEVSEL#応答タイムアウトと判断して、マスタアボートビットを有効にし、FRAME#をディアサートして(7)ABORTステートに遷移する。
カウンタ値が0x0よりも大きければ、カウンタを0x1だけデクリメントして、このステートでDEVSEL#のアサートを待つ。
カウンタ値が0x0よりも大きければ、カウンタを0x1だけデクリメントして、このステートでDEVSEL#のアサートを待つ。
残り転送サイズREMAIN_SIZEを参照し、この値が0x4よりも大きい場合で、DEVSEL#、TRDY#がアサートされていて、残り転送サイズREMAIN_SIZEが0x8である場合には、次のクロックでデータ転送が完了するのでFRAME#をディアサートすると共に、残り転送サイズREMAIN_SIZEを0x4だけデクリメントし、外部データ格納メモリ305のアドレスMEM_ADDRを0x1だけインクリメントする。
さらに、TRDY#の初めてのアサート状態である可能性を確認し、もしそうである場合にはIRDY#をディアサートする。
TRDY#が初めてアサートされたことを確認するためには、TRDY#の立ち下がりエッジを検出すればよい。
STOP#がアサートされている場合には、FRAME#をディアサートして(6)RETRY_OR_DISCONNECTステートに遷移する。
DEVSEL#はアサート、TRDY#はディアサートされている場合においても、STOP#がアサートされていたら、FRAME#をディアサートして(6)RETRY_OR_DISCONNECTステートに遷移する。
さらに、TRDY#の初めてのアサート状態である可能性を確認し、もしそうである場合にはIRDY#をディアサートする。
TRDY#が初めてアサートされたことを確認するためには、TRDY#の立ち下がりエッジを検出すればよい。
STOP#がアサートされている場合には、FRAME#をディアサートして(6)RETRY_OR_DISCONNECTステートに遷移する。
DEVSEL#はアサート、TRDY#はディアサートされている場合においても、STOP#がアサートされていたら、FRAME#をディアサートして(6)RETRY_OR_DISCONNECTステートに遷移する。
DEVSEL#がディアサートの場合、TRDY#がディアサートでSTOP#がアサートされていたら、ターゲットアボートビットを有効にし、FRAME#をディアサートして(7)ABORTステートに遷移する。
STOP#がディアサートされていたら、DEVSEL#応答のタイムアウトを検出するためのカウンタ値を確認し、この値が0x0になっていれば、DEVSEL#応答タイムアウトと判断して、マスタアボートビットを有効にし、FRAME#をディアサートして(7)ABORTステートに遷移する。
カウンタ値が0x0よりも大きければ、カウンタを0x1だけデクリメントして、このステートでDEVSEL#のアサートを待つ。
STOP#がディアサートされていたら、DEVSEL#応答のタイムアウトを検出するためのカウンタ値を確認し、この値が0x0になっていれば、DEVSEL#応答タイムアウトと判断して、マスタアボートビットを有効にし、FRAME#をディアサートして(7)ABORTステートに遷移する。
カウンタ値が0x0よりも大きければ、カウンタを0x1だけデクリメントして、このステートでDEVSEL#のアサートを待つ。
残り転送サイズREMAIN_SIZEを参照し、この値が0x4よりも大きい場合で、DEVSEL#、TRDY#がアサートされていて、残り転送サイズREMAIN_SIZEが0x8でない場合には、外部データ格納メモリ305のアドレスMEM_ADDRを0x1だけインクリメントする。
さらに、TRDY#の初めてのアサート状態である可能性を確認し、もしそうである場合にはIRDY#をディアサートする。
そうではない場合には残り転送サイズREMAIN_SIZEを0x4だけデクリメントする。
また、STOP#がアサートされている場合には、FRAME#をディアサートして(6)RETRY_OR_DISCONNECTステートに遷移する。
STOP#がディアサートされている場合には、このステートに留まる。
さらに、TRDY#の初めてのアサート状態である可能性を確認し、もしそうである場合にはIRDY#をディアサートする。
そうではない場合には残り転送サイズREMAIN_SIZEを0x4だけデクリメントする。
また、STOP#がアサートされている場合には、FRAME#をディアサートして(6)RETRY_OR_DISCONNECTステートに遷移する。
STOP#がディアサートされている場合には、このステートに留まる。
DEVSEL#はアサート、TRDY#はディアサートされている場合に、STOP#がアサートされていたら、FRAME#をディアサートして(6)RETRY_OR_DISCONNECTステートに遷移する。
DEVSEL#がディアサートの場合、TRDY#がディアサートでSTOP#がアサートされていたら、ターゲットアボートビットを有効にし、FRAME#をディアサートして(7)ABORTステートに遷移する。
STOP#がディアサートされていたら、DEVSEL#応答のタイムアウトを検出するためのカウンタ値を確認し、この値が0x0になっていれば、DEVSEL#応答タイムアウトと判断して、マスタアボートビットを有効にし、FRAME#をディアサートして(7)ABORTステートに遷移する。
カウンタ値が0x0よりも大きければ、カウンタを0x1だけデクリメントして、このステートでDEVSEL#のアサートを待つ。
STOP#がディアサートされていたら、DEVSEL#応答のタイムアウトを検出するためのカウンタ値を確認し、この値が0x0になっていれば、DEVSEL#応答タイムアウトと判断して、マスタアボートビットを有効にし、FRAME#をディアサートして(7)ABORTステートに遷移する。
カウンタ値が0x0よりも大きければ、カウンタを0x1だけデクリメントして、このステートでDEVSEL#のアサートを待つ。
(5)MST_TURN_AROUNDステートでは、IRDY#をハイインピーダンスにし、(1)IDLEステートに遷移する。
また、リトライ、または、ディスコネクトによってこのステートに遷移してきたわけではない、つまり、ページ単位の転送を完了することによってこのステートに遷移してきた場合には、残りページREMAIN_PAGEを参照し、0x1よりも大きければ、次ページの転送情報を要求するためにPAGE_NEXTをアサートすると共に、REMAIN_PAGEを0x1だけデクリメントする。
なお、PAGE_NEXTは(1)IDLEステートでディアサート状態にセットされる。
REMAIN_PAGEが0x1であれば、最後のページのデータ転送が完了したことになるので、全ページ分のDMA転送完了を示すDMA_DONEをアサートする。また、INTA#をアサートする。
また、リトライ、または、ディスコネクトによってこのステートに遷移してきたわけではない、つまり、ページ単位の転送を完了することによってこのステートに遷移してきた場合には、残りページREMAIN_PAGEを参照し、0x1よりも大きければ、次ページの転送情報を要求するためにPAGE_NEXTをアサートすると共に、REMAIN_PAGEを0x1だけデクリメントする。
なお、PAGE_NEXTは(1)IDLEステートでディアサート状態にセットされる。
REMAIN_PAGEが0x1であれば、最後のページのデータ転送が完了したことになるので、全ページ分のDMA転送完了を示すDMA_DONEをアサートする。また、INTA#をアサートする。
(6)RETRY_OR_DISCONNECTステートでは、FRAME#をハイインピーダンス、IRDY#をディアサート、ADバス、C/BE#のドライブを解放する。
そして、リトライ、または、ディスコネクトにより、ページ途中でデータ転送が打ち切られたことを識別できるようにしておくため、所定の内部レジスタにその旨を記録して、(5)MST_TURN_AROUNDステートに遷移する。
そして、リトライ、または、ディスコネクトにより、ページ途中でデータ転送が打ち切られたことを識別できるようにしておくため、所定の内部レジスタにその旨を記録して、(5)MST_TURN_AROUNDステートに遷移する。
(7)ABORTステートでは、RAME#をハイインピーダンス、IRDY#をディアサート、ADバス、C/BE#のドライブを解放し、(5)MST_TURN_AROUNDステートに遷移する。
以上のように、本発明のDMA転送制御装置によれば、同期読み出し方式のメモリに格納されているデータを、PCIバスを介して、ユーザー空間で確保されたメインメモリ領域であって、物理アドレス空間においては離散的にマッピングされるメインメモリ領域に高速に取り溢しなくデータを転送することができる。
100……メインメモリ、101……転送情報領域、102……データ領域、12……DMA転送制御装置、13……バス、300……MA転送制御装置、301……ターゲットシーケンサ、302……レジスタインターフェース、3021……コンフィグレーションレジスタ、3022……MAコントロール/ステータスレジスタ、303……イニシエータシーケンサ、304……ディスクリプタ格納メモリ、305……外部データ格納メモリ、306……パリティチェッカ/ジェネレータ、310……PCIバス、320……チップセット、3201……モリコントロールハブ(MCH)、3202……/Oコントロールハブ(ICH)、330……CPU、340……メインメモリ。
Claims (3)
- 仮想記憶方式を採用するOS環境下で動作するDMA転送制御装置であって、
ユーザー空間でデータの転送先となるメモリ領域を確保した時点でその領域に対応する物理アドレスをカーネル空間で取得する手段と、
前記DMA転送制御装置が具備するメモリに予め総ページ数、各ページの先頭物理アドレス、各ページの転送サイズ情報を前記データの転送に必要な転送情報として記録してからDMA転送を開始する手段と、
を備えることを特徴とするDMA転送制御装置。 - 同期読み出しメモリを有し、該同期読み出しメモリに格納されているデータをPCIバスを介してメインメモリに転送するDMA転送制御装置であって、
前記PCIバスのターゲットレディ信号(TRDY#)がアサートされた次の1クロックだけ前記PCIバスのイニシエータレディ信号(IRDY#)をディアサートする手段と、
前記イニシエータレディ信号(IRDY#)をディアサートしている1クロックの間に前記同期読み出しメモリのアドレスを確定しておく手段と、
を備えることを特徴とするDMA転送制御装置。 - 前記データの前記メインメモリへの転送は、前記DMA転送制御装置がイニシエータデバイスとして動作し、かつ、前記メインメモリを含むチップセットがターゲットデバイスとして動作することでなされる、
ことを特徴とする請求項2記載のDMA転送制御装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009220526A JP2011070372A (ja) | 2009-09-25 | 2009-09-25 | Dma転送制御装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009220526A JP2011070372A (ja) | 2009-09-25 | 2009-09-25 | Dma転送制御装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2011070372A true JP2011070372A (ja) | 2011-04-07 |
Family
ID=44015610
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2009220526A Pending JP2011070372A (ja) | 2009-09-25 | 2009-09-25 | Dma転送制御装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2011070372A (ja) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2016134018A (ja) * | 2015-01-20 | 2016-07-25 | 富士通株式会社 | Dma制御装置、マイクロコントローラおよびdma制御方法 |
CN107273312A (zh) * | 2016-04-04 | 2017-10-20 | 罗伯特·博世有限公司 | 具有工作存储器的计算单元用的存储器直接访问控制装置 |
CN113127391A (zh) * | 2021-05-13 | 2021-07-16 | 西安微电子技术研究所 | 一种多设备兼容的dma数据传输引擎设计方法 |
JP2022510919A (ja) * | 2018-11-28 | 2022-01-28 | マーベル アジア ピーティーイー、リミテッド | 車両内データ転送のための、エンドポイントおよびダイレクトメモリアクセスコントローラを有するネットワークスイッチ |
-
2009
- 2009-09-25 JP JP2009220526A patent/JP2011070372A/ja active Pending
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2016134018A (ja) * | 2015-01-20 | 2016-07-25 | 富士通株式会社 | Dma制御装置、マイクロコントローラおよびdma制御方法 |
US10031871B2 (en) | 2015-01-20 | 2018-07-24 | Fujitsu Limited | DMA control device, micro control unit, and DMA control method |
CN107273312A (zh) * | 2016-04-04 | 2017-10-20 | 罗伯特·博世有限公司 | 具有工作存储器的计算单元用的存储器直接访问控制装置 |
JP2022510919A (ja) * | 2018-11-28 | 2022-01-28 | マーベル アジア ピーティーイー、リミテッド | 車両内データ転送のための、エンドポイントおよびダイレクトメモリアクセスコントローラを有するネットワークスイッチ |
US11822494B2 (en) | 2018-11-28 | 2023-11-21 | Marvell Asia Pte, Ltd. | Network switch with DMA controller for independent direct memory access of host system |
JP7414365B2 (ja) | 2018-11-28 | 2024-01-16 | マーベル アジア ピーティーイー、リミテッド | 車両内データ転送のための、エンドポイントおよびダイレクトメモリアクセスコントローラを有するネットワークスイッチ |
CN113127391A (zh) * | 2021-05-13 | 2021-07-16 | 西安微电子技术研究所 | 一种多设备兼容的dma数据传输引擎设计方法 |
CN113127391B (zh) * | 2021-05-13 | 2023-03-14 | 西安微电子技术研究所 | 一种多设备兼容的dma数据传输引擎设计方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6085278A (en) | Communications interface adapter for a computer system including posting of system interrupt status | |
US7263572B2 (en) | Bus bridge and data transfer method | |
US8874959B2 (en) | Information processing apparatus, image forming apparatus, and information processing program | |
US9003091B2 (en) | Flow control for a Serial Peripheral Interface bus | |
WO2013080027A2 (en) | Interrupt handling systems and methods for pcie bridges with multiple buses | |
JP5578713B2 (ja) | 情報処理装置 | |
US20150046616A1 (en) | Peripheral registers with flexible data width | |
TW202240413A (zh) | PCIe裝置及其操作方法 | |
US6678838B1 (en) | Method to track master contribution information in a write buffer | |
US8918680B2 (en) | Trace queue for peripheral component | |
JP2024515055A (ja) | シームレスに集積されたマイクロコントローラチップ | |
US6584586B1 (en) | Apparatus and method for capturing and transferring internal system activity | |
JP2011070372A (ja) | Dma転送制御装置 | |
EP1746497B1 (en) | Apparatus and method for sparse line write transactions | |
US7774513B2 (en) | DMA circuit and computer system | |
JP4097883B2 (ja) | データ転送装置および方法 | |
US7698494B2 (en) | Access control device and access control method | |
US20070011376A1 (en) | Target readiness protocol for contiguous write | |
JP2001256179A (ja) | プロセッサシステム | |
US8560748B2 (en) | Information processing system including interrupt processing function | |
JP5146796B2 (ja) | ホストコントローラ | |
JP2010140440A (ja) | バス調停装置 | |
JP4538054B2 (ja) | データ転送装置および方法 | |
WO2016053146A1 (ru) | Компьютерная система | |
JP2006092077A (ja) | バスシステム |