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。
一次完整的读取流程包括读取请求和读取响应两个部分,如图2和图3所示。两个部分必须配套使用,中间不能穿插其他命令。数据字段描述定义了读取流程的详细信息,如表1所示。
字段 |
描述 |
详细定义 |
---|---|---|
SlaveAddress |
SMC从设备地址 |
从机I2C地址 |
CommondCode |
命令类型 |
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所示。
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。
Command |
M=0,S=1/ R=1,W=0/ Param |
描述 |
标准命令字 |
数据定义 |
备注 |
|
---|---|---|---|---|---|---|
1h |
0/1/0 |
查询硬件信息 |
Get Hardware Version |
[15:8] |
保留/board_id |
首版本预留 |
[7:4] |
BOM版本 |
|||||
[3:0] |
PCB版本 |
|||||
2h |
0/1/0 |
查询软件信息 |
Get Software Version |
[31:24] |
RSVD |
- |
[23:16] |
DFX的数据长度(N)-最多255Bytes |
|||||
[15:8] |
SMC响应命令间隔(ms) |
|||||
[7:0] |
背板CPLD Ver(格式:高四位.低四位),如数据0x11代表1.01版本 |
|||||
3h |
0/1/0 |
查询组件工作模式 |
Get Unit Workmode |
[7:0] |
查询组件当前工作模式 =0h - 正常模式 =1h - 装备测试模式 |
- |
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为设备个数 |
[111:96] |
stby_1v8 adc采样电压*1=实际电压 |
|||||
[95:80] |
vcc_12v0 adc采样电压*6=实际电压 |
|||||
[79:64] |
3V3_vcc adc采样电压*2=实际电压 |
|||||
[63:48] |
0v9_vddavs adc采样电压*1=实际电压 |
|||||
[47:32] |
1v8_cpu adc采样电压*1=实际电压 |
|||||
[31:16] |
MOS附近板温 |
|||||
[15:0] |
电感背面板温 |
|||||
6h |
0/1/0 |
查询固件开发时间 |
Get SMC Release Time |
[39:32] |
年 |
查询固件开发的时间 |
[31:24] |
月 |
|||||
[23:16] |
日 |
|||||
[15:8] |
时 |
|||||
[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寄存器数值是否持续变化 |
1/0/1 |
设置Test寄存器 |
Set Test Reg |
[7:0] |
测试寄存器:55h或Aah |
||
9h |
0/1/0 |
查询组件CPLD的升级方式 |
Get SMC Upgrade Info |
[15:8] |
Localbus模拟JTAG升级通道 =0h - BMC JTAG管脚直接升级 =xh - JTAG升级通道(模组板02h) |
描述组件CPLD的JTAG升级通道,与扩展板的SMC命令字Eh对应 |
[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 |
1/0/1 |
设置组件EEPROM写保护状态 |
Set CSR WP Status |
[7:0] |
=0h - 关闭写保护 =1h - 打开写保护 |
Command |
M=0,S=1/ R=1,W=0/ Param |
描述 |
标准命令字 |
数据定义 |
备注 |
|
---|---|---|---|---|---|---|
2h |
0/1/0 |
查询系统事件 |
Get System Event |
[7:5] |
保留 |
- |
4 |
基础板电源上电超时事件(vcc_time_out) =0h - 无效 =1h - 有效 |
- |
||||
3 |
基础板电源异常掉电事件(vcc_power_fail) =0h - 无效 =1h - 有效 |
- |
||||
2 |
IMU使能复位业务系统事件(os_rst_n_event) =0h - 正常,无事件产生 =1h - 产生复位事件 |
U通过写CPLD寄存器的方式,复位OS |
||||
1 |
BMC或板内跳冒使能复位业务系统事件(bmc_sysrst_en_event) =0h - 无效 =1h - 有效 |
- |
||||
0 |
业务系统解复位事件(pltrst_event) =0h - 无效 =1h - 有效 |
- |
||||
1/0/1 |
清除系统事件 |
Clear System Event |
[7:5] |
保留 |
- |
|
4 |
清除业务系统上电超时事件(clear_vcc_time_out) =0h - 清除上电超时 =1h - default |
- |
||||
3 |
清除业务系统异常掉电事件(clear_vcc_power_fail) =0h - 清除异常掉电 =1h - default |
- |
||||
2 |
清除IMU使能复位业务系统事件(clear_bmc_os_rst_n) =0h - 清除复位事件(写清) =1h - default |
- |
||||
1 |
清除BMC或板内跳冒使能复位业务系统事件(clear_bmc_sysrst_en) =0h - 清除复位事件(写清) =1h - default |
- |
||||
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] |
保留 |
- |
1 |
BMC控制CPLD模拟前面板RST键,复位业务系统(bmc_sysrst) =0h - 默认值 =1h - 模拟面板复位 |
- |
||||
0 |
BMC控制CPLD操作ME_RST,复位IMU(ME)系统(bmc_me_rst_en) =0h - 默认值 =1h - 复位IMU |
- |
||||
1/0/1 |
设置BMC复位系统寄存器 |
Reset System |
[7:2] |
保留 |
- |
|
1 |
BMC控制CPLD模拟前面板RST键,复位业务系统(bmc_sysrst) =0h - 默认值 =1h - 模拟面板复位 |
- |
||||
0 |
BMC控制CPLD操作ME_RST,复位IMU(ME)系统(bmc_me_rst_en) =0h - 默认值 =1h - 复位IMU |
- |
||||
7h |
0/1/0 |
查询外设复位状态 |
- |
[7:3] |
保留 |
- |
2 |
BMC PCIE接口和LPC接口复位 =0h - 解复位 =1h - 复位 |
|||||
1 |
CPU LPC接口复位 =0h - 解复位 =1h - 复位 |
|||||
0 |
保留 |
|||||
1/0/1 |
设置外设复位状态 |
- |
[7:3] |
保留 |
- - - - |
|
2 |
BMC PCIE接口和LPC接口复位 =0h - default =1h - 复位(写清) |
|||||
1 |
CPU LPC接口复位 =0h - default =1h - 复位(写清) |
|||||
0 |
保留 |
|||||
8h |
0/1/0 |
查询CPU状态 |
Get CPU Status |
[15:5] |
预留 |
- |
4 |
rst_out_cpu1_tb_n上报(业务电上电有效) =0h - 正常 =1h - 有复位事件发生 |
- |
||||
3 |
预留 |
- |
||||
2 |
imu_caterr(业务电上电有效) =0h - 正常 =1h - 有复位事件发生 |
- |
||||
1 |
os_halt_detect(业务电上电有效) =0h - 正常 =1h - 有复位事件发生 |
- |
||||
0 |
系统复位事件汇聚 =0h - 正常 =1h - 有复位事件发生 |
- |
||||
9h |
0/1/0 |
查询CPU Efuse电源状态 |
Get CPU Efuse Power Status |
1 |
CPU0 efuse 1.8V PG信号 =0h - efuse电源不工作或异常 =1h - efuse电源工作正常 |
- |
0 |
CPU0 efuse 1.8V 使能信号(业务电上电有效) =1h - efuse电源未使能 =0h - efuse电源使能 |
- |
||||
Bh |
0/1/0 |
查询100M时钟是否丢失 |
- |
[7:1] |
保留 |
- |
0 |
100M时钟是否丢失 =1h - 时钟丢失 =0h - 正常 |
|||||
Dh |
0/1/0 |
查询所有处理器状态 响应数据长度为1*N N=CPU数量 |
Get CPU Event |
7 |
CPU2 Prochot信号(BIOS寄存器发送sys) =0h - 未使能 =1h - 使能 |
CPU2进行降频标记,由BIOS实时控制,BMC可读 0:未发生降频 1:发生降频 |
6 |
CPU2 Thremtrip信号(BIOS寄存器发送sys) =0h - 未使能 =1h - 使能 |
CPU2发生thermtrp掉电事件 1:事件发生,BMC清零清事件 0:未发生该事件 |
||||
5 |
CPU1 系统复位事件汇聚 =0h - 正常 =1h - 有复位事件发生 |
- |
||||
4 |
CPU1 caterr信号 =0h - 无效 =1h - 有效 |
cpu1_caterr_n_effect(33a bit1)-catmcerr |
||||
3 |
CPU1 Prochot信号(BIOS寄存器发送sys) =0h - 未使能 =1h - 使能 |
CPU1进行降频标记,由BIOS实时控制,BMC可读 0:未发生降频 1:发生降频 |
||||
2 |
CPU1 Thremtrip信号(BIOS寄存器发送sys) =0h - 未使能 =1h - 使能 |
CPU1发生thermtrp掉电事件 1:事件发生,BMC清零清事件 0:未发生该事件 |
||||
1 |
CPU1 smimcErr信号 =0h - 无效 =1h - 有效 |
cpu1_prochot_n_effect(33a bit2)-smimcerr 新增 |
||||
0 |
CPU1在位状态 =0h - 不在位 =1h - 在位 |
- |
||||
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 带宽配置 |
- |
[335:328] |
CPU2 Hilink10 PCIE/Serdes模式配置 |
- |
||||
[327:320] |
CPU2 Hilink9 带宽配置 |
- |
||||
[319:312] |
CPU2 Hilink9 PCIE/Serdes模式配置 |
- |
||||
[311:304] |
CPU2 Hilink8 带宽配置 |
- |
||||
[303:296] |
CPU2 Hilink8 PCIE/Serdes模式配置 |
- |
||||
[295:288] |
CPU2 Hilink7 带宽配置 |
- |
||||
[287:280] |
CPU2 Hilink7 PCIE/Serdes模式配置 |
- |
||||
[279:272] |
CPU2 Hilink6 带宽配置 |
- |
||||
[271:264] |
CPU2 Hilink6 PCIE/Serdes模式配置 |
- |
||||
[263:256] |
CPU2 Hilink5 带宽配置 |
- |
||||
[255:248] |
CPU2 Hilink5 PCIE/Serdes模式配置 |
- |
||||
[247:240] |
CPU2 Hilink4 带宽配置 |
- |
||||
[239:232] |
CPU2 Hilink4 PCIE/Serdes模式配置 |
- |
||||
[231:224] |
CPU2 Hilink3 带宽配置 |
03h |
||||
[223:216] |
CPU2 Hilink3 PCIE/Serdes模式配置 |
06h |
||||
[215:208] |
CPU2 Hilink2 带宽配置 |
03h |
||||
[207:200] |
CPU2 Hilink2 PCIE/Serdes模式配置 |
06h |
||||
[199:192] |
CPU2 Hilink1 带宽配置 |
02h |
||||
[191:184] |
CPU2 Hilink1 PCIE/Serdes模式配置 |
02h |
||||
[183:176] |
CPU2 Hilink0 带宽配置 |
02h |
||||
[175:168] |
CPU2 Hilink0 PCIE/Serdes模式配置 |
02h |
||||
[175:168] |
CPU1 Hilink10 带宽配置 |
- |
||||
[167:160] |
CPU1 Hilink10 PCIE/Serdes模式配置 |
- |
||||
[159:152] |
CPU1 Hilink9 带宽配置 |
- |
||||
[151:144] |
CPU1 Hilink9 PCIE/Serdes模式配置 |
- |
||||
[143:136] |
CPU1 Hilink8 带宽配置 |
- |
||||
[135:128] |
CPU1 Hilink8 PCIE/Serdes模式配置 |
- |
||||
[127:120] |
CPU1 Hilink7 带宽配置 |
- |
||||
[119:112] |
CPU1 Hilink7 PCIE/Serdes模式配置 |
- |
||||
[111:104] |
CPU1 Hilink6 带宽配置 |
- |
||||
[103:96] |
CPU1 Hilink6 PCIE/Serdes模式配置 |
- |
||||
[95:88] |
CPU1 Hilink5 带宽配置 |
- |
||||
[87:80] |
CPU1 Hilink5 PCIE/Serdes模式配置 |
- |
||||
[79:72] |
CPU1 Hilink4 带宽配置 |
- |
||||
[71:64] |
CPU1 Hilink4 PCIE/Serdes模式配置 |
- |
||||
[63:56] |
CPU1 Hilink3 带宽配置 |
03h |
||||
[55:48] |
CPU1 Hilink3 PCIE/Serdes模式配置 |
06h |
||||
[47:40] |
CPU1 Hilink2 带宽配置 |
03h |
||||
[39:32] |
CPU1 Hilink2 PCIE/Serdes模式配置 |
06h |
||||
[31:24] |
CPU1 Hilink1 带宽配置 |
02h |
||||
[23:16] |
CPU1 Hilink1 PCIE/Serdes模式配置 |
02h |
||||
[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 |
||||
[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] |
预留 |
- |
3 |
单板锁存异常记录指示寄存器 1:单板锁存异常未记录 0:单板锁存异常已记录 写0清除 |
latch_issue_record_tag |
||||
2 |
单板锁存异常指示寄存器 1:单板发生过异常,被锁存 0:单板未发生过异常 |
latch_issue_tag |
||||
1 |
单板当前错误记录指示寄存器 1:单板当前异常未记录 0:单板当前异常已记录 写0清除 |
issue_record_tag |
||||
0 |
单板当前异常指示寄存器 1:单板当前状态异常 0:单板当前状态单板正常 |
issue_tag |
||||
1/0/1 |
清除电源告警记录锁存寄存器 |
Clear PowerFail Event |
[7:4] |
预留 |
- |
|
3 |
清除单板锁存异常记录指示寄存器 1:default 0:清除单板锁存异常记录 写0清除 |
clear_latch_issue_record_tag |
||||
1 |
清除单板当前错误记录指示寄存器 1:default 0:清除单板当前异常记录 写0清除 |
clear_issue_record_tag |
||||
E0h |
0/1/0 |
获取SSC生效状态 |
GET_SSC_ENABLE |
[7:1] |
保留 |
- |
0 |
查询SSC生效状态 =0h -SSC功能不使能 =1h -SSC功能使能 |
先设置SSC_MODE和SSC_NUM,然后设置SSC_ENABLE,查询SSC_END为1后,再上电开机(整机AC上电后,设置完SSC,再开机,如要修改SSC,需要AC上电或者模组板CPLD复位) |
||||
1/0/1 |
设置SSC生效状态 |
SET_SSC_ENABLE |
[7:1] |
保留 |
||
0 |
设置SSC生效状态 =0h -SSC功能不使能 =1h -SSC功能使能 |
|||||
E1h |
0/1/0 |
获取SSC模式状态 |
GET_SSC_MODE |
[7:1] |
保留 |
|
0 |
查询SSC模式状态 =0h -负频偏 =1h - 正频偏 |
|||||
1/0/1 |
设置SSC模式状态 |
SET_SSC_MODE |
[7:1] |
保留 |
||
0 |
设置SSC模式状态 =0h -负频偏 =1h - 正频偏 |
|||||
E2h |
0/1/0 |
获取SSC 频偏值 |
GET_SSC_NUM |
[7:0] |
查询SSC 频偏值 00h~ffh 频偏值 |
|
1/0/1 |
设置SSC 频偏值 |
SET_SSC_NUM |
[7:0] |
设置SSC 频偏值 00h~ffh 频偏值 |
||
E3h |
0/1/0 |
获取SSC 调频是否结束 |
GET_SSC_END |
[7:1] |
保留 |
|
0 |
查询SSC 调频是否结束 =0h -调频未结束 =1h - 调频结束 |
|||||
E4h |
1/0/1 |
BMC控制上下电 |
SET_BMC_PWR_UPDOWN |
[7:2] |
保留 |
- |
1 |
bmc_pwr_up写1上电(写清) |
- |
||||
0 |
bmc_pwr_down写1下电(写清) |
- |
||||
F1h |
0/1/0 |
查询VRD fw生效状态 |
Get VRD Upgrade Status |
[7:1] |
保留 |
- |
0 |
查询VRD固件生效 =0h -正常工作状态 =1h - 生效VR固件 |
- |
||||
1/0/1 |
设置VRD fw生效状态 |
Set VRD Upgrade Status |
[7:1] |
保留 |
- |
|
0 |
设置VRD固件生效 =0h -default =1h - 生效VR固件(写清) |
BMC写1生效,逻辑自动清除 |
||||
F2h |
0/1/0 |
VR 固件类型区分 |
Get VRDfw Type |
[7:2] |
保留 |
用于BMC区分当前基础板上上件的VR控制器和DrMOS厂家,BMC通过不同的组合选择不同的升级文件和流程 |
[1:0] |
VRD控制器类型: 01=SD5003 00=IFX 10=MPS 11=RSV |
Command |
M=0,S=1/ R=1,W=0/ Param |
描述 |
标准命令字 |
数据定义 |
备注 |
|
---|---|---|---|---|---|---|
4h |
1/0/1 |
BIOS配置 |
Clear BIOS CMOS |
[7:1] |
保留 |
- |
0 |
清除CMOS =0h - 无效 =1h - 有效 |
用于清除CMOS - BIOS恢复默认设置,需要和BIOS核对解耦情况 |
||||
0/1/1 |
BIOS配置 |
GET Clear BIOS CMOS |
[7:1] |
保留 |
- |
|
0 |
清除CMOS =0h - 无效 =1h - 有效 |
获取BIOS清除CMOS功能 |

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