Re: [Patch v3] drm/amdgpu: add vram check function for GMC

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

 



On Fri, Jan 14, 2022 at 05:23:38PM +0800, Du, Xiaojian wrote:
> This will add vram check function for GMC block.
> It will write pattern data to the vram and then read back from the vram,
> so that to verify the work status of vram.
> This patch  will cover gmc v6/7/8/9/10.
> 
> Signed-off-by: Xiaojian Du <Xiaojian.Du@xxxxxxx>

Reviewed-by: Huang Rui <ray.huang@xxxxxxx>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 46 +++++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h |  1 +
>  drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c  |  5 +++
>  drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c   |  5 ++-
>  drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c   |  5 ++-
>  drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c   |  5 ++-
>  drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c   |  7 +++-
>  7 files changed, 70 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> index 83f26bca7dac..96cabf3ed29e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> @@ -833,3 +833,49 @@ void amdgpu_gmc_get_reserved_allocation(struct amdgpu_device *adev)
>  		break;
>  	}
>  }
> +
> +int amdgpu_gmc_vram_checking(struct amdgpu_device *adev)
> +{
> +	struct amdgpu_bo	*vram_bo;
> +	uint64_t	vram_gpu;
> +	void	*vram_ptr;
> +
> +	int ret, size = 0x100000;
> +	uint8_t cptr[10];
> +
> +	ret = amdgpu_bo_create_kernel(adev, size, PAGE_SIZE,
> +				AMDGPU_GEM_DOMAIN_VRAM,
> +				&vram_bo,
> +				&vram_gpu,
> +				&vram_ptr);
> +	if (ret)
> +		return ret;
> +
> +	memset(vram_ptr, 0x86, size);
> +	memset(cptr, 0x86, 10);
> +
> +	/**
> +	* Check the start, the mid, and the end of the memory if the content of
> +	* each byte is the pattern "0x86". If yes, we suppose the vram bo is
> +	* workable.
> +	*
> +	* Note: If check the each byte of whole 1M bo, it will cost too many
> +	* seconds, so here, we just pick up three parts for emulation.
> +	*/
> +	ret = memcmp(vram_ptr, cptr, 10);
> +	if (ret)
> +		return ret;
> +
> +	ret = memcmp(vram_ptr + (size / 2), cptr, 10);
> +	if (ret)
> +		return ret;
> +
> +	ret = memcmp(vram_ptr + size - 10, cptr, 10);
> +	if (ret)
> +		return ret;
> +
> +	amdgpu_bo_free_kernel(&vram_bo, &vram_gpu,
> +			&vram_ptr);
> +
> +	return 0;
> +}
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> index 82ec665b366c..f06af61378ef 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
> @@ -343,4 +343,5 @@ void amdgpu_gmc_init_pdb0(struct amdgpu_device *adev);
>  uint64_t amdgpu_gmc_vram_mc2pa(struct amdgpu_device *adev, uint64_t mc_addr);
>  uint64_t amdgpu_gmc_vram_pa(struct amdgpu_device *adev, struct amdgpu_bo *bo);
>  uint64_t amdgpu_gmc_vram_cpu_pa(struct amdgpu_device *adev, struct amdgpu_bo *bo);
> +int amdgpu_gmc_vram_checking(struct amdgpu_device *adev);
>  #endif
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> index 3915ba837596..41b11c1f8db0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> @@ -1048,6 +1048,11 @@ static int gmc_v10_0_hw_init(void *handle)
>  	if (r)
>  		return r;
>  
> +	if (amdgpu_emu_mode == 1) {
> +		r = amdgpu_gmc_vram_checking(adev);
> +		if (r)
> +			return r;
> +	}
>  	if (adev->umc.funcs && adev->umc.funcs->init_registers)
>  		adev->umc.funcs->init_registers(adev);
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> index 0fe714f54cca..dec5539fe779 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> @@ -923,7 +923,10 @@ static int gmc_v6_0_hw_init(void *handle)
>  	if (r)
>  		return r;
>  
> -	return r;
> +	if (amdgpu_emu_mode == 1)
> +		return amdgpu_gmc_vram_checking(adev);
> +	else
> +		return r;
>  }
>  
>  static int gmc_v6_0_hw_fini(void *handle)
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> index 0a50fdaced7e..b249aa9b3724 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> @@ -1112,7 +1112,10 @@ static int gmc_v7_0_hw_init(void *handle)
>  	if (r)
>  		return r;
>  
> -	return r;
> +	if (amdgpu_emu_mode == 1)
> +		return amdgpu_gmc_vram_checking(adev);
> +	else
> +		return r;
>  }
>  
>  static int gmc_v7_0_hw_fini(void *handle)
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> index 9a3fc0926903..78ce7828b348 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> @@ -1241,7 +1241,10 @@ static int gmc_v8_0_hw_init(void *handle)
>  	if (r)
>  		return r;
>  
> -	return r;
> +	if (amdgpu_emu_mode == 1)
> +		return amdgpu_gmc_vram_checking(adev);
> +	else
> +		return r;
>  }
>  
>  static int gmc_v8_0_hw_fini(void *handle)
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> index ce7d438eeabe..ebbd212ed795 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> @@ -1771,8 +1771,13 @@ static int gmc_v9_0_hw_init(void *handle)
>  		adev->umc.funcs->init_registers(adev);
>  
>  	r = gmc_v9_0_gart_enable(adev);
> +	if (r)
> +		return r;
>  
> -	return r;
> +	if (amdgpu_emu_mode == 1)
> +		return amdgpu_gmc_vram_checking(adev);
> +	else
> +		return r;
>  }
>  
>  /**
> -- 
> 2.25.1
> 



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

  Powered by Linux