[マニアック注意] PCI-Express バス実装トポロジを確認してみる。

 さてそれは、ふとした疑問。

 手元のAsus M4A89GTD PRO/USB3の、NECのUSBチップがぶら下がっているのは890GXの下か、SB850の下か、どっち?

 一昔前のマニュアルにはブロックダイアグラムが載ってて当たり前だったけど、最近はそうでもない模様。
 仕方ないので、Windowsでのデバイスリスティングを頼りに、PCIeバスの接続を割り出してみますか。

 ちなみにこの手法はx86 PCでは汎用的に通用するので、例えばIntel Chipsetのマザボで「このPCIeスロット、直接CPUにぶら下がっているのか、それとも(圧倒的に帯域の狭い)DMIの先にあるのか」なんてことを判別する際にも使えますよ、念のため。

 ◇

 ということで、まずはハードウェア側の基礎知識から。

 PCI-Expressには「レーン」と「ポート」という2つの概念がある。
 「レーン」というのは信号線の数。PCIe x16とかx1とかいう、アレ。よく見ますな。
 対して「ポート」というのはやや分かりにくいのだが、簡単に言うとデバイスを接続出来る数。

 例えば「16レーン」且つ「1ポート」では、PCIeカードは1枚しか挿せない。
 ところが同じ「16レーン」でも「2ポート」では、「8レーン」+「8レーン」でPCIeカードを2枚挿せる。
 こんな感じ。

 次。

 PCI-Expressはソフトウェア的にはPCIと同一に見えるように工夫されているため、全ての「ポート」に対して「PCIバス番号」が振られる。

 これどういうことかというと、CPU側から見た場合、例えばPCIバスが3本あるのと、PCI-Expressが3ポートあるのと、同じに見えるんですわ。
 なので、例えばPCI-ExpressでVGAを挿してポート1を使用した場合、PCIバスの1番目にVGA挿してあるのと同じようにCPUからは見える。

 ◇

 次、Windows側の基礎知識。

 前述の仕組みのお陰で、WindowsからはPCI-ExpressとPCIとは区別されずに見える。

 そして、個々のデバイスの接続模様は、デバイスマネージャから個別のデバイスの「プロパティ」ダイアログを開き、「詳細」タブの「プロパティ」を開いて「場所のパス」という項目から確認出来る。

 ♯Windows7の場合。他も大体同じだと思う。

 するとこんなのが見える筈。

 PCIROOT(0)#PCI(0100)#PCI(0000)

 コレを読み解けば良いのですよ。
 ということで、以下読み方。

 ◇

 PCIROOT(0)

 まず最初のコレ、CPUから見たPCIバスの1つ目(0から始めるので)という意味。
 普通のPCだとまず見ないが、サーバ系だと1つのCPUに複数のバスが接続されていることも。そういう場合、ここにPCIROOT(1)なんてのが出てきたりする。

 #PCI(0100)

 次に来るコレはノースブリッジに接続されたPCIバスの番号。16進数で、上2桁と下2桁で意味が違う。
 上2桁はスロット番号で、1から始まる。0は自分自身という意味。

 下2桁は機能番号と言い、1つのPCIバスに1つのデバイスしか接続されていない場合は0。
 複数のデバイスが1つのPCIバスに接続されている場合、ここの数字を変えることで区別する。

 #PCI(0000)

 最後のコレは、PCIバスに接続されているデバイス自身のこと。
 例によって16進数で、上2桁と下2桁で意味が違う。
 上2桁は、上記したように0は自分自身を示すので、ノースブリッジの下に自分が居ますよ、という意味。
 下2桁は、機能番号なので、1つのデバイスが1つの機能しか持っていなければ00だけ、2つ以上の機能を持っていれば00、01・・・という風に増えていく。

 以上により、こんな風に解釈される。

 PCIROOT(0)#PCI(0100)#PCI(0000) → CPU:ノースブリッジの1番目のポート:単機能PCIeデバイス(拡張カード)

 ◇

 もし間にPCIeブリッジなんかが挟まると、一項目増えることに。

 PCIROOT(0)#PCI(0400)#PCI(0000)#PCI(0000)
 →CPU:ノースブリッジの4番目のポート:PCIe/PCI-Xブリッジ:PCI-Xデバイス

 ポイントは2つ。
 繋がってるのが全部で4項目になっていること。
 PCIeブリッジ自体は、0000と表示されていること。

 PCIeブリッジの表示が0000なことについては、正直良く分からないのだがこれそういうモノらしい。
 ここから先は別のバスになります、ということで区切っている、のかな?
 ちなみにPCIeブリッジがPCI-Xを2ch持っていると、0000と0001となります、はい。

 ◇

 そしてサウスブリッジに内蔵された機能の場合は、例えばこんな風。

 PCIROOT(0)#PCI(1402)
 →CPU:サウスブリッジの20番目のポートが内蔵する2番目の機能

 この場合、サウスブリッジに内蔵された20番のポートに内蔵された2番目の機能、という意味。
 何で最後に#PCI(0000)が付かないかというと、PCIeバスに「接続された」デバイスではなく「内蔵された」機能のため。

 ◇

 さて、ここまでは長~い前振り。

 以上の前提を以てデバイスマネージャを開いてチェックすると、M4A89GTD PRO/USB3では以下のようになっている模様。

 0100 – 内蔵VGA
 0200 – PCIe x8 (スロットはx16)
 0300 – PCIe x8 (スロットはx16)
 0400 – PCIe x4
 0900 – オンボード NEC USB3.0
 0A00 – オンボード JMicron JMB361
 1100 – SB850 RAID
 1200 – SB850 OHCI
 1202 – SB850 EHCI
 1300 – SB850 OHCI
 1302 – SB850 EHCI
 1400 – SB850 SMBus
 1401 – SB850 IDE
 1402 – SB850 HD-Audio
 1403 – SB850 ISA (LPC)
 1404 – SB850 PCI → 0700 – VIA 1394
 1405 – SB850 OHCI
 1500 – オンボード ギ蟹
 1501 – PCIe x1
 1600 – SB850 OHCI
 1602 – SB850 EHCI

 890GXは22レーン/8ポート(A-Link相当分を除く)。3ポート余ってます(0500、0600、0700)な。
 そして0800が欠番に見えるのは、これ多分内部的にノース・サウス間のA-Link(=PCI-Expressそのもの)用に使っているんでないかね。
 そして1100以降1602までSB850が占有しているので、その中にある1500と1501に関してはSB850配下のPCI-Express Busということが判別出来る。

 にしても、PCIeスロットがSB850配下ってのはちと想定外だった。これ要するに、PCIe-x1カードを挿す場合でも、空いているなら他のスロットを使った方がよろしいということですな。

 ◇

 ということで、結論。
 M89GTD PRO/USB3のUSB3.0は890GX直下にぶら下がっている。
 以上。

Share