How to disable Arc A370M dGPU on a laptop

Arc GPU that looks like a vampire sucking power from a battery.

My laptop, equipped with a dedicated Intel Arc A370M GPU, achieved its advertised battery life on Windows but suffered significantly reduced battery life on Linux. After investigating, I discovered the Arc GPU was the cause. Pending an official driver update that enables proper low-power mode for the GPU, I've implemented a workaround. I've effectively doubled my laptop's battery life by disabling the Arc GPU while running Linux,

When I get a new machine preloaded with Windows, I give Windows another chance for a while. I have tried using WSL and I've done the Linux VM running on Windows thing a few times for Linux specific tasks. For various reasons, Windows just isn't my jam. While using it with Windows I noted the battery life was roughly as advertised. Everything worked great after installing Linux, but the battery life was unacceptably bad.

Use this command to see the current power draw of your laptop in watts while running on battery:

1awk '{print $1*10^-6 " W"}' /sys/class/power_supply/BAT0/power_now
bash

My result was anywhere from 18W to 20W with the laptop totally idle. After disabling the Arc GPU my power usage is around 7.5W while idle. You read that right, I see at least 10W draw from this GPU when it is not doing anything at all.

I fixed this months ago, but realized that I should post something on my site in the hopes that someone like me will save some time. I spent hours trying various power saving approaches, running powertop, fiddling with esoteric options, ASUS RoG tools, kernel flags, even trying different Linux distros. Blacklisting the GPU driver prevents the integrated GPU from working because they're both Intel. The laptop BIOS doesn't offer an option to disable the dGPU either. I was about to give up and go back to Windows where the battery life was pretty decent.

I finally stumbled across a method to shut the discrete GPU down at runtime. If you need the GPU often and don't want to reboot to re-enable it, I can't help you. If you only need integrated graphics and you just want battery life, keep reading.

You'll need to know the address of your device on the PCI bus. Run lspci to get a list of every PCI device. Find the A370M GPU Display controller entry and make note of the address. If you have a different Arc GPU model, find that instead. In my case the address is 0000:04:00.0.

1lspci
2...
30000:04:00.0 Display controller: Intel Corporation DG2 [Arc A370M] (rev 05)
4...
bash

Create a script with these contents, substituting your address, and run it with sudo.

1#!/bin/bash
2
3# unbind device from the driver if it is bound
4echo 0000:04:00.0 | sudo tee /sys/bus/pci/drivers/i915/unbind
5echo 0000:04:00.0 | sudo tee /sys/bus/pci/drivers/xe/unbind
6# allow PM
7echo auto | sudo tee /sys/bus/pci/devices/0000\:04\:00.0/power/control
8# remove device from pci subsystem
9echo 1 | tee /sys/bus/pci/devices/0000\:04\:00.0/remove
bash

Now run the battery draw command from the start of this article and observe that power consumption dropped by around 10W. That's it, you're done. Enjoy roughly 2x battery life in Linux.

Post-hoc rationalization and extra tips

Why did I buy a laptop with a dGPU I don't really need? Excellent question, thanks for asking. I guess at the time I thought that it wouldn't need to be super fast, but I might play the occasional game on it. Also, I wanted to try out Arc and the price was right. I honestly never use the discrete GPU anymore and if I really needed to I could reboot. I could waste several more hours of my life to uncover the root cause and actually fix the problem. Maybe, but I have better ways to spend my time.

At one point the command below would re-enable the GPU, now it freezes the computer. I haven't dug into why, and I don't plan on it. Google REISUB procedure before running this command.

1# Careful, this may lock your computer.
2echo 1 | sudo tee /sys/bus/pci/rescan
bash

A bonus tip that I found while doing all this: You can limit your battery charge to 80% to improve battery longevity if you mostly leave it plugged in. There are proprietary manufacturer apps to do this, but they're unecessary for setting a charge limit. Especially for those who plan on leaving the GPU enabled, it can't stray far from a power source. Run the script below to cap charging at 80%:

1#!/bin/bash
2# Replace 80 with 100 to disable the limit.
3echo 80 > /sys/class/power_supply/BAT0/charge_control_end_threshold
bash

I hope this helps someone out. I spent a lot of time getting to the point where I could blame the Arc GPU driver. Then I spent another few evenings fiddling with ways to let it sleep properly without totally disabling it. I didn't come up with anything useful. It seems like when the device is enabled something is constantly waking it up even with GDM service stopped at effectively runlevel 3.