Add a function to fill in details for firmware reserve region.

Signed-off-by: Lijo Lazar <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 70 +++++++++++++++----------
 1 file changed, 41 insertions(+), 29 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index d5bd6f1a307f..f5aa4fecb1b0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -1693,6 +1693,43 @@ void amdgpu_ttm_init_vram_resv(struct amdgpu_device 
*adev,
        resv->needs_cpu_map = needs_cpu_map;
 }
 
+static void amdgpu_ttm_init_fw_resv_region(struct amdgpu_device *adev)
+{
+       uint32_t reserve_size = 0;
+
+       if (!adev->discovery.reserve_tmr)
+               return;
+
+       /*
+        * Query reserved tmr size through atom firmwareinfo for Sienna_Cichlid 
and onwards for all
+        * the use cases (IP discovery/G6 memory training/profiling/diagnostic 
data.etc)
+        *
+        * Otherwise, fallback to legacy approach to check and reserve tmr 
block for ip
+        * discovery data and G6 memory training data respectively
+        */
+       if (adev->bios)
+               reserve_size =
+                       amdgpu_atomfirmware_get_fw_reserved_fb_size(adev);
+
+       if (!adev->bios &&
+           (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) ||
+            amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4) ||
+            amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 5, 0)))
+               reserve_size = max(reserve_size, (uint32_t)280 << 20);
+       else if (!adev->bios &&
+                amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(12, 1, 0)) {
+               if (hweight32(adev->aid_mask) == 1)
+                       reserve_size = max(reserve_size, (uint32_t)128 << 20);
+               else
+                       reserve_size = max(reserve_size, (uint32_t)144 << 20);
+       } else if (!reserve_size)
+               reserve_size = DISCOVERY_TMR_OFFSET;
+
+       amdgpu_ttm_init_vram_resv(adev, AMDGPU_RESV_FW,
+                                 adev->gmc.real_vram_size - reserve_size,
+                                 reserve_size, false);
+}
+
 static void amdgpu_ttm_init_vram_resv_regions(struct amdgpu_device *adev)
 {
        /* Initialize memory reservations as required for VGA.
@@ -1701,6 +1738,7 @@ static void amdgpu_ttm_init_vram_resv_regions(struct 
amdgpu_device *adev)
         * and driver.
         */
        amdgpu_gmc_init_vga_resv_regions(adev);
+       amdgpu_ttm_init_fw_resv_region(adev);
 }
 
 int amdgpu_ttm_mark_vram_reserved(struct amdgpu_device *adev,
@@ -1794,9 +1832,11 @@ static int amdgpu_ttm_reserve_tmr(struct amdgpu_device 
*adev)
 {
        struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx;
        bool mem_train_support = false;
-       uint32_t reserve_size = 0;
+       uint32_t reserve_size;
        int ret;
 
+       reserve_size = adev->mman.resv_region[AMDGPU_RESV_FW].size;
+
        if (adev->bios && !amdgpu_sriov_vf(adev)) {
                if (amdgpu_atomfirmware_mem_training_supported(adev))
                        mem_train_support = true;
@@ -1804,31 +1844,6 @@ static int amdgpu_ttm_reserve_tmr(struct amdgpu_device 
*adev)
                        DRM_DEBUG("memory training does not support!\n");
        }
 
-       /*
-        * Query reserved tmr size through atom firmwareinfo for Sienna_Cichlid 
and onwards for all
-        * the use cases (IP discovery/G6 memory training/profiling/diagnostic 
data.etc)
-        *
-        * Otherwise, fallback to legacy approach to check and reserve tmr 
block for ip
-        * discovery data and G6 memory training data respectively
-        */
-       if (adev->bios)
-               reserve_size =
-                       amdgpu_atomfirmware_get_fw_reserved_fb_size(adev);
-
-       if (!adev->bios &&
-           (amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 3) ||
-            amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 4) ||
-            amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 5, 0)))
-               reserve_size = max(reserve_size, (uint32_t)280 << 20);
-       else if (!adev->bios && 
-                amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(12, 1, 0)) {
-               if (hweight32(adev->aid_mask) == 1)
-                       reserve_size = max(reserve_size, (uint32_t)128 << 20);
-               else
-                       reserve_size = max(reserve_size, (uint32_t)144 << 20);
-       } else if (!reserve_size)
-               reserve_size = DISCOVERY_TMR_OFFSET;
-
        if (mem_train_support) {
                /* reserve vram for mem train according to TMR location */
                amdgpu_ttm_training_data_block_init(adev, reserve_size);
@@ -1843,9 +1858,6 @@ static int amdgpu_ttm_reserve_tmr(struct amdgpu_device 
*adev)
                ctx->init = PSP_MEM_TRAIN_RESERVE_SUCCESS;
        }
 
-       amdgpu_ttm_init_vram_resv(adev, AMDGPU_RESV_FW,
-                                 adev->gmc.real_vram_size - reserve_size,
-                                 reserve_size, false);
        ret = amdgpu_ttm_mark_vram_reserved(adev, AMDGPU_RESV_FW);
        if (ret) {
                dev_err(adev->dev, "alloc tmr failed(%d)!\n", ret);
-- 
2.49.0

Reply via email to