インテル® Agilex™ FPGA ベースの SmartNIC  N6000-PLを使ってみた

<!--
************************************************************
　インテル® Agilex™ FPGA ベースの SmartNIC N6000-PLを使ってみた
************************************************************
-->

インテル® Agilex™ FPGA ベースの SmartNIC N6000-PLを使ってみた
===============================================================

# はじめに

（株）スターラップ・テクノロジーです。  
 インテル Agilex FPGAベースのSmartNIC プラットフォーム（N6011）による長瀬産業のFPGA向けの高速・低レイテンシサーチエンジンIP（Axonerve）の動作検証を実施しました。  
 不可解な現象が残ったままですがOS選定からIOFSインストールまでのトラブル対処も踏まえた環境構築フローをここに紹介します。

# 目次
* [使用環境](#使用環境)
* [環境構築](#環境構築)
* [ノウハウ事例集](#ノウハウ事例集)
* [あとがき](#あとがき)

# 使用環境
| FPGAボード|intel FPGA SmartNIC プラットフォーム（N6011）|
|:---|:---:|
| CPU　　　　|Intel Core i7-12700k|
|メモリ容量 |128GB|
| OS　　　　  |Cent OS Stream 8|
| Quartus　| Quartus Pro 21.3.0 SP0.14 |

 
# 環境構築　　

ここではスタートアップガイドに準じて、OSならびにKernelの選定からIOFSインストールによる環境構築までの実施手順、そしてトラブル内容および処置を記載します。  

## （１） BIOS設定変更
IOFS-DFL（N6011用ドライバ）をインストールできない問題対策として次の項目を変更します。  

| 項目               | 設定 |
|:-----------------:|:----:|
| Secure boot        | 無効 |
| SR-IOV Support　    | 有効 |
| Native　PCIE Enable | 無効 |


## （２） OSならびにKernelの選定とインストール  

|        OS         |  kernel   |
| :-----------------------------------: | :------: |
| Cent OS Stream 8           | kernel-rt-4.18.0-**348**.1.rt7.70.el8.x86_64  |  
## （３） IOFS インストール （スタートアップガイドに準じる）
（3-1）シェルスクリプトを用いてIOFSをインストール

```Linux:実施例
$ sudo ./fpga-ofs-2022-04-21.sh
```

```linux:実施ログ
$Verifying archive integrity... 100% SHA256 checksums are OK. All good. 
Uncompressing FPGA OFS Driver and Application Package 100%
Failed to installed epel repository, which is needed to build kernel modules
```
:::note warn
epel repositoryが未設定のため<font color="Red">**Failエラー発生**</font>
:::

（3-2）epelをインストール　（epel repositoryの設定）

```linux:実施例
＄sudo yum install epel-release
```

```linux:実施ログ（一部）
Package filename：epel-release-8-11.el8.noarch.rpm
```


（3-3）シェルスクリプトを用いてIOFSを再インストール


```linux:実施例
$ sudo ./fpga-ofs-2022-04-21.sh
```

```linux:実施ログ
Building module:
Cleaning build area...
make -j20 KERNELRELEASE=4.18.0-365.el8.x86_64 KERNELDIR=/lib/modules/4.18.0-365.el8.x86_ 64/build...(bad exit status: 2)
Error! Bad return status for module build on kernel: 4.18.0-365.el8.x86_64 (x86_64)
Consult /var/lib/dkms/linux-dfl-backport/0^20220421gsil1.8.r6.g010f7374-1/build/make.log for more information.
modprobe: WARNING: Module dfl_pci not found in directory /lib/modules/4.18.0-365.el8.x86_64
警告: %post(linux-dfl-backport-0^20220421gsil1.8.r6.g010f7374-1.noarch) 
スクリプトの実行に失敗しました。
終了ステータス 1
Error in POSTIN scriptlet in rpm package linux-dfl-backport
```
  
:::note warn
<font color="Blue">make -j20 KERNELRELEASE=4.18.0-<font color="Red">**365**</font>.el8.x86_64 KERNELDIR= ........</font>

　・処理中に**Kernel版数が [365]** となりエラーが発生し、DFLとOPAEがインストールできない。 
　・Kernel版数がなぜ変わったのか？パソコン環境あるいはシェルスクリプト起因かは不明。
:::

（3-4）**強制Reboot**によるKernelデフォルト版数を [365]から元の[348] へ切り替え

（3-5）IOFS-DFLのみ個別インストール

```linux:実施例
$ sudo yum install 'linux-dfl-backport-0^20220421gsil1.8.r6.g010f7374-1.noarch.rpm'
```

```linux:実施ログ
Building module:
Cleaning build area...
make -j20 KERNELRELEASE=4.18.0-348.el8.x86_64 KERNELDIR=/lib/modules/4.18.0-348.el8.x86_64/build... 
Signing module /var/lib/dkms/linux-dfl-backport/0^ 20220421gsil1.8.r6.g010f7374-1/build/regmap-mmio.ko Signing module /var/lib/dkms/linux-dfl-backport/0^ 20220421gsil1.8.r6.g010f7374-1/build/regmap-spi-avmm.ko 
　＜＜以下省略＞＞
```

`IOFS-DFLのインストールが正常終了`

（3-6）IOFS-OPAEのみ個別インストール

```linux:実施例
$ sudo ./fpga-ofs-2022-04-21.sh -- --opae-only
```
`IOFS-OPAEのインストールが正常終了`

## （4） 環境チェック 

（4-1）opaeコマンドによるドライバの組込み状態
```linux:実行コマンドとログ
$ opae.io ls
[0000:03:00.0] (0x8086, 0xbcce) Intel N6000 ADP (Driver: dfl-pci)
[0000:03:00.1] (0x8086, 0xbcce) Intel N6000 ADP (Driver: dfl-pci)
[0000:03:00.4] (0x8086, 0xbcce) Intel N6000 ADP (Driver: dfl-pci)
[0000:03:00.2] (0x8086, 0xbcce) Intel N6000 ADP (Driver: dfl-pci)
```

`Kernelへのドライバが正常に組み込まれている`

（4-2）fpgainfoコマンドによるPCIe経由でのN6011のソフトウエア情報

```linux:実行コマンドとログ
$ fpgainfo fme
Intel Acceleration Development Platform
Board Management Controller NIOS FW version: 3.2.0 
Board Management Controller Build version: 3.2.0 
//****** FME ******//
Object Id               : 0xF000000
PCIe s:b:d.f            : 0000:03:00.0
Vendor Id               : 0x8086
Device Id               : 0xBCCE
SubVendor Id            : 0x8086
SubDevice Id            : 0x0000
Socket Id             　: 0x00
Ports Num               : 01
Bitstream Id            : 0x501060200000000
Bitstream Version       : 5.0.1
Pr Interface Id         : af0ba90a-6df0-5f12-8fb5-263d15d98c72
Boot Page               : user1
Factory Image Info      : b3442faf0237fea4e23ef057af64586b
User1 Image Info        : ba740062978c274152402e5c4def51ec
User2 Image Info        : a8f39027e12ed8ba5feaf5b154bf5b66
```
`N6011のソフトウエア情報が正常に読み出され、内容も問題なし`
#### 環境構築完了 

# ノウハウ事例集
ここではFPGA設計段階でのトラブル(Know-how)事例を紹介します。
N6011用のマニュアルに準じ、Buildあるいはbinの書き込み時に発生したユーザー環境の設定に起因した２つの事例です。
## 事例-1.  
:::note warn
Buildスクリプト内で、GitHubへの問い合わせ処理のステップにてエラー発生
:::
[ 内容 ]： OFS_BUILD_NUMBER環境変数が設定されていない  
[ 処置 ]： OFS_BUILD_NUMBERへ任意の数字を設定（”0”を設定)    

## 事例-2.  
:::note warn
Build後に作られるbinファイルが3種類あり、どれを書き込むべきか不明
:::
   
[ 内容 ]：Build後に作られたbinファイルは以下の通り確認できます  

```linux:binファイル
$ cd work_x8_2x1x100G_adp/syn/n6000/fim_x8_2x1x100G/adp/syn_top/output_files
$ ls -1 *pacsign*.bin
ofs_top_page0_pacsign_factory.bin
ofs_top_page1_pacsign_user1.bin
ofs_top_page2_pacsign_user2.bin
```


[ 処置 ]：“ fpgainfo fme “実行リストの <font color="green">「Boot Page」</font>の項に記載されたファイル<font color="green">（” user1 “）</font>を書き込む。 

```linux:実行コマンドとログ
$ fpgainfo fme
Intel Acceleration Development Platform
Board Management Controller NIOS FW version: 3.2.0 
Board Management Controller Build version: 3.2.0 
//****** FME ******//
Object Id                        : 0xF000000
PCIe s:b:d.f                     : 0000:03:00.0
Vendor Id                        : 0x8086
Device Id                        : 0xBCCE
SubVendor Id                     : 0x8086
SubDevice Id                     : 0x0000
Socket Id                        : 0x00
Ports Num                        : 01
Bitstream Id                     : 0x501060200000000
Bitstream Version                : 5.0.1
Pr Interface Id                  : af0ba90a-6df0-5f12-8fb5-263d15d98c72
Boot Page                        : user1
Factory Image Info               : b3442faf0237fea4e23ef057af64586b
User1 Image Info                 : ba740062978c274152402e5c4def51ec
User2 Image Info                 : a8f39027e12ed8ba5feaf5b154bf5b66
```
<Br>
[  補足 ]：Boot Pageを変更する場合は以下のコマンドを使用する。

```linux:実施例
rsu fpga -p user1 03:00.0
```

# あとがき

今回は、FPGA動作検証までの記載は割愛し、環境構築までの情報を記載しました。
同じように環境設定でつまずいた方の参考になれば幸いです。<Br>