Linuxシステムで特定のThunderboltデバイス(例えばeGPUエンクロージャ、ドック)を介して接続されたPCIデバイス(グラフィックカードなど)を見つける安定した方法はありますか?
コンテキスト
私の特定のユースケースでは、接続されたTB3 eGPUを検出して識別することに最も興味があります。 PCIベースのビデオデバイスを検出できますが、接続されているThunderboltデバイスと一致させることができる場合は、次の問題を解決するのに役立ちます。
- 特定のビデオデバイスがeGPUであることを確実に検出します。
- eGPUエンクロージャを識別して(TB UUIDを介して)同じベンダー/製品であっても、複数のeGPUを区別します。
現在、PCIとThunderboltデバイスに関する/sys/bus/pci/devices
情報を別々に分析しています/sys/bus/thunderbolt/devices/
。
試行失敗:PCIバス階層の使用
残念ながら、PCIバス階層はこれに関してあまり役に立たないようです。 Thunderboltデバイスを名前付きPCIデバイスにマッピングできますIntel Corporation JHL7540 Thunderbolt 3 NHI
。しかし、、両方のThunderboltデバイス(2つが接続されている場合)は同じデバイスを指します。また、ビデオカード(eGPU)のPCIデバイスは他のPCIバスの子であるため、PCIビデオデバイス(eGPU)を対応するThunderboltデバイス(eGPUエンクロージャ)に直接マッピングすることは不可能です。
まだそれがどういう意味なのかはよく理解していませんが、カーネル文書で探してから、節を見ると、この観察がある程度(?)確認されるようです。
Thunderboltホストコントローラには、PCIeスイッチを管理するための複数のPCIeホットプラグポートとNHIデバイスが含まれています。システムスリープモードで再起動するとき、NHIデバイスはホットプラグポートを再起動する前に接続されたデバイスのPCIトンネルをリセットする必要があります。ホットプラグポートがNHIのサブポートの場合、PMコアは自動的にこの回復コマンドを実行します。しかし残念ながら彼らは叔母たちです。。
–https://www.kernel.org/doc/html/v4.14/driver-api/device_link.html?highlight=thunderbolt#examples
リソース
私はカーネルに初めてアクセスし、私のシステムを直接調べてから結論を導き出すことによってこのほとんどを見つけました。誰かが私にLinux / PCI / Thunderboltの有用なリソースへのリンクを提供できる場合は、すでに多くの助けになるでしょう。完全性を期すために、学習過程で役に立ったいくつかのリンクをここにリストしました。
- Linux PCIバスサブシステム(kernel.org)
- sysfsの情報にアクセスする方法の規則(kernel.org)
- sysfsを介してPCIデバイスリソースにアクセスする(kernel.org)
- PCI構成スペース - 標準化されたレジスタ(wikipedia.org)
- PCI - PCIデバイス構造 - 共通ヘッダフィールド(osdev.org)
- Linuxデバイスドライバ - 第12章PCIドライバ(本)