Re: [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]

 



Am 10.11.23 um 13:52 schrieb Yifan Zhang:
For BOs in AGP aperture, tbo.resource->start includes AGP aperture start.


Well big NAK to that. tbo.resource->start should never ever include the AGP aperture start in the first place.

How did that happen?

Regards,
Christian.

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);
  }




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

  Powered by Linux