CXL (Compute Express Link) その18 - Vendor Defined Message (VDM)

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

---
今回は、前回(CXLその17)で触れたVDMについて書きます。
# Vendor Defined Message (VDM)
CXLの仕様では、CXL.ioを通したホストCPUとCXLメモリデバイス間のMessageとして、PCIeで定義されるTLPのVendor Defined Messageを使用したMessageが定められています。

CXLの仕様で定めらているMessageは以下の2種類です。
- Power Management VDM
　CXLメモリデバイス起動/終了、Power Managementに関連する動作で使用されます。CXLその17で書いたGPFは、このMessageが使われます。
- Memory Error Firmware Notification VDM
　CXLメモリデバイスでエラーが検出された際のホストCPUへの通知手段の一つとして使用されます。MSI/MSI-Xの割り込みを使用する場合は使用されません。

# 1. Power Management VDM
Power Management VDMのフォーマットを下図に示します。



![PM_VDM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/d8ae3540-5c3c-1956-94ce-b38726ba7bdc.png)
図中の青色箇所はPCIeの仕様に従い設定されるパラメータ、黄色箇所がCXLの仕様で定められるパラメータに相当します。青色箇所のパラメータの詳細についてはPCIeの仕様を参照してください。

Power Management VDMは、以下の5種類の用途で使用されます。括弧内は、CXLの仕様書でのコマンド名です。
- 受信可能なPM VDMのクレジット数の通知 (CREDIT_RTN)
- Power Management VDMによる通信の初期化 (AGENT_INFO)
- ホストシステムが、Reset、もしくはPower Management Stateの遷移をするための準備をCXLメモリデバイスに指示 (RESETPREP)
- CXLメモリデバイスがPower Management Stateの遷移を行うための許可 (PMREQ)
- Global Persistent Flush (GPF)

それぞれのコマンドは、上図に示される「PM Logical Opcode」で指定されます。
それぞれのコマンドにより、上図に示されるParameterとPayloadの使い方が異なります。

## 1.1. Credit and PM Initialization
Credit and PM InitializationはCXLでのリンクが確立された直後などに行われ、CREDIT_RTNとAGENT_INFOが使用されます。Credit and PM Initializationのシーケンスを下図に示します。

![CreditPMInit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/cdccd589-cd3f-471d-6571-70006699c76a.png)
Credit and PM Initializationは、Credit InitializationとPM Initializationの2つで構成されています。

CREDIT_RTNとAGENT_INFOで使用されるパラメータを下表に示します。特に記載のないビットはReservedです。
#### CREDIT_RNT
| Field | Description |
|:--|:--|
| Parameter[15:0] | Reserved |
| Payload[95:0] |[7:0] NUM_CREDIT: 受信可能なCredit数<br>[14:8] TARGET_AGENT_ID: ホストCPUが割り当てるID |

TARGET_AGENT_IDは、Credit Initializationの最初のCREDIT_RTNで、ホストCPUがCXLメモリデバイスに送るIDです。CXLメモリデバイスは受信したTARGET_AGENT_IDを保持し、以降、CXLメモリデバイスはホストCPUにMessageを返す際は、PM Agenet IDにTARGET_AGENT_IDを設定し、ホストCPUがMessageの発行元のCXLメモリデバイスを区別できるようにします。

#### AGENT_INFO
| Field | Description |
|:--|:--|
| Parameter[15:0] | [0] Request(1)/Response(0) <br> [7:1] INDEX(0以外はReserved) |
| Payload[95:0] | INDEX=0のときのみ有効<br>[7:0] CAPABILITY_VECTOR<br>　[0] CXL1.1のPM VDMをサポートの有無<br>　[1] GPFのサポートの有無<br>　[7:2] Reserved |

AGENT_INFOでは、ホストCPUとCXLメモリデバイス間で、それぞれがサポートするPM VDMの情報が交換されます。

## 1.2. RESETPREP
ホストシステムがパワーステートを遷移させる際、またはリセットを掛ける際に、ホストCPUは、CXLメモリデバイスにRESETPREPで準備するように指示します。
CXLメモリデバイスは、必要に応じてバッファ内のデータの退避等の処理を行い、完了をホストCPUに通知します。

RESETPREPのシーケンスを下図に示します。
![RESETPrep.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/2a782baa-be8d-b48f-f399-c00b3fdce636.png)

RESETPREPの完了後に、ホストシステムはパワーステートを遷移やリセットを行います。

RESETPREPで使用されるパラメータを下表に示します。

#### RESETPREP
| Field | Description |
|:--|:--|
| Parameter[15:0] | [0] Request(1)/Response(0)　|
| Payload[95:0] | [7:0] ResetType<br>　0x01: ホストシステムがS0からS1に遷移<br>　0x03: ホストシステムがS0からS2に遷移<br>　0x04: ホストシステムがS0からS4に遷移<br>　0x05: ホストシステムがS0からS5に遷移<br>　0x10：ホストシステムがResetを行う<br>[15:8] PrepType<br>　0x00: General Prepare (これ以外の値はReserved) |

パワーステートSxの定義についてはACPIの仕様書を参照してください。

## 1.3 PMREQ
CXLメモリデバイスが、ホストCPUから新たなコマンドを受けていない状態が続く等の要因により、低消費電力モードに自発的に入る場合や、ホストシステムがCXLメモリデバイスを低消費電力モードから復帰させる場合などに使用されます。

CXLメモリデバイスが低消費電力モードに入る場合のフローを下図に示します。

![PMREQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/bea95f99-e53b-8bd8-d0b2-a8c513dfc123.png)

CXLメモリデバイスからのリクエストに対して、ホストCPUが許可、または不許可の応答を返します。
CXLメモリデバイスは、ホストCPUが許可した場合、低消費電力モードに入ることができます。

CXLメモリデバイスを低消費電力モードから復帰させる場合のフローを下図に示します。
![PMREQ_wake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/3a91cce4-ef73-2791-8137-a2e3b0ecc5e0.png)

PMREQで使用されるパラメータを下表に示します。

### PMREQ
| Field | Description |
|:--|:--|
| Parameter[15:0] | [0] Request(1)/Response(0)<br>[2] Go(1) |
| Payload[95:0] | [31:0] Latency Tolerance Reporting (LTR)<br>　[31:24] Snoop Latency[7:0]<br>　[23:16] Snoop Latency[15:8]<br>　[15:8] No-Snoop Latency[7:0]<br>　[7:0] No-Snoop Latency[15:8] |

No-Soop/Snoop Latency[15:0]のフォーマットを下表に示します。
![LTR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/01774bc7-cc43-b3c0-447b-58c6f8f26903.png)
Requirementは設定された値の有効・無効を示すビットです。LTR= (Latency Value) x (Latency Scale)として算出されます。
シーケンスの図で示されるCXL_MEM_LTRの値は、パラメータのLTRに設定されるのですが、現在リリースされているCXLの仕様書では、Low/Highで設定する明確な値は書かれていないようです。

## 1.4. GPF
GPFのフローを下図に示します。
![GPF_Flow3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/9e691c51-13ea-ef7e-595c-511cd3a8be3e.png)

CXLその17で掲載した図と同じ図ですので、フローの説明は割愛します。

GPFで使用されるパラメータを下表に示します。
### GPF
| Field | Description |
|:--|:--|
| Parameter[15:0] | [0] Request(1)/Response(0) |
| Payload[95:0] | [7:0] GPFType<br>　[0] Powerfailが差し迫った状態であることを示す(1)<br>　[1] Cacheのフラッシュの実行を指示(1)<br>　[7:2] Reserved<br>[15:8] GPFStatus<br>　[8] Phase1でエラーが発生したことを通知する<br>　[15:9] Reserved<br>[17:16] Phase<br>　0x01: Phase 1<br>　0x02: Phase 2 |

# 2. Memory Error Firmware Notification VDM
Memory Error Firmware Notification VDMのフォーマットを下図に示します。
![MEFN_VDM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/3828ed8b-d2df-ff3f-b814-a9dc752437f5.png)
Memory Error Firmware Notification VDMは、CXLメモリデバイスでエラーが検出され、ホストCPUに通知するために使用されます。

CXLその11で示した図を以下に再掲します。
![Event.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/44c3702b-651f-9d93-e2f2-7f1fe39a3d5d.png)
Interruptと示した箇所でMemory Error Firmware Notification VDMが使用されます。
MSI/MSI-Xの割り込みが使用される場合、Memory Error Firmware Notification VDMは使用されません。

---
5/10にSamsungから512GBのCXLメモリデバイスの製品の発表がされました。

https://news.samsung.com/global/samsung-electronics-introduces-industrys-first-512gb-cxl-memory-module

2022/3Qから、顧客やパートナーに評価向けにリリースが開始されるようです。
CXLのデモ等を見る限り、既にいくつかの特定顧客にはリリースされているようですので、今回の発表では評価用にリリースする顧客の範囲を広げるという話をしているようです。
既に行っている特定顧客での評価とSamsungへの結果のフィードバックの反映でほぼ製品仕様を確定させ、2022/3Qから最後の製品仕様の調整と製品の完成度を上げて、市場に製品リリースという流れでしょうか。この発表は、最終製品仕様と製品リリースの見込みが立ったということだと思われます。

ユーザデータの記憶媒体としては、DDR5のDRAMのみのようですので、CPUが使える揮発性のメモリ空間を拡張するために使用される製品となっているようです。
CPUのCXLへの対応のRoadmapから考えると、CXL1.1対応の製品だと思われます。

SamsungのCXLメモリデバイスの最初の発表が2021/5/11で、以降に特定顧客向けリリースを開始したとすると、評価開始から製品リリースまでは、１年以上は掛かっています。比較的用途の分かりやすいDRAMの容量拡張の製品で評価期間が１年以上なので、不揮発性メモリ製品の評価期間も少なくとも１年以上は見ておいた方が良さそうです。




-----