<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Nvidia on Andy Little</title><link>https://andylittle.net/tags/nvidia/</link><description>Recent content in Nvidia on Andy Little</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 22 Jul 2026 12:00:00 -0500</lastBuildDate><atom:link href="https://andylittle.net/tags/nvidia/index.xml" rel="self" type="application/rss+xml"/><item><title>Installing the NVIDIA T600 Driver with PRIME Render Offload on Debian 12 (Dell Precision 3571)</title><link>https://andylittle.net/blog/2026/nvidia-t600-prime-render-offload-debian-12/</link><pubDate>Wed, 22 Jul 2026 12:00:00 -0500</pubDate><guid>https://andylittle.net/blog/2026/nvidia-t600-prime-render-offload-debian-12/</guid><description>A step-by-step guide to getting a PRIME render offload setup working on a Dell Precision 3571 — Intel iGPU driving the desktop, NVIDIA T600 on demand — plus the specific mistakes that commonly break it.</description><content:encoded><![CDATA[<p>This guide walks through installing the proprietary NVIDIA driver on a Dell
Precision 3571 (or any similar Optimus laptop with an NVIDIA T600 / Turing-class
dGPU and Intel integrated graphics) running Debian 12 &ldquo;Bookworm.&rdquo; The goal is a
proper <strong>PRIME render offload</strong> setup: the Intel iGPU drives the desktop for
good battery life, and the NVIDIA GPU stays parked until you explicitly hand it
a workload (CUDA, Blender, NVENC, 3D, etc.).</p>
<p>It also documents the specific mistakes that commonly break this install, so
you can avoid them.</p>
<p><strong>Applies to:</strong> Debian 12 (Bookworm), Optimus laptops with Intel iGPU + NVIDIA
dGPU. Examples use an NVIDIA T600 Laptop GPU (Turing, <code>TU117</code>) at PCI address
<code>01:00.0</code>. Adjust the PCI address to match your hardware (find it with
<code>lspci | grep -i nvidia</code>).</p>
<h2 id="before-you-start-know-your-starting-state">Before you start: know your starting state</h2>
<p>Before installing anything, confirm what the system is actually running. This
avoids fighting a half-configured driver. Run:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">lspci -k -s 01:00.0                <span class="c1"># which kernel driver is bound to the GPU?</span>
</span></span><span class="line"><span class="cl">lsmod <span class="p">|</span> grep -E <span class="s1">&#39;nvidia|nouveau&#39;</span>   <span class="c1"># which modules are loaded right now?</span>
</span></span><span class="line"><span class="cl">dpkg -l <span class="p">|</span> grep -i nvidia           <span class="c1"># any NVIDIA packages already installed?</span>
</span></span><span class="line"><span class="cl">ls -la /etc/X11/xorg.conf          <span class="c1"># is there a leftover X config? (there should NOT be)</span>
</span></span></code></pre></div><p>On a fresh system you will typically see the open-source <code>nouveau</code> driver
bound to the card, no NVIDIA packages installed, and no <code>/etc/X11/xorg.conf</code>.
That is the clean baseline this guide assumes.</p>
<p><strong>If <code>/etc/X11/xorg.conf</code> exists, deal with it first.</strong> A stale X config —
usually left behind by a previous <code>nvidia-xconfig</code> run — is the single most
common reason a &ldquo;clean&rdquo; reinstall still produces a black screen. Move it out
of the way: <code>sudo mv /etc/X11/xorg.conf /etc/X11/xorg.conf.bak</code>. On a
PRIME/Optimus laptop you want <strong>no</strong> hand-written <code>xorg.conf</code> at all.</p>
<h2 id="step-1--enable-the-non-free-repositories">Step 1 — Enable the <code>non-free</code> repositories</h2>
<p>The NVIDIA driver lives in Debian&rsquo;s <code>non-free</code> component. Check your sources:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /etc/apt/sources.list
</span></span></code></pre></div><p>Each Bookworm line should include <code>contrib non-free non-free-firmware</code>. For
example:</p>
<pre tabindex="0"><code>deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware
</code></pre><p>If your system uses the newer deb822 format instead, you&rsquo;ll have a <code>.sources</code>
file under <code>/etc/apt/sources.list.d/</code>; add <code>contrib non-free non-free-firmware</code>
to its <code>Components:</code> line rather than editing <code>sources.list</code>.</p>
<h2 id="step-2--install-kernel-headers-and-the-driver">Step 2 — Install kernel headers and the driver</h2>
<p>The kernel headers are not optional. Without them, DKMS has nothing to build
the NVIDIA kernel module against, and the install will <em>silently</em> do nothing —
you&rsquo;ll reboot and still be on nouveau with no obvious error. Install the
headers first, then the driver:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt install linux-headers-amd64
</span></span><span class="line"><span class="cl">sudo apt install nvidia-driver mesa-utils
</span></span></code></pre></div><p>The <code>nvidia-driver</code> metapackage pulls in <code>nvidia-kernel-dkms</code> and builds the
module during installation. <code>mesa-utils</code> gives you <code>glxinfo</code> for verification
later.</p>
<p><strong>Watch the two messages that appear during install</strong> — both are normal and
neither is an error. They&rsquo;re explained next.</p>
<h3 id="conflicting-nouveau-kernel-module-loaded">&ldquo;Conflicting nouveau kernel module loaded&rdquo;</h3>
<p>The installer warns that nouveau is currently loaded and conflicts with the
NVIDIA module. This is expected: nouveau is driving the card in your <em>running</em>
session and can&rsquo;t be swapped out live. The install adds a modprobe blacklist
for nouveau; the switch happens on reboot. Just acknowledge the dialog and let
the install finish.</p>
<h3 id="dkms-builds-for-the-current-kernel-and-may-skip-an-old-one">DKMS builds for the current kernel and may &ldquo;skip&rdquo; an old one</h3>
<p>If you recently ran a system upgrade, you may have more than one kernel
installed. DKMS builds the module for your current/newest kernel and may
report skipping an older one:</p>
<pre tabindex="0"><code>Building for 6.1.0-XX-amd64 6.1.0-YY-amd64
Module build for kernel 6.1.0-XX-amd64 was skipped since the
kernel headers for this kernel do not seem to be installed.
Building initial module for 6.1.0-YY-amd64
</code></pre><p>This is fine. The module is built for the kernel you&rsquo;ll actually boot (the
newest one). The skipped kernel is just an older fallback entry in GRUB. If you
want to silence the skip — for example to keep the fallback kernel bootable
with NVIDIA — install headers for that specific version:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install linux-headers-6.1.0-XX-amd64   <span class="c1"># optional; replace with the skipped version</span>
</span></span></code></pre></div><h2 id="step-3--reboot-and-verify">Step 3 — Reboot and verify</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo reboot
</span></span></code></pre></div><p>If the machine comes back up to a normal desktop (no black screen), the
Intel-drives-the-display half is already working. Now confirm the driver swap
and the offload behavior:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">lsmod <span class="p">|</span> grep -E <span class="s1">&#39;nvidia|nouveau&#39;</span>    <span class="c1"># want nvidia* loaded, nouveau ABSENT</span>
</span></span><span class="line"><span class="cl">nvidia-smi                          <span class="c1"># want the GPU listed with its driver version</span>
</span></span><span class="line"><span class="cl">glxinfo <span class="p">|</span> grep <span class="s2">&#34;OpenGL renderer&#34;</span>    <span class="c1"># want Intel here (desktop on the iGPU = correct)</span>
</span></span></code></pre></div><p><strong>The desktop renderer reporting Intel is the goal, not a failure.</strong> Your
everyday desktop should render on the iGPU for battery life. The NVIDIA GPU
only comes into play when you explicitly offload to it (next step).</p>
<p>Now prove the NVIDIA GPU wakes on demand:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">__NV_PRIME_RENDER_OFFLOAD</span><span class="o">=</span><span class="m">1</span> <span class="nv">__GLX_VENDOR_LIBRARY_NAME</span><span class="o">=</span>nvidia glxinfo <span class="p">|</span> grep <span class="s2">&#34;OpenGL renderer&#34;</span>
</span></span></code></pre></div><p>This one should report the NVIDIA T600. If it does, PRIME render offload is
working end to end.</p>
<h2 id="step-4--using-the-gpu-offload-invocation">Step 4 — Using the GPU (offload invocation)</h2>
<p>To run any application on the NVIDIA GPU, prefix it with the two offload
environment variables:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">__NV_PRIME_RENDER_OFFLOAD</span><span class="o">=</span><span class="m">1</span> <span class="nv">__GLX_VENDOR_LIBRARY_NAME</span><span class="o">=</span>nvidia &lt;application&gt;
</span></span></code></pre></div><p>For example, to launch a game or a 3D app on the dGPU while everything else
stays on Intel. For convenience you can wrap this in a small shell alias or a
<code>prime-run</code>-style helper script.</p>
<h2 id="step-5--suspendresume-and-power-tuning">Step 5 — Suspend/resume and power tuning</h2>
<p>Debian&rsquo;s NVIDIA package ships <code>/etc/modprobe.d/nvidia-options.conf</code> with
several power-management options present but commented out. Two of them matter
on a laptop. Open the file:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo nano /etc/modprobe.d/nvidia-options.conf
</span></span></code></pre></div><p>Uncomment these two lines (remove the leading <code>#</code>):</p>
<pre tabindex="0"><code>options nvidia-current NVreg_PreserveVideoMemoryAllocations=1
options nvidia-current NVreg_EnableS0ixPowerManagement=1
</code></pre><table>
	<thead>
			<tr>
					<th>Option</th>
					<th>What it does</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>NVreg_PreserveVideoMemoryAllocations=1</code></td>
					<td>Saves the GPU&rsquo;s VRAM contents to system RAM on suspend and restores them on resume. Prevents corrupted output or a hung GPU after waking — essential on a laptop that suspends frequently. Also what makes the <code>nvidia-suspend</code> / <code>nvidia-hibernate</code> / <code>nvidia-resume</code> services function.</td>
			</tr>
			<tr>
					<td><code>NVreg_EnableS0ixPowerManagement=1</code></td>
					<td>Integrates the driver with the modern s2idle / s0ix low-power standby path used by current Intel laptops (including Alder Lake–based machines like the Precision 3571), rather than assuming legacy deep S3 sleep.</td>
			</tr>
	</tbody>
</table>
<p>Rebuild the initramfs and reboot so the options take effect:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo update-initramfs -u
</span></span><span class="line"><span class="cl">sudo reboot
</span></span></code></pre></div><p>After the reboot, test a suspend/resume cycle and confirm the display comes
back cleanly:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">systemctl <span class="nb">suspend</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wake the machine, confirm the screen restores correctly</span>
</span></span></code></pre></div><h2 id="optional--fully-power-down-the-dgpu-when-idle">Optional — Fully power down the dGPU when idle</h2>
<p>You may notice the NVIDIA GPU stays in a low but non-zero power state even
when nothing is offloaded to it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status   <span class="c1"># may read &#34;active&#34;</span>
</span></span></code></pre></div><p>To have the driver cut power to the GPU entirely (D3cold) when idle, add the
aggressive dynamic power-management option as a <strong>separate, deliberate
change</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;options nvidia &#34;NVreg_DynamicPowerManagement=0x02&#34;&#39;</span> <span class="p">|</span> sudo tee /etc/modprobe.d/nvidia-pm.conf
</span></span><span class="line"><span class="cl">sudo update-initramfs -u
</span></span><span class="line"><span class="cl">sudo reboot
</span></span></code></pre></div><p>After rebooting, re-check <code>runtime_status</code> (you want <code>suspended</code>) <strong>and
re-test <code>systemctl suspend</code></strong>. D3cold is the one setting most likely to
interfere with clean suspend/resume or dGPU wake on some configurations. If
anything misbehaves, simply remove the file
(<code>sudo rm /etc/modprobe.d/nvidia-pm.conf</code>), rebuild the initramfs, and reboot
to revert.</p>
<p>Change one power option at a time and re-test suspend after each. It&rsquo;s the
only reliable way to know which knob caused a regression.</p>
<h2 id="pitfalls--what-not-to-do">Pitfalls — what <em>not</em> to do</h2>
<table>
	<thead>
			<tr>
					<th>Don&rsquo;t</th>
					<th>Why it breaks things</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>nvidia-xconfig</code></td>
					<td>Generates an <code>/etc/X11/xorg.conf</code> that hard-pins X to the NVIDIA driver as the primary display. On an Optimus laptop the panel is wired to the Intel iGPU, so this causes a black screen or forces the dGPU to render the entire desktop (killing battery). Worse, the file <em>persists after you purge the driver</em>, so the system stays broken even after removal. Never run it on this class of hardware.</td>
			</tr>
			<tr>
					<td><code>apt install nvidia-driver-full</code></td>
					<td>That package name is an Ubuntu-ism — it does not exist in Debian&rsquo;s repositories. In Debian the package is simply <code>nvidia-driver</code>. Mixing a real metapackage with a nonexistent one leaves a partial, confusing state.</td>
			</tr>
			<tr>
					<td>Skipping <code>linux-headers-amd64</code></td>
					<td>Without matching kernel headers, DKMS can&rsquo;t build the kernel module and the install quietly no-ops. You reboot and you&rsquo;re still on nouveau, with no obvious error to point at.</td>
			</tr>
			<tr>
					<td>Hand-writing an <code>xorg.conf</code></td>
					<td>On a PRIME/Optimus setup, modern X auto-detects correctly. A manual config almost always fights the offload arrangement. Keep it absent.</td>
			</tr>
	</tbody>
</table>
<h2 id="reference--working-configuration-summary">Reference — working configuration summary</h2>
<table>
	<thead>
			<tr>
					<th>Item</th>
					<th>Value</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Hardware</td>
					<td>Dell Precision 3571, Intel iGPU + NVIDIA T600 Laptop GPU (Turing, TU117)</td>
			</tr>
			<tr>
					<td>OS</td>
					<td>Debian 12 (Bookworm)</td>
			</tr>
			<tr>
					<td>Driver</td>
					<td><code>nvidia-driver</code> (Bookworm <code>non-free</code>), DKMS-built against <code>linux-headers-amd64</code></td>
			</tr>
			<tr>
					<td>Mode</td>
					<td>PRIME render offload — Intel drives the desktop, NVIDIA on demand</td>
			</tr>
			<tr>
					<td>Offload invocation</td>
					<td><code>__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia &lt;app&gt;</code></td>
			</tr>
			<tr>
					<td>Power options (<code>/etc/modprobe.d/nvidia-options.conf</code>)</td>
					<td><code>NVreg_PreserveVideoMemoryAllocations=1</code>, <code>NVreg_EnableS0ixPowerManagement=1</code></td>
			</tr>
			<tr>
					<td>Optional dGPU power-down</td>
					<td><code>NVreg_DynamicPowerManagement=0x02</code> (D3cold), added separately and suspend-tested</td>
			</tr>
	</tbody>
</table>
<h2 id="quick-verification-checklist">Quick verification checklist</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># After the full setup, all of these should hold:</span>
</span></span><span class="line"><span class="cl">lsmod <span class="p">|</span> grep nouveau        <span class="c1"># (empty)  -&gt; nouveau blacklisted</span>
</span></span><span class="line"><span class="cl">nvidia-smi                  <span class="c1"># lists the T600 + driver version</span>
</span></span><span class="line"><span class="cl">glxinfo <span class="p">|</span> grep renderer     <span class="c1"># Intel    -&gt; desktop on iGPU</span>
</span></span><span class="line"><span class="cl"><span class="nv">__NV_PRIME_RENDER_OFFLOAD</span><span class="o">=</span><span class="m">1</span> <span class="nv">__GLX_VENDOR_LIBRARY_NAME</span><span class="o">=</span>nvidia glxinfo <span class="p">|</span> grep renderer   <span class="c1"># T600</span>
</span></span><span class="line"><span class="cl">systemctl <span class="nb">suspend</span>           <span class="c1"># resumes cleanly</span>
</span></span></code></pre></div><hr>
<p><em>This guide was written by Claude, an AI assistant made by Anthropic, based on
a hands-on troubleshooting session working through this exact setup step by
step.</em></p>
]]></content:encoded></item></channel></rss>