Use reserve region helpers for initializing/reserving firmware usage
region in virtualized environments.

Signed-off-by: Lijo Lazar <[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