Option "Coolbits" is not used | Optimus-enabled laptop running an RTX 2070 | Manjaro Linux

Hi there.
I’m trying to enable Coolbits so I can change the fan speeds of my Optimus-enabled laptop running Manjaro with an RTX 2070.

My current Xconf is as follows:

cat /etc/X11/xorg.conf.d/10-coolbits.conf 
Section "ServerLayout"
        Identifier      "layout"
        Screen 0        "iGPU"
        Option          "AllowNVIDIAGPUScreens"

Section "Device"
        Identifier      "iGPU"
        Driver          "modesetting"
        BusID           "PCI:0:2:0"

Section "Screen"
        Identifier      "iGPU"
        Device          "iGPU"

Section "Device"
        Identifier      "RTX"
        BusID           "PCI:1:0:0"
        Driver          "nvidia"
        VendorName      "NVIDIA"
        BoardName       "NVIDIA Corporation TU106M [GeForce RTX 2070 Mobile] (rev a1)"
        Option          "Coolbits" "12"

However it is not actually enabled. Using Nvidia bug report, I get the following messages:

cat nvidia-bug-report.log | grep Coolbits
[     7.816] (WW) NVIDIA(G0): Option "Coolbits" is not used
        Option          "Coolbits" "12"
[   114.674] (WW) NVIDIA(G0): Option "Coolbits" is not used

I’m currently at a loss on how I’m supposed to fix this. Any help would be greatly appreciated.
Thanks! <3
nvidia-bug-report.log (642 KB)


This appears to be a driver bug. Namely, it seems that the Coolbits option can only be attached to an X screen associated with the GPU (it appears that if attached to GPU itself, the option gets transferred to the screen internally), but there is no X screen associated with the discrete GPU if you are using PRIME render offload. It will have to be fixed upstream.

Until it’s fixed upstream, I can provide a workaround for driver version 440.64. The file nvidia_drv.so should have sha1sum dbd03c529fd6d66c6a016a9cfbc4613be501e0fc. Perform the following replacements:

  • at offset 45970, replace 6 bytes with B801000000C3,
  • at offset 45A4B, replace 2 bytes with 9090,
  • at offset 45A86, replace 10 bytes with B8010000004883C408C3,
  • at offset 4A988, replace 1 byte with EB.

You should get a file with sha1sum d2a16889a058b0368371e1d5167f4f0fefab6800. These changes are roughly equivalent to using Option "Coolbits" "12" in xorg.conf for all of your GPUs regardless of whether there is an associated X screen. Enjoy!

Note that although I did my best to ensure the workaround is correct (and it works well for me), it might have unintended consequences, and so you are using it entirely at your own risk.


Was this ever fixed upstream? If not, could you provide me with a workaround for the 440.82 driver? Thank you

Nope. I did the work because I needed it myself, and provided it openly as a courtesy to other people who hit the same bug.

Ah, thanks for the info. So currently it is not possible to “fix” this in the 440.82 release?

It’s possible–you just have to do the work yourself.

No problem, thanks for clearing it up! I ended up switching to nvidia-only from my bios to check and there’s not a lot I can do on my laptop even with Coolbit set. So no point for me to pursue this course further. Thanks anyways!

Exactly. Coolbits doesn’t work in offload mode but it’s pointless on notebook gpus anyway because those are locked by the vendor most if not all times.

Coolbits on notebook GPUs is not pointless. For instance, I have an old notebook where I can apply an offset of 398 MHz on memory clock and 200 MHz on graphics clock. I would not call that pointless. Please, avoid making such statements that could lead people (specially NVIDIA employees) to ignore the actual problem. I see no technical reason for Coolbits to not work with PRIME Render Offload. Yes, the option is currently tied to an X screen, but why should it be? If I revert to a setup with NVIDIA’s card only (old PRIME setup), I can set Coolbits. It is a software limitation, and the patch previously posted here is a proof that it is indeed possible to fix it. Will NVIDIA do it? That is the question that remains unanswered.