Count all GPU instances from AMD(including iGPUs and
dGPUs) in the system.

Change-Id: If62a0873c64857a3fcdf9785557e24cb3456c12e
Signed-off-by: Evan Quan <evan.q...@amd.com>
Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h     | 18 +++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |  7 ++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 52 +++++++++++++++++++++++++
 3 files changed, 77 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index daadf3b8bec0..6583a68b7ee9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -81,6 +81,23 @@
 #include "amdgpu_bo_list.h"
 #include "amdgpu_gem.h"
 
+#define MAX_GPU_INSTANCE               16
+
+struct amdgpu_gpu_instance
+{
+       struct amdgpu_device            *adev;
+       int                             mgpu_fan_enabled;
+};
+
+struct amdgpu_mgpu_info
+{
+       struct amdgpu_gpu_instance      gpu_ins[MAX_GPU_INSTANCE];
+       struct mutex                    mutex;
+       uint32_t                        num_gpu;
+       uint32_t                        num_dgpu;
+       uint32_t                        num_apu;
+};
+
 /*
  * Modules parameters.
  */
@@ -134,6 +151,7 @@ extern int amdgpu_compute_multipipe;
 extern int amdgpu_gpu_recovery;
 extern int amdgpu_emu_mode;
 extern uint amdgpu_smu_memory_pool_size;
+extern struct amdgpu_mgpu_info mgpu_info;
 
 #ifdef CONFIG_DRM_AMDGPU_SI
 extern int amdgpu_si_support;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index b536808f62ec..c6da46f1d7fa 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -127,6 +127,13 @@ int amdgpu_compute_multipipe = -1;
 int amdgpu_gpu_recovery = -1; /* auto */
 int amdgpu_emu_mode = 0;
 uint amdgpu_smu_memory_pool_size = 0;
+struct amdgpu_mgpu_info mgpu_info = {
+       .gpu_ins = {0},
+       .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),
+       .num_gpu = 0,
+       .num_apu = 0,
+       .num_dgpu = 0,
+};
 
 /**
  * DOC: vramlimit (int)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 64cc483db973..50ece76131a3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -40,6 +40,30 @@
 #include "amdgpu_gem.h"
 #include "amdgpu_display.h"
 
+static void amdgpu_unregister_gpu_instance(struct amdgpu_device *adev)
+{
+       struct amdgpu_gpu_instance *gpu_instance;
+       int i;
+
+       mutex_lock(&mgpu_info.mutex);
+
+       for (i = 0; i < mgpu_info.num_gpu; i++) {
+               gpu_instance = &(mgpu_info.gpu_ins[i]);
+               if (gpu_instance->adev == adev) {
+                       mgpu_info.gpu_ins[i] =
+                               mgpu_info.gpu_ins[mgpu_info.num_gpu - 1];
+                       mgpu_info.num_gpu--;
+                       if (adev->flags & AMD_IS_APU)
+                               mgpu_info.num_apu--;
+                       else
+                               mgpu_info.num_dgpu--;
+                       break;
+               }
+       }
+
+       mutex_unlock(&mgpu_info.mutex);
+}
+
 /**
  * amdgpu_driver_unload_kms - Main unload function for KMS.
  *
@@ -55,6 +79,8 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)
        if (adev == NULL)
                return;
 
+       amdgpu_unregister_gpu_instance(adev);
+
        if (adev->rmmio == NULL)
                goto done_free;
 
@@ -75,6 +101,31 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)
        dev->dev_private = NULL;
 }
 
+static void amdgpu_register_gpu_instance(struct amdgpu_device *adev)
+{
+       struct amdgpu_gpu_instance *gpu_instance;
+
+       mutex_lock(&mgpu_info.mutex);
+
+       if (mgpu_info.num_gpu >= MAX_GPU_INSTANCE) {
+               DRM_ERROR("Cannot register more gpu instance\n");
+               mutex_unlock(&mgpu_info.mutex);
+               return;
+       }
+
+       gpu_instance = &(mgpu_info.gpu_ins[mgpu_info.num_gpu]);
+       gpu_instance->adev = adev;
+       gpu_instance->mgpu_fan_enabled = 0;
+
+       mgpu_info.num_gpu++;
+       if (adev->flags & AMD_IS_APU)
+               mgpu_info.num_apu++;
+       else
+               mgpu_info.num_dgpu++;
+
+       mutex_unlock(&mgpu_info.mutex);
+}
+
 /**
  * amdgpu_driver_load_kms - Main load function for KMS.
  *
@@ -169,6 +220,7 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned 
long flags)
                pm_runtime_put_autosuspend(dev->dev);
        }
 
+       amdgpu_register_gpu_instance(adev);
 out:
        if (r) {
                /* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */
-- 
2.19.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to