[Patch v2] drm/amdgpu: add vram check function for GMC
Alex Deucher
alexdeucher at gmail.com
Thu Jan 13 15:24:27 UTC 2022
On Thu, Jan 13, 2022 at 5:00 AM Xiaojian Du <Xiaojian.Du at amd.com> wrote:
>
> This will add vram check function for GMC, it will cover gmc v6/7/8/9/10
>
Please provide a better description.
Also, we should either protect the calls to this function with:
if (amdgpu_emu_mode == 1)
or return early in the function if amdgpu_emu_mode != 1.
Alex
> Signed-off-by: Xiaojian Du <Xiaojian.Du at amd.com>
> ---
> 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 | 4 +++
> drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 6 +++-
> drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 6 +++-
> drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 6 +++-
> drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 8 ++++-
> 7 files changed, 73 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..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_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> index 0fe714f54cca..17770c1017ba 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> @@ -923,7 +923,11 @@ static int gmc_v6_0_hw_init(void *handle)
> if (r)
> return r;
>
> - return r;
> + r = amdgpu_gmc_vram_checking(adev);
> + if (r)
> + return r;
> +
> + return 0;
> }
>
> 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..fa43905ae61f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> @@ -1112,7 +1112,11 @@ static int gmc_v7_0_hw_init(void *handle)
> if (r)
> return r;
>
> - return r;
> + r = amdgpu_gmc_vram_checking(adev);
> + if (r)
> + return r;
> +
> + return 0;
> }
>
> 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..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;
> }
>
> 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;
> }
>
> /**
> --
> 2.25.1
>
More information about the amd-gfx
mailing list