drm/amdgpu: add support for extended stolen vga memory
authorAlex Deucher <alexander.deucher@amd.com>
Tue, 28 Jul 2020 22:05:11 +0000 (18:05 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 4 Aug 2020 21:29:28 +0000 (17:29 -0400)
This will allow us to split the allocation for systems
where we have to keep the stolen memory around to avoid
S3 issues.  This way we don't waste as much memory and
still avoid any screen artifacts during the bios to
driver transition.

Reviewed-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c

index 0cf18f01e67a4507986fc10a14789731648a566c..8f4af955d72ceb2c9c113b81ad46ed11e32fcb30 100644 (file)
@@ -215,6 +215,8 @@ struct amdgpu_gmc {
        bool                    prt_warning;
        uint64_t                stolen_vga_size;
        struct amdgpu_bo        *stolen_vga_memory;
+       uint64_t                stolen_extended_size;
+       struct amdgpu_bo        *stolen_extended_memory;
        bool                    keep_stolen_vga_memory;
        uint32_t                sdpif_register;
        /* apertures */
index fd61769202b39e59186a7ff78b7b9602c6cfab9d..ec975251b171c77de0264b83b932743cfb638954 100644 (file)
@@ -1915,7 +1915,7 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
        uint64_t gtt_size;
        int r;
        u64 vis_vram_limit;
-       void *stolen_vga_buf;
+       void *stolen_vga_buf, *stolen_extended_buf;
 
        mutex_init(&adev->mman.gtt_window_lock);
 
@@ -1985,6 +1985,13 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
                                       &stolen_vga_buf);
        if (r)
                return r;
+       r = amdgpu_bo_create_kernel_at(adev, adev->gmc.stolen_vga_size,
+                                      adev->gmc.stolen_extended_size,
+                                      AMDGPU_GEM_DOMAIN_VRAM,
+                                      &adev->gmc.stolen_extended_memory,
+                                      &stolen_extended_buf);
+       if (r)
+               return r;
 
        DRM_INFO("amdgpu: %uM of VRAM memory ready\n",
                 (unsigned) (adev->gmc.real_vram_size / (1024 * 1024)));
@@ -2041,11 +2048,13 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
  */
 void amdgpu_ttm_late_init(struct amdgpu_device *adev)
 {
-       void *stolen_vga_buf;
+       void *stolen_vga_buf, *stolen_extended_buf;
 
        /* return the VGA stolen memory (if any) back to VRAM */
        if (!adev->gmc.keep_stolen_vga_memory)
                amdgpu_bo_free_kernel(&adev->gmc.stolen_vga_memory, NULL, &stolen_vga_buf);
+       amdgpu_bo_free_kernel(&adev->gmc.stolen_extended_memory, NULL,
+                             &stolen_extended_buf);
 }
 
 /**