以下、添付図面を参照し、本発明の好適な実施形態について説明する。なお、以下説明する実施形態は、本発明を具体的に実施した場合の一例を示すもので、特許請求の範囲に記載した構成の具体的な実施例の1つである。
[第1の実施形態]
先ず、本実施形態に係るデータ処理装置(情報処理装置)101及びその周辺機器から成るシステムの構成例について、図1のブロック図を用いて説明する。なお、図1に示した構成は、以下に説明する各処理を実現可能な構成の一例に過ぎず、以下に説明する各処理を実現可能な構成であれば、如何なる構成を採用しても構わない。
本実施形態に係るデータ処理装置101は、データのDMA転送を行うと共に、該DMA転送中に該データに対するチェックサムのための演算を行う装置であり、転送器102、演算器103、レジスタ部104、を有する。転送器102は、データ処理装置101の外部に設けられているCPU114(プロセッサの一例)からの指示に応じてデータのDMA転送を行い、演算器103は、該DMA転送中に該データに対するチェックサムのための演算を行う。レジスタ部104は、DMA転送やチェックサムのための演算を要求するCPU114がアクセス可能なレジスタ群を有する。
システムバス113には、上記のデータ処理装置101に加え、CPU114、データの転送元として使用する転送元メモリ115、データの転送先として使用する転送先メモリ116、後述する記述子(ディスクリプタ)を格納する為の記述子配置メモリ117が接続されている。
次に、このような構成を有するシステムの動作の概要について説明する。データ処理装置101にデータのDMA転送を行わせるためには先ず、CPU114は、記述子を作成する必要がある。記述子とは、データ処理装置101にDMA転送を行わせるための指示内容と、DMA転送中にデータ処理装置101にチェックサムのための演算を行わせるための指示内容と、について記述したものである。CPU114がこのような記述子を生成して記述子配置メモリ117にセットすると共に、記述子をセットした記述子配置メモリ117中のアドレスをレジスタ部104にセットすることで、データ処理装置101はDMA転送を開始する。すなわち、データ処理装置101は、記述子に従って転送元メモリ115からデータを読み出して転送先メモリ116にDMA転送すると共にチェックサムのための演算を行い、演算の結果を記述子に応じた格納先に格納する。
ここで、記述子についてより詳細に説明する。記述子は、転送元に係る記述子である転送元用記述子と、転送先に係る記述子である転送先用記述子と、の2種類から成り、CPU114は、1以上の転送元用記述子と1以上の転送先用記述子とを生成することになる。
転送元用記述子のフォーマットを図2(A)に示す。Data Start Address(SRC_DSA201)は、転送対象となるデータの(転送元メモリ115における)先頭アドレスである。Data Length(SRC_DL202)は、転送対象となるデータのサイズ(転送サイズ、データ長)である。Next Descriptor Enable(SRC_NDE203)は、次の転送元用記述子が存在するか否かを示すフラグ値であり、SRC_NDE203=1の場合は存在することを示し、SRC_NDE203=0であれば存在しないことを示す。Next Descriptor Address(SRC_NDA204)は、次の転送元用記述子が存在する場合(SRC_NDE203=1の場合)に、該次の転送元用記述子の(記述子配置メモリ117における)先頭アドレスである。
転送先用記述子のフォーマットを図2(B)に示す。Data Start Address(DST_DSA211)は、転送先メモリ116において転送対象となるデータを格納するための領域(格納領域)の先頭アドレスである。Data Length(DST_DL212)は、格納領域のサイズである。Next Descriptor Enable(DST_NDE213)は、次の転送先用記述子が存在するか否かを示すフラグ値である。DST_NDE213=1の場合は存在することを示し、DST_NDE213=0であれば存在しないことを示す。Next Descriptor Address(DST_NDA214)は、次の転送先用記述子が存在する場合(DST_NDE213=1の場合)に、該次の転送元用記述子の(記述子配置メモリ117における)先頭アドレスである。Checksum Mode(DST_CM215)は、演算器103によるチェックサムのための演算の結果の出力先を指定するための値(モード値)である。DST_CM215=1であれば、出力先をデータ処理装置101外のメモリとし、DST_CM215=0であれば、出力先をデータ処理装置101内のレジスタとする。図1の場合は、DST_CM215=1であれば、出力先は転送先メモリ116となり、DST_CM215=0であれば、出力先はレジスタ部104となる。
このように転送元用記述子、転送先用記述子を構成することで、たとえ転送元用記述子、転送先用記述子のそれぞれを複数生成し、記述子配置メモリ117に格納したとしても(SRC_NDE=DST_NDE=1)、レジスタ部104には、複数の転送元用記述子のうち先頭の転送元用記述子の先頭アドレス、複数の転送先用記述子のうち先頭の転送先用記述子の先頭アドレス、さえ登録しておけば良く、N(Nは2以上の整数)番目の転送元用記述子の先頭アドレスは、(N−1)番目の転送元用記述子のSRC_NDA204から取得することができ、N(Nは2以上の整数)番目の転送先用記述子の先頭アドレスは、(N−1)番目の転送先用記述子のDST_NDA214から取得することができる。
なお、転送元用記述子、転送先用記述子のフォーマットはそれぞれ図2(A)、(B)に示したフォーマットに限るものではない。例えば、転送元用記述子、転送先用記述子を別個にするのではなく、連結させて1つの記述子としても構わない。
次に、データ処理装置101が上記のような記述子を用いて行うDMA転送及びチェックサムのための演算について、図3,4を用いて説明する。
図3では、図3(A)に示す如く、転送対象となる3つのデータ(Data1,Data2,Data3)が隣接して転送元メモリ115内に格納されており、Data1,Data2,Data3をそれぞれ、転送先メモリ116において隣接していない領域にDMA転送すると共に、それぞれのデータに対するチェックサムの結果を転送先メモリ116に格納するケースについて説明する。このようなDMA転送を実現するためにCPU114が生成する転送元用記述子、転送先用記述子を図3(B)に示す。
上記の通り、Data1,Data2,Data3は、転送元メモリ115において連続するアドレスに書き込まれている一塊のデータ群であるため、CPU114は、この一塊のデータ群に対して1つの転送元用記述子を生成する。図3(B)では、この一塊のデータ群(転送元メモリ115に格納されているData1,Data2,Data3)に対して1つの転送元用記述子「転送元用1」を生成している。「転送元用1」におけるSRC_DSA201には、この一塊のデータ群の転送元メモリ115における先頭アドレス(すなわち、Data1の先頭アドレス)が格納されている。また、「転送元用1」におけるSRC_DL202には、この一塊のデータ群のデータサイズ(即ち、Data1,Data2,Data3のそれぞれのデータサイズの合計値)が格納されている。また、転送元メモリ115には、この一塊のデータ群(Data1,Data2,Data3)だけが転送対象として格納されており、転送元用記述子も「転送元用1」だけとなるため、「転送元用1」におけるSRC_NDE203には「0」が格納され、SRC_NDA204にはNULLなどの無効値が格納されることになる。
また、上記の通り、転送先メモリ116には、Data1,Data2,Data3のそれぞれを、転送先メモリ116において隣接していない領域に転送するため、転送先用記述子は、Data1,Data2,Data3のそれぞれについて生成することになる。図3(B)では、Data1,Data2,Data3のそれぞれに対する転送先用記述子として、「転送先用1」、「転送先用2」、「転送先用3」が生成されている。
「転送先用1」のDST_DSA211には、転送先メモリ116においてData1を格納するための領域(格納領域)の先頭アドレスが格納されており、DST_DL212には、転送先メモリ116においてData1を格納するための領域のサイズが格納されている。また、「転送先用1」のDST_NDE213には、次の転送対象データであるData2に対する転送先用記述子(すなわち「転送先用2」)が存在するために「1」が格納され、DST_NDA214には、「転送先用2」の記述子配置メモリ117における先頭アドレスが格納されている。また、「転送先用1」のDST_CM215には、チェックサムの結果を転送先メモリ116に格納する(図3(A)の場合は領域301に格納する)ことを示す値「1」が格納されている。
「転送先用2」のDST_DSA211には、転送先メモリ116においてData2を格納するための領域(格納領域)の先頭アドレスが格納されており、DST_DL212には、転送先メモリ116においてData2を格納するための領域のサイズが格納されている。また、「転送先用2」のDST_NDE213には、次の転送対象データであるData3に対する転送先用記述子(すなわち「転送先用3」)が存在するために「1」が格納され、DST_NDA214には、「転送先用3」の記述子配置メモリ117における先頭アドレスが格納されている。また、「転送先用2」のDST_CM215には、チェックサムの結果を転送先メモリ116に格納する(図3(A)の場合は領域302に格納する)ことを示す値「1」が格納されている。
「転送先用3」のDST_DSA211には、転送先メモリ116においてData3を格納するための領域(格納領域)の先頭アドレスが格納されており、DST_DL212には、転送先メモリ116においてData3を格納するための領域のサイズが格納されている。また、「転送先用3」のDST_NDE213には、次の転送対象データが存在しないために「0」が格納され、DST_NDA214にはNULLなどの無効値が格納されている。また、「転送先用3」のDST_CM215には、チェックサムの結果を転送先メモリ116に格納する(図3(A)の場合は領域303に格納する)ことを示す値「1」が格納されている。
図4では、図4(A)に示す如く、転送対象となる3つのデータ(Data1,Data2,Data3)が転送元メモリ115内で隣接していない領域に格納されており、このような3つのデータ(Data1,Data2,Data3)を転送先メモリ116において隣接している領域にDMA転送すると共に、それぞれのデータに対するチェックサムの結果を転送先メモリ116に格納するケースについて説明する。このようなDMA転送を実現するためにCPU114が生成する転送元用記述子、転送先用記述子を図4(B)に示す。
上記の通り、転送元メモリ115には、Data1,Data2,Data3のそれぞれが隣接していない領域に格納されているため、転送元用記述子は、Data1,Data2,Data3のそれぞれについて生成することになる。図4(B)では、Data1,Data2,Data3のそれぞれに対する転送元用記述子として、「転送元用1」、「転送元用2」、「転送元用3」が生成されている。
「転送元用1」におけるSRC_DSA201には、Data1の転送元メモリ115における先頭アドレスが格納されており、SRC_DL202には、Data1のデータサイズが格納されている。また、「転送元用1」のSRC_NDE203には、次の転送対象データであるData2に対する転送元用記述子(すなわち「転送元用2」)が存在するために「1」が格納され、SRC_NDA204には、「転送元用2」の記述子配置メモリ117における先頭アドレスが格納されている。
「転送元用2」におけるSRC_DSA201には、Data2の転送元メモリ115における先頭アドレスが格納されており、SRC_DL202には、Data2のデータサイズが格納されている。また、「転送元用2」のSRC_NDE203には、次の転送対象データであるData3に対する転送元用記述子(すなわち「転送元用3」)が存在するために「1」が格納され、SRC_NDA204には、「転送元用3」の記述子配置メモリ117における先頭アドレスが格納されている。
「転送元用3」におけるSRC_DSA201には、Data3の転送元メモリ115における先頭アドレスが格納されており、SRC_DL202には、Data3のデータサイズが格納されている。また、「転送元用3」のSRC_NDE203には、次の転送対象データが存在しないために「0」が格納され、SRC_NDA214にはNULLなどの無効値が格納されている。
また、上記の通り、転送先メモリ116には、Data1,Data2,Data3を、転送先メモリ116において連続するアドレスに転送する(一塊のデータ群として転送先メモリ116に格納する)ため、CPU114は、この一塊のデータ群に対して1つの転送先用記述子を生成する。図4(B)では、この一塊のデータ群(Data1,Data2,Data3)に対して1つの転送先用記述子「転送先用1」を生成している。「転送先用1」におけるDST_DSA211には、転送先メモリ116において、一塊のデータ群(Data1,Data2,Data3)を格納するための領域(格納領域)の先頭アドレス(すなわち、Data1を格納するための領域の先頭アドレス)が格納されている。また、「転送先用1」におけるDST_DL212には、この格納領域のデータサイズが格納されている。また、「転送先用1」におけるDST_NDE213には「0」が格納され、DST_NDA214にはNULLなどの無効値が格納される。また、「転送先用1」のDST_CM215には、チェックサムの結果を転送先メモリ116に格納する(図4(A)の場合は領域401に格納する)ことを示す値「1」が格納されている。
図1に戻って、次に、データ処理装置101の内外に設けられたインターフェースについて説明する。データ処理装置101が有する転送器102は、データリードI/F(インターフェース)105及びデータライトI/F106を介してシステムバス113に接続されており、レジスタ部104は、レジスタアクセスI/F107を介してシステムバス113に接続されている。
転送器102は、データリードI/F105を介して、システムバス113に直接的若しくは間接的に接続されている様々なメモリからデータを読み出して取得する。読み出すデータは、記述子やDMA転送の対象となるデータ(転送元データ)である。また、転送器102は、データライトI/F106を介して、システムバス113に直接的若しくは間接的に接続されている様々なメモリに対してデータを書き込む。書き込むデータは、DMA転送の対象となるデータ(転送元データ)やチェックサムの結果(演算結果)である。なお、データ処理装置101のステータス(実行中、完了)を記述子に書き込むようにしても構わない。
CPU114は、システムバス113に接続されている記述子配置メモリ117等に対してアクセスを行ったり、システムバス113及びレジスタアクセスI/F107を介してレジスタ部104に対してアクセスすることができる。
また、CPU114は、データ処理装置101から送信される通知信号108を受けることができる。この通知信号108は、データ処理装置101が各種ステータスを通知するために使用するものであり、CPU114は、この通知信号108を受けて解析することで、データ処理装置101のステータスを確認することができる。例えば、データ処理装置101が何らかの処理を完了させた場合には、その旨を通知信号108にてCPU114に通知する。他に、記述子やレジスタの設定値に誤りがあり、データ処理装置101がエラーを検出した場合にも、エラー通知を通知信号108としてCPU114に送信する。
次に、データ処理装置101についてより詳細に説明する。転送器102は、レジスタ部104に記述子のアドレスが書き込まれたことをレジスタ部104からレジスタ信号A109を介して通知されると、動作を開始する。動作を開始した転送器102は、データリードI/F105を介して記述子配置メモリ117から記述子を取得して解析し、該解析の結果に従って、転送元メモリ115に格納されている転送対象のデータをデータリードI/F105を介して取得し、該取得したデータをデータライトI/F106を介して転送先メモリ116に転送する、いわゆるDMA転送を実行する。また、転送器102は、演算指示/結果通知信号111を介して演算器103にチェックサムのための演算の実行指示を行ったり、演算器103による演算の結果を演算指示/結果通知信号111を介して受信したりする。
演算器103は、演算指示/結果通知信号111を介して転送器102から演算の実行指示を受けると、転送器102によりDMA転送されるデータに対してチェックサム演算を行う。ここでいうチェックサム演算とは、1の補数和の計算であり、データライトI/F106上に現れるデータ群をスヌープI/F112を介して取得し、そのデータに対して演算を行う。
レジスタ部104は、データ処理装置101とCPU114との間におけるコミュニケーションを行うためのレジスタが格納されており、CPU114からアクセス可能なレジスタである。転送器102がレジスタ部104に対して、レジスタ値の取得や、レジスタへの書込みを行う場合には、レジスタ信号A109を介して行う。さらに、演算器103がレジスタ部104に対し、レジスタ値の取得や、レジスタへの書込みを行う場合には、レジスタ信号B110を介して行う。
次に、転送器102の構成例について、図5のブロック図を用いて説明する。転送器制御部501は、転送器102全体の動作制御を行う。レジスタ部104に記述子のアドレスが書き込まれると、その旨がレジスタ部104からレジスタ信号A109を介して通知されるので、転送器制御部501は、レジスタ信号A109を介してこの通知を受けると、転送器102を構成する各部の動作を開始させる。
バスアクセス処理部503は、転送器制御部501からの指示により、以下の処理を行う。
・ データリードI/F105を介して、記述子配置メモリ117に格納されている記述子を読み出し、該読み出した記述子を記述子解析部504に対して送出する。
・ データリードI/F105を介して、転送元メモリ115に格納されている転送対象のデータを読み出し、該読み出したデータをPUSHデータバス506を介してFIFO部502にPUSHする。
・ FIFO部502に格納されているデータを、POPデータバス507を介して読み出してバスアクセス処理部503へPOPし、該データをデータライトI/F106を介して転送先メモリ116に転送する。
・ 演算器I/F処理部505を介して、演算器103からの演算結果を受信し、該演算結果をデータライトI/F106を介して転送先メモリ116に転送する。
FIFO部502は、転送元メモリ115から転送先メモリ116に転送するデータを一時的に記憶するためのバッファメモリとして機能するものである。転送器102は、転送元メモリ115から読み出したデータを、転送先用記述子に記載されたサイズ(DST_DL212)に分割若しくは結合させてから転送先メモリ116に転送するのであるが、FIFO部502は、該分割や該結合の為の処理で用いるバッファメモリとして機能する。
記述子解析部504は、バスアクセス処理部503がデータリードI/F105を介して読み出した記述子(転送元用記述子、転送先用記述子)を取得し、該取得した記述子の解析を行い、該解析の結果を転送器制御部501に通知する。演算器I/F処理部505は、以下の処理を行う。
・ 演算器103に対して、チェックサムのための演算の実行指示を行う。具体的には、これから転送器102がDMA転送を行うデータのサイズ(記述子解析部504が転送器制御部501に通知した転送先用記述子に含まれているDST_DL212)と演算結果の出力先(記述子解析部504が転送器制御部501に通知した転送先用記述子に含まれているDST_CM215)を通知する。
・ 演算器103から演算結果を受信し、該受信した演算結果をバスアクセス処理部503に通知する。
次に、図1のシステムにおいて、CPU114、データ処理装置101、転送元メモリ115、転送先メモリ116、記述子配置メモリ117、のそれぞれ間で行われる処理について、図6,7を用いて説明する。
先ず、転送先用記述子におけるDST_CM215の値が「1」の場合、すなわち、演算器103による演算結果の出力先として転送先メモリ116が指定された場合に、CPU114、データ処理装置101、転送元メモリ115、転送先メモリ116、記述子配置メモリ117、のそれぞれ間で行われる処理について、図6を用いて説明する。
先ず、CPU114は、転送対象となるデータについて転送元用記述子、転送先用記述子(DST_CM215=1)を作成し(図6では転送元用記述子及び転送先用記述子が合計3つ作成されている場合を示している)、作成したそれぞれの記述子をシステムバス113を介して記述子配置メモリ117に格納する(601)。このとき、転送対象となるデータの総データ量と、転送先メモリ116において転送対象となるデータを格納するための領域のサイズが、下記の式の如く一致する必要がある。
また、CPU114は、記述子配置メモリ117に格納した転送元用記述子のうち1番目の転送元用記述子、記述子配置メモリ117に格納した転送先用記述子のうち1番目の転送先用記述子、のそれぞれについて、該記述子配置メモリ117における格納アドレスを、システムバス113及びレジスタアクセスI/F107を介してレジスタ部104に書き込む(602)。
レジスタ部104は、処理602によって2つの識別子のアドレスの格納が完了したことを検知すると、レジスタ信号A109を介してその旨を転送器102に対して通知する(603)ので、転送器102は動作を開始する。
動作を開始した転送器102は先ず、レジスタ信号A109を介してレジスタ部104から、1番目の転送元用記述子のアドレス(アドレスX)、1番目の転送先用記述子のアドレス(アドレスY)を取得し、記述子配置メモリ117においてアドレスXに格納されている記述子(すなわち1番目の転送元用記述子)、記述子配置メモリ117においてアドレスYに格納されている記述子(すなわち1番目の転送先用記述子)を、データリードI/F105を介して取得する。2番目以降の転送元用記述子、転送先用記述子については上記の通り、それぞれ1つ先に取得した転送元用記述子、転送先用記述子のSRC_NDA204/DST_NDA214に格納されているアドレスを参照することで取得することができる。このような処理により、転送器102は、記述子配置メモリ117に格納されている転送元用記述子、転送先用記述子を取得することができる(604)。
次に、転送器102は、転送元用記述子、転送先用記述子を解析して、転送元メモリ115におけるどのアドレスからデータを読み出し、転送先メモリ116のどの領域に転送するのか、転送しているデータに対するチェックサムの結果をどの格納先に出力するのか、等を特定する(605)。
そして転送器102は、演算指示/結果通知信号111を介して演算器103に対して、チェックサムのための演算の実行指示を行う(606)。この実行指示には、上記の通り、処理605における解析の結果に含まれている、これから転送器102がDMA転送を行うデータのサイズ(DST_DL212)と演算結果の出力先(DST_CM215)と、が含まれている。
そして転送器102は、データリードI/F105を介して、転送元メモリ115に格納されているデータを転送元用記述子に従って順次読み出し、該データを分割したり結合したりしてから、転送先用記述子に従ってデータライトI/F106を介して転送先メモリ116に対して転送する(607)。
また、演算器103は、データライトI/F106に上に現れるデータ群をスヌープI/F112を介して取得し、そのデータに対して、チェックサムのための演算を行う(608)。なお、転送器102は、データ群の開始及び終了の信号がバスに無い場合は、演算対象となるデータのサイズ(DST_DL212に相当)を事前に通知しておくので、演算器103は、演算済みデータ数のカウントを行い、自動で演算の終了判定ができる。また、転送器102は、演算器103に対して、演算結果の出力先(DST_CM215に相当)も通知しておくので、演算器103は、演算結果を得たあと、自身でレジスタ部104に書き込むのか、転送器102に演算結果を通知するのかを決定できる。
そして転送器102は、データのDMA転送が完了すると、演算器103から演算指示/結果通知信号111を介してチェックサムの結果が通知されるまで待機する(609)。演算器103は、転送器102が転送した全てのデータに対するチェックサムのための演算が完了すると、該演算の結果を演算指示/結果通知信号111を介して転送器102に対して通知する(610)。
転送器102は、演算器103からチェックサムの結果を受けると、該結果を、転送先用記述子中のDST_CM215に書き込まれている値に応じた格納先、即ち、転送先メモリ116に対して、データライトI/F106を介して送出する(611)。そして転送器102は、レジスタ信号A109を介してレジスタ部104にDMA転送処理の完了ステータスを表す値を書き込む(612)。レジスタ部104に書き込まれた値は、通知信号108を介してCPU114に通知される(613)ので、CPU114は、データ処理装置101へリクエストした処理が完了したことを検知する。
次に、転送先用記述子におけるDST_CM215の値が「0」の場合、すなわち、演算器103による演算結果の出力先としてレジスタ部104が指定された場合に、CPU114、データ処理装置101、転送元メモリ115、転送先メモリ116、記述子配置メモリ117、のそれぞれ間で行われる処理について、図7を用いて説明する。図7において、図6に示した処理と同じ処理には同じ参照番号を付しており、この処理に係る説明は省略する。
先ず、CPU114は、転送対象となるデータについて転送元用記述子、転送先用記述子(DST_CM215=0)を作成し(図7では転送元用記述子及び転送先用記述子が合計3つ作成されている場合を示している)、作成したそれぞれの記述子をシステムバス113を介して記述子配置メモリ117に格納する(701)。
そして転送器102は、データのDMA転送が完了すると、演算器103から演算指示/結果通知信号111を介してチェックサムの結果が通知されるまで待機することなく、即座に、DMA転送が完了したことを通知するための値を、レジスタ信号A109を介してレジスタ部104に書き込む(702)。レジスタ部104に書き込まれた値は、通知信号108を介してCPU114に通知される(703)ので、CPU114は、データ処理装置101へリクエストした処理が完了したことを検知する。
演算器103は、転送器102が転送した全てのデータに対するチェックサムのための演算が完了すると、該演算の結果を、レジスタ信号B110を介してレジスタ部104に対して送出する(704)。
ここで、完了通知(処理703)と演算結果の通知(処理704)との間のタイムラグ705が実装で一定の範囲内に収まっていれば、転送器102は、演算器103の完了を待つことなくCPU114にDMA転送が完了した旨を通知しても構わない。すなわち、レジスタ部104への演算結果の格納は、CPU114が完了通知を検知したことに応じてレジスタ部104にアクセスして演算結果を確認するまで(この時間はシステムによって異なるが)に完了していればよいわけであるから、DMA転送が完了した時点で即座に完了通知を行っても、完了通知からタイムラグ705の間に、レジスタ部104への演算結果の格納が完了していれば問題はない。
次に、転送器102が行う処理について、同処理のフローチャートを示す図8を用いて説明する。図8のフローチャートに従った処理は、上記の通り、「記述子配置メモリ117に格納した転送元用記述子のうち1番目の転送元用記述子、記述子配置メモリ117に格納した転送先用記述子のうち1番目の転送先用記述子、のそれぞれの該記述子配置メモリ117における格納アドレスがレジスタ部104に書き込まれた旨」がレジスタ信号A109を介して通知され、転送器制御部501がこれを検知した場合に開始されるものである。
ステップS802では、転送元メモリ115からデータを読み出してFIFO部502に取り込む処理1(ステップS804〜S810)と、FIFO部502に取り込んだデータを転送先メモリ116にDMA転送すると共に、転送するデータに対するチェックサムを演算器103に行わせる処理2(ステップS811〜S820、S824)と、が実行されるのであるが、処理1が処理2に先行して実行されるのであれば、処理1と処理2とは並行して実行可能である。先ず、処理1について説明する。
ステップS804の処理は、第1回目と2回目以降とで処理の内容が若干異なる。第1回目のステップS804では、転送器制御部501は、レジスタ信号A109を介してレジスタ部104から取得した(転送元用記述子の)アドレスをバスアクセス処理部503に通知する。バスアクセス処理部503は、データリードI/F105を介して、記述子配置メモリ117中の該アドレスに格納されている転送元用記述子を読み出し、該読み出した転送元用記述子を記述子解析部504に対して送出するので、記述子解析部504は該転送元用記述子を解析する。
第N(Nは2以上の整数)回目のステップS804では、バスアクセス処理部503は、記述子配置メモリ117において、第(N−1)回目のステップS804で読み出した転送元用記述子中のSRC_NDA204が示すアドレスに格納されている転送元用記述子を、データリードI/F105を介して読み出し、該読み出した転送元用記述子を記述子解析部504に対して送出するので、記述子解析部504は該転送元用記述子を解析する。
ステップS805では、転送器制御部501は、Error判定1を実行する。ここで、Error判定1について説明する。DMA転送の性質上、転送データのリード処理の前に転送データのライト処理が完了することは無い。従って、DMA転送が正常終了した場合であっても異常終了している場合であっても、この時点でステップS820における処理が完了しているような場合には、Errorが発生していると判断する。このようなErrorが発生しているか否かの判定がError判定1である。このようなErrorが発生している場合には、処理はステップS810に進み、発生していない場合には、処理はステップS806に進む。
ステップS806では、バスアクセス処理部503は、FIFO部502に空き容量がない(Fullである)か否かを判断する。この判断の結果、Fullである場合、転送中のデータが何らかの理由により、まだ転送先メモリ116に書かれていないため、転送元メモリ115からの転送データの読み込みを保留すべく、処理はステップS805に戻る。一方、Fullではない場合には、処理はステップS807に進む。
ステップS807では、バスアクセス処理部503は、ステップS804で記述子配置メモリ117から読み出した転送元用記述子中のSRC_DSA201が示すアドレスを先頭アドレスとし、該転送元用記述子中のSRC_DL202が示すデータ長ぶんのデータを、単位データ長のデータごとに分割した場合に、1つぶんの分割データをデータリードI/F105を介して読み出し、該読み出した分割データをFIFO部502にPUSHする。
ステップS808では、バスアクセス処理部503は、ステップS804で記述子配置メモリ117から読み出した転送元用記述子中のSRC_DSA201が示すアドレスから、該転送元用記述子中のSRC_DL202が示すデータ長ぶんのデータを読み出したか否か(全ての分割データを読み出したか否か)を判断する。この判断の結果、読み出した場合には、処理はステップS809に進み、まだ読み出すべき分割データが残っている場合には、処理はステップS805に戻る。
ステップS809では、バスアクセス処理部503は、ステップS804で記述子配置メモリ117から読み出した転送元用記述子中のSRC_NDE203の値が「1」であるのか「0」であるのかを判断する。この判断の結果、SRC_NDE203=1の場合には、処理はステップS804に戻り、SRC_NDE203=0の場合には、処理はステップS810に進む。
ステップS810では、バスアクセス処理部503は、全ての転送元用記述子に対する処理が完了した旨を転送器制御部501に通知するので、転送器制御部501は、転送元に関する処理の全てが終了した時の処理を行う。例えば、転送器制御部501は、データリード処理(転送元に関する処理)が完了したことを示す情報をレジスタ部104に格納するようにしても構わない。なお、転送器制御部501は、上記のError判定1において、Errorが発生していると判断した場合に、その旨をレジスタ部104に格納するようにしても構わない。
次に、上記の処理2について説明する。ステップS811の処理は、第1回目と2回目以降とで処理の内容が若干異なる。第1回目のステップS811では、転送器制御部501は、レジスタ信号A109を介してレジスタ部104から取得した(転送先用記述子の)アドレスをバスアクセス処理部503に通知する。バスアクセス処理部503は、データリードI/F105を介して、記述子配置メモリ117中の該アドレスに格納されている転送先用記述子を読み出し、該読み出した転送先用記述子を記述子解析部504に対して送出するので、記述子解析部504は該転送先用記述子を解析する。
第N(Nは2以上の整数)回目のステップS811では、バスアクセス処理部503は、記述子配置メモリ117において、第(N−1)回目のステップS811で読み出した転送先用記述子中のDST_NDA214が示すアドレスに格納されている転送先用記述子を、データリードI/F105を介して読み出し、該読み出した転送先用記述子を記述子解析部504に対して送出するので、記述子解析部504は該転送先用記述子を解析する。
何れの回であっても、ステップS811では、演算器I/F処理部505は、記述子解析部504による転送先用記述子に対する解析結果を転送器制御部501を介して取得し、これから転送器102がDMA転送を行うデータのサイズ(DST_DL212)と演算結果の出力先(DST_CM215)と、が含まれている実行指示を、演算指示/結果通知信号111を介して演算器103に対して送出する。
次に、ステップS812では、転送器制御部501は、Error判定2を実行する。すなわち、転送器制御部501は、転送先用記述子中のDST_DL212が示すデータ長ぶんのデータの転送が完了していないのに、FIFO部502が空の状態(Empty)であり、且つこの時点でステップS810における処理が完了している(正常終了、異常終了は問わない)ような場合には、Errorが発生していると判断する。このようなErrorが発生しているか否かの判定がError判定2である。このようなErrorが発生している場合には、処理はステップS820に進み、発生していない場合には、処理はステップS813に進む。
次に、ステップS813では、転送器制御部501は、FIFO部502が空の状態であるか否かを判断する。FIFO部502が空の状態(Empty)であれば、転送中データが何らかの理由により、まだFIFO部502にPUSHされていないため、FIFO部502から転送先メモリ116へのデータ転送を保留する。然るに、この判断の結果、FIFO部502が空の状態である場合には、処理はステップS812に戻り、空の状態ではない場合には、処理はステップS814に進む。
ステップS814では、バスアクセス処理部503は転送先用記述子に従って、POPデータバス507を介してFIFO部502から転送単位分のデータをPOPし、該転送単位分のデータをデータライトI/F106を介して転送先メモリ116に転送する。
ステップS815では、バスアクセス処理部503は、転送先用記述子中のDST_DL212が示すデータ長ぶんだけのデータ転送を行ったか否かを判断する。この判断の結果、転送先用記述子中のDST_DL212が示すデータ長ぶんだけのデータ転送を行った場合には、処理はステップS816に進み、行っていない場合には、ステップS812に戻る。
ステップS816では、転送器制御部501は、記述子解析部504による転送先用記述子の解析により、DST_CM215の値が「1」であるのかそれとも「0」であるのかを判断する。この判断の結果、DST_CM215の値が「1」である場合には、処理はステップS817に進み、DST_CM215の値が「0」である場合には、処理はステップS819に進む。
ステップS817では、演算器I/F処理部505は、演算器103から演算指示/結果通知信号111を介してチェックサムの結果を受信したか否かを判断する。この判断の結果、まだ受信していない場合には、処理はステップS824に進み、受信した場合には、処理はステップS818に進む。ステップS824では、演算器I/F処理部505は、演算器103からのチェックサムの受信を待機し、その後、処理はステップS817に戻る。
ステップS818では、演算器I/F処理部505は、演算指示/結果通知信号111を介して演算器103から受信したチェックサムの結果をバスアクセス処理部503に転送するので、バスアクセス処理部503は、この転送されたチェックサムの結果をデータライトI/F106を介して転送先メモリ116に転送し、転送済みのデータの末尾に該チェックサムの結果を格納する。
ステップS819では、転送器制御部501は、転送先用記述子中のDST_NDE213の値が「1」であるのかそれとも「0」であるのかを判断する。この判断の結果、DST_NDE213=1の場合には、処理はステップS811に戻り、DST_NDE213=0の場合には、処理はステップS820に進む。
ステップS820では、バスアクセス処理部503は、全ての転送先用記述子に対する処理が完了した旨を転送器制御部501に通知するので、転送器制御部501は、転送先に関する処理の全てが終了した時の処理を行う。例えば、転送器制御部501は、データライト処理(転送先に関する処理)が完了したことを示す情報をレジスタ部104に格納するようにしても構わない。なお、転送器制御部501は、上記のError判定2において、Errorが発生していると判断した場合に、その旨をレジスタ部104に格納するようにしても構わない。
特別な処理が特に必要無ければ、転送元に関する処理終了まで待ち状態となる。しかし、エラーが発生していない場合は、転送先用記述子に対する処理も完了しているはずであるので、処理はステップS821に移行することになる。
ステップS821では、転送器制御部501は、データのDMA転送が正常終了したか否かを判断する。例えば、処理1及び処理2の両方が正常終了し、且つFIFO部502に残存データが無い場合(Empty)に、DMA転送は正常終了したと判断する。
この判断の結果、DMA転送が正常終了した場合には、処理はステップS822に進み、DMA転送が正常終了していない場合には、処理はステップS823に進む。ステップS822では、転送器制御部501は、DMA転送が正常終了したことを示す情報を、レジスタ信号A109を介してレジスタ部104に書き込む。一方、ステップS823では、転送器制御部501は、DMA転送が正常終了していないことを示す情報を、レジスタ信号A109を介してレジスタ部104に書き込む。
次に、演算器103が行う処理について、同処理のフローチャートを示す図9を用いて説明する。ステップS901では、演算器103は、上記のステップS811で演算器I/F処理部505から演算指示/結果通知信号111を介して受けた実行指示を受信する。
ステップS902では、演算器103は、スヌープI/F112上におけるデータの流れを監視し、該スヌープI/F112上にデータが現れないかを判断する。この判断の結果、データが現れた場合には、処理はステップS903を介してステップS904に進み、まだ現れていない場合には、処理はステップS903を介してステップS905に進む。
ステップS905では、演算器103は、スヌープI/F112上にデータが現れるのを待機し、その後、処理はステップS903に戻る。一方、ステップS904では、演算器103は、スヌープI/F112上に現れたデータに対するチェックサムのための演算処理を実行する。
そしてステップS906では、演算器103は、ステップS901で受信した実行指示中のDST_DL212を参照し、DST_DL212が表すデータ長ぶんのデータのチェックサムの為の演算処理を行ったか否かを判断する。この判断の結果、行った場合には、処理はステップS907に進み、行っていない場合には、処理はステップS903に戻る。
ステップS907では、演算器103は、DST_DL212が表すデータ長ぶんのデータに対するチェックサムの結果の補正処理(演算結果補正処理)、必要に応じて行う。ここでいう補正処理とは、チェックサム演算であれば演算結果のビット反転や、キャリーオーバ値の加算等が挙げられる。この補正処理は、CPU114が、得たい演算結果の形式に適合するように実装すればよい。
ステップS908では、演算器103は、ステップS901で受信した実行指示中のDST_CM215の値が「1」であるのかそれとも「0」であるのかを判断する。この判断の結果、DST_CM215の値が「1」であれば、処理はステップS910に進み、「0」であれば、処理はステップS909に進む。
ステップS909では、演算器103は、チェックサムの結果を、レジスタ信号B110を介してレジスタ部104に対して送出する。一方、ステップS910では、演算器103は、チェックサムの結果を、演算指示/結果通知信号111を介して転送器102に対して送出する。
[第2の実施形態]
第1の実施形態では、演算器103がチェックサムの為の演算処理を行うために、データをデータライトI/F106からスヌープする形態について説明したが、スヌープする場所はここでなくてもよい。例えば、POPデータバス507をスヌープすることによっても、転送データに対するチェックサムを実現することはできる。また、システムにより転送元から受信するデータに対してチェックサムを行いたい場合は、データリードI/F105をスヌープすればよい。その際、DST_CM215に相当する情報を転送元用記述子に含めておくことが望ましい。
また、第1の実施形態では、演算器103の演算処理に必要となるDST_DL212を転送器102から演算器103に対して送信する形態について説明したが、例えば、レジスタ部104にDST_DL212を保持するレジスタ領域があれば、該レジスタ領域にこのDST_DL212を格納し、演算器103は、該レジスタ領域に格納されたDST_DL212を参照して動作するようにしても良い。ただし、転送先用記述子がチェーン(DST_NDE213=1)されていれば、その分だけレジスタが必要となる。
また、第1の実施形態では、転送元メモリ115、転送先メモリ116、記述子配置メモリ117、のそれぞれは別個のメモリとして説明したが、CPU114及びデータ処理装置101がアクセス可能なメモリであれば、それぞれのメモリはどのような形態で提供されてもよく、例えば、1つのメモリ内に、転送元メモリ115、転送先メモリ116、記述子配置メモリ117、のそれぞれに対応する記憶領域を設けるようにしても構わない。
また、第1の実施形態では、チェックサムの結果は、転送先メモリ116において転送済みのデータの末尾に付与する形で格納されたが、チェックサムの結果の格納位置はこれに限るものではない。例えば、転送先用記述子に演算結果書込み用のフィールドを具備し、演算結果を該フィールドに書き込むようにしても構わない。また、レジスタ部104に演算結果書込み先アドレスを格納するためのレジスタを用意し、転送器102が該アドレスに演算結果を書き込むといった方法も実現できる。
[第3の実施形態]
本実施形態では、第1,2の実施形態で説明したデータ処理装置101を、データ通信システムに適用した場合について説明する。このようなデータ通信システムにおいて、データ(パケット)の受信頻度よりもデータ(パケット)の送信頻度が高いとする。このような場合、データ通信システムは、送信対象のパケットに対するDST_CM215の値は「1」とし、受信対象のパケットに対するDST_CM215の値は「0」とする。このようにすることで、レジスタ部104に要する容量を極力小さくすることができ、且つ例えば受信したパケットが送信パケットに対する応答パケットであるときは、速やかにチェックサムの結果を得ることができる。これは、データ処理装置101の外部にチェックサムの結果を書き込むよりも、レジスタ部104に書き込む方が、レイテンシが小さいことが理由に挙げられる。例えば、TCPのACKパケット受信時、該ACKパケットのチェックサム演算が高速に行え、結果として高速なACKパケットの受信処理が可能となる。
なお、第1〜3の実施形態において、DST_CM215の値は予め定められていても良いし、ユーザが不図示の操作部を用いて適宜設定しても構わない。また、本実施形態の場合は、送信の頻度及び受信の頻度から判断して、送信パケットに対するDST_CM215の値と、受信パケットに対するDST_CM215の値と、をCPU114が適宜切り替えても構わない。このように、DST_CM215の値の設定や切り替えには様々な形態が考えられ、特定の形態に限るものではない。
(その他の実施例)
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア(プログラム)を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)がプログラムを読み出して実行する処理である。