SlideShare a Scribd company logo
1 of 114
Download to read offline
1 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA+SoC+Linux
実践勉強会
2017 年 12 月 2 日
@ikwzm
2 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
SoC ? FPGA ?
・ SoC : System on Chip
・ CPU Core + Peripherals
・ Xilinx → PS (Processing System)
・ Altera → HPS (Hard Processor System)
・ FPGA : Field Programmable Gate Array
・ Xilinx → PL (Programmable Logic)
・ Altera → FPGA Fablic
3 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA+SoC ? (Xilinx Zynq)
PS (Processing System)
PL (Progrmable Logic)
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
Cortex-A9
MPCore
Cortex-A9
SCU NEON
512KB L2 256KB OCM
DRAM Controller
MIO
USB GigE
GPIOUART
SDIO SPI
Peripherals
・ FPGA+SoC :
・ PS and PL on Single
Chip
・Connected PS and PL
through on-chip bus
4 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA+SoC ? (Altera CycloneV-SoC)
HPS (Hard Processor System)
FPGA Fablic
Reset
Controller
Clock
Controller
FPGA
Manager
HPS-FPGA
Bridge
Cortex-A9
MPCore
Cortex-A9
SCU NEON
512KB L2 256KB OCM
DRAM Controller
MIO
USB GigE
GPIOUART
SDIO SPI
Peripherals
・ FPGA+SoC :
・ HPS and FPGA Fablic on
Single Chip
・ Connected HPS and
FPGA through on-chip
bus
5 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA+SoC ?
PS (Processing System)
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
Cortex-A9
MPCore
Cortex-A9
SCU NEON
512KB L2 256KB OCM
DRAM Controller
MIO
USB GigE
GPIOUART
SDIO SPI
Peripherals
・ FPGA+SoC :
・ PS and FPGA on Single
Chip
・ Connected PS and FPGA
through on-chip bus
以降、 この資料では PS と FPGA に統一します
(SoC という言葉は PS だけを指すのか PS+PL を指すのか紛らわしいので)
6 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Agenda
・ How to Configuration FPGA from PS with Linux
・ FPGA Configuration Overview
・ Device Tree Overlay
・ FPGA Region
・ How to Control FPGA from PS with Linux
・ Cache Coherency
・ Memory Management Unit
・ UDMABUF
・ UIO and Interrupt
without
device driver
7 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ How to Configuration FPGA from PS with Linux
・ FPGA Configuration Overview
・ Device Tree Overlay
・ FPGA Region
・ How to Control FPGA from PS with Linux
・ Cache Coherency
・ Memory Management Unit
・ UDMABUF
・ UIO and Interrupt
without
device driver
8 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ How to Configuration FPGA from PS with Linux
・ FPGA Configuration Overview
・ Device Tree Overlay
・ FPGA Region
・ How to Control FPGA from PS with Linux
・ Cache Coherency
・ Memory Management Unit
・ UDMABUF
・ UIO and Interrupt
without
device driver
9 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration に必要な基本要素
(1) Cofiguration Hardware
(2) Reset
(3) Bridge
(4) Clock
10 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Hardware (1) - Cofiguration H/W
PS (Processing System)
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
Cortex-A9
MPCore
Cortex-A9
SCU NEON
512KB L2 256KB OCM
DRAM Controller
MIO
USB GigE
GPIOUART
SDIO SPI
Peripherals
・ BitStream をメモリから読んで
FPGA に書き込む
・ PCAP (Xilinx)
Processor
Configuration
Access
Port
・ FPGA Manager(Altera)
11 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Hardware (2) - Reset Controller
PS (Processing System)
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
Cortex-A9
MPCore
Cortex-A9
SCU NEON
512KB L2 256KB OCM
DRAM Controller
MIO
USB GigE
GPIOUART
SDIO SPI
Peripherals
・ コンフィギュレーション中に
FPGA が誤動作しないように
Register をリセット状態にし
ておく必要がある
・ Full Configuration の時は
PCAP がリセットをかけるので
特に考慮する必要はない
・ Partial Reconfiguration の
時は考慮する必要があるので
注意
12 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Hardware (3) - Bridge
PS (Processing System)
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
Cortex-A9
MPCore
Cortex-A9
SCU NEON
512KB L2 256KB OCM
DRAM Controller
MIO
USB GigE
GPIOUART
SDIO SPI
Peripherals
・ コンフィギュレーション中に
FPGA や PS が誤動作しない
ように Bridge をオフにしておく
必要がある
13 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Hardware (4) - Clock Controller
PS (Processing System)
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
Cortex-A9
MPCore
Cortex-A9
SCU NEON
512KB L2 256KB OCM
DRAM Controller
MIO
USB GigE
GPIOUART
SDIO SPI
Peripherals
・ デザイン毎に異なる周波数や
使うクロックが異なることがあり、
その場合はデザイン毎にクロッ
クの設定を変更する必要があ
る
・ FPGA を使わないときはクロック
を止めておいたほうが省エネ上
良いことがある
14 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Software Stack
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
PS
Low Level
Driver
Reset
Controller
Low Level
Driver
Clock
Controller
Low Level
Driver
FPGA Mngr
Framework
Low Level
Driver
Bridge
Framework
Device
Driver
Device Tree
Overlay
High Level
Interface
User Application
H/W
S/W
High Level
Interface
High Level
Interface
High Level
Interface
High Level
Interface
Linux
Kernel
15 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Software Stack
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
PS
Low Level
Driver
Reset
Controller
Low Level
Driver
Clock
Controller
Low Level
Driver
FPGA Mngr
Framework
Low Level
Driver
Bridge
Framework
Device
Driver
Device Tree
Overlay
High Level
Interface
User Application
H/W
S/W
High Level
Interface
High Level
Interface
High Level
Interface
High Level
Interface
Linux
Kernel
・ Hige Level Interface
・ ユーザとの API
・ Framework
・ Device を統一的に扱う
ためのフレームワーク
・ Low Level Driver
・ 実際に Hardware を制
御するドライバ
16 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Software Stack - Vender Kernel Xilinx
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
PS
Low Level
Driver
Reset
Controller
Low Level
Driver
Clk Device
Driver
Device Tree
Overlay
User Application
H/W
S/W
High Level
Interface
High Level
Interface
High Level
Interface
Linux
Kernel
xdevcfg
・ /dev/xdevcfg にビットストリームファイル
を転送することで FPGA をコンフィギュレー
ションする
shell# dd if=bitstream_1.bit of=/dev/xdevcfg bs=1M
・ /dev/xdevcfg を読むことでリードバック
shell# dd if=/dev/xdevcfg of=bitstream_2.bit bs=1M
・ Xilinx のビットストリーム対応
・ コンフィギュレーション時に Bridge をオフ
するのもこのドライバが行う
17 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Software Stack - Vender Kernel Altera
FPGA
Reset
Controller
Clock
Controller
FPGA
Manager
HPS-FPGA
Bridge
HPS
Low Level
Driver
Reset
Controller
Low Level
Driver
Clk Device
Driver
Device Tree
Overlay
User Application
H/W
S/W
High Level
Interface
HPS-FPGA
Bridge
Driver
High Level
Interface
High Level
Interface
Linux
Kernel
/dev/fpga
・/dev/fpga にビットストリームフ
ァイルを転送することで FPGA
をコンフィギュレーションする
・ コンフィギュレーション前にはブリッヂドライバを使ってブリッジをオ
フに、 コンフィギュレーション終了後はブリッジをオンにする
shell# echo 0 > /sys/class/fpga-bridge/fpga2hps/enable
shell# echo 0 > /sys/class/fpga-bridge/hps2fpga/enable
shell# echo 0 > /sys/class/fpga-bridge/lwhps2fpga/enable
shell# dd if=bitstream_1.rbf of=/dev/fpga0 bs=1M
shell# echo 1 > /sys/class/fpga-bridge/fpga2hps/enable
shell# echo 1 > /sys/class/fpga-bridge/hps2fpga/enable
shell# echo 1 > /sys/class/fpga-bridge/lwhps2fpga/enable
18 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Software Stack - Mainline Kernel 4.4
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
PS
Low Level
Driver
Reset
Controller
Low Level
Driver
Clock
Controller
Low Level
Driver
FPGA Mngr
Framework
Device
Driver
Device Tree
Overlay
User Application
H/W
S/W
High Level
Interface
Linux
Kernel High Level
Interface
High Level
Interface
High Level
Interface
Bridge
Driver
・ FPGA Manager Framework が導入
・ Xilinx Zynq と Altera-SoC 用 の
Low Level Driver も提供
・ High Level Interface が未実装
・ ユーザーからは FPGA のコンフィギュレー
ション出来ない
・ Vender Kernel より退化
・ 詳細は Qiita に書きました
・『 FPGA+SoC+Linux で FPGA Manager を試してみた』
https://qiita.com/ikwzm/items/9eb4d49545636162057
19 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Software Stack - Mainline Kernel 4.10
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
PS
Low Level
Driver
Reset
Controller
Low Level
Driver
Clock
Controller
FPGA Mngr
Framework
Device
Driver
Device Tree
Overlay
User Application
H/W
S/W
High Level
Interface
Linux
Kernel High Level
Interface
High Level
Interface
Low Level
Driver
FPGA Bridge
Framework
Low Level
Driver
FPGA Region
・ FPGA Region が導入
・ FPGA Bridge Framework
が導入
・ Xilinx Zynq と Altera-SoC
用 の Low Level Driver も
提供
・ 詳細は Qiita に書きました
・『 Linux Kernel 4.10 での FPGA のサポート事情』
https://qiita.com/ikwzm/items/2ff7d5429da8ace7c0bd
20 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Software Stack - Mainline Kernel 4.10
詳細はこれから説明します
が
その前に
21 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ How to Configuration FPGA from PS with Linux
・ FPGA Configuration Overview
・ Device Tree Overlay
・ FPGA Region
・ How to Control FPGA from PS with Linux
・ Cache Coherency
・ Memory Management Unit
・ UDMABUF
・ UIO and Interrupt
without
device driver
22 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree のど~でもいい話 (1) - 導入の経緯
・ kernel 2.6.38 の時に、 Linus 氏が肥大する ARM コードに激怒し
たのが発端らしい
・ 引用: LKML: Linus Torvalds: Re: [GIT PULL] omap
changes for v2.6.39 merge window
https://lkml.org/lkml/2011/3/30/379
・ 参考: [Linux][kernel] Device Tree についてのまとめ @Qiita
https://qiita.com/koara-local/items/ed99a7b96a0ca252fc4e
23 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree のど~でもいい話 (2) - 生まれ
・ 元々は Open Firmware の規格の一つ
・ Open Firmware(または OpenBoot)はハードウェアに依存しないファーム
ウェア(オペレーティングシステムをロードするソフトウェア)であり、 サン・マイクロ
システムズのミッチ・ブラッドリーによって開発され、 IEEE により標準化され、 サ
ン・マイクロシステムズ、 アップル、 IBM などによって使われている。
https://ja.wikipedia.org/wiki/Open_Firmware
https://en.wikipedia.org/wiki/Device_tree
・ Linux Kernel のソースコードに名残
・ Device Tree 関連のソースコードは drivers/of/ にある
・ Device Tree 関連の API や構造体は of_ で始まる
24 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree の問題点と Overlay による解決
・ Boot 時に構成が決まっていなければならない
・ 元々 Open Firmware という Boot Loader の規格
・ 動的に構成が変わるのは想定外(Hot plug 未対応)
・ FPGA を動的に変更する用途には向かない
・ そこで Device Tree Overlay
・ Device Tree を後から自由に追加削除できる機能
・ Linux Kernel 3.19 から導入
25 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Overlay Device Tree Source Format
/dts-v1/;
/ {
/* ignored properties by the overlay */
fragment@0 { /* first child node */
target=<phandle>; /* phandle target of the overlay */
or
target-path="/path"; /* target path of the overlay */
__overlay__ {
property-a; /* add property-a to the target */
node-a { /* add to an existing, or create a node-a */
...
};
};
}
fragment@1 { /* second child node */
...
};
/* more fragments follow */
} ;
26 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree Overlay のサンプル
/dts-v1/;
/ {
fragment@0 {
target-path = "/amba";
__overlay__ {
#address-cells = <0x1>;
#size-cells = <0x1>;
uio0@43c10000 {
compatible = "generic-uio";
reg = <0x43c10000 0x1000>;
interrupts = <0x0 0x1d 0x4>;
};
};
};
};
27 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree Overlay の課題
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
PS
Low Level
Driver
Reset
Controller
Low Level
Driver
Clock
Controller
Device
Driver
Device Tree
Overlay
User Application
H/W
S/W
High Level
Interface
Linux
Kernel High Level
Interface
High Level
Interface
Low Level
Driver
FPGA Mngr
Framework
Low Level
Driver
Bridge
Framework
FPGA Region
・ High Level Interface が未実装
・ ユーザーから使える API が無い
・ drivers/of/overlay.c の API はすべてカーネル内関数
28 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
dtbocfg
・ dtbocfg を作りました
・ Device Tree Overlay Configuration File System
・ Device Tree Overlay をユーザーから使えるようにするデバイス
ドライバ
・ configfs を通して Device Tree を追加/削除する
・ Mainline Kernel で正式サポートされるまでの中継ぎ
・ https://github.com/ikwzm/dtbocfg
29 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
dtbocfg の使い方(1)
・ ConfigFS にディレクトリを用意する
・ /config/device-tree/overlays の下に適当に名前を付けて
ディレクトリを作ります
shell# mkdir /config/device-tree/overlays/uio0
・ /config/device-tree/overlays/uio0 の下に status と
dtbo というファイルが自動的に出来ます。
shell# ls -la /config/device-tree/overlays/uio0/
合計 0
drwxr-xr-x 2 root root 0 4 月 4 20:08 .
drwxr-xr-x 3 root root 0 4 月 4 20:08 ..
-rw-r--r-- 1 root root 4096 4 月 4 20:09 dtbo
-rw-r--r-- 1 root root 4096 4 月 4 20:09 status
30 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
dtbocfg の使い方(2)
・ Device Tree Blob を書き込む
・ /config/device-tree/overlays/uio0/dtbo に書き込む
shell# dtc -I dts -O dtb -o uio0.dtbo uio0.dts
shell# cp uio0.dtbo /config/device-tree/overlays/uio0/dtbo
・ Device Tree に追加する
・ /config/device-tree/overlays/uio0/status に書き込む
shell# echo 1 > /config/device-tree/overlays/uio0/status
31 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
dtbocfg の使い方(3)
・ Device Tree から削除(1)
・ /config/device-tree/overlays/uio0/status に書き込む
shell# echo 0 > /config/device-tree/overlays/uio0/status
・ Device Tree から削除(2)
・ /config/device-tree/overlays/uio0 を削除
shell# rmdir /config/device-tree/overlays/uio0
32 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
dtbocfg.rb
・ dtbocfg を少し使いやすくするための Ruby スクリプト
Usage: dtbocfg [command] [options] device_name
command
-i, --install Install (Create, Load, Start)
-s, --start Append Device Tree Blob on ConfigFS to System
-t, --stop Remove Device Tree Blob on ConfigFS from System
-l, --load Load Device Tree Overlay File to ConfigFS
-c, --create Create Device Tree Overlay Directory to ConfigFS
-r, --remove Remove Device Tree Overlay Directory to ConfigFS
options
--dts FILE_NAME Device Tree Source File
--dtb FILE_NAME Device Tree Blob File
-v, --verbose
-d, --debug
33 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ How to Configuration FPGA from PS with Linux
・ FPGA Configuration Overview
・ Device Tree Overlay
・ FPGA Region
・ How to Control FPGA from PS with Linux
・ Cache Coherency
・ Memory Management Unit
・ UDMABUF
・ UIO and Interrupt
without
device driver
34 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA Configuration Software Stack - Mainline Kernel 4.10
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
PS
Low Level
Driver
Reset
Controller
Low Level
Driver
Clock
Controller
FPGA Mngr
Framework
Device
Driver
Device Tree
Overlay
User Application
H/W
S/W
High Level
Interface
Linux
Kernel High Level
Interface
High Level
Interface
Low Level
Driver
FPGA Bridge
Framework
Low Level
Driver
FPGA Region
・ FPGA Region が導入
・ FPGA Bridge Framework
が導入
・ Xilinx Zynq と Altera-SoC
用 の Low Level Driver も
提供
・ 詳細は Qiita に書きました
・『 Linux Kernel 4.10 での FPGA のサポート事情』
https://qiita.com/ikwzm/items/2ff7d5429da8ace7c0bd
35 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
What Region ?
PS (Processing System)
FPGA
Reset
Controller
PCAP AXI
Bridge
・ Region - 領域
・ Altera の Partial
Reconfiguration 用語から
(多分)
・ FPGA-Region は Altera 製
Reset
Controller
AXI-Bridge
(decoupler)
Reconfigurable
Region
Reconfigurable
Region
AXI-Bridge
(decoupler)
・ Static Region
・ Rconfigurable Region
36 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Why Region ?
PS (Processing System)
FPGA
Reset
Controller
PCAP AXI
Bridge
・ Region は Bridge を介して
外部と接続
・ FPGA 全部を一つの Region
とみなすと、 Region が入れ
子になっていることに注目
・ Full Configuration の場合
は FPGA という Region にプ
ログラムをロード
・ Partial Reconfiguration
の場合は、 Reconfigurable
Region にプログラムをロード
・ プログラムをロードする対象を
Region と見なしてデバイスド
ライバをモデル化
Reset
Controller
AXI-Bridge
(decoupler)
Reconfigurable
Region
Reconfigurable
Region
AXI-Bridge
(decoupler)
37 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree による FPGA Region の定義
/dts-v1/;
/ {
amba {
devcfg: devcfg@f8007000 {/* Zynq 用 FPGA Mngr の Low Driver */
compatible = "xlnx,zynq-devcfg-1.0";
reg = <0xf8007000 0x100>;
interrupt-parent = <&intc>;
interrupts = <0 8 4>;
clocks = <&clkc 12>;
clock-names = "ref_clk";
syscon = <&slcr>;
};
fpga_region0: fpga-region0 { /* FPGA 全体の Region の定義 */
compatible = "fpga-region";
fpga-mgr = <&devcfg>;/* FPGA Mngr の Low Driver を指定 */
#address-cells = <1>;
#size-cells = <1>;
ranges;
};
};
} ;
38 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree Overlay for FPGA Full configuration (1)
・ Device Tree のサンプルソース (sample.dts)
/dts-v1/; /plugin/;
/ {
fragment@1 {
target-path = "/amba/fpga-region0"; /* Region のパスを指定 */
#address-cells = <1>;
#size-cells = <1>;
__overlay__ {
#address-cells = <1>;
#size-cells = <1>;
firmware-name = "sample.bin"; /* ビットストリームファイル名 */
uio0@43c10000 { /* 追加するデバイスドライバ */
compatible = "generic-uio";
reg = <0x43c10000 0x1000>;
interrupts = <0x0 0x1d 0x4>;
};
};
};
};
39 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree Overlay for FPGA Full configuration (2)
・ ビットストリームファイルは /lib/firmware の下に置く
・ Xilinx の場合、 何故か Vivado が生成したビットストリームファ
イルはそのままではロードできない。
・ Zynq 用の FPGA Manager の Low level Interface であ
る devcfg が、 Vivado のビットストリームファイルを扱えないの
が原因
・ fpga-bit-to-bin.py 等でフォーマット変換する必要があります
・ 詳細は『 Linux の FPGA Manager で Xilinx のビットストリー
ムファイルを扱う方法』 @Qiita 参照
https://qiita.com/ikwzm/items/1bb63be0b86a1e0e56fa
40 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree Overlay for FPGA Full configuration (3)
・ Device Tree Overlay でツリーに追加する
shell# dtbocfg.rb --install sample --dts sample.dts
・ ツリーに追加するだけで FPGA にビットストリームファイルがロード
・ コンフィギュレーション中は Bridge がオフになる
・ 使用するデバイスドライバも同時にツリーに追加できる
・ 使用するデバイスドライバは FPGA のコンフィギュレーション後に
有効になる
41 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree Overlay for FPGA Full configuration (4)
・ Device Tree Overlay でツリーから削除する
shell# dtbocfg.rb --remove sample
・ 追加したデバイスドライバは無効になる
・ デバイスツリーから削除されても FPGA の回路は次にコンフィギュ
レーションするまで動き続ける
・ FPGA の回路を止めるには別の手段が必要
42 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Mainline Kernel 4.10 の FPGA Configuration の懸念点 (1)
・ Device Tree ありき
・ ARM アーキテクチャでは一般的だが x86 では?
・ Device Tree Overlay のユーザー制御が未実装
・ FPGA の動的変更には不可欠なのになぜ?
・ Clock の制御が未サポート
・ クロックの制御に関してノータッチ どうすんの?
・ そもそもカーネル内に実装する必要があるのか?
43 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Mainline Kernel 4.10 の FPGA Configuration の懸念点 (2)
・ Mainline Kernel 対 Vender Kernel
・ FPGA Region、 FPGA Manager Framework、 FPGA
Bridge Framework は Altera 製
・ Xilinx は FPGA Framework 対応の Low Level Driver
を Mainline に提供
・ Mainline Kernel に収束していくのか、 Mainline Kernel と
Vender Kernel の 2 本立てでいくのか?
44 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Mainline Kernel の FPGA Configuration で言いたいこと
・ まだまだ発展途上
・ Device Tree ありき
・ Device Tree Overlay のユーザー制御が未実装
・ Clock の制御が未サポート
・ Vender Kernel との関係
・ でも足りない部分を補えば便利
・ Linux 動作中に FPGA やドライバを変更できる
・ FPGA のデザインごとに Linux を再構築しなくて済む
・ Vivado SDK とか JTAG ケーブル不要 (私はもう使っていない)
45 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
https://github.com/ikwzm/FPGA-SoC-Linux の紹介
FPGA
Reset
Controller
Clock
Controller
PCAP AXI
Bridge
PS
Low Level
Driver
Reset
Controller
Low Level
Driver
Clock
Controller
FPGA Mngr
Framework
Device
Driver
Device Tree
Overlay
User Application
H/W
S/W
High Level
Interface
Linux
Kernel
Low Level
Driver
FPGA Region
FPGA Bridge
Framework
Low Level
Driver
fclkcfg.ko dtbocfg.ko
・ FPGA Configuration を試してみるための一揃いを
https://github.com/ikwzm/FPGA-SoC-Linux に公開
・ Mainline Kernel 4.10 で足りない機能を追加
・ Mainline Kernel 4.12.14 + Debian9 RootFS + U-Boot
・ dtbocfg
・ Device Tree Overlay の High Level Interface
・ https://github.com/ikwzm/dtbocfg
・ fclkcfg
・ Clock Controller の High Level Interface
・ https://github.com/ikwzm/fclkcfg
46 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
https://github.com/ikwzm/FPGA-SoC-Linux の紹介
・ FPGA Configuration お試し用
・ あくまでも Mainline が正式サポートするまでのつなぎ
・ Mainline Kernel 4.10 で足りない機能を追加
・ Device Tree Overlay の High Level Interface
・ Clock Controller の High Level Interface
・ Mainline Kernel 4.12.14 + Debian9 RootFS + U-Boot
・ ZYBO/ZYBO-Z7/PYNQ-Z1/De0-Nano-SoC 対応
・ 詳しくは『 FPGA+SoC+Linux+Device Tree Overlay+FPGA
Region(ブートイメージの提供)』 @Qiita 参照
https://qiita.com/ikwzm/items/7e90f0ca2165dbb9a577
47 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ How to Configuration FPGA from PS with Linux
・ FPGA Configuration Overview
・ Device Tree Overlay
・ FPGA Region
・ How to Control FPGA from PS with Linux
・ Cache Coherency
・ Memory Management Unit
・ UDMABUF
・ UIO and Interrupt
without
device driver
48 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ How to Configuration FPGA from PS with Linux
・ FPGA Configuration Overview
・ Device Tree Overlay
・ FPGA Region
・ How to Control FPGA from PS with Linux
・ Cache Coherency
・ Memory Management Unit
・ UDMABUF
・ UIO and Interrupt
without
device driver
49 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Cache Coherency トラブルの症状
・ ケース1 CPU が書いたデータが FPGA から正しく読めない
・ ケース 2 FPGA が書いたデータが CPU から正しく読めない
50 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Cache Coherency でトラブルが発生するケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
51 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Cache Coherency でトラブルが発生するケース1
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xDEAD
この時まだ Mem にはライトされてない
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
1. CPU が Addr=0x0080 に
Data=0xABED をライト
52 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Cache Coherency でトラブルが発生するケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
4. 未だ Mem の Addr=0x0080 には
Data=0xABED は書き込まれて
いないので、 FPGA は
Data=0xDEAD を読んでしまう
0x0080 0xABED
0x0080 0xDEAD
3. FPGA が Addr=0x0080 をリード
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
53 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Cache Coherency でトラブルが発生するケース 2
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xABED
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
2. Cache に無いので Mem にリード
1. CPU が Addr=0x0080 をリード
54 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Cache Coherency でトラブルが発生するケース 2
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 をリード
0x0080 0xABED
0x0080 0xDEAD
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
2. Cache に無いので Mem にリード
55 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Cache Coherency でトラブルが発生するケース 2
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 をリード
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
Data Cache に Addr=0x0080 のデ
ータ(0xABED)が残っているので、
CPU は data=0xABED と誤った値を
リード(Mem にはリードしない)
0x0080 0xABED
0x0080 0xDEAD
2. Cache に無いので Mem にリード
5. CPU が Addr=0x0080 をリード
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
56 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Cache Coherency トラブルの解決方法
・ キャッシュを使わない
・ ソフトウェアによる解決方法
ソフトウェアで Cache Flush/Invalidiate する
・ ハードウェアによる解決方法
Cache Coherency に対応した Cache と Interconnect
57 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ソフトウェアで Cache を制御してトラブル回避 ケース1
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xDEAD
1. CPU が Addr=0x0080 に
Data=0xABED をライト
58 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ソフトウェアで Cache を制御してトラブル回避 ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
0x0080 0xABED
0x0080 0xDEAD
59 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ソフトウェアで Cache を制御してトラブル回避 ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
0x0080 0xABED
0x0080 0xABED
3. Data Cache の Addr=0x0080
を強制的に Flush
60 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ソフトウェアで Cache を制御してトラブル回避 ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
4. FPGA が Addr=0x0080
をリード
0x0080 0xDEAD
3. Data Cache の Addr=0x0080
を強制的に Flush
FPGA は正しい値
(0xABED)が読める
61 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ソフトウェアで Cache を制御してトラブル回避 ケース2
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xABED
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
2. Cache に無いので Mem にリード
1. CPU が Addr=0x0080 をリード
62 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ソフトウェアで Cache を制御してトラブル回避 ケース2
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 をリード
0x0080 0xABED
0x0080 0xDEAD
2. Cache に無いので Mem にリード
4. FPGA が Addr=0x0080
に Data=0xDEAD をライト
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
63 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ソフトウェアで Cache を制御してトラブル回避 ケース2
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 をリード
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
0x0080 0xABED
0x0080 0xDEAD
2. Cache に無いので Mem にリード
5. Data Cache の Addr=0x0080
を Invalidiate(無効化)
64 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ソフトウェアで Cache を制御してトラブル回避 ケース2
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 をリード
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
0x0080 0xDEAD
0x0080 0xDEAD
2. Cache に無いので Mem にリード
5. Data Cache の Addr=0x0080
を Invalidiate(無効化)
7. Cache に無いので Mem にリード
6. CPU が Addr=0x0080 をリード
65 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ソフトウェアで Cache を制御する方法の問題点
・ 面倒くせ~よ
・ 相手がリード/ライトするタイミングが判ってないと無理
・ CPU が DMA や FPGA を制御する場合は可能だけど、
マルチプロセッサ間では難しい
・ 時間がかかる
・ キャッシュの操作は意外と時間がかかる
・ しかもクリティカルセクション(他の処理ができない)
66 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency - 用意するもの
CPU
addr data
CPU
addr data
Mem FPGA
Cache Coherency に対応した
Interface Protocol
Cache Coherency に対応した
InterConnect
Cache Coherency に対応した Cache
67 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
0x0080 0xABED
0x0080 0xDEAD
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
68 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
3. FPGA が Addr=0x0080
をリード
0x0080 0xABED
0x0080 0xDEAD
69 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
3. FPGA が Addr=0x0080
をリード
0x0080 0xABED
0x0080 0xDEAD
4.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
70 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
3. FPGA が Addr=0x0080
をリード
0x0080 0xABED
0x0080 0xDEAD
4.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
5.該当する Addr(0x0080)のデータを
キャッシュしているマスターがいる場合は
マスターがデータを出力
71 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency ケース1
CPU
addr data
CPU
addr data
Mem FPGA
1. CPU が Addr=0x0080 に
Data=0xABED をライト
2. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
3. FPGA が Addr=0x00C0
をリード
0x0080 0xABED
0x00C0 0xDEAD
4.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
5.該当する Addr(0x00C0)のデータを
キャッシュしているマスターがいない場合
は Mem から読む
72 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency ケース 2
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xABED
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
2. Cache に無いので Mem にリード
1. CPU が Addr=0x0080 をリード
73 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency ケース 2
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xABED
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
1. CPU が Addr=0x0080 をリード
2. Cache に無いので Mem にリード
4. FPGA が Addr=0x0080
に Data=0xDEAD をライト
74 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency ケース 2
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xABED
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
1. CPU が Addr=0x0080 をリード
2. Cache に無いので Mem にリード
4. FPGA が Addr=0x0080
に Data=0xDEAD をライト
5.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
75 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency ケース 2 (キャッシュラインサイズの書き込みの場合)
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xABED
0x0080 0xDEAD
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
1. CPU が Addr=0x0080 をリード
2. Cache に無いので Mem にリード
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
5.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
6.該当する Addr(0x0080)のデータを
キャッシュしているマスターはキャッシュを
無効化(Invalidiate)
7. Mem の Addr=0x0080 に
Data=0xDEAD をライト
76 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency ケース 2 (キャッシュラインサイズの書き込みの場合)
CPU
addr data
CPU
addr data
Mem FPGA
0x0080 0xDEAD
0x0080 0xDEAD
3. Data Cache に Addr=0x0080
Data=0xABED をキャッシュ
1. CPU が Addr=0x0080 をリード
2. Cache に無いので Mem にリード
4. FPGA が Addr=0x0080 に
Data=0xDEAD をライト
5.InterConnect 内でキャッシュを持つ
マスターに Addr を通知(snoop)
6.該当する Addr(0x0080)のデータを
キャッシュしているマスターはキャッシュを
無効化(Invalidiate)
7. Mem の Addr=0x0080 に
Data=0xDEAD をライト
8. CPU が Addr=0x0080 をリード9. Cache に無いので Mem にリード
77 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Cache Coherency トラブル
・ 症状
・ CPU が書いたデータが FPGA から正しく読めない
・ FPGA が書いたデータが CPU から正しく読めない
・ 対策
・ キャッシュを使わない
・ ソフトウェアによる解決方法
・ ソフトウェアで Cache Flush/Invalidiate する
・ ハードウェアによる解決方法
・ Cache Coherency に対応した Cache と
Interconnect
78 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
ハードウェアで Cache Coherency - Zynq の場合
・ ACP(Accelarator Coherency Port)を使う
・ Zynq にはハードウェアで Cache Coherency を制御できる
専用のアクセスポートがあります
・ HP(High Performance Port - Cache Coherency を制
御しないポート) に比べて 30%~70%の帯域しかでません
・ 参照: FPGA の部屋 『 Zynq の AXI_ACP ポートと
AXI_HP ポートの性能の違い1(AXI_ACP ポート)』
(http://marsee101.blog19.fc2.com/blog-entry-2773.html)
・ しかしソフトウェアで Cache を操作する苦労をしなくて済みます
・ とりあえず動くことを確認したい時には便利です
79 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ How to Configuration FPGA from PS with Linux
・ FPGA Configuration Overview
・ Device Tree Overlay
・ FPGA Region
・ How to Control FPGA from PS with Linux
・ Cache Coherency
・ Memory Management Unit
・ UDMABUF
・ UIO and Interrupt
without
device driver
80 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Memory Management Unit の働き
・ 仮想アドレスから物理アドレスへの変換
・ 仮想記憶 - 個々のプロセスからは単一のメモリマップ
・ 物理メモリの有効利用
・ 物理アドレス空間と仮想アドレス空間の分離
・ メモリ保護
・ キャッシュ制御
81 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
仮想アドレスから物理アドレスへの変換(Aarch32-LPAE の例)
Main Memory
(物理アドレス)12 11 02021293031
PTE Table
Phys Addr
Phys Addr
PMD Table
Table Ptr
Table Ptr
PGD Table
Table Ptr
Table Ptr
TTBRx
プロセス(仮想アドレス)
64 bit/entry64 bit/entry
64 bit/entry
512
entry
512
entry
4Kbyte/page
LPAE : Large Physical Address Extension
PTE : Page Table Entry
PMD : Page Middle Directory
PGD : Page Global Directory
82 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
仮想記憶 - 個々のプロセスからは単一のメモリマップ
プロセス 1
(仮想アドレス)
Main Memory
(物理アドレス)MMU
0x0000_0000 0x08_0000_0000
0x0000_0000
0x0000_1000
0x0000_2000
0x0000_3000
0x0000_2000
0x0000_3000
0x0000_4000
0x0000_1000
0x08_0000_1000
0x08_0000_2000
0x08_0000_3000
0x08_0000_4000
0x08_0000_5000
0x08_0000_6000
0x08_0000_7000
0x08_0000_8000
プロセス 2
(仮想アドレス)
83 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA から見た場合の問題
プロセス 1
(仮想アドレス)
Main Memory
(物理アドレス)MMU
0x0000_0000
0x0000_1000
0x0000_2000
0x0000_3000
0x0000_4000
buf[0x0000]
buf[0x1000]
buf[0x2000]
buf[0x3000]
buf[0x0000]
buf[0x1000]
buf[0x2000]
buf[0x3000]
仮想アドレス上は
連続でも物理アド
レス上はバラバラに
配置されている
84 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
FPGA からバラバラに配置されたバッファへのアクセス方法
・ ハードウェアのアシスト有り (今回は説明対象外)
・ Scatter-Gather DMA
・ IOMMU
・ ハードウェアのアシスト無し
- 物理メモリ上に連続領域(DMA バッファ)を確保
・ バッファから/へ DMA バッファへ/からデータをコピー
・ DMA バッファをユーザープロセスからアクセス
85 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
バッファから/へ DMA バッファへ/からデータをコピー
プロセス 1
(仮想アドレス)
Main Memory
(物理アドレス)MMU
0x0000_0000
0x0000_1000
0x0000_2000
0x0000_3000
0x0000_4000
buf[0x0000]
buf[0x1000]
buf[0x2000]
buf[0x3000]
buf[0x0000]
buf[0x1000]
buf[0x2000]
buf[0x3000]
メモリ上に連続領
域(DMA バッファ)
を確保
バッファから/へ
DMA バッファに/か
らデータをコピー
86 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
バッファから/へ DMA バッファへ/からデータをコピー
・ 良い点
・ 特殊なハードウェアを必要としない
・ 悪い点
・ データのコピーによる性能劣化
・ 課題
・ 連続領域(DMA バッファ)の確保方法(後述)
・ 例
・ レガシーなデバイス(一昔前はわりとメジャーな方法)
・ 今でも低速なデバイス(UART など)ではよく使われる
87 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
DMA バッファをユーザープロセスからアクセス
プロセス 1
(仮想アドレス)
Main Memory
(物理アドレス)MMU
0x0000_0000
0x0000_1000
0x0000_2000
0x0000_3000
0x0000_4000
buf[0x0000]
buf[0x1000]
buf[0x2000]
buf[0x3000]
メモリ上に連続領
域(DMA バッファ)
を確保
DMA バッファをユ
ーザープロセスの仮
想空間にマッピング
88 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
DMA バッファをユーザープロセスからアクセス
・ 良い点
・ 特殊なハードウェアを必要としない
・ 悪い点
・ ユーザープログラム側に(mmap()を使う等)対処が必要
・ 課題
・ 連続領域(DMA バッファ)の確保方法(後述)
・ 例
・ UIO(User space I/O)
・ /dev/mem
・ udmabuf
89 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
連続領域(DMA バッファ)の確保方法 - Linux の場合
・ Linux の管理外領域に連続領域を確保
・ メモリ管理をユーザープログラムが行う必要がある
・ 領域は Linux 起動時に確保
・ /dev/mem や uio の mmap を使う場合はキャッシュ対象外
・ CMA(Contiguous Memory Allocator)を使う
・ メモリ管理は Linux のカーネルが行う
・ CMA 領域の最大値は Linux 起動時に指定
・ "ある程度"動的にバッファを確保できる(フラグメンテーション問題)
・ キャッシュの対象
90 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ How to Configuration FPGA from PS with Linux
・ FPGA Configuration Overview
・ Device Tree Overlay
・ FPGA Region
・ How to Control FPGA from PS with Linux
・ Cache Coherency
・ Memory Management Unit
・ UDMABUF
・ UIO and Interrupt
without
device driver
91 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
udmabuf の紹介
・ CMA の問題
・ ユーザー空間からは使えない(カーネル専用)
・ CMA を使うにはカーネルドライバを作る必要がある
・ udmabuf を作りました
・ User mappable space DMA Buffer
・ CMA 領域に DMA バッファとして連続領域を確保
・ 確保した DMA バッファをユーザー空間にマッピングするための
デバイスドライバ
・ https://github.com/ikwzm/udmabuf
92 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
udmabuf のアーキテクチャ
User space Kernel space Hardware
/dev/uio
/dev/udmabuf
open()
mmap()
open()
mmap()
CMA
dma_alloc_coherent()
access
Accelarator
Control
Status
Registers
DMA
or
Master
User space driver
access
93 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
udmabuf デバイスドライバのロード/アンロード (FPGA-SoC-Linux)
・ systemd による udmabuf.ko の制御
・ FPGA-SoC-Linux には udmabuf のデバイスドライバがイン
ストールされています
・ systemctl コマンドでロード/アンロードできます
shell$ sudo systemctl status udmabuf.service
● udmabuf.service - User space mappable DMA Buffer Service.
Loaded: loaded (/etc/systemd/system/udmabuf.service; enabled; vendor preset:
Active: active (exited) since Fri 2017-11-03 17:38:47 JST; 8min ago
Process: 2514 ExecStart=/sbin/modprobe udmabuf (code=exited, status=0/SUCCESS)
Main PID: 2514 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/udmabuf.service
Nov 03 17:38:47 debian-fpga systemd[1]: Starting User space mappable DMA Buffer Service....
Nov 03 17:38:47 debian-fpga systemd[1]: Started User space mappable DMA Buffer Service....
94 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
デバイスの追加 - DMA バッファの確保 (1)
・ Device Tree Overlay のサンプルソース
/dts-v1/; /plugin/;
/ {
fragment@1 {
target-path = "/amba";
#address-cells = <1>;
#size-cells = <1>;
__overlay__ {
#address-cells = <1>;
#size-cells = <1>;
udmabuf0@0x00 { /* 追加するデバイスツリーノード */
compatible = "ikwzm,udmabuf-0.10.a";
device-name = "udmabuf0"; /* デバイス名 */
size = <0x00100000>; /* バッファサイズ*/
};
};
};
};
95 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
デバイスの追加 - DMA バッファの確保 (2)
・ Device Tree Overlay でツリーに追加する
shell# dtbocfg.rb --install udmabuf0 --dts udmabuf0.dts
udmabuf udmabuf0: driver installed
udmabuf udmabuf0: major number = 248
udmabuf udmabuf0: minor number = 0
udmabuf udmabuf0: phys address = 0x1e900000
udmabuf udmabuf0: buffer size = 1048576
shell# ls -la /dev/udmabuf0
crw------- 1 root root 248, 0 Dec 1 09:34 /dev/udmabuf0
・ Device Tree に追加することで初めてバッファが確保される
・ Device Tree に追加することで初めてデバイスドライバ(この例
では/dev/udmabuf0)が作成される
96 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
DMA バッファをユーザー空間へマッピング (1) C 言語
・ udmabuf デバイスを mmap() でマッピング
if ((fd = open("/dev/udmabuf0", O_RDWR)) != -1) {
buf = mmap(NULL, buf_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
/* Do some read/write access to buf */
close(fd);
}
・ open() 時のオプションに O_SYNC を付けるとキャッシュオフ
・ open() 時のオプションに O_SYNC を付けないとキャッシュオン
97 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ udmabuf デバイスを np.memmap() でマッピング
import numpy as np
class Udmabuf:
"""A simple udmabuf class"""
def __init__(self, name):
self.name = name
self.device_name = '/dev/%s' % self.name
self.class_path = '/sys/class/udmabuf/%s' % self.name
for line in open(self.class_path + '/size'):
self.buf_size = int(line)
break
for line in open(self.class_path + '/phys_addr'):
self.phys_addr = int(line, 16)
break
def memmap(self, dtype, shape):
self.item_size = np.dtype(dtype).itemsize
self.array = np.memmap(self.device_name, dtype=dtype, mode='r+', shape=shape)
return self.array
DMA バッファをユーザー空間へマッピング (2) Python+NumPy
98 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
DMA バッファをユーザー空間へマッピング (3) Python+NumPy
・ 確保した DMA バッファを np.array として使う
if __name__ == '__main__':
udmabuf = Udmabuf('udmabuf0')
test_dtype = np.uint8
test_size = int(udmabuf.buf_size/(np.dtype(test_dtype).itemsize))
comparison = np.random.randint(0,255,(test_size))
ubuf_array = udmabuf.memmap(dtype=test_dtype, shape=(test_size))
ubuf_array[:] = comparison
if np.array_equal(ubuf_array, comparison):
print ("ubuf_array == comparison : OK")
else:
print ("ubuf_array != comparison : NG")
99 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
DMA バッファのサイズを得る (1) C 言語
・ /sys/class/udmabuf/<device-name>/size を読む
unsigned char attr[1024];
unsigned long buf_size;
if ((fd = open("/sys/class/udmabuf/udmabuf0/size", O_RDONLY)) != -1) {
read(fd, attr, 1024);
sscanf(attr, "%d", &buf_size);
close(fd);
}
100 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ /sys/class/udmabuf/<device-name>/size を読む
import numpy as np
class Udmabuf:
"""A simple udmabuf class"""
def __init__(self, name):
self.name = name
self.device_name = '/dev/%s' % self.name
self.class_path = '/sys/class/udmabuf/%s' % self.name
for line in open(self.class_path + '/size'):
self.buf_size = int(line)
break
for line in open(self.class_path + '/phys_addr'):
self.phys_addr = int(line, 16)
break
def memmap(self, dtype, shape):
self.item_size = np.dtype(dtype).itemsize
self.array = np.memmap(self.device_name, dtype=dtype, mode='r+', shape=shape)
return self.array
DMA バッファのサイズを得る (2) Python
101 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
DMA バッファの物理アドレスを得る (1) C 言語
・ /sys/class/udmabuf/<device-name>/phys_addr を読む
unsigned char attr[1024];
unsigned long phys_addr;
if ((fd = open("/sys/class/udmabuf/udmabuf0/phys_addr", O_RDONLY)) != -1) {
read(fd, attr, 1024);
sscanf(attr, "%x", &phys_addr);
close(fd);
}
102 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ /sys/class/udmabuf/<device-name>/phys_addr を読む
import numpy as np
class Udmabuf:
"""A simple udmabuf class"""
def __init__(self, name):
self.name = name
self.device_name = '/dev/%s' % self.name
self.class_path = '/sys/class/udmabuf/%s' % self.name
for line in open(self.class_path + '/size'):
self.buf_size = int(line)
break
for line in open(self.class_path + '/phys_addr'):
self.phys_addr = int(line, 16)
break
def memmap(self, dtype, shape):
self.item_size = np.dtype(dtype).itemsize
self.array = np.memmap(self.device_name, dtype=dtype, mode='r+', shape=shape)
return self.array
DMA バッファの物理アドレスを得る (2) Python
103 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
udmabuf の記事 @Qiita 
・ 『 Linux でユーザー空間で動作するプログラムとハードウェアがメモリ
を共有するためのデバイスドライバ』
https://qiita.com/ikwzm/items/cc1bb33ff43a491440ea
・ 『 Linux でユーザー空間で動作するプログラムとハードウェアがメモリ
を共有するためのデバイスドライバ(Device Tree Overlay 対応)』
https://qiita.com/ikwzm/items/db904df23748e4b957b5
・ 『 Linux でユーザー空間で動作するプログラムとハードウェアがメモリ
を共有するためのデバイスドライバ(NumPy 対応)』
https://qiita.com/ikwzm/items/e615ce90ca0c403b3794
104 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ How to Configuration FPGA from PS with Linux
・ FPGA Configuration Overview
・ Device Tree Overlay
・ FPGA Region
・ How to Control FPGA from PS with Linux
・ Cache Coherency
・ Memory Management Unit
・ UDMABUF
・ UIO and Interrupt
without
device driver
105 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree による UIO デバイスの追加 (1)
・ Device Tree Overlay のサンプルソース
/dts-v1/; /plugin/;
/ {
fragment@1 {
target-path = "/amba";
#address-cells = <1>;
#size-cells = <1>;
__overlay__ {
#address-cells = <1>;
#size-cells = <1>;
uio0@43c10000 {
compatible = "generic-uio";
reg = <0x43c10000 0x1000>;
interrupts = <0x0 0x1d 0x4>;
};
};
};
};
106 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree による UIO デバイスの追加 (2)
・ compatible プロパティで uio のデバイスドライバ名を指定
・ reg プロパティで レジスタのアドレスと範囲を指定
・ 1番目のパラメータが CPU レジスタからみたアドレス
・ 2番目のパラメータでレジスタ領域の大きさ
・ interrupt プロパティで割り込み番号を指定
・ 1番目のパラメータは GIC 内部の割り込みの種類
0=共有ペリフェラル割り込み(SPI)
・ 2番目のパラメータは割り込み番号
IRQ_F2P[0]は SPI の 61 番に接続されている
Device Tree では 61 から 32 を引いた値を指定する
・ 3番目のパラメータはトリガータイプ
1=エッジトリガー / 4=レベルトリガー
107 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
Device Tree による UIO デバイスの追加 (3)
・ Device Tree Overlay でツリーに追加する
shell# dtbocfg.rb --install uio0 --dts uio0.dts
shell# ls -la /dev/uio0
crw------- 1 root root 248, 0 Dec 1 09:34 /dev/uio0
・ Device Tree に追加することで初めてデバイスドライバ(この例
では/dev/uio0)が作成される
108 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
レジスタ空間をユーザー空間へマッピング (1) C 言語
・ uio デバイスを mmap() でマッピング
int uio_fd;
void* regs;
if ((uio_fd = open("/dev/uio0", O_RDWR | O_SYNC)) == -1) {
printf("Can not open /dev/uio0n");
exit(1);
}
regs = mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, uio_fd, 0);
if (regs == NULL) {
printf("Can not mmap /dev/uio0n");
exit(1);
}
109 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ uio デバイスを mmap.mmap() でマッピング
import numpy as np
import mmap
class Uio:
"""A simple uio class"""
def __init__(self, name, length=0x1000):
self.name = name
self.device_name = '/dev/%s' % self.name
self.length = length
self.device_file = os.open(self.device_name, os.O_RDWR | os.O_SYNC)
self.mem = mmap.mmap(self.device_file, self.length,
mmap.MAP_SHARED,
mmap.PROT_READ | mmap.PROT_WRITE, offset=0)
self.word_array = np.frombuffer(self.mem, np.uint32, self.length>>2, 0)
def read_word(self, offset):
return int(self.word_array[offset>>2])
def write_word(self, offset, data):
self.word_array[offset>>2] = np.uint32(data)
レジスタ空間をユーザー空間へマッピング (2) Python+NumPy
110 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
割り込みの許可 or 禁止の設定 (1) C 言語
・ uio デバイスに write() で 1 or 0 を書く
・ uio では割り込みの許可 or 禁止の設定は デバイスファイル
(/dev/uio0)に write することで設定
・ 書き込むデータは 32bit の integer
・ 1 を write することで割り込みを許可
・ 0 を write することで割り込みを禁止
int uio_irq_on(int uio_fd)
{
unsigned int irq_on = 1;
write(uio_fd, &irq_on, sizeof(irq_on));
}
int uio_irq_off(int uio_fd)
{
unsigned int irq_on = 0;
write(uio_fd, &irq_on, sizeof(irq_on));
}
111 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ uio デバイスに os.write() で 1 or 0 を書く
import numpy as np
import mmap
class Uio:
"""A simple uio class"""
def __init__(self, name, length=0x1000):
self.name = name
self.device_name = '/dev/%s' % self.name
self.length = length
self.device_file = os.open(self.device_name, os.O_RDWR | os.O_SYNC)
self.mem = mmap.mmap(self.device_file, self.length,
mmap.MAP_SHARED,
mmap.PROT_READ | mmap.PROT_WRITE, offset=0)
self.word_array = np.frombuffer(self.mem, np.uint32, self.length>>2, 0)
def irq_on(self):
os.write(self.device_file, b'x01x00x00x00')
def irq_off(sef):
os.write(self.device_file, b'x00x00x00x00')
割り込みの許可 or 禁止の設定 (2) Python
112 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
割り込み待ち (1) C 言語
・ uio デバイスを read() で読む
・ uio では read() を使って、 割り込みが発生するまで読み出し
プロセスをブロック
・ 読み出すデータの型は 32bit の integer
int uio_wait_irq(int uio_fd)
{
unsigned int count = 0;
return read(uio_fd, &count, sizeof(count));
}
113 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
・ uio デバイスを os.read() で読む
import numpy as np
import mmap
class Uio:
"""A simple uio class"""
def __init__(self, name, length=0x1000):
self.name = name
self.device_name = '/dev/%s' % self.name
self.length = length
self.device_file = os.open(self.device_name, os.O_RDWR | os.O_SYNC)
self.mem = mmap.mmap(self.device_file, self.length,
mmap.MAP_SHARED,
mmap.PROT_READ | mmap.PROT_WRITE, offset=0)
self.word_array = np.frombuffer(self.mem, np.uint32, self.length>>2, 0)
def wait_irq(self):
os.read(self.device_file, 4)
割り込み待ち (2) Python
114 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2)
uio の記事
・ https://github.com/ikwzm/ZYBO_UIO_IRQ_SAMPLE
・ 『 UIO(User space IO)の割り込みの使い方の例』 @Qiita
https://qiita.com/ikwzm/items/b22592c31cdbb9ab6cf7
・『 Python と Numpy で UIO を制御』 @Qiita
https://qiita.com/ikwzm/items/d7559858d099c86c350c

More Related Content

What's hot

目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
KVM環境におけるネットワーク速度ベンチマーク
KVM環境におけるネットワーク速度ベンチマークKVM環境におけるネットワーク速度ベンチマーク
KVM環境におけるネットワーク速度ベンチマークVirtualTech Japan Inc.
 
"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越Kentaro Ebisawa
 
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説Takateru Yamagishi
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料直久 住川
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいwata2ki
 
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層智啓 出川
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解MITSUNARI Shigeo
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門NVIDIA Japan
 
5分で分かるgitのrefspec
5分で分かるgitのrefspec5分で分かるgitのrefspec
5分で分かるgitのrefspecikdysfm
 
「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!Hirotaka Sato
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるAtsushi KOMIYA
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法kazkiti
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -zgock
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門Fixstars Corporation
 
RISC-V : Berkeley Boot Loader & Proxy Kernelのソースコード解析
RISC-V : Berkeley Boot Loader & Proxy Kernelのソースコード解析RISC-V : Berkeley Boot Loader & Proxy Kernelのソースコード解析
RISC-V : Berkeley Boot Loader & Proxy Kernelのソースコード解析Mr. Vengineer
 
root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす Akihiro Suda
 

What's hot (20)

目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
KVM環境におけるネットワーク速度ベンチマーク
KVM環境におけるネットワーク速度ベンチマークKVM環境におけるネットワーク速度ベンチマーク
KVM環境におけるネットワーク速度ベンチマーク
 
"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越"SRv6の現状と展望" ENOG53@上越
"SRv6の現状と展望" ENOG53@上越
 
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくい
 
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門
 
5分で分かるgitのrefspec
5分で分かるgitのrefspec5分で分かるgitのrefspec
5分で分かるgitのrefspec
 
「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!「おうちクラウド」が今熱い!
「おうちクラウド」が今熱い!
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
RISC-V : Berkeley Boot Loader & Proxy Kernelのソースコード解析
RISC-V : Berkeley Boot Loader & Proxy Kernelのソースコード解析RISC-V : Berkeley Boot Loader & Proxy Kernelのソースコード解析
RISC-V : Berkeley Boot Loader & Proxy Kernelのソースコード解析
 
root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 

Similar to FPGA+SoC+Linux実践勉強会資料

FPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみたFPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみたTakefumi MIYOSHI
 
FPGAスタートアップ資料
FPGAスタートアップ資料FPGAスタートアップ資料
FPGAスタートアップ資料marsee101
 
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向Shinya Takamaeda-Y
 
20170421 tensor flowusergroup
20170421 tensor flowusergroup20170421 tensor flowusergroup
20170421 tensor flowusergroupManaMurakami1
 
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会Hitoshi Sato
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)l_b__
 
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...Takuma Usui
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021Preferred Networks
 
仮想FPGAクラウド
仮想FPGAクラウド仮想FPGAクラウド
仮想FPGAクラウドEric Fukuda
 
Linux kernelのbspとupstream
Linux kernelのbspとupstreamLinux kernelのbspとupstream
Linux kernelのbspとupstreamwata2ki
 
pgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpupgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpuKohei KaiGai
 
Fpga online seminar by fixstars (1st)
Fpga online seminar by fixstars (1st)Fpga online seminar by fixstars (1st)
Fpga online seminar by fixstars (1st)Fixstars Corporation
 
45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄Yukio Saito
 
20210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.020210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.0Kohei KaiGai
 
ACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyoACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyoTakefumi MIYOSHI
 

Similar to FPGA+SoC+Linux実践勉強会資料 (20)

Pdp11 on-fpga
Pdp11 on-fpgaPdp11 on-fpga
Pdp11 on-fpga
 
FPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみたFPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみた
 
FPGAスタートアップ資料
FPGAスタートアップ資料FPGAスタートアップ資料
FPGAスタートアップ資料
 
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向
 
20170421 tensor flowusergroup
20170421 tensor flowusergroup20170421 tensor flowusergroup
20170421 tensor flowusergroup
 
ICD/CPSY 201412
ICD/CPSY 201412ICD/CPSY 201412
ICD/CPSY 201412
 
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
 
Cmc cmd slim
Cmc cmd slimCmc cmd slim
Cmc cmd slim
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)
 
[DL Hacks]FPGA入門
[DL Hacks]FPGA入門[DL Hacks]FPGA入門
[DL Hacks]FPGA入門
 
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
 
仮想FPGAクラウド
仮想FPGAクラウド仮想FPGAクラウド
仮想FPGAクラウド
 
Linux kernelのbspとupstream
Linux kernelのbspとupstreamLinux kernelのbspとupstream
Linux kernelのbspとupstream
 
pgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpupgconfasia2016 lt ssd2gpu
pgconfasia2016 lt ssd2gpu
 
Myoshimi extreme
Myoshimi extremeMyoshimi extreme
Myoshimi extreme
 
Fpga online seminar by fixstars (1st)
Fpga online seminar by fixstars (1st)Fpga online seminar by fixstars (1st)
Fpga online seminar by fixstars (1st)
 
45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄
 
20210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.020210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.0
 
ACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyoACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyo
 

FPGA+SoC+Linux実践勉強会資料

  • 2. 2 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) SoC ? FPGA ? ・ SoC : System on Chip ・ CPU Core + Peripherals ・ Xilinx → PS (Processing System) ・ Altera → HPS (Hard Processor System) ・ FPGA : Field Programmable Gate Array ・ Xilinx → PL (Programmable Logic) ・ Altera → FPGA Fablic
  • 3. 3 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA+SoC ? (Xilinx Zynq) PS (Processing System) PL (Progrmable Logic) Reset Controller Clock Controller PCAP AXI Bridge Cortex-A9 MPCore Cortex-A9 SCU NEON 512KB L2 256KB OCM DRAM Controller MIO USB GigE GPIOUART SDIO SPI Peripherals ・ FPGA+SoC : ・ PS and PL on Single Chip ・Connected PS and PL through on-chip bus
  • 4. 4 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA+SoC ? (Altera CycloneV-SoC) HPS (Hard Processor System) FPGA Fablic Reset Controller Clock Controller FPGA Manager HPS-FPGA Bridge Cortex-A9 MPCore Cortex-A9 SCU NEON 512KB L2 256KB OCM DRAM Controller MIO USB GigE GPIOUART SDIO SPI Peripherals ・ FPGA+SoC : ・ HPS and FPGA Fablic on Single Chip ・ Connected HPS and FPGA through on-chip bus
  • 5. 5 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA+SoC ? PS (Processing System) FPGA Reset Controller Clock Controller PCAP AXI Bridge Cortex-A9 MPCore Cortex-A9 SCU NEON 512KB L2 256KB OCM DRAM Controller MIO USB GigE GPIOUART SDIO SPI Peripherals ・ FPGA+SoC : ・ PS and FPGA on Single Chip ・ Connected PS and FPGA through on-chip bus 以降、 この資料では PS と FPGA に統一します (SoC という言葉は PS だけを指すのか PS+PL を指すのか紛らわしいので)
  • 6. 6 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Agenda ・ How to Configuration FPGA from PS with Linux ・ FPGA Configuration Overview ・ Device Tree Overlay ・ FPGA Region ・ How to Control FPGA from PS with Linux ・ Cache Coherency ・ Memory Management Unit ・ UDMABUF ・ UIO and Interrupt without device driver
  • 7. 7 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ How to Configuration FPGA from PS with Linux ・ FPGA Configuration Overview ・ Device Tree Overlay ・ FPGA Region ・ How to Control FPGA from PS with Linux ・ Cache Coherency ・ Memory Management Unit ・ UDMABUF ・ UIO and Interrupt without device driver
  • 8. 8 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ How to Configuration FPGA from PS with Linux ・ FPGA Configuration Overview ・ Device Tree Overlay ・ FPGA Region ・ How to Control FPGA from PS with Linux ・ Cache Coherency ・ Memory Management Unit ・ UDMABUF ・ UIO and Interrupt without device driver
  • 9. 9 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration に必要な基本要素 (1) Cofiguration Hardware (2) Reset (3) Bridge (4) Clock
  • 10. 10 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Hardware (1) - Cofiguration H/W PS (Processing System) FPGA Reset Controller Clock Controller PCAP AXI Bridge Cortex-A9 MPCore Cortex-A9 SCU NEON 512KB L2 256KB OCM DRAM Controller MIO USB GigE GPIOUART SDIO SPI Peripherals ・ BitStream をメモリから読んで FPGA に書き込む ・ PCAP (Xilinx) Processor Configuration Access Port ・ FPGA Manager(Altera)
  • 11. 11 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Hardware (2) - Reset Controller PS (Processing System) FPGA Reset Controller Clock Controller PCAP AXI Bridge Cortex-A9 MPCore Cortex-A9 SCU NEON 512KB L2 256KB OCM DRAM Controller MIO USB GigE GPIOUART SDIO SPI Peripherals ・ コンフィギュレーション中に FPGA が誤動作しないように Register をリセット状態にし ておく必要がある ・ Full Configuration の時は PCAP がリセットをかけるので 特に考慮する必要はない ・ Partial Reconfiguration の 時は考慮する必要があるので 注意
  • 12. 12 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Hardware (3) - Bridge PS (Processing System) FPGA Reset Controller Clock Controller PCAP AXI Bridge Cortex-A9 MPCore Cortex-A9 SCU NEON 512KB L2 256KB OCM DRAM Controller MIO USB GigE GPIOUART SDIO SPI Peripherals ・ コンフィギュレーション中に FPGA や PS が誤動作しない ように Bridge をオフにしておく 必要がある
  • 13. 13 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Hardware (4) - Clock Controller PS (Processing System) FPGA Reset Controller Clock Controller PCAP AXI Bridge Cortex-A9 MPCore Cortex-A9 SCU NEON 512KB L2 256KB OCM DRAM Controller MIO USB GigE GPIOUART SDIO SPI Peripherals ・ デザイン毎に異なる周波数や 使うクロックが異なることがあり、 その場合はデザイン毎にクロッ クの設定を変更する必要があ る ・ FPGA を使わないときはクロック を止めておいたほうが省エネ上 良いことがある
  • 14. 14 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Software Stack FPGA Reset Controller Clock Controller PCAP AXI Bridge PS Low Level Driver Reset Controller Low Level Driver Clock Controller Low Level Driver FPGA Mngr Framework Low Level Driver Bridge Framework Device Driver Device Tree Overlay High Level Interface User Application H/W S/W High Level Interface High Level Interface High Level Interface High Level Interface Linux Kernel
  • 15. 15 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Software Stack FPGA Reset Controller Clock Controller PCAP AXI Bridge PS Low Level Driver Reset Controller Low Level Driver Clock Controller Low Level Driver FPGA Mngr Framework Low Level Driver Bridge Framework Device Driver Device Tree Overlay High Level Interface User Application H/W S/W High Level Interface High Level Interface High Level Interface High Level Interface Linux Kernel ・ Hige Level Interface ・ ユーザとの API ・ Framework ・ Device を統一的に扱う ためのフレームワーク ・ Low Level Driver ・ 実際に Hardware を制 御するドライバ
  • 16. 16 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Software Stack - Vender Kernel Xilinx FPGA Reset Controller Clock Controller PCAP AXI Bridge PS Low Level Driver Reset Controller Low Level Driver Clk Device Driver Device Tree Overlay User Application H/W S/W High Level Interface High Level Interface High Level Interface Linux Kernel xdevcfg ・ /dev/xdevcfg にビットストリームファイル を転送することで FPGA をコンフィギュレー ションする shell# dd if=bitstream_1.bit of=/dev/xdevcfg bs=1M ・ /dev/xdevcfg を読むことでリードバック shell# dd if=/dev/xdevcfg of=bitstream_2.bit bs=1M ・ Xilinx のビットストリーム対応 ・ コンフィギュレーション時に Bridge をオフ するのもこのドライバが行う
  • 17. 17 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Software Stack - Vender Kernel Altera FPGA Reset Controller Clock Controller FPGA Manager HPS-FPGA Bridge HPS Low Level Driver Reset Controller Low Level Driver Clk Device Driver Device Tree Overlay User Application H/W S/W High Level Interface HPS-FPGA Bridge Driver High Level Interface High Level Interface Linux Kernel /dev/fpga ・/dev/fpga にビットストリームフ ァイルを転送することで FPGA をコンフィギュレーションする ・ コンフィギュレーション前にはブリッヂドライバを使ってブリッジをオ フに、 コンフィギュレーション終了後はブリッジをオンにする shell# echo 0 > /sys/class/fpga-bridge/fpga2hps/enable shell# echo 0 > /sys/class/fpga-bridge/hps2fpga/enable shell# echo 0 > /sys/class/fpga-bridge/lwhps2fpga/enable shell# dd if=bitstream_1.rbf of=/dev/fpga0 bs=1M shell# echo 1 > /sys/class/fpga-bridge/fpga2hps/enable shell# echo 1 > /sys/class/fpga-bridge/hps2fpga/enable shell# echo 1 > /sys/class/fpga-bridge/lwhps2fpga/enable
  • 18. 18 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Software Stack - Mainline Kernel 4.4 FPGA Reset Controller Clock Controller PCAP AXI Bridge PS Low Level Driver Reset Controller Low Level Driver Clock Controller Low Level Driver FPGA Mngr Framework Device Driver Device Tree Overlay User Application H/W S/W High Level Interface Linux Kernel High Level Interface High Level Interface High Level Interface Bridge Driver ・ FPGA Manager Framework が導入 ・ Xilinx Zynq と Altera-SoC 用 の Low Level Driver も提供 ・ High Level Interface が未実装 ・ ユーザーからは FPGA のコンフィギュレー ション出来ない ・ Vender Kernel より退化 ・ 詳細は Qiita に書きました ・『 FPGA+SoC+Linux で FPGA Manager を試してみた』 https://qiita.com/ikwzm/items/9eb4d49545636162057
  • 19. 19 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Software Stack - Mainline Kernel 4.10 FPGA Reset Controller Clock Controller PCAP AXI Bridge PS Low Level Driver Reset Controller Low Level Driver Clock Controller FPGA Mngr Framework Device Driver Device Tree Overlay User Application H/W S/W High Level Interface Linux Kernel High Level Interface High Level Interface Low Level Driver FPGA Bridge Framework Low Level Driver FPGA Region ・ FPGA Region が導入 ・ FPGA Bridge Framework が導入 ・ Xilinx Zynq と Altera-SoC 用 の Low Level Driver も 提供 ・ 詳細は Qiita に書きました ・『 Linux Kernel 4.10 での FPGA のサポート事情』 https://qiita.com/ikwzm/items/2ff7d5429da8ace7c0bd
  • 20. 20 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Software Stack - Mainline Kernel 4.10 詳細はこれから説明します が その前に
  • 21. 21 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ How to Configuration FPGA from PS with Linux ・ FPGA Configuration Overview ・ Device Tree Overlay ・ FPGA Region ・ How to Control FPGA from PS with Linux ・ Cache Coherency ・ Memory Management Unit ・ UDMABUF ・ UIO and Interrupt without device driver
  • 22. 22 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree のど~でもいい話 (1) - 導入の経緯 ・ kernel 2.6.38 の時に、 Linus 氏が肥大する ARM コードに激怒し たのが発端らしい ・ 引用: LKML: Linus Torvalds: Re: [GIT PULL] omap changes for v2.6.39 merge window https://lkml.org/lkml/2011/3/30/379 ・ 参考: [Linux][kernel] Device Tree についてのまとめ @Qiita https://qiita.com/koara-local/items/ed99a7b96a0ca252fc4e
  • 23. 23 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree のど~でもいい話 (2) - 生まれ ・ 元々は Open Firmware の規格の一つ ・ Open Firmware(または OpenBoot)はハードウェアに依存しないファーム ウェア(オペレーティングシステムをロードするソフトウェア)であり、 サン・マイクロ システムズのミッチ・ブラッドリーによって開発され、 IEEE により標準化され、 サ ン・マイクロシステムズ、 アップル、 IBM などによって使われている。 https://ja.wikipedia.org/wiki/Open_Firmware https://en.wikipedia.org/wiki/Device_tree ・ Linux Kernel のソースコードに名残 ・ Device Tree 関連のソースコードは drivers/of/ にある ・ Device Tree 関連の API や構造体は of_ で始まる
  • 24. 24 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree の問題点と Overlay による解決 ・ Boot 時に構成が決まっていなければならない ・ 元々 Open Firmware という Boot Loader の規格 ・ 動的に構成が変わるのは想定外(Hot plug 未対応) ・ FPGA を動的に変更する用途には向かない ・ そこで Device Tree Overlay ・ Device Tree を後から自由に追加削除できる機能 ・ Linux Kernel 3.19 から導入
  • 25. 25 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Overlay Device Tree Source Format /dts-v1/; / { /* ignored properties by the overlay */ fragment@0 { /* first child node */ target=<phandle>; /* phandle target of the overlay */ or target-path="/path"; /* target path of the overlay */ __overlay__ { property-a; /* add property-a to the target */ node-a { /* add to an existing, or create a node-a */ ... }; }; } fragment@1 { /* second child node */ ... }; /* more fragments follow */ } ;
  • 26. 26 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree Overlay のサンプル /dts-v1/; / { fragment@0 { target-path = "/amba"; __overlay__ { #address-cells = <0x1>; #size-cells = <0x1>; uio0@43c10000 { compatible = "generic-uio"; reg = <0x43c10000 0x1000>; interrupts = <0x0 0x1d 0x4>; }; }; }; };
  • 27. 27 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree Overlay の課題 FPGA Reset Controller Clock Controller PCAP AXI Bridge PS Low Level Driver Reset Controller Low Level Driver Clock Controller Device Driver Device Tree Overlay User Application H/W S/W High Level Interface Linux Kernel High Level Interface High Level Interface Low Level Driver FPGA Mngr Framework Low Level Driver Bridge Framework FPGA Region ・ High Level Interface が未実装 ・ ユーザーから使える API が無い ・ drivers/of/overlay.c の API はすべてカーネル内関数
  • 28. 28 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) dtbocfg ・ dtbocfg を作りました ・ Device Tree Overlay Configuration File System ・ Device Tree Overlay をユーザーから使えるようにするデバイス ドライバ ・ configfs を通して Device Tree を追加/削除する ・ Mainline Kernel で正式サポートされるまでの中継ぎ ・ https://github.com/ikwzm/dtbocfg
  • 29. 29 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) dtbocfg の使い方(1) ・ ConfigFS にディレクトリを用意する ・ /config/device-tree/overlays の下に適当に名前を付けて ディレクトリを作ります shell# mkdir /config/device-tree/overlays/uio0 ・ /config/device-tree/overlays/uio0 の下に status と dtbo というファイルが自動的に出来ます。 shell# ls -la /config/device-tree/overlays/uio0/ 合計 0 drwxr-xr-x 2 root root 0 4 月 4 20:08 . drwxr-xr-x 3 root root 0 4 月 4 20:08 .. -rw-r--r-- 1 root root 4096 4 月 4 20:09 dtbo -rw-r--r-- 1 root root 4096 4 月 4 20:09 status
  • 30. 30 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) dtbocfg の使い方(2) ・ Device Tree Blob を書き込む ・ /config/device-tree/overlays/uio0/dtbo に書き込む shell# dtc -I dts -O dtb -o uio0.dtbo uio0.dts shell# cp uio0.dtbo /config/device-tree/overlays/uio0/dtbo ・ Device Tree に追加する ・ /config/device-tree/overlays/uio0/status に書き込む shell# echo 1 > /config/device-tree/overlays/uio0/status
  • 31. 31 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) dtbocfg の使い方(3) ・ Device Tree から削除(1) ・ /config/device-tree/overlays/uio0/status に書き込む shell# echo 0 > /config/device-tree/overlays/uio0/status ・ Device Tree から削除(2) ・ /config/device-tree/overlays/uio0 を削除 shell# rmdir /config/device-tree/overlays/uio0
  • 32. 32 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) dtbocfg.rb ・ dtbocfg を少し使いやすくするための Ruby スクリプト Usage: dtbocfg [command] [options] device_name command -i, --install Install (Create, Load, Start) -s, --start Append Device Tree Blob on ConfigFS to System -t, --stop Remove Device Tree Blob on ConfigFS from System -l, --load Load Device Tree Overlay File to ConfigFS -c, --create Create Device Tree Overlay Directory to ConfigFS -r, --remove Remove Device Tree Overlay Directory to ConfigFS options --dts FILE_NAME Device Tree Source File --dtb FILE_NAME Device Tree Blob File -v, --verbose -d, --debug
  • 33. 33 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ How to Configuration FPGA from PS with Linux ・ FPGA Configuration Overview ・ Device Tree Overlay ・ FPGA Region ・ How to Control FPGA from PS with Linux ・ Cache Coherency ・ Memory Management Unit ・ UDMABUF ・ UIO and Interrupt without device driver
  • 34. 34 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA Configuration Software Stack - Mainline Kernel 4.10 FPGA Reset Controller Clock Controller PCAP AXI Bridge PS Low Level Driver Reset Controller Low Level Driver Clock Controller FPGA Mngr Framework Device Driver Device Tree Overlay User Application H/W S/W High Level Interface Linux Kernel High Level Interface High Level Interface Low Level Driver FPGA Bridge Framework Low Level Driver FPGA Region ・ FPGA Region が導入 ・ FPGA Bridge Framework が導入 ・ Xilinx Zynq と Altera-SoC 用 の Low Level Driver も 提供 ・ 詳細は Qiita に書きました ・『 Linux Kernel 4.10 での FPGA のサポート事情』 https://qiita.com/ikwzm/items/2ff7d5429da8ace7c0bd
  • 35. 35 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) What Region ? PS (Processing System) FPGA Reset Controller PCAP AXI Bridge ・ Region - 領域 ・ Altera の Partial Reconfiguration 用語から (多分) ・ FPGA-Region は Altera 製 Reset Controller AXI-Bridge (decoupler) Reconfigurable Region Reconfigurable Region AXI-Bridge (decoupler) ・ Static Region ・ Rconfigurable Region
  • 36. 36 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Why Region ? PS (Processing System) FPGA Reset Controller PCAP AXI Bridge ・ Region は Bridge を介して 外部と接続 ・ FPGA 全部を一つの Region とみなすと、 Region が入れ 子になっていることに注目 ・ Full Configuration の場合 は FPGA という Region にプ ログラムをロード ・ Partial Reconfiguration の場合は、 Reconfigurable Region にプログラムをロード ・ プログラムをロードする対象を Region と見なしてデバイスド ライバをモデル化 Reset Controller AXI-Bridge (decoupler) Reconfigurable Region Reconfigurable Region AXI-Bridge (decoupler)
  • 37. 37 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree による FPGA Region の定義 /dts-v1/; / { amba { devcfg: devcfg@f8007000 {/* Zynq 用 FPGA Mngr の Low Driver */ compatible = "xlnx,zynq-devcfg-1.0"; reg = <0xf8007000 0x100>; interrupt-parent = <&intc>; interrupts = <0 8 4>; clocks = <&clkc 12>; clock-names = "ref_clk"; syscon = <&slcr>; }; fpga_region0: fpga-region0 { /* FPGA 全体の Region の定義 */ compatible = "fpga-region"; fpga-mgr = <&devcfg>;/* FPGA Mngr の Low Driver を指定 */ #address-cells = <1>; #size-cells = <1>; ranges; }; }; } ;
  • 38. 38 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree Overlay for FPGA Full configuration (1) ・ Device Tree のサンプルソース (sample.dts) /dts-v1/; /plugin/; / { fragment@1 { target-path = "/amba/fpga-region0"; /* Region のパスを指定 */ #address-cells = <1>; #size-cells = <1>; __overlay__ { #address-cells = <1>; #size-cells = <1>; firmware-name = "sample.bin"; /* ビットストリームファイル名 */ uio0@43c10000 { /* 追加するデバイスドライバ */ compatible = "generic-uio"; reg = <0x43c10000 0x1000>; interrupts = <0x0 0x1d 0x4>; }; }; }; };
  • 39. 39 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree Overlay for FPGA Full configuration (2) ・ ビットストリームファイルは /lib/firmware の下に置く ・ Xilinx の場合、 何故か Vivado が生成したビットストリームファ イルはそのままではロードできない。 ・ Zynq 用の FPGA Manager の Low level Interface であ る devcfg が、 Vivado のビットストリームファイルを扱えないの が原因 ・ fpga-bit-to-bin.py 等でフォーマット変換する必要があります ・ 詳細は『 Linux の FPGA Manager で Xilinx のビットストリー ムファイルを扱う方法』 @Qiita 参照 https://qiita.com/ikwzm/items/1bb63be0b86a1e0e56fa
  • 40. 40 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree Overlay for FPGA Full configuration (3) ・ Device Tree Overlay でツリーに追加する shell# dtbocfg.rb --install sample --dts sample.dts ・ ツリーに追加するだけで FPGA にビットストリームファイルがロード ・ コンフィギュレーション中は Bridge がオフになる ・ 使用するデバイスドライバも同時にツリーに追加できる ・ 使用するデバイスドライバは FPGA のコンフィギュレーション後に 有効になる
  • 41. 41 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree Overlay for FPGA Full configuration (4) ・ Device Tree Overlay でツリーから削除する shell# dtbocfg.rb --remove sample ・ 追加したデバイスドライバは無効になる ・ デバイスツリーから削除されても FPGA の回路は次にコンフィギュ レーションするまで動き続ける ・ FPGA の回路を止めるには別の手段が必要
  • 42. 42 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Mainline Kernel 4.10 の FPGA Configuration の懸念点 (1) ・ Device Tree ありき ・ ARM アーキテクチャでは一般的だが x86 では? ・ Device Tree Overlay のユーザー制御が未実装 ・ FPGA の動的変更には不可欠なのになぜ? ・ Clock の制御が未サポート ・ クロックの制御に関してノータッチ どうすんの? ・ そもそもカーネル内に実装する必要があるのか?
  • 43. 43 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Mainline Kernel 4.10 の FPGA Configuration の懸念点 (2) ・ Mainline Kernel 対 Vender Kernel ・ FPGA Region、 FPGA Manager Framework、 FPGA Bridge Framework は Altera 製 ・ Xilinx は FPGA Framework 対応の Low Level Driver を Mainline に提供 ・ Mainline Kernel に収束していくのか、 Mainline Kernel と Vender Kernel の 2 本立てでいくのか?
  • 44. 44 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Mainline Kernel の FPGA Configuration で言いたいこと ・ まだまだ発展途上 ・ Device Tree ありき ・ Device Tree Overlay のユーザー制御が未実装 ・ Clock の制御が未サポート ・ Vender Kernel との関係 ・ でも足りない部分を補えば便利 ・ Linux 動作中に FPGA やドライバを変更できる ・ FPGA のデザインごとに Linux を再構築しなくて済む ・ Vivado SDK とか JTAG ケーブル不要 (私はもう使っていない)
  • 45. 45 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) https://github.com/ikwzm/FPGA-SoC-Linux の紹介 FPGA Reset Controller Clock Controller PCAP AXI Bridge PS Low Level Driver Reset Controller Low Level Driver Clock Controller FPGA Mngr Framework Device Driver Device Tree Overlay User Application H/W S/W High Level Interface Linux Kernel Low Level Driver FPGA Region FPGA Bridge Framework Low Level Driver fclkcfg.ko dtbocfg.ko ・ FPGA Configuration を試してみるための一揃いを https://github.com/ikwzm/FPGA-SoC-Linux に公開 ・ Mainline Kernel 4.10 で足りない機能を追加 ・ Mainline Kernel 4.12.14 + Debian9 RootFS + U-Boot ・ dtbocfg ・ Device Tree Overlay の High Level Interface ・ https://github.com/ikwzm/dtbocfg ・ fclkcfg ・ Clock Controller の High Level Interface ・ https://github.com/ikwzm/fclkcfg
  • 46. 46 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) https://github.com/ikwzm/FPGA-SoC-Linux の紹介 ・ FPGA Configuration お試し用 ・ あくまでも Mainline が正式サポートするまでのつなぎ ・ Mainline Kernel 4.10 で足りない機能を追加 ・ Device Tree Overlay の High Level Interface ・ Clock Controller の High Level Interface ・ Mainline Kernel 4.12.14 + Debian9 RootFS + U-Boot ・ ZYBO/ZYBO-Z7/PYNQ-Z1/De0-Nano-SoC 対応 ・ 詳しくは『 FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(ブートイメージの提供)』 @Qiita 参照 https://qiita.com/ikwzm/items/7e90f0ca2165dbb9a577
  • 47. 47 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ How to Configuration FPGA from PS with Linux ・ FPGA Configuration Overview ・ Device Tree Overlay ・ FPGA Region ・ How to Control FPGA from PS with Linux ・ Cache Coherency ・ Memory Management Unit ・ UDMABUF ・ UIO and Interrupt without device driver
  • 48. 48 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ How to Configuration FPGA from PS with Linux ・ FPGA Configuration Overview ・ Device Tree Overlay ・ FPGA Region ・ How to Control FPGA from PS with Linux ・ Cache Coherency ・ Memory Management Unit ・ UDMABUF ・ UIO and Interrupt without device driver
  • 49. 49 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Cache Coherency トラブルの症状 ・ ケース1 CPU が書いたデータが FPGA から正しく読めない ・ ケース 2 FPGA が書いたデータが CPU から正しく読めない
  • 50. 50 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Cache Coherency でトラブルが発生するケース1 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 に Data=0xABED をライト
  • 51. 51 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Cache Coherency でトラブルが発生するケース1 CPU addr data CPU addr data Mem FPGA 0x0080 0xABED 0x0080 0xDEAD この時まだ Mem にはライトされてない 2. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 1. CPU が Addr=0x0080 に Data=0xABED をライト
  • 52. 52 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Cache Coherency でトラブルが発生するケース1 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 に Data=0xABED をライト 4. 未だ Mem の Addr=0x0080 には Data=0xABED は書き込まれて いないので、 FPGA は Data=0xDEAD を読んでしまう 0x0080 0xABED 0x0080 0xDEAD 3. FPGA が Addr=0x0080 をリード 2. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ
  • 53. 53 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Cache Coherency でトラブルが発生するケース 2 CPU addr data CPU addr data Mem FPGA 0x0080 0xABED 0x0080 0xABED 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 2. Cache に無いので Mem にリード 1. CPU が Addr=0x0080 をリード
  • 54. 54 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Cache Coherency でトラブルが発生するケース 2 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 をリード 0x0080 0xABED 0x0080 0xDEAD 4. FPGA が Addr=0x0080 に Data=0xDEAD をライト 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 2. Cache に無いので Mem にリード
  • 55. 55 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Cache Coherency でトラブルが発生するケース 2 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 をリード 4. FPGA が Addr=0x0080 に Data=0xDEAD をライト Data Cache に Addr=0x0080 のデ ータ(0xABED)が残っているので、 CPU は data=0xABED と誤った値を リード(Mem にはリードしない) 0x0080 0xABED 0x0080 0xDEAD 2. Cache に無いので Mem にリード 5. CPU が Addr=0x0080 をリード 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ
  • 56. 56 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Cache Coherency トラブルの解決方法 ・ キャッシュを使わない ・ ソフトウェアによる解決方法 ソフトウェアで Cache Flush/Invalidiate する ・ ハードウェアによる解決方法 Cache Coherency に対応した Cache と Interconnect
  • 57. 57 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ソフトウェアで Cache を制御してトラブル回避 ケース1 CPU addr data CPU addr data Mem FPGA 0x0080 0xDEAD 1. CPU が Addr=0x0080 に Data=0xABED をライト
  • 58. 58 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ソフトウェアで Cache を制御してトラブル回避 ケース1 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 に Data=0xABED をライト 2. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 0x0080 0xABED 0x0080 0xDEAD
  • 59. 59 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ソフトウェアで Cache を制御してトラブル回避 ケース1 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 に Data=0xABED をライト 2. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 0x0080 0xABED 0x0080 0xABED 3. Data Cache の Addr=0x0080 を強制的に Flush
  • 60. 60 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ソフトウェアで Cache を制御してトラブル回避 ケース1 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 に Data=0xABED をライト 2. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 4. FPGA が Addr=0x0080 をリード 0x0080 0xDEAD 3. Data Cache の Addr=0x0080 を強制的に Flush FPGA は正しい値 (0xABED)が読める
  • 61. 61 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ソフトウェアで Cache を制御してトラブル回避 ケース2 CPU addr data CPU addr data Mem FPGA 0x0080 0xABED 0x0080 0xABED 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 2. Cache に無いので Mem にリード 1. CPU が Addr=0x0080 をリード
  • 62. 62 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ソフトウェアで Cache を制御してトラブル回避 ケース2 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 をリード 0x0080 0xABED 0x0080 0xDEAD 2. Cache に無いので Mem にリード 4. FPGA が Addr=0x0080 に Data=0xDEAD をライト 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ
  • 63. 63 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ソフトウェアで Cache を制御してトラブル回避 ケース2 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 をリード 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 4. FPGA が Addr=0x0080 に Data=0xDEAD をライト 0x0080 0xABED 0x0080 0xDEAD 2. Cache に無いので Mem にリード 5. Data Cache の Addr=0x0080 を Invalidiate(無効化)
  • 64. 64 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ソフトウェアで Cache を制御してトラブル回避 ケース2 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 をリード 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 4. FPGA が Addr=0x0080 に Data=0xDEAD をライト 0x0080 0xDEAD 0x0080 0xDEAD 2. Cache に無いので Mem にリード 5. Data Cache の Addr=0x0080 を Invalidiate(無効化) 7. Cache に無いので Mem にリード 6. CPU が Addr=0x0080 をリード
  • 65. 65 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ソフトウェアで Cache を制御する方法の問題点 ・ 面倒くせ~よ ・ 相手がリード/ライトするタイミングが判ってないと無理 ・ CPU が DMA や FPGA を制御する場合は可能だけど、 マルチプロセッサ間では難しい ・ 時間がかかる ・ キャッシュの操作は意外と時間がかかる ・ しかもクリティカルセクション(他の処理ができない)
  • 66. 66 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency - 用意するもの CPU addr data CPU addr data Mem FPGA Cache Coherency に対応した Interface Protocol Cache Coherency に対応した InterConnect Cache Coherency に対応した Cache
  • 67. 67 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency ケース1 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 に Data=0xABED をライト 0x0080 0xABED 0x0080 0xDEAD 2. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ
  • 68. 68 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency ケース1 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 に Data=0xABED をライト 2. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 3. FPGA が Addr=0x0080 をリード 0x0080 0xABED 0x0080 0xDEAD
  • 69. 69 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency ケース1 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 に Data=0xABED をライト 2. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 3. FPGA が Addr=0x0080 をリード 0x0080 0xABED 0x0080 0xDEAD 4.InterConnect 内でキャッシュを持つ マスターに Addr を通知(snoop)
  • 70. 70 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency ケース1 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 に Data=0xABED をライト 2. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 3. FPGA が Addr=0x0080 をリード 0x0080 0xABED 0x0080 0xDEAD 4.InterConnect 内でキャッシュを持つ マスターに Addr を通知(snoop) 5.該当する Addr(0x0080)のデータを キャッシュしているマスターがいる場合は マスターがデータを出力
  • 71. 71 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency ケース1 CPU addr data CPU addr data Mem FPGA 1. CPU が Addr=0x0080 に Data=0xABED をライト 2. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 3. FPGA が Addr=0x00C0 をリード 0x0080 0xABED 0x00C0 0xDEAD 4.InterConnect 内でキャッシュを持つ マスターに Addr を通知(snoop) 5.該当する Addr(0x00C0)のデータを キャッシュしているマスターがいない場合 は Mem から読む
  • 72. 72 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency ケース 2 CPU addr data CPU addr data Mem FPGA 0x0080 0xABED 0x0080 0xABED 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 2. Cache に無いので Mem にリード 1. CPU が Addr=0x0080 をリード
  • 73. 73 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency ケース 2 CPU addr data CPU addr data Mem FPGA 0x0080 0xABED 0x0080 0xABED 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 1. CPU が Addr=0x0080 をリード 2. Cache に無いので Mem にリード 4. FPGA が Addr=0x0080 に Data=0xDEAD をライト
  • 74. 74 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency ケース 2 CPU addr data CPU addr data Mem FPGA 0x0080 0xABED 0x0080 0xABED 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 1. CPU が Addr=0x0080 をリード 2. Cache に無いので Mem にリード 4. FPGA が Addr=0x0080 に Data=0xDEAD をライト 5.InterConnect 内でキャッシュを持つ マスターに Addr を通知(snoop)
  • 75. 75 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency ケース 2 (キャッシュラインサイズの書き込みの場合) CPU addr data CPU addr data Mem FPGA 0x0080 0xABED 0x0080 0xDEAD 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 1. CPU が Addr=0x0080 をリード 2. Cache に無いので Mem にリード 4. FPGA が Addr=0x0080 に Data=0xDEAD をライト 5.InterConnect 内でキャッシュを持つ マスターに Addr を通知(snoop) 6.該当する Addr(0x0080)のデータを キャッシュしているマスターはキャッシュを 無効化(Invalidiate) 7. Mem の Addr=0x0080 に Data=0xDEAD をライト
  • 76. 76 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency ケース 2 (キャッシュラインサイズの書き込みの場合) CPU addr data CPU addr data Mem FPGA 0x0080 0xDEAD 0x0080 0xDEAD 3. Data Cache に Addr=0x0080 Data=0xABED をキャッシュ 1. CPU が Addr=0x0080 をリード 2. Cache に無いので Mem にリード 4. FPGA が Addr=0x0080 に Data=0xDEAD をライト 5.InterConnect 内でキャッシュを持つ マスターに Addr を通知(snoop) 6.該当する Addr(0x0080)のデータを キャッシュしているマスターはキャッシュを 無効化(Invalidiate) 7. Mem の Addr=0x0080 に Data=0xDEAD をライト 8. CPU が Addr=0x0080 をリード9. Cache に無いので Mem にリード
  • 77. 77 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Cache Coherency トラブル ・ 症状 ・ CPU が書いたデータが FPGA から正しく読めない ・ FPGA が書いたデータが CPU から正しく読めない ・ 対策 ・ キャッシュを使わない ・ ソフトウェアによる解決方法 ・ ソフトウェアで Cache Flush/Invalidiate する ・ ハードウェアによる解決方法 ・ Cache Coherency に対応した Cache と Interconnect
  • 78. 78 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ハードウェアで Cache Coherency - Zynq の場合 ・ ACP(Accelarator Coherency Port)を使う ・ Zynq にはハードウェアで Cache Coherency を制御できる 専用のアクセスポートがあります ・ HP(High Performance Port - Cache Coherency を制 御しないポート) に比べて 30%~70%の帯域しかでません ・ 参照: FPGA の部屋 『 Zynq の AXI_ACP ポートと AXI_HP ポートの性能の違い1(AXI_ACP ポート)』 (http://marsee101.blog19.fc2.com/blog-entry-2773.html) ・ しかしソフトウェアで Cache を操作する苦労をしなくて済みます ・ とりあえず動くことを確認したい時には便利です
  • 79. 79 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ How to Configuration FPGA from PS with Linux ・ FPGA Configuration Overview ・ Device Tree Overlay ・ FPGA Region ・ How to Control FPGA from PS with Linux ・ Cache Coherency ・ Memory Management Unit ・ UDMABUF ・ UIO and Interrupt without device driver
  • 80. 80 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Memory Management Unit の働き ・ 仮想アドレスから物理アドレスへの変換 ・ 仮想記憶 - 個々のプロセスからは単一のメモリマップ ・ 物理メモリの有効利用 ・ 物理アドレス空間と仮想アドレス空間の分離 ・ メモリ保護 ・ キャッシュ制御
  • 81. 81 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) 仮想アドレスから物理アドレスへの変換(Aarch32-LPAE の例) Main Memory (物理アドレス)12 11 02021293031 PTE Table Phys Addr Phys Addr PMD Table Table Ptr Table Ptr PGD Table Table Ptr Table Ptr TTBRx プロセス(仮想アドレス) 64 bit/entry64 bit/entry 64 bit/entry 512 entry 512 entry 4Kbyte/page LPAE : Large Physical Address Extension PTE : Page Table Entry PMD : Page Middle Directory PGD : Page Global Directory
  • 82. 82 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) 仮想記憶 - 個々のプロセスからは単一のメモリマップ プロセス 1 (仮想アドレス) Main Memory (物理アドレス)MMU 0x0000_0000 0x08_0000_0000 0x0000_0000 0x0000_1000 0x0000_2000 0x0000_3000 0x0000_2000 0x0000_3000 0x0000_4000 0x0000_1000 0x08_0000_1000 0x08_0000_2000 0x08_0000_3000 0x08_0000_4000 0x08_0000_5000 0x08_0000_6000 0x08_0000_7000 0x08_0000_8000 プロセス 2 (仮想アドレス)
  • 83. 83 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA から見た場合の問題 プロセス 1 (仮想アドレス) Main Memory (物理アドレス)MMU 0x0000_0000 0x0000_1000 0x0000_2000 0x0000_3000 0x0000_4000 buf[0x0000] buf[0x1000] buf[0x2000] buf[0x3000] buf[0x0000] buf[0x1000] buf[0x2000] buf[0x3000] 仮想アドレス上は 連続でも物理アド レス上はバラバラに 配置されている
  • 84. 84 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) FPGA からバラバラに配置されたバッファへのアクセス方法 ・ ハードウェアのアシスト有り (今回は説明対象外) ・ Scatter-Gather DMA ・ IOMMU ・ ハードウェアのアシスト無し - 物理メモリ上に連続領域(DMA バッファ)を確保 ・ バッファから/へ DMA バッファへ/からデータをコピー ・ DMA バッファをユーザープロセスからアクセス
  • 85. 85 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) バッファから/へ DMA バッファへ/からデータをコピー プロセス 1 (仮想アドレス) Main Memory (物理アドレス)MMU 0x0000_0000 0x0000_1000 0x0000_2000 0x0000_3000 0x0000_4000 buf[0x0000] buf[0x1000] buf[0x2000] buf[0x3000] buf[0x0000] buf[0x1000] buf[0x2000] buf[0x3000] メモリ上に連続領 域(DMA バッファ) を確保 バッファから/へ DMA バッファに/か らデータをコピー
  • 86. 86 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) バッファから/へ DMA バッファへ/からデータをコピー ・ 良い点 ・ 特殊なハードウェアを必要としない ・ 悪い点 ・ データのコピーによる性能劣化 ・ 課題 ・ 連続領域(DMA バッファ)の確保方法(後述) ・ 例 ・ レガシーなデバイス(一昔前はわりとメジャーな方法) ・ 今でも低速なデバイス(UART など)ではよく使われる
  • 87. 87 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) DMA バッファをユーザープロセスからアクセス プロセス 1 (仮想アドレス) Main Memory (物理アドレス)MMU 0x0000_0000 0x0000_1000 0x0000_2000 0x0000_3000 0x0000_4000 buf[0x0000] buf[0x1000] buf[0x2000] buf[0x3000] メモリ上に連続領 域(DMA バッファ) を確保 DMA バッファをユ ーザープロセスの仮 想空間にマッピング
  • 88. 88 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) DMA バッファをユーザープロセスからアクセス ・ 良い点 ・ 特殊なハードウェアを必要としない ・ 悪い点 ・ ユーザープログラム側に(mmap()を使う等)対処が必要 ・ 課題 ・ 連続領域(DMA バッファ)の確保方法(後述) ・ 例 ・ UIO(User space I/O) ・ /dev/mem ・ udmabuf
  • 89. 89 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) 連続領域(DMA バッファ)の確保方法 - Linux の場合 ・ Linux の管理外領域に連続領域を確保 ・ メモリ管理をユーザープログラムが行う必要がある ・ 領域は Linux 起動時に確保 ・ /dev/mem や uio の mmap を使う場合はキャッシュ対象外 ・ CMA(Contiguous Memory Allocator)を使う ・ メモリ管理は Linux のカーネルが行う ・ CMA 領域の最大値は Linux 起動時に指定 ・ "ある程度"動的にバッファを確保できる(フラグメンテーション問題) ・ キャッシュの対象
  • 90. 90 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ How to Configuration FPGA from PS with Linux ・ FPGA Configuration Overview ・ Device Tree Overlay ・ FPGA Region ・ How to Control FPGA from PS with Linux ・ Cache Coherency ・ Memory Management Unit ・ UDMABUF ・ UIO and Interrupt without device driver
  • 91. 91 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) udmabuf の紹介 ・ CMA の問題 ・ ユーザー空間からは使えない(カーネル専用) ・ CMA を使うにはカーネルドライバを作る必要がある ・ udmabuf を作りました ・ User mappable space DMA Buffer ・ CMA 領域に DMA バッファとして連続領域を確保 ・ 確保した DMA バッファをユーザー空間にマッピングするための デバイスドライバ ・ https://github.com/ikwzm/udmabuf
  • 92. 92 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) udmabuf のアーキテクチャ User space Kernel space Hardware /dev/uio /dev/udmabuf open() mmap() open() mmap() CMA dma_alloc_coherent() access Accelarator Control Status Registers DMA or Master User space driver access
  • 93. 93 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) udmabuf デバイスドライバのロード/アンロード (FPGA-SoC-Linux) ・ systemd による udmabuf.ko の制御 ・ FPGA-SoC-Linux には udmabuf のデバイスドライバがイン ストールされています ・ systemctl コマンドでロード/アンロードできます shell$ sudo systemctl status udmabuf.service ● udmabuf.service - User space mappable DMA Buffer Service. Loaded: loaded (/etc/systemd/system/udmabuf.service; enabled; vendor preset: Active: active (exited) since Fri 2017-11-03 17:38:47 JST; 8min ago Process: 2514 ExecStart=/sbin/modprobe udmabuf (code=exited, status=0/SUCCESS) Main PID: 2514 (code=exited, status=0/SUCCESS) CGroup: /system.slice/udmabuf.service Nov 03 17:38:47 debian-fpga systemd[1]: Starting User space mappable DMA Buffer Service.... Nov 03 17:38:47 debian-fpga systemd[1]: Started User space mappable DMA Buffer Service....
  • 94. 94 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) デバイスの追加 - DMA バッファの確保 (1) ・ Device Tree Overlay のサンプルソース /dts-v1/; /plugin/; / { fragment@1 { target-path = "/amba"; #address-cells = <1>; #size-cells = <1>; __overlay__ { #address-cells = <1>; #size-cells = <1>; udmabuf0@0x00 { /* 追加するデバイスツリーノード */ compatible = "ikwzm,udmabuf-0.10.a"; device-name = "udmabuf0"; /* デバイス名 */ size = <0x00100000>; /* バッファサイズ*/ }; }; }; };
  • 95. 95 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) デバイスの追加 - DMA バッファの確保 (2) ・ Device Tree Overlay でツリーに追加する shell# dtbocfg.rb --install udmabuf0 --dts udmabuf0.dts udmabuf udmabuf0: driver installed udmabuf udmabuf0: major number = 248 udmabuf udmabuf0: minor number = 0 udmabuf udmabuf0: phys address = 0x1e900000 udmabuf udmabuf0: buffer size = 1048576 shell# ls -la /dev/udmabuf0 crw------- 1 root root 248, 0 Dec 1 09:34 /dev/udmabuf0 ・ Device Tree に追加することで初めてバッファが確保される ・ Device Tree に追加することで初めてデバイスドライバ(この例 では/dev/udmabuf0)が作成される
  • 96. 96 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) DMA バッファをユーザー空間へマッピング (1) C 言語 ・ udmabuf デバイスを mmap() でマッピング if ((fd = open("/dev/udmabuf0", O_RDWR)) != -1) { buf = mmap(NULL, buf_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); /* Do some read/write access to buf */ close(fd); } ・ open() 時のオプションに O_SYNC を付けるとキャッシュオフ ・ open() 時のオプションに O_SYNC を付けないとキャッシュオン
  • 97. 97 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ udmabuf デバイスを np.memmap() でマッピング import numpy as np class Udmabuf: """A simple udmabuf class""" def __init__(self, name): self.name = name self.device_name = '/dev/%s' % self.name self.class_path = '/sys/class/udmabuf/%s' % self.name for line in open(self.class_path + '/size'): self.buf_size = int(line) break for line in open(self.class_path + '/phys_addr'): self.phys_addr = int(line, 16) break def memmap(self, dtype, shape): self.item_size = np.dtype(dtype).itemsize self.array = np.memmap(self.device_name, dtype=dtype, mode='r+', shape=shape) return self.array DMA バッファをユーザー空間へマッピング (2) Python+NumPy
  • 98. 98 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) DMA バッファをユーザー空間へマッピング (3) Python+NumPy ・ 確保した DMA バッファを np.array として使う if __name__ == '__main__': udmabuf = Udmabuf('udmabuf0') test_dtype = np.uint8 test_size = int(udmabuf.buf_size/(np.dtype(test_dtype).itemsize)) comparison = np.random.randint(0,255,(test_size)) ubuf_array = udmabuf.memmap(dtype=test_dtype, shape=(test_size)) ubuf_array[:] = comparison if np.array_equal(ubuf_array, comparison): print ("ubuf_array == comparison : OK") else: print ("ubuf_array != comparison : NG")
  • 99. 99 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) DMA バッファのサイズを得る (1) C 言語 ・ /sys/class/udmabuf/<device-name>/size を読む unsigned char attr[1024]; unsigned long buf_size; if ((fd = open("/sys/class/udmabuf/udmabuf0/size", O_RDONLY)) != -1) { read(fd, attr, 1024); sscanf(attr, "%d", &buf_size); close(fd); }
  • 100. 100 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ /sys/class/udmabuf/<device-name>/size を読む import numpy as np class Udmabuf: """A simple udmabuf class""" def __init__(self, name): self.name = name self.device_name = '/dev/%s' % self.name self.class_path = '/sys/class/udmabuf/%s' % self.name for line in open(self.class_path + '/size'): self.buf_size = int(line) break for line in open(self.class_path + '/phys_addr'): self.phys_addr = int(line, 16) break def memmap(self, dtype, shape): self.item_size = np.dtype(dtype).itemsize self.array = np.memmap(self.device_name, dtype=dtype, mode='r+', shape=shape) return self.array DMA バッファのサイズを得る (2) Python
  • 101. 101 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) DMA バッファの物理アドレスを得る (1) C 言語 ・ /sys/class/udmabuf/<device-name>/phys_addr を読む unsigned char attr[1024]; unsigned long phys_addr; if ((fd = open("/sys/class/udmabuf/udmabuf0/phys_addr", O_RDONLY)) != -1) { read(fd, attr, 1024); sscanf(attr, "%x", &phys_addr); close(fd); }
  • 102. 102 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ /sys/class/udmabuf/<device-name>/phys_addr を読む import numpy as np class Udmabuf: """A simple udmabuf class""" def __init__(self, name): self.name = name self.device_name = '/dev/%s' % self.name self.class_path = '/sys/class/udmabuf/%s' % self.name for line in open(self.class_path + '/size'): self.buf_size = int(line) break for line in open(self.class_path + '/phys_addr'): self.phys_addr = int(line, 16) break def memmap(self, dtype, shape): self.item_size = np.dtype(dtype).itemsize self.array = np.memmap(self.device_name, dtype=dtype, mode='r+', shape=shape) return self.array DMA バッファの物理アドレスを得る (2) Python
  • 103. 103 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) udmabuf の記事 @Qiita  ・ 『 Linux でユーザー空間で動作するプログラムとハードウェアがメモリ を共有するためのデバイスドライバ』 https://qiita.com/ikwzm/items/cc1bb33ff43a491440ea ・ 『 Linux でユーザー空間で動作するプログラムとハードウェアがメモリ を共有するためのデバイスドライバ(Device Tree Overlay 対応)』 https://qiita.com/ikwzm/items/db904df23748e4b957b5 ・ 『 Linux でユーザー空間で動作するプログラムとハードウェアがメモリ を共有するためのデバイスドライバ(NumPy 対応)』 https://qiita.com/ikwzm/items/e615ce90ca0c403b3794
  • 104. 104 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ How to Configuration FPGA from PS with Linux ・ FPGA Configuration Overview ・ Device Tree Overlay ・ FPGA Region ・ How to Control FPGA from PS with Linux ・ Cache Coherency ・ Memory Management Unit ・ UDMABUF ・ UIO and Interrupt without device driver
  • 105. 105 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree による UIO デバイスの追加 (1) ・ Device Tree Overlay のサンプルソース /dts-v1/; /plugin/; / { fragment@1 { target-path = "/amba"; #address-cells = <1>; #size-cells = <1>; __overlay__ { #address-cells = <1>; #size-cells = <1>; uio0@43c10000 { compatible = "generic-uio"; reg = <0x43c10000 0x1000>; interrupts = <0x0 0x1d 0x4>; }; }; }; };
  • 106. 106 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree による UIO デバイスの追加 (2) ・ compatible プロパティで uio のデバイスドライバ名を指定 ・ reg プロパティで レジスタのアドレスと範囲を指定 ・ 1番目のパラメータが CPU レジスタからみたアドレス ・ 2番目のパラメータでレジスタ領域の大きさ ・ interrupt プロパティで割り込み番号を指定 ・ 1番目のパラメータは GIC 内部の割り込みの種類 0=共有ペリフェラル割り込み(SPI) ・ 2番目のパラメータは割り込み番号 IRQ_F2P[0]は SPI の 61 番に接続されている Device Tree では 61 から 32 を引いた値を指定する ・ 3番目のパラメータはトリガータイプ 1=エッジトリガー / 4=レベルトリガー
  • 107. 107 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) Device Tree による UIO デバイスの追加 (3) ・ Device Tree Overlay でツリーに追加する shell# dtbocfg.rb --install uio0 --dts uio0.dts shell# ls -la /dev/uio0 crw------- 1 root root 248, 0 Dec 1 09:34 /dev/uio0 ・ Device Tree に追加することで初めてデバイスドライバ(この例 では/dev/uio0)が作成される
  • 108. 108 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) レジスタ空間をユーザー空間へマッピング (1) C 言語 ・ uio デバイスを mmap() でマッピング int uio_fd; void* regs; if ((uio_fd = open("/dev/uio0", O_RDWR | O_SYNC)) == -1) { printf("Can not open /dev/uio0n"); exit(1); } regs = mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, uio_fd, 0); if (regs == NULL) { printf("Can not mmap /dev/uio0n"); exit(1); }
  • 109. 109 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ uio デバイスを mmap.mmap() でマッピング import numpy as np import mmap class Uio: """A simple uio class""" def __init__(self, name, length=0x1000): self.name = name self.device_name = '/dev/%s' % self.name self.length = length self.device_file = os.open(self.device_name, os.O_RDWR | os.O_SYNC) self.mem = mmap.mmap(self.device_file, self.length, mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE, offset=0) self.word_array = np.frombuffer(self.mem, np.uint32, self.length>>2, 0) def read_word(self, offset): return int(self.word_array[offset>>2]) def write_word(self, offset, data): self.word_array[offset>>2] = np.uint32(data) レジスタ空間をユーザー空間へマッピング (2) Python+NumPy
  • 110. 110 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) 割り込みの許可 or 禁止の設定 (1) C 言語 ・ uio デバイスに write() で 1 or 0 を書く ・ uio では割り込みの許可 or 禁止の設定は デバイスファイル (/dev/uio0)に write することで設定 ・ 書き込むデータは 32bit の integer ・ 1 を write することで割り込みを許可 ・ 0 を write することで割り込みを禁止 int uio_irq_on(int uio_fd) { unsigned int irq_on = 1; write(uio_fd, &irq_on, sizeof(irq_on)); } int uio_irq_off(int uio_fd) { unsigned int irq_on = 0; write(uio_fd, &irq_on, sizeof(irq_on)); }
  • 111. 111 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ uio デバイスに os.write() で 1 or 0 を書く import numpy as np import mmap class Uio: """A simple uio class""" def __init__(self, name, length=0x1000): self.name = name self.device_name = '/dev/%s' % self.name self.length = length self.device_file = os.open(self.device_name, os.O_RDWR | os.O_SYNC) self.mem = mmap.mmap(self.device_file, self.length, mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE, offset=0) self.word_array = np.frombuffer(self.mem, np.uint32, self.length>>2, 0) def irq_on(self): os.write(self.device_file, b'x01x00x00x00') def irq_off(sef): os.write(self.device_file, b'x00x00x00x00') 割り込みの許可 or 禁止の設定 (2) Python
  • 112. 112 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) 割り込み待ち (1) C 言語 ・ uio デバイスを read() で読む ・ uio では read() を使って、 割り込みが発生するまで読み出し プロセスをブロック ・ 読み出すデータの型は 32bit の integer int uio_wait_irq(int uio_fd) { unsigned int count = 0; return read(uio_fd, &count, sizeof(count)); }
  • 113. 113 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) ・ uio デバイスを os.read() で読む import numpy as np import mmap class Uio: """A simple uio class""" def __init__(self, name, length=0x1000): self.name = name self.device_name = '/dev/%s' % self.name self.length = length self.device_file = os.open(self.device_name, os.O_RDWR | os.O_SYNC) self.mem = mmap.mmap(self.device_file, self.length, mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE, offset=0) self.word_array = np.frombuffer(self.mem, np.uint32, self.length>>2, 0) def wait_irq(self): os.read(self.device_file, 4) 割り込み待ち (2) Python
  • 114. 114 @ikwzmFPGA+SoC+Linux 実践勉強会(2017/12/2) uio の記事 ・ https://github.com/ikwzm/ZYBO_UIO_IRQ_SAMPLE ・ 『 UIO(User space IO)の割り込みの使い方の例』 @Qiita https://qiita.com/ikwzm/items/b22592c31cdbb9ab6cf7 ・『 Python と Numpy で UIO を制御』 @Qiita https://qiita.com/ikwzm/items/d7559858d099c86c350c