-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Description
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) andNV402C_CTRL_CMD_I2C_TRANSACTIONwithI2C_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.