[PATCH] drm/amdgpu: exclude domain start when calucales offset for AGP aperture BOs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



For BOs in AGP aperture, tbo.resource->start includes AGP aperture start.
Don't add it again in amdgpu_bo_gpu_offset. This issue was mitigated due to
GART aperture start was 0 until this patch ("a013c94d5aca drm/amdgpu/gmc11:
set gart placement GC11") changes GART start to a non-zero value.

Reported-by: Jesse Zhang <Jesse.Zhang@xxxxxxx>
Signed-off-by: Yifan Zhang <yifan1.zhang@xxxxxxx>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c    |  7 +++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h    |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 10 ++++++++--
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
index 5f71414190e9..00e940eb69ab 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
@@ -169,6 +169,13 @@ int amdgpu_gmc_set_pte_pde(struct amdgpu_device *adev, void *cpu_pt_addr,
 	return 0;
 }
 
+bool bo_in_agp_aperture(struct amdgpu_bo *bo)
+{
+	struct ttm_buffer_object *tbo = &(bo->tbo);
+	struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
+
+	return (tbo->resource->start << PAGE_SHIFT) > adev->gmc.agp_start;
+}
 /**
  * amdgpu_gmc_agp_addr - return the address in the AGP address space
  *
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
index e699d1ca8deb..448dc08e83de 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
@@ -393,6 +393,7 @@ int amdgpu_gmc_set_pte_pde(struct amdgpu_device *adev, void *cpu_pt_addr,
 				uint64_t flags);
 uint64_t amdgpu_gmc_pd_addr(struct amdgpu_bo *bo);
 uint64_t amdgpu_gmc_agp_addr(struct ttm_buffer_object *bo);
+bool bo_in_agp_aperture(struct amdgpu_bo *bo);
 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);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index cef920a93924..91a011d63ab4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -39,6 +39,7 @@
 #include "amdgpu.h"
 #include "amdgpu_trace.h"
 #include "amdgpu_amdkfd.h"
+#include "amdgpu_gmc.h"
 
 /**
  * DOC: amdgpu_object
@@ -1529,8 +1530,13 @@ u64 amdgpu_bo_gpu_offset_no_check(struct amdgpu_bo *bo)
 	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
 	uint64_t offset;
 
-	offset = (bo->tbo.resource->start << PAGE_SHIFT) +
-		 amdgpu_ttm_domain_start(adev, bo->tbo.resource->mem_type);
+	/* tbo.resource->start includes agp_start for AGP BOs */
+	if (bo_in_agp_aperture(bo)) {
+		offset = (bo->tbo.resource->start << PAGE_SHIFT);
+	} else {
+		offset = (bo->tbo.resource->start << PAGE_SHIFT) +
+			 amdgpu_ttm_domain_start(adev, bo->tbo.resource->mem_type);
+	}
 
 	return amdgpu_gmc_sign_extend(offset);
 }
-- 
2.37.3




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux