[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