XMG Pro 16 m25 under Linux: Maximum GPU Power and Gaming Performance

I’ve been using XMG laptops since 2020. For me, they offer one of the best value-for-money options if you want an elegant machine that works equally well for productivity and gaming. After two Fusion models (m19, then m22), I recently switched to a XMG Pro 16 m25.

Compared to the Fusion, the Pro 16 is a bit heavier, but it comes with a RTX 5070 Ti (12 GB instead of 8 GB) and, more importantly, allows the GPU to draw up to 140 W (versus 110 W on the Fusion). For gaming workloads, this makes a noticeable difference.

As usual, I installed Arch Linux and went through a series of tweaks and adjustments to get the most out of the hardware—especially to let the GPU use as much power as possible when needed. I decided to share what I learned, both for people wondering whether this laptop works well under Linux and, more specifically, whether it is a good choice for Linux gaming.

Spoiler alert: yes—and it’s very good.

Pre-requisites

The advanced BIOS settings are factory-locked. As far as I know, the only way to unlock them is to boot Windows 11 once and install the official XMG Control Center application. This tool provides an option to enable advanced BIOS features, which then allows fine-tuning of memory timings as well as CPU voltage (including undervolting).

In my opinion, this is quite disappointing. It is actually the only reason I had to install Windows 11 on this laptop. I still find it surprising to see such constraints today, especially when Linux desktop and gaming usage keeps growing and has already proven to be superior in many areas.

To enable this advanced mode, you first need to create a custom performance profile in the Performance menu of the Control Center:

Once this custom profile is selected, a new option called “CPU Advanced Performance Menu” becomes available. Enabling it immediately unlocks the advanced BIOS options.
The good news is that you do not need to keep running Control Center afterward—once enabled, the BIOS remains unlocked permanently.

Memory

My XMG Pro is equipped with 2×16 GB DDR5-6400 CL38 modules with an XMP profile (Kingston KF564S38IBK2-32). However, out of the box, I was surprised to see the memory running at only 4800 MT/s.

I initially tried enabling XMP1, but I never managed to get a stable boot. In addition, boot times became extremely long—sometimes taking several minutes, which clearly wasn’t acceptable.

The best compromise I found was to manually limit the memory speed to 6000 MT/s and select XMP3, which corresponds to 6000 MT/s / CL40. This configuration has proven to be stable and offers a noticeable improvement over the default settings, without the excessive boot delays.

Getting max power on GPU

The concept

My primary goal was to achieve the best possible gaming performance. Based on my experience with gaming laptops, the bottleneck is almost always the GPU, while the CPU often sits below 50% load in real-world gaming scenarios.

To maximize performance, the GPU needs to operate as close as possible to its maximum power budget (140 W). Achieving this requires a combination of firmware, driver, and power-management tweaks. On this platform, the total power budget is shared between the CPU and the GPU, meaning that limiting CPU power directly benefits GPU headroom. In short: the less power the CPU wastes, the more the GPU can consume.

My objective was therefore to find the best balance between CPU efficiency (performance per watt) and maximum sustained GPU power.

At a high level, this involved the following steps:

  • Setting the system to “Enthusiast Mode” in the BIOS
  • Limiting CPU power to free up thermal and electrical budget
  • Installing the NVIDIA proprietary drivers
  • Switching the system to dGPU-only mode in the BIOS, as Hybrid mode caps GPU power at 115 W

A quick note about this last point: I did not find any way to switch GPU modes from Linux itself—even using tools like supergfxctl. From Linux, it is only possible to switch to hybrid, integrated, or VFIO modes. Switching to dGPU-only is only available via the BIOS.

That said, this setup still offers the best of both worlds:

  • Integrated GPU mode for battery life
  • Dedicated RTX 5070 mode for gaming, with full power unlocked

The only downside is that switching between these modes requires a BIOS reboot—but once configured, it works reliably.

CPU Undervolting

Undervolting on a Core Ultra 9 is fairly complex, mainly because several voltage domains are involved: Core, Ring, and VF points 1 to 6. All of these parameters can be adjusted directly from the BIOS on the XMG Pro 16 m25 once advanced options are unlocked.

For each configuration change, I systematically ran two different types of tests:

  1. Full CPU load (stress test)
    This was used purely to validate stability. In practice, the CPU always ends up maxing out around 75 W, as it aggressively boosts frequency until it reaches its thermal limit, which appears to be 94 °C on the Pro 16 m25.
  2. “Gaming-like” workload
    This scenario is more representative of real usage. The goal here was to identify the settings that allow the highest sustained frequencies, which translates to maximum compute performance within the thermal and power budget.

One important takeaway from this process is that aggressive undervolting is not always beneficial. Even when fully stable, too much undervolting can actually cause the CPU to reduce its operating frequency in order to compensate for the reduced available voltage and power.

In other words, stability alone is not a sufficient metric: the best results came from moderate undervolting, where the CPU maintains higher clocks rather than chasing the lowest possible voltage.

Below are a few screenshots of the BIOS settings used during this tuning process:

GPU

Unfortunately, there is no straightforward way to undervolt NVIDIA GPUs on Linux. However, overclocking effectively forces the GPU to operate at lower voltages for a given frequency. In practice, this acts like an undervolt: the GPU attempts to reach higher clocks, but within the power and thermal limits, it simply stabilizes at the highest achievable frequency for that voltage.

To push this further, I followed guidance from both ArchWiki and other community sources that leverage the NVIDIA API in Python. Using this method, I applied a clock offset of 300 MHz with nvmlDeviceSetGpcClkVfOffset.

In simple terms, this means that for any given target frequency, the GPU will now use the voltage of that frequency minus the offset. Effectively, this achieves a mild undervolt, improving efficiency without sacrificing stability or maxing out thermal limits.

Tests

As explained earlier, I ran two types of tests: stress tests and in-game benchmarks. The goal was to identify the sweet spot between CPU stability, maximum GPU power, and the highest FPS.

CPU Stress Test

For CPU stress testing, I used: stress-ng --cpu 24 --cpu-method fft --timeout 5m. While the test was running, I monitored three key metrics using Tuxedo Control Center:

  1. CPU temperature – lower is better, as it frees more thermal headroom for the GPU
  2. Maximum stable frequency – higher is better, since higher frequency equals more compute power
  3. Power consumption (Watts) – lower is better, because it leaves more power available for the GPU
The undervolt values I tested are listed in the following order: Core VF1–VF6 → Ring VF1–VF6.
Undervolt settings temperature (°C) Stabilized frequency (Ghz) Watts
Bios option “Level 2” 87 4.6 90
0 / 50 / 30 / 0 / 20 / 0 – 45 / 45 / 45 / 40 / 40 / 35 85 4.7 85
80 / 70 / 50 / 0 / 30 / 0 – 70 / 70 / 60 / 55 / 55 / 45 85 4.4 85
60 / 50 / 65 / 65 / 30 / 0 – 45 / 45 / 55 / 40 / 40 / 35 crash crash crash
60 / 50 / 50 / 50 / 30 / 0 – 45 / 45 / 50 / 40 / 40 / 35 84 4.7 85
The final values I settled on are those that offered the best balance of stability and performance.

In-Game Benchmarks

Starting from the optimal CPU configuration, I ran SuperTuxKart at the laptop’s native resolution (2560×1600). The goal was to maximize FPS by adjusting the CPU power budget using powercap-set . Limiting CPU power allows the GPU to consume more watts, which translates directly into higher performance.
 

During testing, I also monitored GPU power consumption. Although it never hit the theoretical 145 W maximum, it stably hovered between 130–135 W. The best FPS results coincided with these higher GPU power levels.

For each scenario, I configured both long-term and short-term CPU power limits, for example: 60 W long-term and 95 W short-term.

Long / short term min average max
60 / 95 113 158 183
60 / 80 132 158 182
60 / 70 130 158 182
50 / 60 135 165 190

The final settings were tuned for SuperTuxKart, but I also tested CPU-heavy games such as The Last of Us Remastered to ensure performance remained optimal.

Overall, the best balance I found was with CPU power limits of 55 W long-term / 65 W short-term, providing both stability and maximum GPU utilization.

Gamemoderun

After completing all the tests, I decided to leverage gamemoderun to automatically execute scripts when games start and stop. This allows me to apply optimizations such as CPU power limits and GPU undervolting only while gaming, keeping the system in a more conservative state at other times.

Start Script:

End Script:

Nvidia Undervolt Script:

These scripts ensure that the system automatically maximizes GPU performance and optimizes CPU power for each gaming session, without requiring manual adjustments.

More details about keyboard scripts and automation will be covered in the next chapter.

Misc / Bonus

In this section, I’m sharing some additional tips and insights about using this laptop under Linux. Keep in mind that their relevance or effectiveness may change over time with software updates or new drivers.

Tuxedo control center 

Arch Linux provides the tuxedo-control-center-bin  package via the AUR. In practice, I found it mostly redundant under Linux. While it allows adjusting some CPU settings, I prefer automating everything with scripts and gamemoderun  rather than doing manual tweaks.

The only situation where it proved useful was for monitoring CPU temperatures and power consumption during benchmarking. That said, there are plenty of alternative tools on Linux that can provide the same information more flexibly.

Battery profile

On Linux, the battery profile resets at each boot. I wanted to set it to “stationary” to help extend battery lifespan.

The battery profile is exposed via: /sys/devices/platform/tuxedo_keyboard/charging_profile/charging_profile 

Unfortunately, it cannot be persisted using sysctl.

Following the guidance from the systemd Arch Linux wiki, I created a tmpfiles entry at /etc/tmpfiles.d/tuxedo_settings.conf to automatically apply the desired profile at boot:

This ensures that the battery profile is set correctly every time the laptop starts, without manual intervention.

Keyboard color

I wasn’t able to replicate the exact “cool” lighting effects that the XMG Control Center provides on Windows 11. However, under Linux, the keyboard backlight can be controlled like any other LED using the Tuxedo drivers. On Arch Linux, the relevant AUR package is: tuxedo-drivers-nocompatcheck-dkms.

The “nocompatcheck” variant allows installing the driver on non-official Tuxedo hardware, including XMG laptops.

I then created a set of scripts to dynamically control the keyboard color based on the desktop background or whether GameModeRun is active.

I’m using Plasma’s “Picture of the Day” feature with the Bing provider for my desktop background. The scripts are stored in ~/.local/bin :

  • keyboard_color.sh – Sets the keyboard color based on the current desktop image.
  • keyboard_gaming.sh – Applies a dedicated color setup for gaming; triggered by gamemoderun 
  • wallpaper_check.sh – Runs at Plasma session start, checks for background image changes, and calls keyboard_color.sh if necessary.

Below are the three scripts:

keyboard_color.sh

keyboard_gaming.sh:

wallpaper_check.sh:

This setup allows the keyboard lighting to adapt dynamically to the desktop or gaming session, giving a visual feedback similar to the Windows XMG Control Center, but fully integrated into Linux.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.