This will add vram check function for GMC, it will cover gmc v6/7/8/9/10

Signed-off-by: Xiaojian Du <xiaojian...@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

Reply via email to