MCTP control message用于在MCTP通信的协议中,来设置和初始化MCTP通信。
本文基于 SMBus/I2C 来实现 MCTP Control Protocol,SMBus/I2C 包格式如下:
1. MCTP control protocol 术语
Term | Description |
Requester | 指发起MCTP控制请求消息的端点。 |
Responder | 指发起MCTP控制响应消息的端点。 |
Originator or Source | 指发起任何MCTP控制消息的端点:请求、响应或者数据报 |
Target or Destination | 指作为任何MCTP控制消息的预期接收方的端点:请求、响应或者数据报 |
Asynchronous Notification | MCTP端点向另一个MCTP端点发出未请求的数据报 |
Broadcast | 使用广播EID将MCTP控制数据报发送到总线上时,使用术语“Broadcast |
2. MCTP control message format
MCTP control messages使用Message type code = 0x00,MCTP control messages不使用消息完整性检查字段。因此MCTP中的IC bit位应该始终为0b。
MCTP Message Types定义如下:
3. MCTP control message fields
介绍MCTP control message中各fields字段的含义。
Field Name | Description |
IC | Message Integrity Check bit = 0b,MCTP控制消息不包括完整性检查字段。 |
Message Type | MCTP control = 0x00 |
Rq bit | Request bit,这个位用来区分MCTP控制请求消息和其它消息类。如果消息是Command或Request,则Rq = 1b,如果是响应消息,则Rq = 0b。对于数据报和广播消息,Rq位设置为1b。 |
D-bit | Datagram bit, 这个位用于指示Instance ID字段是用于跟踪和匹配请求和响应,还是仅用于标识重传消息。 |
Instance ID | Instance ID字段用于标识MCTP控件的新实例 |
Command Code | 对于Request messages,该字段指示command code |
Completion Code | 该字段仅出现响应消息中,指示响应是否正常完成。如果命令没有正常完成,该值可以提供错误条件的附加信息。 |
Message Data | 请求或者响应的数字字段。 |
4. MCTP control message transmission unit size
所有MCTP控制消息都要求packet payload不大于64byte,通常MCTP控制消息在单个MCTP包中携带。如果一个操作需要传输的数据多于单个消息所能承载的数据,则使用多个消息来传输。
5. MCTP control messages
5.1 MCTP control message command codes
本章只介绍一些常用的Command,其他Command的介绍可自行参考协议:
https://www.dmtf.org/sites/default/files/standards/documents/DSP0236_1.3.0.pdf
https://www.dmtf.org/sites/default/files/standards/documents/DSP0237_1.2.0.pdf
5.1.1 Set Endpoint ID(0x01)
Set Endponit ID命令用来为终端指定EID值。此命令只能由总线owner发出,以将EID分配给特定物理地址处的端点。如果端点尚未分配EID,或者由于EID未知,消息中的Destination Endpoint ID被设置为特殊的空EID值(EID = 0x00)。
如果一个EID已经被分配,而Set Endpoint ID命令从另外一个总线发出,没有强制分配EID,则该命令将返回SUCCESSFUL completion code,但响应参数将返回一个EID分配状态“EID rejected”。
Byte | Description | |
---|---|---|
Request data | 1 | Operation [7:3] - reserved [1:0] - Operation: 00b Set EID :设置EID,对于单总线的情况,应该总是被执行。 01b Force EID :强制设置EID 10b Reset EID(option): 针对支持静态EID的情况 11b Set Discovered Flag |
2 | Endpoint ID. 0xFF(广播EID),0x00(空EID) = illegal非法的. |
Byte | Description | |
---|---|---|
Response data | 1 | Completion code |
2 | [7:6] - reserved [5:4] - EID assignment status: 00b = EID assignment accepted. 01b = EID assignment rejected. 10b = reserved. 11b = reserved. [3:2] - reserved. [1:0] - Endpoint ID allocation status 00b = Device does not use an EID pool. 01b = Endpoint requies EID pool allocation. 10b = Endpoint uses an EID pool and has already received an allocation for that pool. 11b = reserved | |
3 | EID Setting. 如果EID设置被接受,该值将与请求中传递的EID匹配。否则返回当前的EID设置值。 | |
4 | EID Pool Size. 这是bridge可以用来分配的动态EID pool的大小。 0x00 = no dynamic EID pool. |
5.1.2 Get Endpoint ID(0x02)
Get Endpoint ID命令返回端点的EID。该命令通常仅由总线Owner发出,用于查询指定物理地址的EID。因此 message 中的 destination EID 通常会被设置为特殊的物理寻址专用EID值。
Byte | Description | |
---|---|---|
Request data | - | - |
Response data | 1 | Completion code |
2 | Endpoint ID. 0x00 = EID not yet assigned. | |
3 | Endpoint Type. [7:6] = reserved [5:4] = Endpoint Type: 00b = simple endpoint 01b = bus owner/bridge 10b = reserved 11b = reserved [2:0] = reserved [1:0] = Endpoint ID Type: 00b = dynamic EID,端点仅使用动态EID 01b = static EID supported. 返回当前EID值,可能与静态EID一致也可能不一致。 10b = static EID supported. 当前EID值与静态EID值一致 11b = static EID supported. 当前EID值与静态EID值不一致 | |
4 | Medium-Specific Information. 保存端点可选配置的附加信息。 除非transport binding协议有指定,否则该字节将返回0x00. |
5.1.3 Get Endpoint UUID(0x03)
Get Endpoint UUID命令返回通用唯一标识符(UUID),也称为全局唯一ID(GUID)。该命令用于将一个设备与一个或多个EID关联。
Byte | Description | |
---|---|---|
Request data | - | - |
Response data | 1 | Completion Code |
2:17 | UUID byte 1:16, 格式参考Table 17 |
5.1.4 Get MCTP Version Support(0x04)
Get MCTP Version Support命令用于检索端点支持的MCTP基本规范版本,以及每种消息类型支持的消息类型规范版本,版本号从老到新依次排列。
该命令返回一个Completion code,可用于查询端点是否支持请求的消息类型。
版本号由4Byte组成:“major”、“minor”、“update”、“alpha”。其中“major”、“minor”、“update”字节是按照BCD编码,每个字节包含两个BCD数字。“alpha”字节包含一个可选的字母数字字符扩展【a-z, A-Z】,如果“alpha”字节值为0x00,表明没有被使用。“update”字节值为0xFF表示忽略该字段。
BCD编码有效位中如果值为0xF,表示应该忽略该区域,应用程序不应该显示前导0。
Byte | Description | |
---|---|---|
Request data | 1 | Message Type Number 要检索版本信息的消息类型号: 0xFF = return MCTP base specification version information. 0x7E, 0x7F = vendor-defined message types 0x00 = return MCTP control protocol message version information 0x01 = return version of DSP0241 0x02,0x03 = return version of DSP0261 Other = 返回给定消息类型的版本信息。 |
Respinse data | 1 | Completion Code 0x80 = message type number not supported |
2 | Version Number Entry count 返回One-based的 32-bit 版本号计数,首先返回数值较低的版本号。 | |
3:6 | Version Number entry [31:24] = major version number.主要版本号 [23:16] = minor version number.次要版本号 [15:8] = update version number.更新版本号 [7:0] = "alpha"byte.预发布版本号 | |
(7:X) | Version Number Entries 2 through N. Additional 32-bit major/minor version numbers.if any |
5.1.5 Get Message Type Support(0x05)
Get Message Type Support命令使管理控制器能够发现其他MCTP端点支持的MCTP控制协议功能,并获得端点支持的MCTP消息类型列表。
Byte | Description | |
---|---|---|
Request data | - | - |
Response data | 1 | Completion Code. |
2 | MCTP Message Type Count. One-based. 除了该端点支持的MCTP控制消息类型之外,消息类型的数量 | |
(3:N) | 列出Message Type数量,每个类型一个字节。 |
5.1.6 Prepare for Endpoint Discovery (0x0B)
Endpoint Discovery命令是用于确认总线上是否有MCTP通信的设备。目前该消息可能仅由特定的transport binding,例如PCI Express VDM。因为其它的binding例如SMBus/I2C可能使用其它机制来确认该信息,如果binding的是SMBus/I2C,是不支持Endpoint Discovery命令,端点将为这些命令返回 ERROR_UNSUPPORTED_CMD 完成状态。
总线上每个端点(总线owner除外)都维护一个称为“Discovered” flag的内部标志。
Prepare for Endpoint Discovery命令通过给总线上发送广播请求消息,可以使总线上每一个端点将各自的“Discovered” flag设置为“undiscovered”状态。当Endpoint接收到Set Endpoint ID命令时,该标志随后也被设置为“discovered”状态。
只有将Discovered flag设置为“undiscovered”的Endpoint才会响应该消息,将Discovered flag设置为“discovered”的Endpoint不会响应。
Endponit还可以在以下时刻将flag设置为“undiscovered”状态:
- 当Endpoint关联的物理地址发生变化或配置时。
- 当Endpoint首次出现在总线上,并需要分配EID时。
- 在操作期间,如果Endpoint进入要重新分配EID的状态时。
- 对于hot-plug Endpoint:在hot-plug endpoint无法响应MCTP Control Requests,并超过SMBus超时时间,处于任何临时状态时。
Byte | Description | |
---|---|---|
Request data | - | - |
Response data | 1 | Completion Code |
5.1.7 Endpoint Discovery (0x0C)
Endpoint Discovery命令用于发现Discovered flag设置为“undiscovered”的端点。只有将Discovered flag设置为“undiscovered”的端点才会响应此消息。将表示设置为“discovered”的端点不会响应。
该消息通常作为广播请求发送,由总线owner使用广播EID作为destination EID,出于测试目的,端点也应接收并处理非广播包的请求。
Byte | Description | |
---|---|---|
Request data | - | - |
Response data | 1 | Completion Code |
5.2 MCTP control message completion codes
Command / Result code字段用于在Response Messages 中返回管理的结果。如果返回SUCCESS的completion code,则也应该返回指定的响应参数(如果有的话)。如果responder返回 errror completion code(not SUCCESS)。除非另有规定,否则responder不应该返回任何额外的参数数据。requester应该忽略reponder中提供的任何额外参数数据(如果有的话)。
Value | Name | Description |
0x00 | SUCCESS | 请求被正常接收并完成。 |
0x01 | ERROR | 通用的错误信息,如果应用有更具体的结果代码时,不应该使用它。 |
0x02 | ERROR_INVALID_DATA | packet payload中包含无效数据或参数值不合法。 |
0x03 | ERROR_INVALID_LENGTH | 消息长度无效。(消息体大于或小于特定请求的预期值) |
0x04 | ERROR_NOT_READY | 接收方还没有准备好接收相应的消息 |
0x05 | ERROR_UNSUPPORTED_CMD | 接收到的消息的control type在此端点上不支持。 |
0x80 - 0xFF | COMMAND_SPECIFIC | 此completion code值范围保留给特定的MCTP control messages。 |
All other | Reserved | Reserved |