CXL (Compute Express Link) その7 - コマンドとレスポンス

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

#1. CXL.memのコマンドとレスポンス
CXL.memのプロトコルでは、ホストCPUからCXLデバイスのメモリ空間にデータの読み書きする際に実行されるコマンドは、以下の2種類のいずれかのフォーマットに従って送信されます。

- Request (Req)
データの読み出し等、ホストCPUからデータの転送が不要であるコマンドの実行を指示するためのフォーマット。

- Requeset with Data (RwD)
データの書き込み等、ホストCPUからデータの転送が必要であるコマンドの実行を指示するためのフォーマット。

コマンドに対するレスポンスは、以下の2種類のいずれかのフォーマットで返されます。

- Data Response (DRS)
Reqに対するレスポンス。Reqの実行結果として、CXLデバイスからデータの転送が伴う場合に返される。DRSは、データのヘッダとして転送され、以降のSlotにData Chunkが入る。

- No Data Response (NDR)
Req、もしくはRwDに対するレスポンス。Req、もしくはRwDの実行結果として、CXLデバイスからデータの転送が伴わない場合に返される。

#2. Request (Req)
Reqのデータフォーマットを下図に示します。
![Req.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/5482053c-5997-9ea7-29b5-0dd37674b260.png)
それぞれのパラメータ下表に示します。

| Field | Bits | 概要 |
|:--|---:|:--|
| Valid | 1 | リクエストが有効であるか無効であるか示す。<br>0b: 無効なリクエスト<br>1b: 有効なリクエスト |
| Memory Operation | 4 | リクエストのオペレーションコード。ReqでCXL Type3に実行指示が可能なリクエストは以下の通り。<br>0000: MemInv<br>0001: MemRd<br>0010: MemRdData<br>1000: MemSpecRd<br>1001: MemInvNT |
| Snoop Type | 3 | スヌープタイプ。<br>000: No-Op<br>001: リクエスタがデータのShared Copyを要求している示す<br>010: リクエスタがデータをキャッシュしないことを示す<br>011: リクエスタがデータのExclusive Copyを要求していることを示す<br>  |
| Meta Data Field  | 2 | メタステートの更新の有無を指示する。<br>00: メタステートをMeta Data Valueで指定する値に更新 (MS0)<br>11: Meta Data Valueの値を無視 (No-Op)|
| Meta Data Value | 2 | キャッシュラインのメタステートの値。MESIプロトコルに従う。<br>00: Invalid<br>10: Any (Exclusive or Modified)<br>11: Shared |
| Tag | 16 | リクエストの発行元(リクエスター)を示す |
| Address [51:5] | 47 | リクエストを実行するメモリ空間のアドレス。Address[5]は将来の用途のための予約であるため、アドレスは64Bアライン。 |
| Traffic Class | 2 | QoSに関連するパラメータに使用される(将来の用途のための予約)。 |
| LD-ID | 4 | Logical Device Identifier。MLDをサポートするデバイスで使用される。Requestを実行するLogical DeviceのIDを示す。 |
| Reserved | 6 | Reserved |

#3. Request with Data (RwD)
RwDのデータフォーマットを下図に示します。
![RwD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/bfb0fef6-d8b4-09cc-55bd-e3a22f0ebb7f.png)
それぞれのパラメータ下表に示します。

| Field | Bits | 概要 |
|:--|---:|:--|
| Valid | 1 | リクエストが有効であるか無効であるか示す。<br>0b: 無効なリクエスト<br>1b: 有効なリクエスト |
| Memory Operation | 4 | リクエストのオペレーションコード。RwDでCXL Type3に実行指示が可能なリクエストは以下の通り。<br>0001: MemWr<br>0010: MemWrPtl |
| Snoop Type | 3 | スヌープタイプ。<br>000: No-Op<br>001: リクエスタがデータのShared Copyを要求している示す<br>010: リクエスタがデータをキャッシュしないことを示す<br>011: リクエスタがデータのExclusive Copyを要求していることを示す<br>  |
| Meta Data Field  | 2 | メタステートの更新の有無を指示する。<br>00: メタステートをMeta Data Valueで指定する値に更新 (MS0)<br>11: Meta Data Valueの値を無視 (No-Op)|
| Meta Data Value | 2 | キャッシュラインのメタステートの値。MESIプロトコルに従う。<br>00: Invalid<br>10: Any (Exclusive or Modified)<br>11: Shared |
| Tag | 16 | リクエストの発行元(リクエスター)を示す |
| Address [51:6] | 46 | リクエストを実行するメモリ空間のアドレス。アドレスは64Bアライン。 |
| Poison | 1 | リクエストで送信するデータがPoisonの状態であることを示す。<br>0: Poisonでない<br>1: Poison |
| Traffic Class | 2 | QoSに関連するパラメータに使用される(将来の用途のための予約)。 |
| LD-ID | 4 | Logical Device Identifier。MLDをサポートするデバイスで使用される。Requestを実行するLogical DeviceのIDを示す。 |
| Reserved | 6 | Reserved |

---
ReqとRwDのフォーマットの違いは、Addressのビット数と、RwDにPoisonのパラメータが存在することです。Poisonは、何らかの誤りを含むデータを、ホストCPUとCXLデバイス間で転送する際に付けられるフラグです。
CXLデバイスは、Poisonであるデータを受信した場合、受信したデータがPoisonであることを保持しておく必要があります。Poisonの詳細は、エラーに関して書く際に触れたいと思います。

#4. No Data Response (NDR)
NDRのデータフォーマットを下図に示します。
![NDR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/c07834c9-f4d4-a4e8-be71-c967a07dd45a.png)
パラメータ下表に示します。

| Field | Bits | 概要 |
|:--|---:|:--|
| Valid | 1 | リクエストが有効であるか無効であるか示す。<br>0b: 無効なリクエスト<br>1b: 有効なリクエスト |
| Memory Operation | 4 | リクエストのオペレーションコード。RwDでCXL Type3に実行指示が可能なリクエストは以下の通り。<br>0001: MemWr<br>0010: MemWrPtl |
| Meta Data Field  | 2 | メタステートの更新の有無を指示する。<br>00: メタステートをMeta Data Valueで指定する値に更新 (MS0)<br>11: Meta Data Valueの値を無視 (No-Op)|
| Meta Data Value | 2 | キャッシュラインのメタステートの値。MESIプロトコルに従う。<br>00: Invalid<br>10: Any (Exclusive or Modified)<br>11: Shared |
| Tag | 16 | リクエストの発行元(リクエスター)を示す |
| LD-ID | 4 | Logical Device Identifier。MLDをサポートするデバイスで使用される。Requestを実行するLogical DeviceのIDを示す。 |
| Device Load | 2 | デバイスのQoSを示す。 |

#5. Data Response (DRS)
DRSのデータフォーマットを下図に示します。
![DRS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/65754f38-5b41-bb04-d5de-8097c1c8f865.png)

パラメータ下表に示します。

| Field | Bits | 概要 |
|:--|---:|:--|
| Valid | 1 | リクエストが有効であるか無効であるか示す。<br>0b: 無効なリクエスト<br>1b: 有効なリクエスト |
| Memory Operation | 4 | リクエストのオペレーションコード。RwDでCXL Type3に実行指示が可能なリクエストは以下の通り。<br>0001: MemWr<br>0010: MemWrPtl |
| Meta Data Field  | 2 | メタステートの更新の有無を指示する。<br>00: メタステートをMeta Data Valueで指定する値に更新 (MS0)<br>11: Meta Data Valueの値を無視 (No-Op)|
| Meta Data Value | 2 | キャッシュラインのメタステートの値。MESIプロトコルに従う。<br>00: Invalid<br>10: Any (Exclusive or Modified)<br>11: Shared |
| Tag | 16 | リクエストの発行元(リクエスター)を示す |
| LD-ID | 4 | Logical Device Identifier。MLDをサポートするデバイスで使用される。Requestを実行するLogical DeviceのIDを示す。 |
| Device Load | 2 | デバイスのQoSを示す。 |

---
NDRとDRSのフォーマットの違いは、Reservedとして確保されているサイズの違いはありますが、DRSにPoisonのパラメータが存在することです。このPoisonは、RwDのPoison同様、ホストCPUとCXLデバイス間で転送されるデータに誤りが含まれることを示します。
Poisonは、CXLデバイスのメモリから読み出されたデータに含まれる誤りが、CXLデバイス内部で訂正し切れなかった場合にも用いられます。
CXLデバイスは、Poisonであるデータを送信した場合も、Poisonでデータを送信したことを保持しておく必要があります。


#6.CXL.memのコマンドとレスポンスの対応
Req/RwDとDRS/NDRとの対応関係を以下の表に示します。
仕様上発生しないコマンドおよびレスポンスのパラメータの組み合わせは表から除外してあります。
![Command_Response.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/a3933ed6-c6eb-7631-61b2-5d5e40295c1c.png)
上記に挙げたReq/RwD/DRS/NDRが、前回の記事(CXLその6)で示した、Header Slot(12B)/Generic Slot(16B)に埋め込まれて転送されます。それぞれのSlotに埋め込まれるReq/RwD/DRS/NDRは1つとは限りません。複数個のReq/RwD/DRS/NDRが組み合わされてSlotに埋め込まれ、Flit単位で転送されます。

---
次回以降もCXLの仕様の詳細について書いていきます。