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