Reading sensors off of EVGA’s iCX3 video cards on Linux

TL;DR if you want to use the iCX3 features on EVGA’s 30-series Ampere cards on Linux:

Binaries at the release page here.

Source code at my Gitea here.

This program will let you read the iCX3 temperature sensors as well as read and control the fans individually (instead of the official Nvidia driver’s 2 fan only controls). There are also optional features to read the “VRAM” and “HotSpot” temperature sensors, please read the disclaimer in the README about these sensors. Any source I have found about them is very flaky so I would also not trust GPU-Z and others on them being accurate.

If you want to control the RGB LEDs please use the wonderful OpenRGB project.

I switched from Windows to Linux a bit over a year ago, and one thing I missed was the ability to monitor my video card. I have an EVGA GeForce RTX 3090 FTW3 ULTRA GAMING. EVGA has added several (9 to be exact) temperature sensors to their card for use by enthusiasts as part of their “iCX3 Technology” feature, mostly for extreme overclocking, as well as individual fan controls. These are available through their PrecisionX software, however this does not work on Linux.

The iCX3 sensors can be read through software like GPU-Z and HWiNFO, and when booting into Windows 7 and opening up the latter I noticed it had settings for I²C buses. This got me wondering if this is how the EVGA software talks to the device.

If you’re not familiar with I²C, it’s a simple, serial, low bitrate protocol for talking to things like embedded devices. If you have RGB LEDs in your PC it’s probably how it communicates with the lighting controller. The Windows Nvidia driver has the ability to allow userspace to communicate with I²C devices on the card using functions like NvAPI_I2CReadEx(), but these functions are absent from the Linux driver (which is why PrecisionX doesn’t work through Wine). However, the I²C devices are still exposed to the system, and it’s possible to access them manually through Linux device files.

The developers behind OpenRGB thankfully made a nice tool called NvAPISpy which can intercept these calls to the Windows Nvidia I²C functions. It was designed for reverse engineering of RGB lighting but also worked great for figuring out how the EVGA software works.

It turns out there are just a few simple reads and writes to the I²C bus to read the temperature sensors and control the fans, I leave the details to the source code. I’d also like to thank OpenRGB for figuring out some device IDs and things like that, their lighting controls use the same I²C interface just different functions.

There appears to be some additional functions to read power and voltage sensors off of the K|NGP|N cards, and possibly even control the onboard OLED screen. If you have one of these and are willing to help test this please contact me!

As an example, here’s the output of my program:

$ ./evga-icx
#0: EVGA GeForce RTX 3090 FTW3 Ultra v2 (/dev/i2c-3) @ c:00.0
Fan 0: 1751 RPM (58/0%, Auto)
Fan 1: 1730 RPM (57/0%, Auto)
Fan 2: 1712 RPM (57/0%, Offset)
Ext. fan: 0 RPM (0/0%, Offset)
GPU1: +65°C
GPU2: +57.8°C
VRAM: +74°C
MEM1: +56.1°C
MEM2: +53.5°C
MEM3: +55.5°C
PWR1: +48.2°C
PWR2: +53.2°C
PWR3: +59.6°C
PWR4: +58.0°C
PWR5: +51.1°C
HotSpot: +75°C
Mem util: 43%
Clock reasons: Power cap (0x4)

Comments