VirtIOデバイスの初期化シーケンス

VirtIOデバイスの初期化

VirtIOデバイスとして動作するためには以下の2段階の初期化が必要です.

  • VirtIOデバイスとしての初期化
  • デバイスの種類に応じた初期化

デバイスの種類に応じた初期化はデバイスに応じたものとなるので今回は省略し,今回はVirtIOデバイスとしての初期化について,レジスタの読み書きについて流れを見ました.

初期化シーケンス

VirtIOデバイスはメモリマップされたレジスタファイルの値をOSが読み書きして初期化します.

以下は,ブロックデバイスとしてVirtIOデバイスの初期化を完了させるために必要な流れです.R/WはOS側から見た記述です.デバイス側では,OSが正しく初期化を完了できるようにレジスタファイルの値をあらかじめ設定しておく,あるいは書き込まれた値に応じた処理を行ないレジスタファイルの値を変更する必要があります.

ステップアドレスレジスタRW値(例)内容
00x000MagicValueR0x74726976マジックナンバー
10x004VersionR0x2VirtIOのバージョン
20x008DeviceIDR0x2デバイスの種類(0x2=ブロックデバイス)
30x00cVendorIDR0xffeeddccベンダーID
40x070StatusW0x0デバイスのリセット
50x070StatusR0x1ACKNOWLEDGEビットを確認
デバイスのリセット完了
60x070StatusW0x1ACKNOWLEDGEビットの書き込み
70x070StatusR0x1エラーが発生していないか確認する
80x070StatusW0x3DRIVERビットを設定しネゴシエーションを開始する
90x014DeviceFeatureSelW0x1読み取るDeviceFeatureの領域を選択
1なので[63:32]を対象とする
100x010DeviceFeatureR0x1DeviceFeature[63:32]を読み取る
110x014DeviceFeatureSelW0x0読み取るDeviceFeatureの領域を選択
0なので[31:0]を対象とする
120x010DeviceFeatureR0x0DeviceFeature[31:0]を読み取る
130x024DriverFeatureSelW0x1DriverFeatureの領域を選択
1なので[63:32]を対象とする
140x020DriverFeatureW0x1DriverFeature[63:32]を設定する
150x024DriverFeatureSelW0x0DriverFeatureの領域を選択
0なので[31:0]を対象とする
160x020DriverFeatureW0x0DriverFeature[31:0]を設定する
170x070StatusR0x3エラーが発生していないかを確認する
180x070StatusW0xbFEATURES_OKビットを設定しネゴシエーションを完了
190x070StatusR0xbエラーが発生していないかを確認する
200x030QueueSelW0x0Virtqueueの選択
210x044QueueReadyR0x0キューの準備が未完了か確認
220x034QueueNumMaxR0x10Virtqueue内の最大キュー数を確認
230x038QueueNumW0x10Virtqueue内で使用するキュー数を設定
240x080QueueDescLowW0x1e42e000VirtqueueのDescriptor Tableの下位アドレスを設定
250x084QueueDescHighW0x0Descriptor Tableの上位アドレスを設定
260x090QueueDriverLowW0x1e42e100VirtqueueのDriver(Available Ring)の下位アドレスを設定
270x094QueueDriverHighW0x0Driver(Available Ring)の上位アドレスを設定
280x0a0QueueDeviceLowW0x1e42f000VirtqueueのDevice(Used Ring)の下位アドレスを設定
290x0a4QueueDeviceHighW0x0Device(Used Ring)の上位アドレスを設定
300x044QueueReadyW0x1キューの準備が完了したことを設定
310x0fcConfigGenerationR0x0デバイスの構成のバージョンを読み取る
32~0x100~Configデバイスの種類に応じて読み書きする

実際に動作しているAXIトランザクションをILAでキャプチャした画像です.

デバイスの種類に応じたレジスタも送受信すると以下のようなログでOSにデバイスとして認識してもらえます.

まとめ

仕様書のレジスタマップだけでは実際にどのような順序で読み書きされているのかが分かりづらかったので実際の動きをテキストに書き起こしてみました. どのようにデバイスの存在や機能の有無を確認し有効化するのか流れで理解する事ができました.

コメント

タイトルとURLをコピーしました