Am 2022-01-13 um 2:45 a.m. schrieb Xiaojian Du:
> This will add vram check function for GMC, it will cover gmc v8/9/10
>
> Signed-off-by: Xiaojian Du <xiaojian...@amd.com>
> Reviewed-by: Huang Rui <ray.hu...@amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 42 +++++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h |  1 +
>  drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c  |  4 +++
>  drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c   |  6 +++-
>  drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c   |  8 ++++-
>  5 files changed, 59 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> index 83f26bca7dac..dbc0de89d7e4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> @@ -833,3 +833,45 @@ void amdgpu_gmc_get_reserved_allocation(struct 
> amdgpu_device *adev)
>               break;
>       }
>  }
> +
> +int amdgpu_gmc_vram_checking(struct amdgpu_device *adev)
> +{
> +     int ret, size = 0x100000;
> +     uint8_t cptr[10];
> +
> +     ret = amdgpu_bo_create_kernel(adev, size, PAGE_SIZE,
> +                             AMDGPU_GEM_DOMAIN_VRAM,
> +                             &adev->vram_bo,
> +                             &adev->vram_gpu,
> +                             &adev->vram_ptr);
> +     if (ret)
> +             return ret;
> +
> +     memset(adev->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(adev->vram_ptr, cptr, 10);
> +     if (ret)
> +             return ret;
> +
> +     ret = memcmp(adev->vram_ptr + (size / 2), cptr, 10);
> +     if (ret)
> +             return ret;
> +
> +     ret = memcmp(adev->vram_ptr + size - 10, cptr, 10);
> +     if (ret)
> +             return ret;
> +
> +     amdgpu_bo_free_kernel(&adev->vram_bo, &adev->vram_gpu,
> +                     &adev->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..5e407c88c8d0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
> @@ -1048,6 +1048,10 @@ static int gmc_v10_0_hw_init(void *handle)
>       if (r)
>               return r;
>  
> +     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_v8_0.c 
> b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> index 9a3fc0926903..6c94a9712a3a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> @@ -1241,7 +1241,11 @@ static int gmc_v8_0_hw_init(void *handle)
>       if (r)
>               return r;
>  
> -     return r;
> +     r = amdgpu_gmc_vram_checking(adev);
> +     if (r)
> +             return r;
> +
> +     return 0;

This could simply be

    return amdgpu_gmc_vram_checking(adev);


>  }
>  
>  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..1ea18b4ff63f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> @@ -1771,8 +1771,14 @@ 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;
> +     r = amdgpu_gmc_vram_checking(adev);
> +     if (r)
> +             return r;
> +
> +     return 0;

Same as above.

Regards,
  Felix


>  }
>  
>  /**

Reply via email to