qshinoの日記

Powershell関係と徒然なこと

pci device linux

pci space access

pci 空間には大きく3種類がある。

  1. pci config registers
  2. io resource
  3. 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

f:id:qshino:20190602220646j:plain

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

  1. kernel info https://www.kernel.org/doc/Documentation/filesystems/sysfs-pci.txt

  2. example os sysfs mmap https://github.com/billfarrow/pcimem/blob/master/README

  3. pci rescan http://nahitafu.cocolog-nifty.com/nahitafu/2017/01/pci-expressfpga.html

  4. pci config space desc. http://www.mnc.co.jp/english/INtime/faq07-2_kanren/PCIconfigurationregister.htm