システムのパフォーマンスの低いPCI-Eカードを診断しようとしていますが、間違ったリンク幅をネゴシエートしていることがわかりました。具体的には、lspci -vv
、 そうですか:
LnkCap: Port #1, Speed 8GT/s, Width x8, ASPM L1, Exit Latency L0s <4us, L1 <4us
ClockPM- Surprise- LLActRep- BwNot-
ながら
LnkSta: Speed 8GT/s, Width x4, TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-
私の質問は:このネゴシエーションはハードウェアレベルまたはソフトウェアレベルで行われますか?別の言い方をすると、カードはPCI-Eスロットと直接ネゴシエートしますか、それともドライバーのどこかで行われますか?
(これが明白な答えであることが判明した場合は、ご容赦ください... 1週間診断した後、私の心は少し揚げられます。)
ソフトウェアではなく、電気レベルで行われます。上記の2つのレジスタ、LNK_CAPとLNK_STAは、「ここにリンクの機能があります」と「ここに現在のステータス」と正しく記載されています。 SLT_CAPとSLT_STAもあり、マシンの特定の「スロット」に固有なので、一見の価値があります。
PCIe仕様では、[〜#〜] ltssm [〜#〜]-リンクトレーニングおよびステータスステートマシンを定義しています。 PHY /デバイスレベルで、これは両方のデバイスがサポートする最大速度、両方のデバイスがサポートする最大リンク幅を決定するものであり、これは極性反転/レーン反転が処理される場所でもあります(レイアウトを簡単にするために、仕様ではP交換する/ Nなど)。
デバイスは既知の順序付けられたシンボルのセットを相互に送信し、ハードウェアは2.5GT/sから上向きに動作します。相互に送信できる速度変更コマンドがあり、ここでチャネルイコライゼーション設定も定義されます。
間違った速度でリンクしている場合は、PCIeルートポートが正しく構成されていないか、信号の整合性に問題があるためにリンク幅を狭めている可能性があります。私の経験では、8 GT/sではなく5 GT/sでリンクしている場合、それはSIの問題です。x88 GT/sではなくx4 8 GT/sでリンクすると、構成の問題のように見えますが、または、おそらくx8幅をサポートしないスロットにカードを追加します。
ルート複合機能レジスター(オフセット04h)は、サポートされている最大幅を示し、診断に役立つ場合があります。 IIRC、-xは構成スペースの最初の4Kをダンプし、-xxまたは-xxxはPCIe拡張構成スペースをダンプします。ここにすべての構成スペース/ Pastebinをダンプすると、おそらくそれを掘り下げることができますが、Linuxはレジスターの機能をデコードする適切な仕事をします。