]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Reuse fw_vram_usage_* for dynamic critical region in SRIOV
authorEllen Pan <yunru.pan@amd.com>
Wed, 8 Oct 2025 20:01:10 +0000 (15:01 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 20 Oct 2025 22:28:08 +0000 (18:28 -0400)
- During guest driver init, asa VFs receive PF msg to
init dynamic critical region(v2), VFs reuse fw_vram_usage_*
 from ttm to store critical region tables in a 5MB chunk.

Signed-off-by: Ellen Pan <yunru.pan@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c

index c7d32fb216e4ed5a742815f135c1c613020d7e35..636385c80f643003e37793fe7e89a4d981cac570 100644 (file)
@@ -181,19 +181,22 @@ int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev)
        u8 frev, crev;
        int usage_bytes = 0;
 
-       if (amdgpu_atom_parse_data_header(ctx, index, NULL, &frev, &crev, &data_offset)) {
-               if (frev == 2 && crev == 1) {
-                       fw_usage_v2_1 =
-                               (struct vram_usagebyfirmware_v2_1 *)(ctx->bios + data_offset);
-                       amdgpu_atomfirmware_allocate_fb_v2_1(adev,
-                                       fw_usage_v2_1,
-                                       &usage_bytes);
-               } else if (frev >= 2 && crev >= 2) {
-                       fw_usage_v2_2 =
-                               (struct vram_usagebyfirmware_v2_2 *)(ctx->bios + data_offset);
-                       amdgpu_atomfirmware_allocate_fb_v2_2(adev,
-                                       fw_usage_v2_2,
-                                       &usage_bytes);
+       /* Skip atomfirmware allocation for SRIOV VFs when dynamic crit regn is enabled */
+       if (!(amdgpu_sriov_vf(adev) && adev->virt.is_dynamic_crit_regn_enabled)) {
+               if (amdgpu_atom_parse_data_header(ctx, index, NULL, &frev, &crev, &data_offset)) {
+                       if (frev == 2 && crev == 1) {
+                               fw_usage_v2_1 =
+                                       (struct vram_usagebyfirmware_v2_1 *)(ctx->bios + data_offset);
+                               amdgpu_atomfirmware_allocate_fb_v2_1(adev,
+                                               fw_usage_v2_1,
+                                               &usage_bytes);
+                       } else if (frev >= 2 && crev >= 2) {
+                               fw_usage_v2_2 =
+                                       (struct vram_usagebyfirmware_v2_2 *)(ctx->bios + data_offset);
+                               amdgpu_atomfirmware_allocate_fb_v2_2(adev,
+                                               fw_usage_v2_2,
+                                               &usage_bytes);
+                       }
                }
        }
 
index 2f2a88979644b22480accaafb44508847473db83..326476089db320e8badd67a88a213409b5d86b54 100644 (file)
@@ -1941,17 +1941,17 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
                return r;
 
        /*
-        *The reserved vram for driver must be pinned to the specified
-        *place on the VRAM, so reserve it early.
+        * The reserved VRAM for the driver must be pinned to a specific
+        * location in VRAM, so reserve it early.
         */
        r = amdgpu_ttm_drv_reserve_vram_init(adev);
        if (r)
                return r;
 
        /*
-        * only NAVI10 and onwards ASIC support for IP discovery.
-        * If IP discovery enabled, a block of memory should be
-        * reserved for IP discovey.
+        * only NAVI10 and later ASICs support IP discovery.
+        * If IP discovery is enabled, a block of memory should be
+        * reserved for it.
         */
        if (adev->discovery.reserve_tmr) {
                r = amdgpu_ttm_reserve_tmr(adev);
index 1779b1ac30d223c8f6cf7d3053dc46a60839001d..7cabcbdb50e17551817ff12a06e176789a967b0d 100644 (file)
@@ -1008,6 +1008,15 @@ int amdgpu_virt_init_critical_region(struct amdgpu_device *adev)
                        init_data_hdr->bad_page_size_in_kb;
        }
 
+       /* reserved memory starts from crit region base offset with the size of 5MB */
+       adev->mman.fw_vram_usage_start_offset = adev->virt.crit_regn.offset;
+       adev->mman.fw_vram_usage_size = adev->virt.crit_regn.size_kb << 10;
+       dev_info(adev->dev,
+               "critical region v%d requested to reserve memory start at %08llx with %llu KB.\n",
+                       init_data_hdr->version,
+                       adev->mman.fw_vram_usage_start_offset,
+                       adev->mman.fw_vram_usage_size >> 10);
+
        adev->virt.is_dynamic_crit_regn_enabled = true;
 
 out: