AMD-Xilinx用の公認 Ubuntu でPLに bitstream をダウンロードする方法
はじめに
KV260などで Certified Ubuntu on AMD Devices の Ubuntu 22.02 LTS を利用していますが、この環境において自分で Vivado で作った bitstream をダウンロードする方法です。
そもそも Ubuntu 22.04 起動時にファン制御に繋がる回路が焼かれているようで起動時にファンが静かになって驚いた半面、その回路を取り除かないと自分の回路がダウンロードできなくなったのがきっかけです。
なお、どうやるのが一番行儀のよい方法なのかはよくわかっておりません。
起動時のデフォルトの PLイメージをアンロードする方法
Ubuntu 22.04 起動時に動いている回路は XRT を利用しているようで、
sudo xmutil listapps
とすれば確認でき、 初期には k26-starter-kits というものが動いているようです。
このままでは別の回路を DeviceTree overlay などで書き込むことが出来ません。
sudo xmutil unloadapp
とすれば、アンロードできるようで、再びロードするには
sudo xmutil loadapp k26-starter-kits
とすればいいようです。
もうすこし乱暴な方法としては
sudo rmdir /configfs/device-tree/overlays/k26-starter-kits_image_1
としても取り除けますが xmutil の管理を外れたことを行っていることになるようです。
削除すると勢いよくファンが回り始めてしまいますが、上で作った自作回路をダウンロードすればまた静かになります。
前準備
Vavado で作った bitstream である *.bit ファイルはそのままでもダウンロードできてしまうようなのですが、基本的に bootgen を使って *.bin ファイルに変換しておくもののようです。
実際 *.bin ファイルに変換しておかないとダウンロードにかかる時間が急増するようですので是非変換しましょう。
bootgen のインストール
bootgen は自分でビルド可能で、例えば下記のようにすればインストールできます。
git clone https://github.com/Xilinx/bootgen
cd bootgen/
make
sudo cp bootgen /usr/local/bin/
binファイルへの変換
ここで例えば sample.bit を変換する場合、sample.bif という名前で下記のファイルを作成し
all:
{
sample.bit
}
下記のように実行すれば
bootgen -w -image sample.bif -arch zynqmp -process_bitstream bin
sample.bit.bin
という bin ファイルが出来上がります。
FPGA manager を使う方法
まず簡単なのが FPGA マネージャを使ったダウンロードです。
上で作った sample.bit.bin を /lib/firmware にコピーします。
sudo cp sample.bit.bin /lib/firmware/
その上で
sudo sh -c "echo sample.bin > /sys/class/fpga_manager/fpga0/firmwar"
のように、すればダウンロードできます。
DeviceTree overaly を使う方法
次に DeviceTree overaly を行う方法です。これは他のデバイスドライバのロードと一緒に PL をコンフィギュレーションするのに便利です。
例えば sample.dts という名前で下記のようなファイルを用意します。
/ {
fragment@0 {
target = <&fpga_full>;
overlay0: __overlay__ {
#address-cells = <2>;
#size-cells = <2>;
firmware-name = "sample.bit.bin";
};
};
};
次に下記のように実行すれば
dtc -I dts -O dtb -o sample.dtbo sample.dts
sample.dtbo が出来上がります。
実際に DeviceTree overaly を行うには sample.dtbo と sample.dtbo を /lib/firmware 以下にコピーしてオーバーレイを支持します。
例えば下記のようになります。
sudo mkdir -p /configfs
sudo mount -t configfs configfs /configfs
sudo cp sample.bin /lib/firmware/
sudo cp sample.dtbo /lib/firmware/
sudo sh -c "echo 0 > /sys/class/fpga_manager/fpga0/flags"
sudo mkdir /configfs/device-tree/overlays/full
sudo sh -c "echo -n sample.dtbo > /configfs/device-tree/overlays/full/path"
なお、アンロードするには
sudo rmdir /configfs/device-tree/overlays/full
sudo umount /configfs
などとすればいいようです。
自分の回路を xmutil でロードできるようにする方法
なお、自分が作った回路や bitstream を /lib/firmware/xilinx/ 以下に置いて、xmutil でダウンロードするようにすることも出来るようです。
細かい事はよく理解していないのですが、先に作った sample.bin ファイルと、sample.btbo ファイルに加えて、下記のような内容の shell.json を用意し
{
"shell_type" : "XRT_FLAT",
"num_slots": "1"
}
例えば /lib/firmware/xilinx/sample のようなディレクトリを作ってコピーすればいいようです。
sudo mkdir /lib/firmware/xilinx/sample
sudo cp sample.bin /lib/firmware/xilinx/sample
sudo cp sample.dtbo /lib/firmware/xilinx/sample
sudo cp shell.json /lib/firmware/xilinx/sample
とし、
sudo xmutil loadapp sample
とすればよいようです。
おわりに
なお fpgautil というツールもあり、中を見ると同じような事をやっているのでこのツールをコンパイルして利用する方法もあると思います。
また xmutil の方は python のようで、よく読んでいませんが、また少し複雑な事をしていそうです。
最終的にはdfx-mgrを追いかける必要があるのかもしれません。
xmutil が使える場合はそれが行儀のよい気はしますが、XRT がインストールされていないケースもあり得るのかと思います。
またダウンロード速度を限界まで速くするためにいろいろ探りたいケースもあるかと思います。
何らかの参考になれば幸いです。
おまけ
Linux カーネルの中での FPGA の話は KernelVM の下記の会がとても勉強になったので、勝手ながらリンクを張っておきます。
Discussion