SMBus 接口说明
介绍墨芯计算卡上的 SMBus 规格信息,包括 SMBus 寄存器定义、地址和详细说明,以及获取墨芯计算卡相关信息的前置操作。此外,在 BMC 适配时也可参考本文获取墨芯计算卡的相关信息。
SMBus 规格
| 接口 | 地址 |
|---|---|
| SMBus(7 bits 地址) | 0x58 |
Read Byte Protocol
下图描述了 Read Byte Protocol:
Write Byte Protocol
下图描述了 Write Byte Protocol:
寄存器读取流程
SMBus 寄存器位宽为 8 位,下表描述了寄存器基本读取流程(S: Slave, M: Master):
| 步骤 | 方向 | 位数 | 内容 |
|---|---|---|---|
| 1 | M→S | 1 | Start |
| 2 | M→S | 8 | Slave Address + Write |
| 3 | S→M | 1 | ACK |
| 4 | M→S | 8 | Register Address |
| 5 | S→M | 1 | ACK |
| 6 | M→S | 1 | Start |
| 7 | M→S | 8 | Slave Address + Read |
| 8 | S→M | 1 | ACK |
| 9 | S→M | 8 | Data Byte[7:0] |
| 10 | M→S | 1 | NACK |
| 11 | M→S | 1 | Stop |
SMBus 寄存器描述
须知
所有多字节寄存器均采用小端字节序(Little-Endian),即低地址存储低字节。
| 寄存器名称 | 地址 | 读写权限 | 数据类型 | 说明 | 示例 |
|---|---|---|---|---|---|
| 芯片温度 | 0x4E | RO | int8_t | Bits [7:0]: 芯片温度,单位:摄氏度 | 44 摄氏度 |
| ECC State | 0x4F | RO | uint8_t | Bits [0]: ECC State 标志位,0=disable,1=enable Bits [1]: Device 当前的 ECC 1 bit Status 标志位,0=no error,1=error。如果此位为 1,则可以从 DDR ECC Error 1 bit Counts 获取到 1bit 的错误计数值 Bits [2]: Device 当前的 ECC 2 bits Status 标志位,0=no error,1=error。如果此位为 1,则可以从 DDR ECC Error 2 bit Counts 获取到 2bit 的错误计数值 Bits [7:3]: Reserved |
ECC State: enable ECC 1 bit Status: no error ECC 2 bits Status: no error |
| DDR ECC Error 1 bit Counts | 0x58-0x59 | RO | uint16_t | 0x58=[7:0], 0x59=[15:8] | 0 |
| DDR ECC Error 2 bits Counts | 0x5A-0x5B | RO | uint16_t | 0x5A=[7:0], 0x5B=[15:8] | 0 |
| Aggregate DDR ECC Error 1 bit Counts | 0x5C-0x5D | RO | uint16_t | 0x5C=[7:0], 0x5D=[15:8] | 0 |
| Aggregate DDR ECC Error 2 bits Counts | 0x5E-0x5F | RO | uint16_t | 0x5E=[7:0], 0x5F=[15:8] | 0 |
| PCIe Error Counts | 0x70-0x73 | RO | uint32_t | 0x70=[7:0], 0x71=[15:8], 0x72=[23:16], 0x73=[31:24] | 0 |
| 板卡温度 | 0x74 | RO | int8_t | Bits [7:0]: 板卡温度,单位:摄氏度 | 38 摄氏度 |
| 芯片功耗 | 0x75 | RO | uint8_t | Bits [7:0]: 芯片功耗,单位:W | 2 W |
| 内存温度状态 | 0x76 | RO | uint8_t | Bits [7:0]: 内存温度状态 0x0: -25 摄氏度以下 0x1: -25 ~ 85 摄氏度 0x2: 85 摄氏度以上 |
-25 ~ 85 摄氏度 |
| Max PCIe Link Speed/Width | 0x77 | RO | uint8_t | Bits [2:0] Link Speed: 0x0: unknown 0x1: 2500MTPS, PCIe Gen 1.0 0x2: 5000MTPS, PCIe Gen 2.0 0x3: 8000MTPS, PCIe Gen 3.0 0x4: 16000MTPS, PCIe Gen 4.0 0x5: 32000MTPS, PCIe Gen 5.0 Bits [6:4] Link Width: 0x0: unknown, 0x1: x1, 0x2: x2, 0x3: x4, 0x4: x8, 0x5: x16, 0x6: x32 |
PCIe Gen 3.0 x16 |
| Current PCIe Link Speed/Width | 0x78 | RO | uint8_t | 同 Max PCIe Link Speed/Width | S30: PCIe Gen 3.0 x16 S40: PCIe Gen 3.0 x4 |
| NNCore Utilization | 0x79 | RO | uint8_t | Bits [7:0]: NNCore 利用率,例如 0x10 表示 16% | 0% |
| DDR Utilization | 0x7A | RO | uint8_t | Bits [7:0]: DDR 利用率 | 4% |
| 板卡功耗 | 0x7B-0x7C | RO | uint16_t | 板卡功耗,单位:W | 38 W |
| 报错信息状态位 | 0x7D | RO | uint8_t | Bits [0]: 标志位,0=正常,1=异常 Bits [7:1]: Reserved |
0 |
| VR 温度 | 0x7F | RO | int8_t | Bits [7:0]: VR 温度,单位:摄氏度 | 40 摄氏度 |
| 芯片电压 | 0xCC-0xCD | RO | uint16_t | 芯片电压,单位:mV | 980mV |
| 内存电压 | 0xCC-0xCD | RO | uint16_t | 内存电压,单位:mV | 980mV |
| Product Name | 0xCE-0xD8 | RO | uint8_t × 11 | ASCII 字符串,表示产品名称(MOFFETT S30 或 MOFFETT S40) | S30: MOFFETT S30 S40: MOFFETT S40 |
| System Bus ID | 0xD9 | RO | uint8_t | Bits [7:0]: System Bus ID | 0x04 |
| Subsystem Vendor ID | 0xDA-0xDB | RO | uint16_t | SVID | 0x1f36 |
| Subsystem ID | 0xDC-0xDD | RO | uint16_t | SSID | 0x7000 |
| Vendor ID | 0xDE-0xDF | RO | uint16_t | VID | 0x1f36 |
| Device ID | 0xE0-0xE1 | RO | uint16_t | DID | S30: 0x7030 S40: 0x7040 |
| 驱动版本 | 0xE2-0xE4 | RO | uint8_t × 3 | 0xE2=主版本号,0xE3=子版本号,0xE4=patch 号,例如 v3.2.1 | 3.3.1 |
| 固件版本 | 0xE5-0xE7 | RO | uint8_t × 3 | 0xE5=主版本号,0xE6=子版本号,0xE7=patch 号,例如 v3.20.13 | 3.31.13 |
| 硬件版本 | 0xE8-0xE9 | RO | uint8_t × 2 | 0xE8=主版本号,0xE9=子版本号 | 2.0 |
| PN(Part Number) | 0xEA-0xF3 | RO | uint8_t × 10 | ASCII 字符串,表示 PN | S40-02-A01 |
| SN(Serial Number) | 0xF4-0xFB | RO | uint8_t × 8 | 表示 SN,详细说明见下方 | 2023110400010 |
| 出厂时间 | 0xFC-0xFF | RO | uint8_t × 4 | 0xFC=年份高 2 位,0xFD=年份低 2 位,0xFE=月份,0xFF=日期 | 20230212 |
下表以 SN 号 2023110400010 为例,详细展示了 SN 号的相关信息:

前置操作
须知
S40 板卡内置 4 颗墨芯 Antoum 芯片(也称 Device),S30 板卡内置 3 颗墨芯 Antoum 芯片,每次读取某个 Device 的产品信息都需要先执行相应的前置操作后,才能读取到对应数据。
前置操作步骤
前置操作的通用步骤如下(仅步骤 1 的写入值因 Device 不同而异):
0x3f 地址写入 Device ID。
0x40 地址写入 0x01,配置读取操作。
0x45 地址写入 0xb9,配置读取长度。
0x46 地址写入 0x02,触发读取操作。
polling 0x46 地址的 bit0,bit0=1 时表示 data 就绪。
0x46 地址写入 0x00。
各 Device 对应的 Device ID 如下:
| Device | 0x3f 写入值 | 适用板卡 |
|---|---|---|
| Device 1 | 0x01 | S30 / S40 |
| Device 2 | 0x02 | S30 / S40 |
| Device 3 | 0x03 | S30 / S40 |
| Device 4 | 0x04 | 仅 S40 |
其中,polling 0x46 地址伪代码如下所示:
// 为了尽量减少等待时间,建议使用 retry 机制,10 毫秒 retry 一次,超时时间为 1000 毫秒。
// 通过一次前置操作,可以读取多个寄存器的值。
int retry_count = 100;
int read_smbus_param (void)
{
int flag = 0;
int i;
// 配置前置信息
i2cset(0x3f, 0x01) // i2cset -y -f 0 0x58 0x3f 0x01 (指定获取 Device 1)
i2cset(0x40, 0x01) // i2cset -y -f 0 0x58 0x40 0x01 (读操作)
i2cset(0x45, 0xB9) // i2cset -y -f 0 0x58 0x45 0xB9 (读取的长度)
i2cset(0x46, 0x02) // i2cset -y -f 0 0x58 0x46 0x02 (触发读取操作)
for(i=0; i<retry_count; i++) {
flag = i2cget(0x46); // i2cget -y -f 0 0x58 0x46 (读 0x46 的值)
if(flag&0x01) // 判断 bit0 是否为 1
break;
usleep(10000); // sleep 10ms
}
if((flag&0x01) == 0)
return -1; // timeout
// read vendorid
i2cget(0xde);
i2cget(0xdf);
// read others
i2cget(0xxx);
return 0;
}
前置操作示例
须知
执行以下命令需要 sudo 权限。
目前 MCU 没有自动获取 Device 的数据,需要手动读取,步骤如下(以 S30 为例,S30 的 MCU 设计为 Device 1、Device 2、Device 3):
手动加载 SMBus 驱动。
modprobe i2c-i801查看主板 I2C 端口详情。
i2cdetect -li2c-3 i2c i915 gmbus dpb I2C adapter i2c-1 smbus SMBus I801 adapter at f040 SMBus adapter i2c-6 i2c DPDDC-D I2C adapter i2c-4 i2c i915 gmbus dpd I2C adapter i2c-2 i2c i915 gmbus dpc I2C adapter i2c-0 i2c Synopsys DesignWare I2C adapter I2C adapter i2c-5 i2c DPDDC-C I2C adapter
从输出信息可知,i2c 端口 1 用于 SMBus。
获取 Device 数据。
须知
下文中的 1 为用于 SMBus 通信的端口号,请根据实际情况进行调整。
以获取 Device 1 数据为例(其他 Device 仅需修改第一条命令中的 Device ID):
i2cset -y -f 1 0x58 0x3f 0x01 # 指定获取 Device 1 i2cset -y -f 1 0x58 0x40 0x01 # 读操作 i2cset -y -f 1 0x58 0x45 0xB9 # 读取的长度 i2cset -y -f 1 0x58 0x46 0x02 # 触发读取操作 polling 0x46 地址的 bit0,bit0=1 时表示 data 就绪 i2cset -y -f 1 0x58 0x46 0x00 #0x46 地址写入 0x00
前置操作完成后即可读取对应寄存器,获取对应信息。
使用示例
通过 SMBus 获取墨芯 S30 计算卡上信息数据的操作步骤如下:
须知
执行以下命令需要 sudo 权限。
手动加载 SMBus 驱动。
modprobe i2c-i801查询主板 I2C 端口详情。
i2cdetect -li2c-3 i2c i915 gmbus dpb I2C adapter i2c-1 smbus SMBus I801 adapter at f040 SMBus adapter i2c-6 i2c DPDDC-D I2C adapter i2c-4 i2c i915 gmbus dpd I2C adapter i2c-2 i2c i915 gmbus dpc I2C adapter i2c-0 i2c Synopsys DesignWare I2C adapter I2C adapter i2c-5 i2c DPDDC-C I2C adapter
查看 I2C 端口下挂载的 Device:
i2cdetect -y 1
须知
参数
1表示i2c-1,请根据上一步骤中 SMBus 对应的 i2c 地址进行调整。预期输出:
# 结果表示在 I2C 端口 1 下有识别到地址为 0x58 的Device,对应 MCU 的地址 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- 08 -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: 30 31 -- -- 34 35 36 -- -- -- -- -- -- -- -- -- 40: -- -- -- -- 44 -- -- -- -- -- -- -- -- -- -- -- 50: 50 -- 52 -- -- -- -- -- 58 -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- 6c -- -- -- 70: -- -- -- -- -- -- -- --
读取 Device 信息。
# i2cget –y –f 端口号 Device 地址 寄存器地址 i2cget -y -f 1 0x58 0x01
预期输出:
0x00