---
title: I2C管理接口
description: "CPLD通过了一组I2C管理接口实现与BMC通信功能。包括："
url: https://www.hikunpeng.com/document/detail/zh/kunpengmodule/S920X08/mhg/S920X08_41_0093.html
sourcePath: /source/zh/kunpengmodule/S920X08/mhg/S920X08_41_0093.html
indexId: 0065804e7e169b95481e8c64bac629da77775e8bcf9e00dc46ac5f15c26ed2f757
---
# I2C管理接口

CPLD通过了一组I2C管理接口实现与BMC通信功能。包括：

- 模组基本信息查询。
- CPU相关信息查询与配置。
- 模组复位控制。
- 高速设备信息查询。
- 传感器信息查询。
- 电源控制及状态查询等。

BMC采用统一的接口与协议实现对组件的管理，SMC（Satellite Manager Controller）用于智能组件管理，具有以下特点：

- 采用命令+响应的方式交互数据。
- 通信容量大。
- 采用I2C作为底层链路，链路设计简单，节约IO资源。
- 整个传输过程自带CRC校验，数据传输可靠。

如图1所示，I2C根链路接地址固定为0xAE的EEPROM，BMC到每个组件的根链路下下挂SMC器件，BMC通过SMC命令字访问CPLD，CPLD的SMC模块的默认I2C地址为0x60。

图1 典型组件管理拓扑示意图

一次完整的读取流程包括读取请求和读取响应两个部分，如图2和图3所示。两个部分必须配套使用，中间不能穿插其他命令。数据字段的描述定义了读取流程的详细信息，如表1所示。

图2 SMC读取请求操作

图3 SMC读取响应操作


**表1 数据字段描述**

| 字段 | 描述 | 详细定义 |
| --- | --- | --- |
| SlaveAddress | SMC从设备地址 | 从机I2C地址 |
| CommandCode | 命令类型 | 20h：Write Opcode<br> 21h：ReadBuffer<br> 22h：WriteOpcodeWithData<br> 30h：WriteOpcode\-Forward<br> 31h：ReadBuffer\-Forward |
| Length | 命令长度 | 表示命令中Length之后，CRC之前的数据个数 |
| Completion Code | 完成码 | 0h：Success<br> 1h：Opcode Not Support<br> 2h：Data Not Ready<br> 3h：Parameter Error<br> 4h：Internal Error<br> 5h：CRC Error<br> 6h：Device Error |
| CRC8 | CRC校验码 | 参考Smbus PEC机制，CRC多项式使用x8+x2+x1+1，从DEV\_ADDR开始计算 |
| Opcode | 命令字 | 详见图4 |


SMC使用命令字进行管脚功能配置，命令字的格式描述如表2所示。


**表2 SMC命令字描述**

| Function(6bit) | Command(24) | MS(1) | RW(1) | Parameter(8) |
| --- | --- | --- | --- | --- |
| 0：公共功能<br> 1：扩展组件管理功能<br> 2：机箱部件管理功能<br> 3：计算部件管理功能<br> 4：内存部件管理功能<br> 5：存储部件管理功能<br> 6：散热部件管理功能<br> 7：IO扩展部件管理功能<br> 8：加速扩展部件管理功能<br> | 命令字<br> 见接口定义 | 0：多个读取<br> 1：单个读取 | 0：写入<br> 1：读取 | 1\-N：获取/设置第N个设备信息 |


协议定义了位读，块读，位写、块写4种操作模式。

位读：M/S=1;RW=1；Param=要读取的设备/对象序号; 返回单个对象的数据。

块读：M/S=0;RW=1；Param=0；返回该命令所有数据。

位写：M/S=1;RW=0；Param=要读取的设备/对象序号。

块写：M/S=0;RW=0；Param=0。

Function、Command、MS和RW组合在一起为Opcode，定义如图4所示。具体的SMC命令字信息参考表3/表4/表5。

图4 Opcode定义


**表3 BMC SMC命令字-0h通用功能**

| Command | M=0,S=1/ R=1,W=0/ Param | 描述 | 标准命令字 | 数据定义 | 数据定义 | 备注 |
| --- | --- | --- | --- | --- | --- | --- |
| 1h | 0/1/0 | 查询硬件信息 | Get Hardware Version | [15:8] | 保留/board\_id | 首版本预留 |
| 1h | 0/1/0 | 查询硬件信息 | Get Hardware Version | [7:4] | BOM版本 | 首版本预留 |
| 1h | 0/1/0 | 查询硬件信息 | Get Hardware Version | [3:0] | PCB版本 | 首版本预留 |
| 2h | 0/1/0 | 查询软件信息 | Get Software Version | [31:24] | RSVD | \- |
| 2h | 0/1/0 | 查询软件信息 | Get Software Version | [23:16] | DFX的数据长度(N)\-最多255Bytes | \- |
| 2h | 0/1/0 | 查询软件信息 | Get Software Version | [15:8] | SMC响应命令间隔（ms） | \- |
| 2h | 0/1/0 | 查询软件信息 | Get Software Version | [7:0] | 背板CPLD Ver（格式：高四位.低四位），如数据0x11代表1.01版本 | \- |
| 3h | 0/1/0 | 查询组件工作模式 | Get Unit Workmode | [7:0] | 查询组件当前工作模式 =0h \- 正常模式 =1h \- 装备测试模式 | \- |
| 3h | 1/0/1 | 设置组件工作模式 | Set Unit Workmode | [7:0] | 让组件进入生产测试模式，执行LED等测试项 =0h \- 正常模式 =1h \- 装备测试模式 | \- |
| 4h | 0/1/0 | 获取所有传感器读值 | Get Sensor Info | [127:112] | stby\_3v3 adc采样电压\*2=实际电压 | ADC采样电压： 寄存器值/0x7fff\*2.5=采样电压 2N=18，N为设备个数 |
| 4h | 0/1/0 | 获取所有传感器读值 | Get Sensor Info | [111:96] | stby\_1v8 adc采样电压\*1=实际电压 | ADC采样电压： 寄存器值/0x7fff\*2.5=采样电压 2N=18，N为设备个数 |
| 4h | 0/1/0 | 获取所有传感器读值 | Get Sensor Info | [95:80] | vcc\_12v0 adc采样电压\*6=实际电压 | ADC采样电压： 寄存器值/0x7fff\*2.5=采样电压 2N=18，N为设备个数 |
| 4h | 0/1/0 | 获取所有传感器读值 | Get Sensor Info | [79:64] | 3V3\_vcc adc采样电压\*2=实际电压 | ADC采样电压： 寄存器值/0x7fff\*2.5=采样电压 2N=18，N为设备个数 |
| 4h | 0/1/0 | 获取所有传感器读值 | Get Sensor Info | [63:48] | 0v9\_vddavs adc采样电压\*1=实际电压 | ADC采样电压： 寄存器值/0x7fff\*2.5=采样电压 2N=18，N为设备个数 |
| 4h | 0/1/0 | 获取所有传感器读值 | Get Sensor Info | [47:32] | 1v8\_cpu adc采样电压\*1=实际电压 | ADC采样电压： 寄存器值/0x7fff\*2.5=采样电压 2N=18，N为设备个数 |
| 4h | 0/1/0 | 获取所有传感器读值 | Get Sensor Info | [31:16] | MOS附近板温 | ADC采样电压： 寄存器值/0x7fff\*2.5=采样电压 2N=18，N为设备个数 |
| 4h | 0/1/0 | 获取所有传感器读值 | Get Sensor Info | [15:0] | 电感背面板温 | ADC采样电压： 寄存器值/0x7fff\*2.5=采样电压 2N=18，N为设备个数 |
| 6h | 0/1/0 | 查询固件开发时间 | Get SMC Release Time | [39:32] | 年 | 查询固件开发的时间 |
| 6h | 0/1/0 | 查询固件开发时间 | Get SMC Release Time | [31:24] | 月 | 查询固件开发的时间 |
| 6h | 0/1/0 | 查询固件开发时间 | Get SMC Release Time | [23:16] | 日 | 查询固件开发的时间 |
| 6h | 0/1/0 | 查询固件开发时间 | Get SMC Release Time | [15:8] | 时 | 查询固件开发的时间 |
| 6h | 0/1/0 | 查询固件开发时间 | Get SMC Release Time | [7:0] | 分 | 查询固件开发的时间 |
| 7h | 0/1/0 | 获取DFX信息 | Get DFX Info | NA | 采用块读方案，DFX数据的长度在命令字2h中可以获取到 | 产品CPLD存储数据，由产品硬件自定义。BMC合入此需求，CPLD需要支持该命令，可以全0；BMC软件在执行一键日志收集的时候通过该命令字将所有的硬件DFX信息收集下来，逻辑在该命令字的数据中填写所有有用的数据（即原CPLD全寄存器收集功能，逻辑命令字返回数据的合集），响应数据长度为82Byte。 |
| 8h | 0/1/0 | 查询Test寄存器 | Get Test Reg | [7:0] | 测试寄存器：55h或Aah | BMC：交替向Test寄存器中写入55h和Aah，再读取Test寄存器；组件：判断Test寄存器数值是否持续变化 |
| 8h | 1/0/1 | 设置Test寄存器 | Set Test Reg | [7:0] | 测试寄存器：55h或Aah | BMC：交替向Test寄存器中写入55h和Aah，再读取Test寄存器；组件：判断Test寄存器数值是否持续变化 |
| 9h | 0/1/0 | 查询组件CPLD的升级方式 | Get SMC Upgrade Info | [15:8] | Localbus模拟JTAG升级通道 =0h \- BMC JTAG管脚直接升级 =xh \- JTAG升级通道（模组板02h） | 描述组件CPLD的JTAG升级通道，与扩展板的SMC命令字Eh对应 |
| 9h | 0/1/0 | 查询组件CPLD的升级方式 | Get SMC Upgrade Info | [7:0] | 组件CPLD升级模式 =0h \- 自升级 =1h \- BMC的JTAG管脚直接升级（扩展板） =2h \- Localbus模拟JTAG升级（其他组件） =3h \- I2C升级 | 描述组件中CPLD的升级方式，扩展板CPLD在BMC的JTAG管脚下直接升级，其余组件通过Localbus模拟JTAG链路 |
| Ah | 0/1/0 | 查询组件上电标识 | Get Unit PowerStatus | [7:0] | =0h \- 没有正常上电 =1h \- 组件业务电所有电源已正常上电 | \- |
| Bh | 0/1/0 | 查询组件EEPROM写保护状态 | Get CSR WP Status | [7:0] | =0h \- 关闭写保护 =1h \- 打开写保护 | 此处的EEPROM是指存放CDR的EEPROM |
| Bh | 1/0/1 | 设置组件EEPROM写保护状态 | Set CSR WP Status | [7:0] | =0h \- 关闭写保护 =1h \- 打开写保护 | 此处的EEPROM是指存放CDR的EEPROM |


**表4 BMC SMC命令字-3h计算部件管理**

| Command | M=0,S=1/ R=1,W=0/ Param | 描述 | 标准命令字 | 数据定义 | 数据定义 | 备注 |
| --- | --- | --- | --- | --- | --- | --- |
| 2h | 0/1/0 | 查询系统事件 | Get System Event | [7:5] | 保留 | \- |
| 2h | 0/1/0 | 查询系统事件 | Get System Event | 4 | 基础板电源上电超时事件（vcc\_time\_out） =0h \- 无效 =1h \- 有效 | \- |
| 2h | 0/1/0 | 查询系统事件 | Get System Event | 3 | 基础板电源异常掉电事件（vcc\_power\_fail） =0h \- 无效 =1h \- 有效 | \- |
| 2h | 0/1/0 | 查询系统事件 | Get System Event | 2 | IMU使能复位业务系统事件（os\_rst\_n\_event） =0h \- 正常，无事件产生 =1h \- 产生复位事件 | IMU通过写CPLD寄存器复位OS |
| 2h | 0/1/0 | 查询系统事件 | Get System Event | 1 | BMC或板内跳冒使能复位业务系统事件（bmc\_sysrst\_en\_event） =0h \- 无效 =1h \- 有效 | \- |
| 2h | 0/1/0 | 查询系统事件 | Get System Event | 0 | 业务系统解复位事件（pltrst\_event） =0h \- 无效 =1h \- 有效 | \- |
| 2h | 1/0/1 | 清除系统事件 | Clear System Event | [7:5] | 保留 | \- |
| 2h | 1/0/1 | 清除系统事件 | Clear System Event | 4 | 清除业务系统上电超时事件（clear\_vcc\_time\_out） =0h \- 清除上电超时 =1h \- default | \- |
| 2h | 1/0/1 | 清除系统事件 | Clear System Event | 3 | 清除业务系统异常掉电事件（clear\_vcc\_power\_fail） =0h \- 清除异常掉电 =1h \- default | \- |
| 2h | 1/0/1 | 清除系统事件 | Clear System Event | 2 | 清除IMU使能复位业务系统事件（clear\_bmc\_os\_rst\_n） =0h \- 清除复位事件（写清） =1h \- default | \- |
| 2h | 1/0/1 | 清除系统事件 | Clear System Event | 1 | 清除BMC或板内跳冒使能复位业务系统事件（clear\_bmc\_sysrst\_en） =0h \- 清除复位事件（写清） =1h \- default | \- |
| 2h | 1/0/1 | 清除系统事件 | Clear System Event | 0 | 清除业务系统复位事件（clear\_pltrst\_event） =0h \- 清除复位事件（写清） =1h \- default | \- |
| 3h | 0/1/0 | 上电超时电源告警码 | Get PowerFail Code | [7:0] | 基础板电源上电超时告警码， 指示当前具体电源告警 | \- |
| 4h | 0/1/0 | 异常掉电电源告警码 | \- | [7:0] | 基础板电源异常掉电告警码， 指示当前具体电源告警 | \- |
| 6h | 0/1/0 | 查询BMC复位系统寄存器 | Get System Reset Status | [7:2] | 保留 | \- |
| 6h | 0/1/0 | 查询BMC复位系统寄存器 | Get System Reset Status | 1 | BMC控制CPLD模拟前面板RST键，复位业务系统（bmc\_sysrst） =0h \- 默认值 =1h \- 模拟面板复位 | \- |
| 6h | 0/1/0 | 查询BMC复位系统寄存器 | Get System Reset Status | 0 | BMC控制CPLD操作ME\_RST，复位IMU（ME）系统（bmc\_me\_rst\_en） =0h \- 默认值 =1h \- 复位IMU | \- |
| 6h | 1/0/1 | 设置BMC复位系统寄存器 | Reset System | [7:2] | 保留 | \- |
| 6h | 1/0/1 | 设置BMC复位系统寄存器 | Reset System | 1 | BMC控制CPLD模拟前面板RST键，复位业务系统（bmc\_sysrst） =0h \- 默认值 =1h \- 模拟面板复位 | \- |
| 6h | 1/0/1 | 设置BMC复位系统寄存器 | Reset System | 0 | BMC控制CPLD操作ME\_RST，复位IMU（ME）系统（bmc\_me\_rst\_en） =0h \- 默认值 =1h \- 复位IMU | \- |
| 7h | 0/1/0 | 查询外设复位状态 | \- | [7:3] | 保留 | \- |
| 7h | 0/1/0 | 查询外设复位状态 | \- | 2 | BMC PCIe接口和LPC接口复位 =0h \- 解复位 =1h \- 复位 | \- |
| 7h | 0/1/0 | 查询外设复位状态 | \- | 1 | CPU LPC接口复位 =0h \- 解复位 =1h \- 复位 | \- |
| 7h | 0/1/0 | 查询外设复位状态 | \- | 0 | 保留 | \- |
| 7h | 1/0/1 | 设置外设复位状态 | \- | [7:3] | 保留 | \- \- \- \- |
| 7h | 1/0/1 | 设置外设复位状态 | \- | 2 | BMC PCIe接口和LPC接口复位 =0h \- default =1h \- 复位（写清） | \- \- \- \- |
| 7h | 1/0/1 | 设置外设复位状态 | \- | 1 | CPU LPC接口复位 =0h \- default =1h \- 复位（写清） | \- \- \- \- |
| 7h | 1/0/1 | 设置外设复位状态 | \- | 0 | 保留 | \- \- \- \- |
| 8h | 0/1/0 | 查询CPU状态 | Get CPU Status | [15:5] | 预留 | \- |
| 8h | 0/1/0 | 查询CPU状态 | Get CPU Status | 4 | rst\_out\_cpu1\_tb\_n上报（业务电上电有效） =0h \- 正常 =1h \- 有复位事件发生 | \- |
| 8h | 0/1/0 | 查询CPU状态 | Get CPU Status | 3 | 预留 | \- |
| 8h | 0/1/0 | 查询CPU状态 | Get CPU Status | 2 | imu\_caterr（业务电上电有效） =0h \- 正常 =1h \- 有复位事件发生 | \- |
| 8h | 0/1/0 | 查询CPU状态 | Get CPU Status | 1 | os\_halt\_detect（业务电上电有效） =0h \- 正常 =1h \- 有复位事件发生 | \- |
| 8h | 0/1/0 | 查询CPU状态 | Get CPU Status | 0 | 系统复位事件汇聚 =0h \- 正常 =1h \- 有复位事件发生 | \- |
| 9h | 0/1/0 | 查询CPU Efuse电源状态 | Get CPU Efuse Power Status | 1 | CPU0 eFuse 1.8V PG信号 =0h \- eFuse电源不工作或异常 =1h \- eFuse电源工作正常 | \- |
| 9h | 0/1/0 | 查询CPU Efuse电源状态 | Get CPU Efuse Power Status | 0 | CPU0 eFuse 1.8V 使能信号（业务电上电有效） =1h \- eFuse电源未使能 =0h \- eFuse电源使能 | \- |
| Bh | 0/1/0 | 查询100M时钟是否丢失 | \- | [7:1] | 保留 | \- |
| Bh | 0/1/0 | 查询100M时钟是否丢失 | \- | 0 | 100M时钟是否丢失 =0h \- 时钟丢失 =1h \- 正常 | \- |
| Dh | 0/1/0 | 查询所有处理器状态 响应数据长度为1\*N N=CPU数量 | Get CPU Event | 7 | CPU2 Prochot信号(BIOS寄存器发送sys) =0h \- 未使能 =1h \- 使能 | CPU2进行降频标记，由BIOS实时控制，BMC可读 0：未发生降频 1：发生降频 |
| Dh | 0/1/0 | 查询所有处理器状态 响应数据长度为1\*N N=CPU数量 | Get CPU Event | 6 | CPU2 Thremtrip信号(BIOS寄存器发送sys) =0h \- 未使能 =1h \- 使能 | CPU2发生thermtrp掉电事件 1：事件发生，BMC清零清事件 0：未发生该事件 |
| Dh | 0/1/0 | 查询所有处理器状态 响应数据长度为1\*N N=CPU数量 | Get CPU Event | 5 | CPU1 系统复位事件汇聚 =0h \- 正常 =1h \- 有复位事件发生 | \- |
| Dh | 0/1/0 | 查询所有处理器状态 响应数据长度为1\*N N=CPU数量 | Get CPU Event | 4 | CPU1 caterr信号 =0h \- 无效 =1h \- 有效 | cpu1\_caterr\_n\_effect（33a bit1）\-catmcerr |
| Dh | 0/1/0 | 查询所有处理器状态 响应数据长度为1\*N N=CPU数量 | Get CPU Event | 3 | CPU1 Prochot信号(BIOS寄存器发送sys) =0h \- 未使能 =1h \- 使能 | CPU1进行降频标记，由BIOS实时控制，BMC可读 0：未发生降频 1：发生降频 |
| Dh | 0/1/0 | 查询所有处理器状态 响应数据长度为1\*N N=CPU数量 | Get CPU Event | 2 | CPU1 Thremtrip信号(BIOS寄存器发送sys) =0h \- 未使能 =1h \- 使能 | CPU1发生thermtrp掉电事件 1：事件发生，BMC清零清事件 0：未发生该事件 |
| Dh | 0/1/0 | 查询所有处理器状态 响应数据长度为1\*N N=CPU数量 | Get CPU Event | 1 | CPU1 smimcErr信号 =0h \- 无效 =1h \- 有效 | cpu1\_prochot\_n\_effect（33a bit2）\-smimcerr 新增 |
| Dh | 0/1/0 | 查询所有处理器状态 响应数据长度为1\*N N=CPU数量 | Get CPU Event | 0 | CPU1在位状态 =0h \- 不在位 =1h \- 在位 | \- |
| Dh | 1/0/1 | 清除处理器状态（N=CPU数量） 响应数据长度为2 （自发现版本修改为1） | Clear CPU Event | 2 | Thremtrip信号(clear\_cpu1\_thermtrip\_event) =0h \- 清除thremtrip（写清） =1h \- default | 0：清除告警事件 1：不清除 （Param：自发现版本修改为N） |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [343:336] | CPU2 Hilink10 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [335:328] | CPU2 Hilink10 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [327:320] | CPU2 Hilink9 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [319:312] | CPU2 Hilink9 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [311:304] | CPU2 Hilink8 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [303:296] | CPU2 Hilink8 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [295:288] | CPU2 Hilink7 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [287:280] | CPU2 Hilink7 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [279:272] | CPU2 Hilink6 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [271:264] | CPU2 Hilink6 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [263:256] | CPU2 Hilink5 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [255:248] | CPU2 Hilink5 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [247:240] | CPU2 Hilink4 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [239:232] | CPU2 Hilink4 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [231:224] | CPU2 Hilink3 带宽配置 | 03h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [223:216] | CPU2 Hilink3 PCIe/SerDes模式配置 | 06h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [215:208] | CPU2 Hilink2 带宽配置 | 03h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [207:200] | CPU2 Hilink2 PCIe/SerDes模式配置 | 06h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [199:192] | CPU2 Hilink1 带宽配置 | 02h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [191:184] | CPU2 Hilink1 PCIe/SerDes模式配置 | 02h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [183:176] | CPU2 Hilink0 带宽配置 | 02h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [175:168] | CPU2 Hilink0 PCIe/SerDes模式配置 | 02h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [175:168] | CPU1 Hilink10 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [167:160] | CPU1 Hilink10 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [159:152] | CPU1 Hilink9 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [151:144] | CPU1 Hilink9 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [143:136] | CPU1 Hilink8 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [135:128] | CPU1 Hilink8 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [127:120] | CPU1 Hilink7 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [119:112] | CPU1 Hilink7 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [111:104] | CPU1 Hilink6 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [103:96] | CPU1 Hilink6 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [95:88] | CPU1 Hilink5 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [87:80] | CPU1 Hilink5 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [79:72] | CPU1 Hilink4 带宽配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [71:64] | CPU1 Hilink4 PCIe/SerDes模式配置 | \- |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [63:56] | CPU1 Hilink3 带宽配置 | 03h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [55:48] | CPU1 Hilink3 PCIe/SerDes模式配置 | 06h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [47:40] | CPU1 Hilink2 带宽配置 | 03h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [39:32] | CPU1 Hilink2 PCIe/SerDes模式配置 | 06h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [31:24] | CPU1 Hilink1 带宽配置 | 02h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [23:16] | CPU1 Hilink1 PCIe/SerDes模式配置 | 02h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [15:8] | CPU1 Hilink0 带宽配置 =0h \- 默认配置 =1h \-1X16 =2h \-1X8/2X8 =3h \-1X4/2X4/4X4 =4h \- 2X2/4X2/8X2 =5h \- X4X2X2 =6h \- X2X2X4 =7h \- X8X4X4 =8h \- X4X4X8 =9h \- X8X4X2X2 | 02h |
| Fh | 0/1/0 | 查询所有CPU的Port(Hilink)的PCIe/SerDes配置 响应数据长度为22\*N N=IO Die数量 | Get CPU HighLink Config | [7:0] | CPU1 Hilink0 PCIe/SerDes模式配置 =0h \- 默认配置 =1h \- PCIe =2h \- HCCS/DMI =3h \- (SATA+PCIE)/SATA =4h \- SAS =5h \- CXL =6h \- ETH/GBE =7h \- USB =8h \- 通过GPIO选择复用 | 02h |
| 21h | 0/1/0 | 电源告警记录锁存寄存器 | Get PowerFail Event | [7:4] | 预留 | \- |
| 21h | 0/1/0 | 电源告警记录锁存寄存器 | Get PowerFail Event | 3 | 单板锁存异常记录指示寄存器 1：单板锁存异常未记录 0：单板锁存异常已记录 写0以清除 | latch\_issue\_record\_tag |
| 21h | 0/1/0 | 电源告警记录锁存寄存器 | Get PowerFail Event | 2 | 单板锁存异常指示寄存器 1：单板发生过异常，被锁存 0：单板未发生过异常 | latch\_issue\_tag |
| 21h | 0/1/0 | 电源告警记录锁存寄存器 | Get PowerFail Event | 1 | 单板当前错误记录指示寄存器 1：单板当前异常未记录 0：单板当前异常已记录 写0以清除 | issue\_record\_tag |
| 21h | 0/1/0 | 电源告警记录锁存寄存器 | Get PowerFail Event | 0 | 单板当前异常指示寄存器 1：单板当前状态异常 0：单板当前状态单板正常 | issue\_tag |
| 21h | 1/0/1 | 清除电源告警记录锁存寄存器 | Clear PowerFail Event | [7:4] | 预留 | \- |
| 21h | 1/0/1 | 清除电源告警记录锁存寄存器 | Clear PowerFail Event | 3 | 清除单板锁存异常记录指示寄存器 1：default 0：清除单板锁存异常记录 写0以清除 | clear\_latch\_issue\_record\_tag |
| 21h | 1/0/1 | 清除电源告警记录锁存寄存器 | Clear PowerFail Event | 1 | 清除单板当前错误记录指示寄存器 1：default 0：清除单板当前异常记录 写0以清除 | clear\_issue\_record\_tag |
| E0h | 0/1/0 | 获取SSC生效状态 | GET\_SSC\_ENABLE | [7:1] | 保留 | \- |
| E0h | 0/1/0 | 获取SSC生效状态 | GET\_SSC\_ENABLE | 0 | 查询SSC生效状态 =0h \-SSC功能不使能 =1h \-SSC功能使能 | 先设置SSC\_MODE和SSC\_NUM，然后设置SSC\_ENABLE，查询SSC\_END为1后，再上电开机（整机AC上电后，设置完SSC，再开机，如要修改SSC，需要AC上电或者模组板CPLD复位） |
| E0h | 1/0/1 | 设置SSC生效状态 | SET\_SSC\_ENABLE | [7:1] | 保留 | 先设置SSC\_MODE和SSC\_NUM，然后设置SSC\_ENABLE，查询SSC\_END为1后，再上电开机（整机AC上电后，设置完SSC，再开机，如要修改SSC，需要AC上电或者模组板CPLD复位） |
| E0h | 1/0/1 | 设置SSC生效状态 | SET\_SSC\_ENABLE | 0 | 设置SSC生效状态 =0h \-SSC功能不使能 =1h \-SSC功能使能 | 先设置SSC\_MODE和SSC\_NUM，然后设置SSC\_ENABLE，查询SSC\_END为1后，再上电开机（整机AC上电后，设置完SSC，再开机，如要修改SSC，需要AC上电或者模组板CPLD复位） |
| E1h | 0/1/0 | 获取SSC模式状态 | GET\_SSC\_MODE | [7:1] | 保留 | 先设置SSC\_MODE和SSC\_NUM，然后设置SSC\_ENABLE，查询SSC\_END为1后，再上电开机（整机AC上电后，设置完SSC，再开机，如要修改SSC，需要AC上电或者模组板CPLD复位） |
| E1h | 0/1/0 | 获取SSC模式状态 | GET\_SSC\_MODE | 0 | 查询SSC模式状态 =0h \-负频偏 =1h \- 正频偏 | 先设置SSC\_MODE和SSC\_NUM，然后设置SSC\_ENABLE，查询SSC\_END为1后，再上电开机（整机AC上电后，设置完SSC，再开机，如要修改SSC，需要AC上电或者模组板CPLD复位） |
| E1h | 1/0/1 | 设置SSC模式状态 | SET\_SSC\_MODE | [7:1] | 保留 | 先设置SSC\_MODE和SSC\_NUM，然后设置SSC\_ENABLE，查询SSC\_END为1后，再上电开机（整机AC上电后，设置完SSC，再开机，如要修改SSC，需要AC上电或者模组板CPLD复位） |
| E1h | 1/0/1 | 设置SSC模式状态 | SET\_SSC\_MODE | 0 | 设置SSC模式状态 =0h \-负频偏 =1h \- 正频偏 | 先设置SSC\_MODE和SSC\_NUM，然后设置SSC\_ENABLE，查询SSC\_END为1后，再上电开机（整机AC上电后，设置完SSC，再开机，如要修改SSC，需要AC上电或者模组板CPLD复位） |
| E2h | 0/1/0 | 获取SSC 频偏值 | GET\_SSC\_NUM | [7:0] | 查询SSC 频偏值 00h~ffh 频偏值 | 先设置SSC\_MODE和SSC\_NUM，然后设置SSC\_ENABLE，查询SSC\_END为1后，再上电开机（整机AC上电后，设置完SSC，再开机，如要修改SSC，需要AC上电或者模组板CPLD复位） |
| E2h | 1/0/1 | 设置SSC 频偏值 | SET\_SSC\_NUM | [7:0] | 设置SSC 频偏值 00h~ffh 频偏值 | 先设置SSC\_MODE和SSC\_NUM，然后设置SSC\_ENABLE，查询SSC\_END为1后，再上电开机（整机AC上电后，设置完SSC，再开机，如要修改SSC，需要AC上电或者模组板CPLD复位） |
| E3h | 0/1/0 | 获取SSC 调频是否结束 | GET\_SSC\_END | [7:1] | 保留 | 先设置SSC\_MODE和SSC\_NUM，然后设置SSC\_ENABLE，查询SSC\_END为1后，再上电开机（整机AC上电后，设置完SSC，再开机，如要修改SSC，需要AC上电或者模组板CPLD复位） |
| E3h | 0/1/0 | 获取SSC 调频是否结束 | GET\_SSC\_END | 0 | 查询SSC 调频是否结束 =0h \-调频未结束 =1h \- 调频结束 | 先设置SSC\_MODE和SSC\_NUM，然后设置SSC\_ENABLE，查询SSC\_END为1后，再上电开机（整机AC上电后，设置完SSC，再开机，如要修改SSC，需要AC上电或者模组板CPLD复位） |
| E4h | 1/0/1 | BMC控制上下电 | SET\_BMC\_PWR\_UPDOWN | [7:2] | 保留 | \- |
| E4h | 1/0/1 | BMC控制上下电 | SET\_BMC\_PWR\_UPDOWN | 1 | bmc\_pwr\_up写1上电（写清） | \- |
| E4h | 1/0/1 | BMC控制上下电 | SET\_BMC\_PWR\_UPDOWN | 0 | bmc\_pwr\_down写1下电（写清） | \- |
| F1h | 0/1/0 | 查询VRD fw生效状态 | Get VRD Upgrade Status | [7:1] | 保留 | \- |
| F1h | 0/1/0 | 查询VRD fw生效状态 | Get VRD Upgrade Status | 0 | 查询VRD固件生效 =0h \-正常工作状态 =1h \- 生效VR固件 | \- |
| F1h | 1/0/1 | 设置VRD fw生效状态 | Set VRD Upgrade Status | [7:1] | 保留 | \- |
| F1h | 1/0/1 | 设置VRD fw生效状态 | Set VRD Upgrade Status | 0 | 设置VRD固件生效 =0h \-default =1h \- 生效VR固件（写清） | BMC写1生效，逻辑自动清除 |
| F2h | 0/1/0 | VR 固件类型区分 | Get VRDfw Type | [7:2] | 保留 | 用于BMC区分当前基础板上上件的VR控制器和DrMOS厂家，BMC通过不同的组合选择不同的升级文件和流程 |
| F2h | 0/1/0 | VR 固件类型区分 | Get VRDfw Type | [1:0] | VRD控制器类型： 01=SD5003 00=IFX 10=MPS 11=RSV | 用于BMC区分当前基础板上上件的VR控制器和DrMOS厂家，BMC通过不同的组合选择不同的升级文件和流程 |


**表5 BMC SMC命令字-Ah增强功能**

| Command | M=0,S=1/ R=1,W=0/ Param | 描述 | 标准命令字 | 数据定义 | 数据定义 | 备注 |
| --- | --- | --- | --- | --- | --- | --- |
| 4h | 1/0/1 | BIOS配置 | Clear BIOS CMOS | [7:1] | 保留 | \- |
| 4h | 1/0/1 | BIOS配置 | Clear BIOS CMOS | 0 | 清除CMOS =0h \- 无效 =1h \- 有效 | 用于清除CMOS \- BIOS恢复默认设置，需要和BIOS核对解耦情况 |
| 4h | 0/1/1 | BIOS配置 | GET Clear BIOS CMOS | [7:1] | 保留 | \- |
| 4h | 0/1/1 | BIOS配置 | GET Clear BIOS CMOS | 0 | 清除CMOS =0h \- 无效 =1h \- 有效 | 获取BIOS清除CMOS功能 |


协议定义规则：

- 单个Opcode，单个设备数据读取/写入长度应固定。实际数据长度跟设备数目相关，由SMC定义。
- 通过不同命令字（固定BIT）区分读取单个还是读多个。
- 通过不同命令字（固定BIT）区分读写。
- Opcode定义时，需要考虑读取频率，尽可能将高频读取的数据整合到一个Opcode中。
- 控制命令需要根据实际应该场景定义，尽可能单独定义。
- 多字节传输时低字节在前。
- Param参数中N从1开始计数。
