[AMD Official Use Only - AMD Internal Distribution Only]

>-----Original Message-----
>From: Pan, Ellen <[email protected]>
>Sent: Friday, October 10, 2025 10:13 AM
>To: [email protected]
>Cc: Deucher, Alexander <[email protected]>; Koenig, Christian
><[email protected]>; Lazar, Lijo <[email protected]>; Chan, Hing
>Pong <[email protected]>; Pan, Ellen <[email protected]>
>Subject: [PATCH 4/6] drm/amdgpu: Reuse fw_vram_usage_* for dynamic critical
>region in SRIOV
>
>- 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;
[lijo]

Since you are skipping FW usage tables, isn't drv_vram_usage_size expected to 
be 0 anyway? The discovery one below will need a separate check though for now.

Thanks,
Lijo

>+
>+              /*
>+               * 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