- 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 <[email protected]>
---
 .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c  | 29 ++++++++--------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c       | 33 +++++++++++--------
 drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c      |  9 +++++
 3 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
index c7d32fb216e4..636385c80f64 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
@@ -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);
+                       }
                }
        }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 96bd0185f936..c0810c53703c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -1943,23 +1943,28 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
        if (r)
                return r;
 
-       /*
-        *The reserved vram for driver must be pinned to the specified
-        *place on the 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.
+       /* For VFs with dynamic critical regions (v2), fw_reserve_vram is 
already
+        * reserved, so no additional memory reservation is required below.
         */
-       if (adev->mman.discovery_bin) {
-               r = amdgpu_ttm_reserve_tmr(adev);
+       if (!amdgpu_sriov_vf(adev) || (adev->virt.req_init_data_ver != 
GPU_CRIT_REGION_V2)) {
+               /*
+                * 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 later ASICs support IP discovery.
+                * If IP discovery is enabled, a block of memory should be
+                * reserved for it.
+                */
+               if (adev->mman.discovery_bin) {
+                       r = amdgpu_ttm_reserve_tmr(adev);
+                       if (r)
+                               return r;
+               }
        }
 
        /* allocate memory as required for VGA
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
index 6eca5e8a7375..461e83728594 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
@@ -940,6 +940,15 @@ int amdgpu_virt_init_critical_region(struct amdgpu_device 
*adev)
                
adev->virt.crit_regn_tbl[AMD_SRIOV_MSG_BAD_PAGE_INFO_TABLE_ID].size_kb =
                        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 %08x with %d 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;
                break;
        default:
-- 
2.34.1

Reply via email to