Skip to content

I2C BUFFER_RW transaction does not use Repeated Start (Sr) on GB202/Blackwell via GSP firmware #1057

@Loong0x00

Description

@Loong0x00

Summary

On GB202 (RTX 5090) with driver 590.48.01, all I2C read commands that should use Repeated Start (Sr) between the write phase (register address) and read phase actually use STOP + START. This breaks communication with I2C slave devices that strictly require Sr per the I2C specification, such as the Bosch BMI323 IMU.

Expected Behavior

According to ctrl402c.h (line 439-441), NV402C_CTRL_I2C_TRANSACTION_TYPE_I2C_BUFFER_RW should produce:

I2C Buffer Read: S Addr|Wr [A] cmd [A] Sr Addr|Rd [A] Data1 A...DataN P

The Sr (Repeated Start) between the write and read phases is critical for devices like BMI323 that reset their register pointer on STOP.

Actual Behavior

The actual bus sequence is:

S Addr|Wr [A] cmd [A] P    S Addr|Rd [A] Data1 A...DataN P

STOP is sent after the register address write, followed by a new START for the read. The slave device loses the register pointer and returns zeros (or default values).

Evidence

  • BMI323 at I2C address 0x68 on port 1 ACKs correctly but returns [01 00 00 00] for all registers (0x00-0x7E) — identical data regardless of register address proves the register pointer is not being set
  • IT8915FN at 0x2b returns real data because it tolerates STOP+START (retains register pointer across transactions)
  • Both NV402C_CTRL_CMD_I2C_INDEXED (0x402c0102) and NV402C_CTRL_CMD_I2C_TRANSACTION with I2C_BUFFER_RW (type 3) produce identical results, confirming they share the same backend path through GSP
  • The same hardware works correctly on Windows via NvAPI_I2CRead (GPU Tweak III reads BMI323 successfully)

Commands Tested

Command Code Result
NV402C_CTRL_CMD_I2C_INDEXED 0x402c0102 ACK but zeros (no Sr)
NV402C_CTRL_CMD_I2C_TRANSACTION (I2C_BUFFER_RW) 0x402c0105 ACK but zeros (no Sr)
NV2080_CTRL_CMD_I2C_READ_BUFFER 0x20800601 ACK but zeros (no Sr)
NV2080_CTRL_CMD_I2C_ACCESS 0x20800610 Returns 0x1f (INVALID_STATE)
Linux I2C_RDWR via i2c-dev Zeros (master_xfer splits msgs)

Additional Note: nv-i2c.c master_xfer splits combined messages

In kernel-open/nvidia/nv-i2c.c, nv_i2c_algo_master_xfer processes each i2c_msg as a separate rm_i2c_transfer call in a for loop, which means Linux I2C combined transactions (which should use Sr) are broken at the adapter level too.

Environment

  • GPU: ASUS ROG Astral RTX 5090 (GB202)
  • Driver: 590.48.01 (open kernel modules)
  • OS: Arch Linux, kernel 6.19.6
  • GSP firmware: 570.144

Impact

This affects any I2C slave device on the GPU PCB that requires Repeated Start. Known affected: Bosch BMI323 IMU (used by ASUS ROG Astral for GPU sag detection). The sensor is completely unreadable on Linux while working fine on Windows.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions