drm/amdgpu: Don't reserve vram as WC for A+A
authorOak Zeng <Oak.Zeng@amd.com>
Fri, 22 Jan 2021 19:00:06 +0000 (13:00 -0600)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 24 Mar 2021 02:58:24 +0000 (22:58 -0400)
On A+A platform, vram can be mapped as WB. Not necessarily
to always map vram as WC on such platform.

Calling function arch_io_reserve_memtype_wc will mark the
whole vram region as WC. So don't call it for A+A platform.

Signed-off-by: Oak Zeng <Oak.Zeng@amd.com>
Suggested-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Christian Konig <christian.koenig@amd.com>
Reviewed-by: Felix Kuehling <felix.kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c

index 4b29b82..de52a99 100644 (file)
@@ -1065,13 +1065,17 @@ static const char *amdgpu_vram_names[] = {
  */
 int amdgpu_bo_init(struct amdgpu_device *adev)
 {
-       /* reserve PAT memory space to WC for VRAM */
-       arch_io_reserve_memtype_wc(adev->gmc.aper_base,
-                                  adev->gmc.aper_size);
+       /* On A+A platform, VRAM can be mapped as WB */
+       if (!adev->gmc.xgmi.connected_to_cpu) {
+               /* reserve PAT memory space to WC for VRAM */
+               arch_io_reserve_memtype_wc(adev->gmc.aper_base,
+                               adev->gmc.aper_size);
+
+               /* Add an MTRR for the VRAM */
+               adev->gmc.vram_mtrr = arch_phys_wc_add(adev->gmc.aper_base,
+                               adev->gmc.aper_size);
+       }
 
-       /* Add an MTRR for the VRAM */
-       adev->gmc.vram_mtrr = arch_phys_wc_add(adev->gmc.aper_base,
-                                             adev->gmc.aper_size);
        DRM_INFO("Detected VRAM RAM=%lluM, BAR=%lluM\n",
                 adev->gmc.mc_vram_size >> 20,
                 (unsigned long long)adev->gmc.aper_size >> 20);
@@ -1089,8 +1093,10 @@ int amdgpu_bo_init(struct amdgpu_device *adev)
 void amdgpu_bo_fini(struct amdgpu_device *adev)
 {
        amdgpu_ttm_fini(adev);
-       arch_phys_wc_del(adev->gmc.vram_mtrr);
-       arch_io_free_memtype_wc(adev->gmc.aper_base, adev->gmc.aper_size);
+       if (!adev->gmc.xgmi.connected_to_cpu) {
+               arch_phys_wc_del(adev->gmc.vram_mtrr);
+               arch_io_free_memtype_wc(adev->gmc.aper_base, adev->gmc.aper_size);
+       }
 }
 
 /**