[PATCH] drm/amdgpu: fix AGP addressing when GART is not at 0
Christian König
christian.koenig at amd.com
Fri Nov 10 14:50:57 UTC 2023
Am 10.11.23 um 15:47 schrieb Alex Deucher:
> This worked by luck if the GART aperture ended up at 0. When
> we ended up moving GART on some chips, the GART aperture ended
> up offsetting the the AGP address since the resource->start is
> a GART offset, not an MC address. Fix this by moving the AGP
> address setup into amdgpu_bo_gpu_offset_no_check().
>
> Reported-by: Jesse Zhang <Jesse.Zhang at amd.com>
> Reported-by: Yifan Zhang <yifan1.zhang at amd.com>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> Cc: christian.koenig at amd.com
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 10 +++++++---
> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 4 +---
> 2 files changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index cef920a93924..1b3e97522838 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -1527,10 +1527,14 @@ u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo)
> u64 amdgpu_bo_gpu_offset_no_check(struct amdgpu_bo *bo)
> {
> struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
> - uint64_t offset;
> + uint64_t offset, addr;
>
> - offset = (bo->tbo.resource->start << PAGE_SHIFT) +
> - amdgpu_ttm_domain_start(adev, bo->tbo.resource->mem_type);
> + addr = amdgpu_gmc_agp_addr(&bo->tbo);
IIRC you must check bo->tbo.resource->mem_type before calling
amdgpu_gmc_agp_addr().
Regards,
Christian.
> + if (addr != AMDGPU_BO_INVALID_OFFSET)
> + offset = addr;
> + else
> + offset = (bo->tbo.resource->start << PAGE_SHIFT) +
> + amdgpu_ttm_domain_start(adev, bo->tbo.resource->mem_type);
>
> return amdgpu_gmc_sign_extend(offset);
> }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 05991c5c8ddb..ab4a762aed5b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -959,10 +959,8 @@ int amdgpu_ttm_alloc_gart(struct ttm_buffer_object *bo)
> return 0;
>
> addr = amdgpu_gmc_agp_addr(bo);
> - if (addr != AMDGPU_BO_INVALID_OFFSET) {
> - bo->resource->start = addr >> PAGE_SHIFT;
> + if (addr != AMDGPU_BO_INVALID_OFFSET)
> return 0;
> - }
>
> /* allocate GART space */
> placement.num_placement = 1;
More information about the amd-gfx
mailing list