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 >