]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdgpu: cap GTT size to physical RAM on APUs
authorHarkirat Gill <harkirat.gill@amd.com>
Mon, 27 Jul 2026 18:37:56 +0000 (14:37 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 29 Jul 2026 00:01:16 +0000 (20:01 -0400)
On APUs, the GTT pool is backed by system RAM, but its size is not bound
to the non-carveout memory that actually backs it. A user can end up
with GTT + VRAM exceeding total physical memory through the following
sequence:

 - Have a large non-carveout memory space (~128GB) and accordingly set a
   large GTT (~100GB) via the ttm module parameter.
 - Lower the non-carveout memory space in BIOS by increasing the UMA
   Frame Buffer Size (VRAM) to 64GB.
 - The previously set GTT value (~100GB) persists, even though the new
   non-carveout space (64GB) can no longer back it.

This leads to a case where kernel reports GTT (100GB) + VRAM (64GB)
despite the sum being greater than total physical memory (128GB).

Cap the GTT size to totalram_pages() on APUs. totalram_pages() already
excludes the VRAM carveout, so the resulting GTT can never exceed the
system RAM that actually backs it.

Signed-off-by: Harkirat Gill <harkirat.gill@amd.com>
Reviewed-by: David Francis <David.Francis@amd.com>
Assisted-by: Claude:claude-opus-4
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 5dafdd649280c7dc6c22c8f877da3f54fcc441e1)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c

index eb8bbfc7e6d9b999ea772b413bb6cd814c2b5c06..5fc91f45db5b9659b7f3f77bc66309dec5584b0e 100644 (file)
@@ -2173,6 +2173,18 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
                gtt_size = configured_size;
        }
 
+       /* Cap GTT so that it does not exceed total physical RAM. */
+       if (adev->flags & AMD_IS_APU) {
+               u64 phys_ram = (u64)totalram_pages() << PAGE_SHIFT;
+
+               if (gtt_size > phys_ram) {
+                       gtt_size = phys_ram;
+                       dev_info(adev->dev,
+                                "Capping GTT to %uM to not exceed available system memory\n",
+                                (unsigned int)(gtt_size / (1024 * 1024)));
+               }
+       }
+
        /* Initialize GTT memory pool */
        r = amdgpu_gtt_mgr_init(adev, gtt_size);
        if (r) {