SMBus 接口说明

介绍墨芯计算卡上的 SMBus 规格信息,包括 SMBus 寄存器定义、地址和详细说明,以及获取墨芯计算卡相关信息的前置操作。此外,在 BMC 适配时也可参考本文获取墨芯计算卡的相关信息。

SMBus 规格

接口 地址
SMBus(7 bits 地址) 0x58

Read Byte Protocol

下图描述了 Read Byte Protocol:

SMBus Read Byte Protocol 时序图

Write Byte Protocol

下图描述了 Write Byte Protocol:

SMBus 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 号的相关信息:

SN 号编码规则说明


前置操作

须知

S40 板卡内置 4 颗墨芯 Antoum 芯片(也称 Device),S30 板卡内置 3 颗墨芯 Antoum 芯片,每次读取某个 Device 的产品信息都需要先执行相应的前置操作后,才能读取到对应数据。

前置操作步骤

前置操作的通用步骤如下(仅步骤 1 的写入值因 Device 不同而异):

  1. 0x3f 地址写入 Device ID

  2. 0x40 地址写入 0x01,配置读取操作。

  3. 0x45 地址写入 0xb9,配置读取长度。

  4. 0x46 地址写入 0x02,触发读取操作。

  5. polling 0x46 地址的 bit0,bit0=1 时表示 data 就绪。

  6. 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):

  1. 手动加载 SMBus 驱动。

    modprobe i2c-i801
    
  2. 查看主板 I2C 端口详情。

    i2cdetect -l
    
    i2c-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。

  3. 获取 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 权限。

  1. 手动加载 SMBus 驱动。

    modprobe i2c-i801
    
  2. 查询主板 I2C 端口详情。

    i2cdetect -l
    
    i2c-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
    
  3. 查看 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: -- -- -- -- -- -- -- --
    
  4. 读取 Device 信息。

    # i2cget –y –f 端口号 Device 地址 寄存器地址
    i2cget -y -f 1 0x58 0x01
    

    预期输出:

    0x00