CXL (Compute Express Link) その11 - CXL.ioコマンド: Event Record

私はメモリデバイスの不揮発性メモリ制御やホストIFなどを扱うソフト屋をやっております。
仕事でCXL(Compute Express Link)まわりの技術に関わっています。
CXL技術に関連するメモ書きを残していこうと思います。
ホストのCPUとOS/Applicationまわりの経験・知識共に乏しいので、親切な方は教えて下さると幸いです。
また、間違い、アドバイス、その他、ご意見やご要望ありましたらお気軽にどうぞ。

---
今回は前回(CXL (Compute Express Link) その10-CXL.ioコマンド)でご紹介したCXL.ioのコマンドのうち、CXL Device CommandのEventsコマンドセットの詳細を書きます。

#1 Events Command Set
CXLメモリデバイスでは、デバイス内でエラー等のイベント発生時、発生したイベントの情報を保持し、ホストシステムの要求に応じて返す必要があります。
Eventsコマンドセットは、ホストシステムがCXLメモリデバイスに対して、イベント情報に関連する設定、およびイベント情報の取得をするためのコマンドセットです。
ホストシステムは、イベント情報を使用してデータの復旧等のシステムのリカバリを行うことになります。

イベント発生時のホストシステムとCXLメモリデバイス間のやり取りの例を下図に示します。
![Event.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/907ad818-6a95-5ffe-f8c1-6a6590845b1b.png)

CXLメモリデバイスでは、イベント発生後、Event Recordに発生したイベントの情報を記録し、イベントが発生したことをホストシステムに割り込み等で通知します。
ホストシステムは、割り込みに応じて、Get Event Recordでイベント情報を取得し、取得後はClear Event Recordでイベント情報をクリアします。

Eventsコマンドセットでは下表に示す4つのコマンドが定義されています。
下表に示す通り、CXLメモリデバイスは、全てのコマンドへの応答がMandatoryとなっています。

| Command | Required | 概要 |
|:--|:--|:--|
| Get Event Record | M | イベント情報の取得をする。 |
| Clear Event Records | M | イベント情報のクリアをする。 |
| Get Event Interrupt Policy | M | イベント発生時の通知方法に関する設定の情報の取得をする。 |
| Set Event Interrupt Policy | M | イベント発生時の通知方法を設定する。 |

##1.1 Event Recordの種類
CXL2.0のEvent Recordには、以下に示す6種類のEvent Recordが定義されています。

- General Media Event Record
- DRAM Event Record
- Memory Module Event Record
- Physical Switch Event Record
- Virtual Switch Event Record
- MLD Port Event Record

不揮発性メモリを搭載するCXLメモリデバイスは、General Media Event RecordとMemory Module Event Recordで定義される2種類のイベントを区別し、保持する必要があります。

ホストCPUがデータの読み書きを行う記録媒体としてDRAMを搭載するCXLメモリデバイスの場合は、DRAM Event Recordにも対応する必要があります。
Physical Switch Event Record、Virtual Switch Event Record、MLD Port Event Recordの3種類は、Switchが対応するイベントの情報です。

自分が関心を持っているのは不揮発性メモリを搭載するCXLメモリデバイスであるため、以降は、General Media Event RecordとMemory Module Event Recordのみを扱います。

詳細は後述しますが、General Media Event Recordでは不揮発性メモリからのデータの読み出しで発生した訂正不可エラーに関するイベント、Memory Module Event RecordではCXLメモリデバイスの温度や寿命等の情報に関するイベントが扱われます。

General Media Event RecordとMemory Module Event Recordのフォーマットを下図に示します。
![record.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/6acf6307-d796-c1a8-0485-7c02fe6fa0b2.png)

図中における緑色の箇所は、General Media Event RecordとMemory Module Event Recordの共通のパラメータです。

Event Record共通のパラメータの詳細を下表に示します。

| Field | 概要 |
|:--|:--|
| Event Record ID | Event Recordの種類を区別するためのID。 |
| Event Record Length | Event Recordのサイズ。 |
| Event Record Flags | 発生したイベントによる影響を示すフラグ。<br>Bit[1:0]: Event Recordの重要度(後述)<br>Bit[2]: データの永続性のエラーに関するイベント<br>Bit[3]: CXLメモリデバイスのメインテナンスが必要となるイベント<br>Bit[4]: イベントによりパフォーマンスの低下が発生<br>Bit[5]: CXLメモリデバイスの交換が必要となるイベント |
| Event Record Handle | イベントのID。 |
| Related Event Record Handle | 関連するイベントのID。 |
| Event Record Timestamp | イベントが発生した時間(CXLメモリデバイスがタイムスタンプに対応している場合)。 |

General Media Event Recordのパラメータを下表に示します。

| Field | 概要 |
|:--|:--|
| Physical Address |イベントが発生したメモリのアドレス。|
| Memory Event Descriptor | 発生したイベントの種類。<br>Bit[0]: 訂正不可エラー<br>Bit[1]: 設定された閾値をオーバー<br>Bit[2]: Poison Listのオーバーフロー |
| Memory Event Type | イベントの発生箇所を示す。<br>00h = 記録媒体から読み出したデータの訂正<br>01h = ホストCPUによる無効なアドレスの指定<br>02h = CXLメモリデバイス内部のデータパス<br> |
| Transaction Type | イベントが発生した処理。<br>00h = Unknown/Unreported<br>01h = Host Read<br>02h = Host Write<br>03h = Host Scan Media<br>04h = Host Inject Poison<br>05h = Internal Media Scrub<br>06h = Internal Media Management |
| Validity Flags | イベントが発生したメモリのアドレスの追加情報の使用の有無。<br>Bit[0]: Channel Field is valid<br>Bit[1]: Rank Field is valid<br>Bit[2]: Device Field is valid<br>Bit[3]: Component Identifiere Field is valid |
| Channel | メモリのアドレスの追加情報の一つ。 |
| Rank | メモリのアドレスの追加情報の一つ。|
| Device | メモリのアドレスの追加情報の一つ。 |
| Component Identifier | メモリのアドレスの追加情報の一つ。|

上に示した表中のPoison Listの詳細については、別にMedia and Poison Managementコマンドセットの詳細で触れたいと思います。

Memory Module Event Recordのパラメータを下表に示します。

| Field | 概要 |
|:--|:--|
| Device Event Type | 発生したイベントの種類。<br>00h = Health Status Change<br>01h = Media Status Change<br>02h = Life Used Change<br>03h = Temperature Change<br>04h = Data Path Error<br>05h = LSA Error |
| Health Status | CXLメモリデバイスの状態を示す。<br>Bit[0]: CXLメモリデバイスのメインテナンスが必要とされている状態<br>Bit[1]: パフォーマンス低下が起こっている状態<br>Bit[2]: CXLメモリデバイスの交換が必要とされている状態 |
| Media Status | CXLメモリデバイスの記録媒体の状態を示す。<br>00h = 正常な状態<br>01h = アクセスができない状態<br>02h = 書き込みが正常に行えない状態<br>03h = 全てのデータが失われた状態<br>04h = CXLメモリデバイスで電源断が検出されたことにより書き込みができない可能性のある状態<br>05h = CXLメモリデバイスのシャットダウンにより書き込みができない可能性のある状態<br>06h = イベント以降に受け付けた書き込みが正常にできない可能性のある状態<br>07h = CXLメモリデバイスで電源断が検出されたことにより全てのデータが失われた可能性のある状態<br>08h = CXLメモリデバイスでシャットダウンが行われたことにより全てのデータが失われた可能性のある状態<br>09h = 全てのデータが失われた可能性のある状態 |
| Additional Status | CXLメモリデバイスの状態を示す。<br>Bit[1:0]: 消費されたCXLメモリデバイスの寿命の状態(Normal/Warning/Critical)<br>Bit[3:2]: CXLメモリデバイスの温度状態(Normal/Warning/Critical)<br>Bit[4]: CXLメモリデバイスの揮発性メモリで発生した訂正可能エラーの発生状態(Normal/Warning)<br>Bit[5]: CXLメモリデバイスの不揮発性メモリで発生した訂正可能エラーの発生状態(Normal/Warning) |
| Life Used | CXLメモリデバイスの消費された寿命(%)。|
| Device Temperature | CXLメモリデバイスの温度。|
| Dirty Shutdown Count | CXLメモリデバイスに対して行われた電源瞬断の回数。 |
| Corrected Volatile Error Count | CXLメモリデバイスの揮発性メモリで発生した訂正可能エラー数 |
| Corrected Persistent Error Count | CXLメモリデバイスの不揮発性メモリで発生した訂正可能エラー数 |

Additional Statusにおける、NormalとWarningの境となる閾値は、CXLメモリデバイスのユーザにより設定される閾値です。閾値の設定は、Health Info and Alertsコマンドセットを使用して行います。
WarningとCriticalの境となる閾値は、CXLメモリデバイスの信頼性の保証の観点から、CXLメモリデバイスのベンダーが製造において設定する閾値です。

SRAM/DRAM等の揮発性メモリではデータの誤りが発生することは稀かと思います。しかし、NANDフラッシュメモリにも当てはまるのですが、一般的に、不揮発性メモリで訂正可能な範囲でのデータの誤りは頻繁に発生します。Corrected Persistent Error Countの値を、ホストシステム側で、CXLメモリデバイスの故障を予測するために使用する場合、カウントアップの条件等、ホストシステムとCXLメモリデバイスとの間で取り決めをしておく必要があると考えています。



##1.2 Event Recordの重要度(Severity)
イベントには、重要度に関して4つの分類があります。
CXLメモリデバイスで実際に発生するイベントは製品の実装などにより異なるため、重要度の区分は、CXLメモリデバイスとホストシステム間で製品の実装に合わせて取り決める必要があります。そのためCXLの仕様としては明記されていません。

重要度と例を下表に示します。

| Severity | 例 |
|:--|:--|
| Informational | データの読み書きで指定されたアドレスが無効なアドレス<br>バッファ内のデータで訂正不可エラーが発生 |
| Warning | Warningの閾値温度超え発生<br>Warningの閾値超えた回数の書き込みが発生<br>記録媒体へのデータの書き込みエラー |
| Failure | バッファ内のデータの管理情報の破損<br>Criticalの閾値温度超え発生<br>Criticalの閾値超えた回数の書き込みが発生<br>記録媒体のダイ単位で故障<br>キャパシタの性能低下 |
| Fatal | 記録媒体へのアクセスができない<br>コントローラの故障 |

不揮発性メモリを搭載するCXLメモリデバイスでは、発生したイベントの情報を、Event Recordの2種類と重要度の4種類で、8種類で区別して保持する必要があります。


##1.3 コマンドパラメータ
Eventsコマンドセットで定義されるコマンドの詳細を示します
コマンドで指定するパラメータをInput Payload、応答として返されるパラメータをOutput Payloadで記載します。


###1.4.1 Get Event Records
Get Event Recordsでは重大度を指定して、Event Recordを取得します。

**Input Payload**

| Byte Offset | Length | Description |
|:--|--:|:--|
| 00h | 1| Event Log: 取得するEvent Recordの重大度。<br>00h = Informational Event<br>01h = Warnning Event<br>02h = Failure Event<br>03h = Fatal Event |

**Output Payload**

| Byte Offset | Length | Description |
|:--|--:|:--|
|00h |1| CXLメモリデバイスが保持するEvent Recordのサイズに関するフラグ。<br>Bit[0]: 発生したイベントの数が、CXLメモリデバイスで保持することが可能なEvent Recordの数が超えていること(オーバーフロー)を示す<br>Bit[1]: CXLメモリデバイスが保持するEvent RecordのサイズがMailboxレジスタに収まらないため、複数回の読み出しが必要であることをしめす
| 01h | 1 | Reserved |
| 02h | 2 | オーバーフローしたイベントの数を示す。 |
| 04h | 8 | オーバーフローした最初のイベント発生時のタイムスタンプ。 |
| 0Ch | 8 | オーバーフロー発生後最後のイベント発生時のタイムスタンプ。 |
| 14h | 2 | CXLメモリデバイスが保持するEvent Recordの数。 |
| 16h | 10 | Reserved |
| 20h | Varies | Event Record。 |

Output Payloadでホストシステムに送ることが可能なEvent Recordの数は、CXLデバイスで実装するMailboxレジスタのサイズに依存します。

###1.4.2 Clear Event Records
CXLメモリデバイスで保持しているEvent Recordsをクリアします。

**Input Payload**

| Byte Offset | Length | Description |
|:--|--:|:--|
| 00h | 1 | クリアするEvent Recordの重大度。<br>00h = Informational Event<br>01h = Warnning Event<br>02h = Failure Event<br>03h = Fatal Event |
| 01h | 1 | 全てのEvent Recordをクリアするか否かを示すフラグ。<br>Bit[0]: Clear All Events |
| 02h | 1 | 消去するイベントの数。|
| 03h | 3 | Reserved |
| 06h | Varies | クリアするイベントのID(複数可)。 |

###1.4.3 Get Event Interrupt Policy
イベント発生時の通知方法に関する設定の情報を取得します。
イベントの重大度毎に通知方法が設定されています。

**Output Payload**

| Byte Offset | Length | Description |
|:--|--:|:--|
| 00h | 1 | Informational Eventの通知設定。<br>Bit[1:0]: Interrupt Mode<br>00b = No Interrupt<br>01b = MSI/MSI-X<br>10b = FW Interrupt (EFN VDM)<br>Bit[3:2]: Reserved<br>Bit[7:4]: FW Interuptで通知する場合のメッセージ番号 |
| 01h | 1 | Warning Eventの通知設定。<br>Informational Eventの通知設定と同じため略。|
| 02h | 1 | Failure Eventの通知設定。<br>Informational Eventの通知設定と同じため略。|
| 03h | 1 | Fatal Eventの通知設定。<br>Informational Eventの通知設定と同じため略。|

###1.4.4 Set Event Interrupt Policy
イベント発生時の通知方法を指定します。通知方法は、イベントの重大度毎に設定します。
パラメータ毎の詳細はGet Event Interrupt Policyと同様のため省略します。

**Input Payload**

| Byte Offset | Length | Description |
|:--|--:|:--|
| 00h | 1 | Informational Eventの通知設定。|
| 01h | 1 | Warning Eventの通知設定。|
| 02h | 1 | Failure Eventの通知設定。|
| 03h | 1 | Fatal Eventの通知設定。|

---
次回も、CXL.ioで実行されるコマンドセットからピックアップして詳細について書こうと思っています。