問題タブ [pci-e]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
pci-e - BAR を使用した PCIe の通信はどのように定義されていますか?
私は PCIe の初心者で、単純な PCIe ドライバーを開発する必要があります。
メモリが 1kByte の PCIe デバイスがある場合、BAR には何が含まれていますか? 1kByte空間のアドレスは?また、BAR がメモリまたは I/O アドレス空間に「マップ」されるとはどういう意味ですか?
さまざまな本で答えを見つけようとしましたが、成功しませんでした...
よろしくトーマス
linux - カーネルに PCI デバイス ID の再読み取り/再初期化を強制する方法は?
私のマシン (Linux カーネル 3.2.38 を実行) の起動時に、PCI デバイスのサブシステム ID (サブデバイスとサブベンダー ID) が間違っています。システムがまだ起動している間に PCI デバイスを物理的に抜き差しすると (つまり、ホットプラグ)、正しい ID が取得されます。
取得した間違ったサブデバイス ID とサブベンダー ID は、デバイスのデバイス ID とベンダー ID と同じであることに注意してください (以下の lspci 出力の最初の 2 行を参照してください)。
以下は、デバイスのホットプラグ前後のlspci -vvnnの出力です。
ホットプラグ前:
ホットプラグ後:
私の質問:デバイスをホットプラグせずに ID を修正する方法はありますか? たとえば、PCI バスの再スキャン/再列挙/再構成を実行するなどして、カーネルに PCI デバイス ID の再読み取りを強制しますか?
どんな助けでも大歓迎です。ありがとう。
PS。この問題は、UEFI 内部シェルで起動した場合でも存在するため、実際にはカーネル/ソフトウェアに関連していないことに注意してください。
PPS。この場合の PCI デバイスはMEN F206Nで、「私のマシン」はMEN F22P です。
cuda - マップされた固定ホスト メモリ上の CUDA カーネルでのアトミック操作: 実行するかしないか?
CUDA プログラミング ガイドでは、マップされた固定ホスト メモリでのアトミック操作は、「ホストまたは他のデバイスの観点からはアトミックではない」と述べられています。この文から得られるのは、ホスト メモリ領域が 1 つの GPU によってのみアクセスされる場合、マップされた固定ホスト メモリで (複数の同時カーネル内からでも) アトミックを実行しても問題ないということです。
一方、Nicholas WiltによるCUDA ハンドブックの128 ページには、次のように記載されています。
ホスト (ロックされた比較交換) またはデバイス ( ) のいずれに対しても、マップされた固定ホスト メモリでアトミックを使用しようとしないでください
atomicAdd()
。CPU 側では、ロックされた操作の相互排除を強制する機能は、PCI Express バス上の周辺機器には見えません。逆に、GPU 側では、アトミック操作は GPU のローカル メモリ コントローラーを使用して実装されるため、ローカル デバイスのメモリ ロケーションでのみ機能します。
マップされた固定ホスト メモリでCUDA カーネル内からアトミックを実行しても安全ですか? アトミックの読み取り-変更-書き込みの原子性を維持するために、PCI-e バスに依存できますか?
c - ユーザー空間での書き込み結合 IO アクセスの有効化
ユーザー空間ドライバーを備えた PCIe デバイスがあります。BAR を介してデバイスにコマンドを書き込んでいます。コマンドは遅延の影響を受けやすく、データ量が少ない (~64 バイト) ため、DMA を使用したくありません。
を使用してカーネル内の BAR の物理アドレスを再マップし、カーネル内ioremap_wc
の BAR に 64バイトを書き込むと、64 バイトが PCIe 経由で単一の TLP として書き込まれていることがわかります。ユーザー空間プログラムをフラグ付きの領域に許可してから64 バイトを書き込むと、単一のトランザクションではなく、PCIe バス上に複数の TPL が表示されます。mmap
MAP_SHARED
カーネルPATのドキュメントによると、書き込み結合ページをユーザー空間にエクスポートできるはずです。
一部のページをユーザー空間にエクスポートしたいドライバーは、mmap インターフェイスとの組み合わせを使用してそれを行います
1)
pgprot_noncached()
2)
io_remap_pfn_range()
またはremap_pfn_range()
またはvm_insert_pfn()
PAT のサポートにより、新しい API
pgprot_writecombine
が追加されています。そのため、ドライバーは、ステップ 1 のいずれpgprot_noncached()
かpgprot_writecombine()
で上記のシーケンスを使用し、その後にステップ 2 を続けることができます。
このドキュメントに基づいて、私の mmap ハンドラーからの関連するカーネル コードは次のようになります。
PCIe デバイスが lspci に表示され、予想どおりプリフェッチ可能としてマークされた BAR が表示されます。
ユーザー空間から呼び出すとmmap
、ログ メッセージが表示されます (debugpat カーネル ブート パラメータが設定されています)。
reserve_memtype 追加 [mem 0xd4000000-0xd7ffffff], track write-combining, req write-combining, ret write-combining
/sys/kernel/debug/x86/pat_memtype_list
また、PAT エントリが正しいように見え、重複する領域がないことも確認できます。
また、PAT 構成と競合する MTRR エントリがないことも確認しました。私が見る限り、書き込み結合がユーザー空間で発生するようにすべてが正しく設定されていますが、PCIe アナライザーを使用して PCIe バス上のトランザクションを観察すると、ユーザー空間のアクセス パターンは、カーネルから実行される同じ書き込みとはまったく異なります。ioremap_wc
電話の後。
書き込み結合がユーザー空間から期待どおりに機能しないのはなぜですか?
さらにデバッグするにはどうすればよいですか?
現在、シングル ソケット 6 コア i7-3930K で実行しています。
linux - Linux 3.12 ドライバーで PCIe メモリー領域を「有効にする」必要がありますか?
PCIeドライバーのprobe()関数から呼び出されるコードがあります(この投稿に大まかに基づいています):
編集: Andreas Bombe の応答に基づいて、コードを使用するように変更しましたが、まだシステムがハングする経験がありますpci_iomap()
しかし、カーネルは への呼び出しでハングするだけioread8()
です。
私は何か間違ったことをしていますか?それとも、ハードウェアに目を向ける必要がありますか?
lspci -v
およびのシステムのクリーン ブートの出力は次のcat /proc/iomem
とおりです。
メモリが表示され[disabled]
ます。有効にする必要がありますか?
linux - pci_Driver.probe が呼び出されていない
ラップトップの PCIe 拡張スロットを介して接続された PCI デバイス用の Linux デバイス ドライバーの開発を始めています。
起動時には、すべてが美しく機能します。ただし、基本的な Hotplug サポートをオンラインで取得しようとしています。カードを取り出すと、( でdmesg
) 適切な remove stuff が呼び出されていることがわかります。ただし、カードを再挿入しても何も起こりません。モジュールを手動で取り外してからカードを挿入すると (または起動後にカードを挿入すると)、モジュールinit
が呼び出されていることがわかりますが、probe
. lspci
また、デバイスは出力に表示されません。
ただし、出力にecho 1 > /sys/bus/pci/rescan
は表示されlspci
ますが、モジュールはエラーでロードに失敗します ( pci_enable_device failed with code -22
)。
これを診断し始める場所はありますか?実行に失敗したこと.probe
は、私を本当に困惑させていることです。
これはここに接続されている FPGA ボードであるため、デバイス自体に問題がある可能性がありますが、それでもプローブが実行され、後で奇妙なエラーで失敗すると予想されます。
linux-device-driver - PCIe 1.1 デバイスが pcie gen 3 スロットで検出されない
私の PC は、カーネル バージョン 3.11.0-23 の Ubuntu 12.04 LTS で実行されています。
以下のリンクは私の PC モデルです: http://www.villman.com/Product-Detail/HP_Pavilion_500_232d
x16 PCIE 3.0 スロットに x4 pcie 1.1 デバイスを挿入しました。lspci を実行すると、デバイスがリストに表示されません。
Gen 2.0 スロットを搭載した他の PC でデバイスをテストしたところ、検出されました。
デバイスを検出する方法はありますか?
前もって感謝します!
よろしく、連邦準備制度理事会
computer-architecture - PCIe と QPI のパフォーマンスとアーキテクチャの違いは何ですか?
PCIe 3.0 x16 と QPI 1.1 (20 レーン) の実効帯域幅 (16 GB/秒) は同じです。そこで、両者の違いについて大まかなイメージをつかみたいと思いました。
レイテンシとメッセージ レート (1 秒あたりのパケット数または TLP 数) に関して、2 つの違いは何ですか? レイテンシーについては、QPI で 20 ns、PCIe 3.0 で 200 ns です。これらは良い見積もりですか?はいの場合、PCIe のレイテンシがこれほど高いのはなぜですか? ワイヤの長さが原因ですか?
QPI がキャッシュ スヌーピングを提供するという事実以外に、2 つのアーキテクチャに大きな違いはありますか? 私の知る限り、どちらも階層化されたプロトコルを使用しています。トランスポート層から物理層までです。