pci device linux
pci space access
pci 空間には大きく3種類がある。
- pci config registers
- io resource
- mem resource
pci config space は、4Byte read/write。/proc/bus/pci/...をopen(rw)し、リード/ライト/シーク可能。mmapは、x86_64 ubuntu 18.04 で試したが、エラーが返ってきた。
dir pathの例は /proc/bus/pci/0003:01/00.0 で、/proc/bus/pci/Domain:Bus/Dev.Func の書式。
また、/sys/devices/.../configからもコンフィグレジスタを読み出せる。書き込み及びmmapは未確認。
io resource は/sys/devices/.../resource*をfileとしてオープン、lseekでアドレス指定し、読み書き可能らしい。資料1に記載。未試行。リソースがio空間で有る事をどの様に判断するか不明。barのbit0 が分かれば判断できるが。
mem resourceは、/sys/devices/.../resource*をopen()/mmap()し、リードライト可らしい。資料2にサンプルコードあり。
pci bus treeのトラバースは /proc/bus/pci/devices を使えば可能かもしれない。ただし、文字列パースになり面倒。Programから利用できる、もっと簡単な方法を探している。
現状整理
config/io/mem共に読み取りは可能な見込み。一方、書き込みはio/memは出来そう。config 書き込みは、setpciなら出来そうだが、APIが未確認。最悪の場合は、setpciを外部プロセスで呼ぶ。
現状の課題
config reg のライト、アドレス指定のリード。アドレス指定のリードはlseek()で可能かもしれない。また、lseek()が可能なら、ライトもできるかもしれない。
io/ memリソースの判別。
資料4によると、barのbit0を見て判断する。デバイスは6リソース、ブリッジは2リソース。もっと簡単な方法は?
また、barの有効無効判断はall0で良い?
barの要求サイズはbiosがall1を書いて、1が戻る最上位bitで判断する。よってall0であれば4GBを要求する、あるいは要求なしなのか?恐らく要求なしと思われる。
資料3のconfig dumpを見る限り、all0がリソース未要求に見える。
面倒なのでpypciを使う?
と思ったら、pypciの開発状況がよく分からず、利用する前に確認が必要そう。
また、pci bus tree をトラバースする方法が面倒。簡単にしたい。
一覧
Space | access | Status |
---|---|---|
config | read | ok |
read at | ok | |
write | ok | |
mmap | fail | |
io | r/w | est. ok |
mmap | est.ng | |
mem | mmap | est.ok |
pci rescan
pci hotplug を使った取外しと、再スキャン。資料3参照。
#!/bin/sh sudo chmod 666 /sys/bus/pci/devices/0000\:0$1\:00.0/remove sudo echo 1 > /sys/bus/pci/devices/0000\:0$1\:00.0/remove sudo chmod 666 /sys/bus/pci/rescan sudo echo "1" > /sys/bus/pci/rescan 使い方は、./rescan 4 のようにrescanの後にバス番号を指定します。
pci bar
最大6リソースを定義可能。リソースのタイプは下記により判断する。
Bit | val | Description |
---|---|---|
0 | 0 | Memory Space |
1 | io space | |
2-1 | 00 | 32bit any space for mem |
01 | 32bit less than 1mb | |
10 | 64bit any space | |
11 | reserved | |
3 | 0 | non-prefetchable |
1 | ptefetchable |
pci bridge config reg
bridgeのバス番号設定方法。
関係しそうなpci config registerは、
- 0x18 Primary Bus Number
- 0x19 Secondary Bus Number
- 0x1a Subordinate Bus number
其々をP/S/Oと表記する。
- リセット後
謎。
ホストブリッジ(hb)busdevfunc/以降BDF=0で、pso=0/0/ffに設定。
bus=0のdeviceをスキャン。
ref
kernel info https://www.kernel.org/doc/Documentation/filesystems/sysfs-pci.txt
example os sysfs mmap https://github.com/billfarrow/pcimem/blob/master/README
pci rescan http://nahitafu.cocolog-nifty.com/nahitafu/2017/01/pci-expressfpga.html
pci config space desc. http://www.mnc.co.jp/english/INtime/faq07-2_kanren/PCIconfigurationregister.htm