🐙

AMD-Xilinx用の公認 Ubuntu でPLに bitstream をダウンロードする方法

2024/09/19に公開

はじめに

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 という名前で下記のファイルを作成し

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 という名前で下記のようなファイルを用意します。

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.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 の下記の会がとても勉強になったので、勝手ながらリンクを張っておきます。

https://www.youtube.com/live/yuSVbuiaBuU?si=5apPb70rvG7xEeOS&t=538

GitHubで編集を提案

Discussion