On Wed, Mar 25, 2026 at 12:09 PM Lijo Lazar <[email protected]> wrote:
>
> Use reserve region helpers for initializing/reserving firmware usage
> region in virtualized environments.
>
> Signed-off-by: Lijo Lazar <[email protected]>

Reviewed-by: Alex Deucher <[email protected]>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c  |  6 +--
>  .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c  | 12 ++---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c       | 54 ++++---------------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h       |  6 ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c      | 39 +++++++-------
>  .../drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c |  8 +--
>  6 files changed, 41 insertions(+), 84 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> index 763f2b8dcf13..956eb33008f8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
> @@ -1685,9 +1685,9 @@ static int amdgpu_atombios_allocate_fb_scratch(struct 
> amdgpu_device *adev)
>                         
> (uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION <<
>                         ATOM_VRAM_OPERATION_FLAGS_SHIFT)) {
>                         /* Firmware request VRAM reservation for SR-IOV */
> -                       adev->mman.fw_vram_usage_start_offset = (start_addr &
> -                               (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10;
> -                       adev->mman.fw_vram_usage_size = size << 10;
> +                       amdgpu_ttm_init_vram_resv(adev, 
> AMDGPU_RESV_FW_VRAM_USAGE,
> +                                         (start_addr & 
> (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10,
> +                                         size << 10, true);
>                         /* Use the default scratch size */
>                         usage_bytes = 0;
>                 } else {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> index 7f4751e5caaf..36e1f6b65075 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> @@ -120,9 +120,9 @@ static int amdgpu_atomfirmware_allocate_fb_v2_1(struct 
> amdgpu_device *adev,
>                 (u32)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION <<
>                 ATOM_VRAM_OPERATION_FLAGS_SHIFT)) {
>                 /* Firmware request VRAM reservation for SR-IOV */
> -               adev->mman.fw_vram_usage_start_offset = (start_addr &
> -                       (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10;
> -               adev->mman.fw_vram_usage_size = fw_size << 10;
> +               amdgpu_ttm_init_vram_resv(adev, AMDGPU_RESV_FW_VRAM_USAGE,
> +                                 (start_addr & 
> (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10,
> +                                 fw_size << 10, true);
>                 /* Use the default scratch size */
>                 *usage_bytes = 0;
>         } else {
> @@ -152,9 +152,9 @@ static int amdgpu_atomfirmware_allocate_fb_v2_2(struct 
> amdgpu_device *adev,
>             ((fw_start_addr & (ATOM_VRAM_BLOCK_NEEDS_NO_RESERVATION <<
>                 ATOM_VRAM_OPERATION_FLAGS_SHIFT)) == 0)) {
>                 /* Firmware request VRAM reservation for SR-IOV */
> -               adev->mman.fw_vram_usage_start_offset = (fw_start_addr &
> -                       (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10;
> -               adev->mman.fw_vram_usage_size = fw_size << 10;
> +               amdgpu_ttm_init_vram_resv(adev, AMDGPU_RESV_FW_VRAM_USAGE,
> +                                 (fw_start_addr & 
> (~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10,
> +                                 fw_size << 10, true);
>         }
>
>         if (amdgpu_sriov_vf(adev) &&
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 0dde3fbfba59..674ceb24f93a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -1735,22 +1735,6 @@ void amdgpu_ttm_unreserve_vram(struct amdgpu_device 
> *adev,
>         memset(resv, 0, sizeof(*resv));
>  }
>
> -/*
> - * Firmware Reservation functions
> - */
> -/**
> - * amdgpu_ttm_fw_reserve_vram_fini - free fw reserved vram
> - *
> - * @adev: amdgpu_device pointer
> - *
> - * free fw reserved vram if it has been reserved.
> - */
> -static void amdgpu_ttm_fw_reserve_vram_fini(struct amdgpu_device *adev)
> -{
> -       amdgpu_bo_free_kernel(&adev->mman.fw_vram_usage_reserved_bo,
> -               NULL, &adev->mman.fw_vram_usage_va);
> -}
> -
>  /*
>   * Driver Reservation functions
>   */
> @@ -1768,31 +1752,6 @@ static void amdgpu_ttm_drv_reserve_vram_fini(struct 
> amdgpu_device *adev)
>                                                   
> &adev->mman.drv_vram_usage_va);
>  }
>
> -/**
> - * amdgpu_ttm_fw_reserve_vram_init - create bo vram reservation from fw
> - *
> - * @adev: amdgpu_device pointer
> - *
> - * create bo vram reservation from fw.
> - */
> -static int amdgpu_ttm_fw_reserve_vram_init(struct amdgpu_device *adev)
> -{
> -       uint64_t vram_size = adev->gmc.visible_vram_size;
> -
> -       adev->mman.fw_vram_usage_va = NULL;
> -       adev->mman.fw_vram_usage_reserved_bo = NULL;
> -
> -       if (adev->mman.fw_vram_usage_size == 0 ||
> -           adev->mman.fw_vram_usage_size > vram_size)
> -               return 0;
> -
> -       return amdgpu_bo_create_kernel_at(adev,
> -                                         
> adev->mman.fw_vram_usage_start_offset,
> -                                         adev->mman.fw_vram_usage_size,
> -                                         
> &adev->mman.fw_vram_usage_reserved_bo,
> -                                         &adev->mman.fw_vram_usage_va);
> -}
> -
>  /**
>   * amdgpu_ttm_drv_reserve_vram_init - create bo vram reservation from driver
>   *
> @@ -2183,9 +2142,14 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
>          *The reserved vram for firmware must be pinned to the specified
>          *place on the VRAM, so reserve it early.
>          */
> -       r = amdgpu_ttm_fw_reserve_vram_init(adev);
> -       if (r)
> -               return r;
> +       if (adev->mman.resv_region[AMDGPU_RESV_FW_VRAM_USAGE].size >
> +           adev->gmc.visible_vram_size) {
> +               adev->mman.resv_region[AMDGPU_RESV_FW_VRAM_USAGE].size = 0;
> +       } else {
> +               r = amdgpu_ttm_reserve_vram(adev, AMDGPU_RESV_FW_VRAM_USAGE);
> +               if (r)
> +                       return r;
> +       }
>
>         /*
>          * The reserved VRAM for the driver must be pinned to a specific
> @@ -2348,7 +2312,7 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
>                                         &adev->mman.sdma_access_ptr);
>
>         amdgpu_ttm_free_mmio_remap_bo(adev);
> -       amdgpu_ttm_fw_reserve_vram_fini(adev);
> +       amdgpu_ttm_unreserve_vram(adev, AMDGPU_RESV_FW_VRAM_USAGE);
>         amdgpu_ttm_drv_reserve_vram_fini(adev);
>
>         if (drm_dev_enter(adev_to_drm(adev), &idx)) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> index eaa26cda5780..df46f43e578c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> @@ -101,12 +101,6 @@ struct amdgpu_mman {
>
>         bool                    keep_stolen_vga_memory;
>
> -       /* firmware VRAM reservation */
> -       u64             fw_vram_usage_start_offset;
> -       u64             fw_vram_usage_size;
> -       struct amdgpu_bo        *fw_vram_usage_reserved_bo;
> -       void            *fw_vram_usage_va;
> -
>         /* driver VRAM reservation */
>         u64             drv_vram_usage_start_offset;
>         u64             drv_vram_usage_size;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> index c8e4c6e356aa..e9b8c08051f3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> @@ -437,12 +437,8 @@ static void amdgpu_virt_add_bad_page(struct 
> amdgpu_device *adev,
>         struct eeprom_table_record bp;
>         uint64_t retired_page;
>         uint32_t bp_idx, bp_cnt;
> -       void *vram_usage_va = NULL;
> -
> -       if (adev->mman.fw_vram_usage_va)
> -               vram_usage_va = adev->mman.fw_vram_usage_va;
> -       else
> -               vram_usage_va = adev->mman.drv_vram_usage_va;
> +       void *fw_va = 
> adev->mman.resv_region[AMDGPU_RESV_FW_VRAM_USAGE].cpu_addr;
> +       void *vram_usage_va = fw_va ? fw_va : adev->mman.drv_vram_usage_va;
>
>         memset(&bp, 0, sizeof(bp));
>
> @@ -710,15 +706,16 @@ void amdgpu_virt_fini_data_exchange(struct 
> amdgpu_device *adev)
>  void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev)
>  {
>         uint32_t *pfvf_data = NULL;
> +       void *fw_va = 
> adev->mman.resv_region[AMDGPU_RESV_FW_VRAM_USAGE].cpu_addr;
>
>         adev->virt.fw_reserve.p_pf2vf = NULL;
>         adev->virt.fw_reserve.p_vf2pf = NULL;
>         adev->virt.vf2pf_update_interval_ms = 0;
>         adev->virt.vf2pf_update_retry_cnt = 0;
>
> -       if (adev->mman.fw_vram_usage_va && adev->mman.drv_vram_usage_va) {
> +       if (fw_va && adev->mman.drv_vram_usage_va) {
>                 dev_warn(adev->dev, "Currently fw_vram and drv_vram should 
> not have values at the same time!");
> -       } else if (adev->mman.fw_vram_usage_va || 
> adev->mman.drv_vram_usage_va) {
> +       } else if (fw_va || adev->mman.drv_vram_usage_va) {
>                 /* go through this logic in ip_init and reset to init 
> workqueue*/
>                 amdgpu_virt_exchange_data(adev);
>
> @@ -763,31 +760,32 @@ void amdgpu_virt_exchange_data(struct amdgpu_device 
> *adev)
>         uint64_t bp_block_offset = 0;
>         uint32_t bp_block_size = 0;
>         struct amd_sriov_msg_pf2vf_info *pf2vf_v2 = NULL;
> +       void *fw_va = 
> adev->mman.resv_region[AMDGPU_RESV_FW_VRAM_USAGE].cpu_addr;
>
> -       if (adev->mman.fw_vram_usage_va || adev->mman.drv_vram_usage_va) {
> -               if (adev->mman.fw_vram_usage_va) {
> +       if (fw_va || adev->mman.drv_vram_usage_va) {
> +               if (fw_va) {
>                         if (adev->virt.req_init_data_ver == 
> GPU_CRIT_REGION_V2) {
>                                 adev->virt.fw_reserve.p_pf2vf =
>                                         (struct 
> amd_sriov_msg_pf2vf_info_header *)
> -                                       (adev->mman.fw_vram_usage_va +
> +                                       (fw_va +
>                                         
> adev->virt.crit_regn_tbl[AMD_SRIOV_MSG_DATAEXCHANGE_TABLE_ID].offset);
>                                 adev->virt.fw_reserve.p_vf2pf =
>                                         (struct 
> amd_sriov_msg_vf2pf_info_header *)
> -                                       (adev->mman.fw_vram_usage_va +
> +                                       (fw_va +
>                                         
> adev->virt.crit_regn_tbl[AMD_SRIOV_MSG_DATAEXCHANGE_TABLE_ID].offset +
>                                         (AMD_SRIOV_MSG_SIZE_KB << 10));
>                                 adev->virt.fw_reserve.ras_telemetry =
> -                                       (adev->mman.fw_vram_usage_va +
> +                                       (fw_va +
>                                         
> adev->virt.crit_regn_tbl[AMD_SRIOV_MSG_RAS_TELEMETRY_TABLE_ID].offset);
>                         } else {
>                                 adev->virt.fw_reserve.p_pf2vf =
>                                         (struct 
> amd_sriov_msg_pf2vf_info_header *)
> -                                       (adev->mman.fw_vram_usage_va + 
> (AMD_SRIOV_MSG_PF2VF_OFFSET_KB_V1 << 10));
> +                                       (fw_va + 
> (AMD_SRIOV_MSG_PF2VF_OFFSET_KB_V1 << 10));
>                                 adev->virt.fw_reserve.p_vf2pf =
>                                         (struct 
> amd_sriov_msg_vf2pf_info_header *)
> -                                       (adev->mman.fw_vram_usage_va + 
> (AMD_SRIOV_MSG_VF2PF_OFFSET_KB_V1 << 10));
> +                                       (fw_va + 
> (AMD_SRIOV_MSG_VF2PF_OFFSET_KB_V1 << 10));
>                                 adev->virt.fw_reserve.ras_telemetry =
> -                                       (adev->mman.fw_vram_usage_va + 
> (AMD_SRIOV_MSG_RAS_TELEMETRY_OFFSET_KB_V1 << 10));
> +                                       (fw_va + 
> (AMD_SRIOV_MSG_RAS_TELEMETRY_OFFSET_KB_V1 << 10));
>                         }
>                 } else if (adev->mman.drv_vram_usage_va) {
>                         adev->virt.fw_reserve.p_pf2vf =
> @@ -1081,13 +1079,14 @@ int amdgpu_virt_init_critical_region(struct 
> amdgpu_device *adev)
>         }
>
>         /* 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;
> +       amdgpu_ttm_init_vram_resv(adev, AMDGPU_RESV_FW_VRAM_USAGE,
> +                                 adev->virt.crit_regn.offset,
> +                                 adev->virt.crit_regn.size_kb << 10, true);
>         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->mman.resv_region[AMDGPU_RESV_FW_VRAM_USAGE].offset,
> +                       
> adev->mman.resv_region[AMDGPU_RESV_FW_VRAM_USAGE].size >> 10);
>
>         adev->virt.is_dynamic_crit_regn_enabled = true;
>
> diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c 
> b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c
> index 81553230dca4..1a640b76c988 100644
> --- a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c
> +++ b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c
> @@ -36,17 +36,17 @@ static int amdgpu_virt_ras_get_cmd_shared_mem(struct 
> ras_core_context *ras_core,
>         struct amdgpu_device *adev = ras_core->dev;
>         struct amdsriov_ras_telemetry *ras_telemetry_cpu;
>         struct amdsriov_ras_telemetry *ras_telemetry_gpu;
> +       void *fw_va = 
> adev->mman.resv_region[AMDGPU_RESV_FW_VRAM_USAGE].cpu_addr;
>         uint64_t fw_vram_usage_start_offset = 0;
>         uint64_t ras_telemetry_offset = 0;
>
>         if (!adev->virt.fw_reserve.ras_telemetry)
>                 return -EINVAL;
>
> -       if (adev->mman.fw_vram_usage_va &&
> -           adev->mman.fw_vram_usage_va <= 
> adev->virt.fw_reserve.ras_telemetry) {
> -               fw_vram_usage_start_offset = 
> adev->mman.fw_vram_usage_start_offset;
> +       if (fw_va && fw_va <= adev->virt.fw_reserve.ras_telemetry) {
> +               fw_vram_usage_start_offset = 
> adev->mman.resv_region[AMDGPU_RESV_FW_VRAM_USAGE].offset;
>                 ras_telemetry_offset = 
> (uintptr_t)adev->virt.fw_reserve.ras_telemetry -
> -                               (uintptr_t)adev->mman.fw_vram_usage_va;
> +                               (uintptr_t)fw_va;
>         } else if (adev->mman.drv_vram_usage_va &&
>                 adev->mman.drv_vram_usage_va <= 
> adev->virt.fw_reserve.ras_telemetry) {
>                 fw_vram_usage_start_offset = 
> adev->mman.drv_vram_usage_start_offset;
> --
> 2.49.0
>

Reply via email to