]> git.itanic.dy.fi Git - linux-stable/commitdiff
drm/amdgpu/gmc: add a way to force a particular placement for GART
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 14 Sep 2023 20:23:01 +0000 (16:23 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 4 Oct 2023 22:36:07 +0000 (18:36 -0400)
We normally place GART based on the location of VRAM and the
available address space around that, but provide an option
to force a particular location for hardware that needs it.

v2: Switch to passing the placement via parameter

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c

index 2bfeaacd050cf1792fa312fd3ef713db1a2e0fe9..60c81c3d29d5fe1f692d8c4e31eaab6f387f4bea 100644 (file)
@@ -269,7 +269,8 @@ void amdgpu_gmc_sysvm_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc
  * If GART size is bigger than space left then we ajust GART size.
  * Thus function will never fails.
  */
-void amdgpu_gmc_gart_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc)
+void amdgpu_gmc_gart_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc,
+                             enum amdgpu_gart_placement gart_placement)
 {
        const uint64_t four_gb = 0x100000000ULL;
        u64 size_af, size_bf;
@@ -287,11 +288,22 @@ void amdgpu_gmc_gart_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc)
                mc->gart_size = max(size_bf, size_af);
        }
 
-       if ((size_bf >= mc->gart_size && size_bf < size_af) ||
-           (size_af < mc->gart_size))
-               mc->gart_start = 0;
-       else
+       switch (gart_placement) {
+       case AMDGPU_GART_PLACEMENT_HIGH:
                mc->gart_start = max_mc_address - mc->gart_size + 1;
+               break;
+       case AMDGPU_GART_PLACEMENT_LOW:
+               mc->gart_start = 0;
+               break;
+       case AMDGPU_GART_PLACEMENT_BEST_FIT:
+       default:
+               if ((size_bf >= mc->gart_size && size_bf < size_af) ||
+                   (size_af < mc->gart_size))
+                       mc->gart_start = 0;
+               else
+                       mc->gart_start = max_mc_address - mc->gart_size + 1;
+               break;
+       }
 
        mc->gart_start &= ~(four_gb - 1);
        mc->gart_end = mc->gart_start + mc->gart_size - 1;
index f593259a66c3b217e3ae3cb4c71a03263ec144e4..e699d1ca8debd3e1d49de46a844048e67b55f23a 100644 (file)
@@ -199,6 +199,12 @@ struct amdgpu_mem_partition_info {
 
 #define INVALID_PFN    -1
 
+enum amdgpu_gart_placement {
+       AMDGPU_GART_PLACEMENT_BEST_FIT = 0,
+       AMDGPU_GART_PLACEMENT_HIGH,
+       AMDGPU_GART_PLACEMENT_LOW,
+};
+
 struct amdgpu_gmc {
        /* FB's physical address in MMIO space (for CPU to
         * map FB). This is different compared to the agp/
@@ -391,7 +397,8 @@ void amdgpu_gmc_sysvm_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc
 void amdgpu_gmc_vram_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc,
                              u64 base);
 void amdgpu_gmc_gart_location(struct amdgpu_device *adev,
-                             struct amdgpu_gmc *mc);
+                             struct amdgpu_gmc *mc,
+                             enum amdgpu_gart_placement gart_placement);
 void amdgpu_gmc_agp_location(struct amdgpu_device *adev,
                             struct amdgpu_gmc *mc);
 void amdgpu_gmc_set_agp_default(struct amdgpu_device *adev,
index 70370b412d2474703c612ab4cdf672fb62b976fe..8e6e36279389a3b81af0c26db69571aab6ba03c6 100644 (file)
@@ -670,7 +670,7 @@ static void gmc_v10_0_vram_gtt_location(struct amdgpu_device *adev,
        base += adev->gmc.xgmi.physical_node_id * adev->gmc.xgmi.node_segment_size;
 
        amdgpu_gmc_vram_location(adev, &adev->gmc, base);
-       amdgpu_gmc_gart_location(adev, mc);
+       amdgpu_gmc_gart_location(adev, mc, AMDGPU_GART_PLACEMENT_BEST_FIT);
        if (!amdgpu_sriov_vf(adev))
                amdgpu_gmc_agp_location(adev, mc);
 
index d0a9ee2f12d36b7df3935de4afad9cf0111f7491..d611d2efce3b8e56e9eba3e1067d9959366b0118 100644 (file)
@@ -634,7 +634,7 @@ static void gmc_v11_0_vram_gtt_location(struct amdgpu_device *adev,
        base = adev->mmhub.funcs->get_fb_location(adev);
 
        amdgpu_gmc_vram_location(adev, &adev->gmc, base);
-       amdgpu_gmc_gart_location(adev, mc);
+       amdgpu_gmc_gart_location(adev, mc, AMDGPU_GART_PLACEMENT_BEST_FIT);
        if (!amdgpu_sriov_vf(adev) ||
            (amdgpu_ip_version(adev, GC_HWIP, 0) < IP_VERSION(11, 5, 0)))
                amdgpu_gmc_agp_location(adev, mc);
index 3f31f268e0eb21efbf4febf4ae533288470160a6..7f66954fd3027c2c1a683ecfc67bf5343129fc5c 100644 (file)
@@ -212,7 +212,7 @@ static void gmc_v6_0_vram_gtt_location(struct amdgpu_device *adev,
        base <<= 24;
 
        amdgpu_gmc_vram_location(adev, mc, base);
-       amdgpu_gmc_gart_location(adev, mc);
+       amdgpu_gmc_gart_location(adev, mc, AMDGPU_GART_PLACEMENT_BEST_FIT);
 }
 
 static void gmc_v6_0_mc_program(struct amdgpu_device *adev)
index a72dc21cf6fc0f5426ac2f16d49ddd671490ddbc..3869cefab7bd7af1d3edc1377ad2a7596a0c9224 100644 (file)
@@ -240,7 +240,7 @@ static void gmc_v7_0_vram_gtt_location(struct amdgpu_device *adev,
        base <<= 24;
 
        amdgpu_gmc_vram_location(adev, mc, base);
-       amdgpu_gmc_gart_location(adev, mc);
+       amdgpu_gmc_gart_location(adev, mc, AMDGPU_GART_PLACEMENT_BEST_FIT);
 }
 
 /**
index 8ce77d074d17666368f8391df73d2bc417aa3529..4126172feb7fa3e4b50990a658120f311d52452d 100644 (file)
@@ -414,7 +414,7 @@ static void gmc_v8_0_vram_gtt_location(struct amdgpu_device *adev,
        base <<= 24;
 
        amdgpu_gmc_vram_location(adev, mc, base);
-       amdgpu_gmc_gart_location(adev, mc);
+       amdgpu_gmc_gart_location(adev, mc, AMDGPU_GART_PLACEMENT_BEST_FIT);
 }
 
 /**
index 6b15677c03149d5051f275d792011dbb45cc5774..37e96d9d30a3ffe43fe9962b4c64db1e3237603f 100644 (file)
@@ -1611,7 +1611,7 @@ static void gmc_v9_0_vram_gtt_location(struct amdgpu_device *adev,
                amdgpu_gmc_sysvm_location(adev, mc);
        } else {
                amdgpu_gmc_vram_location(adev, mc, base);
-               amdgpu_gmc_gart_location(adev, mc);
+               amdgpu_gmc_gart_location(adev, mc, AMDGPU_GART_PLACEMENT_BEST_FIT);
                if (!amdgpu_sriov_vf(adev))
                        amdgpu_gmc_agp_location(adev, mc);
        }