aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
diff options
context:
space:
mode:
authorEvan Quan <evan.quan@amd.com>2018-09-27 01:26:58 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-10-09 17:59:33 -0400
commit62d73fbcfb367104db57253a186f410020289517 (patch)
tree5af88c81f02a5cee2aea2d96816610ec42446b5f /drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
parente92b83e50839eced31aede94a39901581b71bada (diff)
drm/amdgpu: added AMD GPU instance counting V2
Count all GPU instances from AMD(including iGPUs and dGPUs) in the system. V2: drop unnecessary initialization for other gpu_info members except mutex Signed-off-by: Evan Quan <evan.quan@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index a64056dadc58..81732a84c2ab 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -40,6 +40,30 @@
40#include "amdgpu_gem.h" 40#include "amdgpu_gem.h"
41#include "amdgpu_display.h" 41#include "amdgpu_display.h"
42 42
43static void amdgpu_unregister_gpu_instance(struct amdgpu_device *adev)
44{
45 struct amdgpu_gpu_instance *gpu_instance;
46 int i;
47
48 mutex_lock(&mgpu_info.mutex);
49
50 for (i = 0; i < mgpu_info.num_gpu; i++) {
51 gpu_instance = &(mgpu_info.gpu_ins[i]);
52 if (gpu_instance->adev == adev) {
53 mgpu_info.gpu_ins[i] =
54 mgpu_info.gpu_ins[mgpu_info.num_gpu - 1];
55 mgpu_info.num_gpu--;
56 if (adev->flags & AMD_IS_APU)
57 mgpu_info.num_apu--;
58 else
59 mgpu_info.num_dgpu--;
60 break;
61 }
62 }
63
64 mutex_unlock(&mgpu_info.mutex);
65}
66
43/** 67/**
44 * amdgpu_driver_unload_kms - Main unload function for KMS. 68 * amdgpu_driver_unload_kms - Main unload function for KMS.
45 * 69 *
@@ -55,6 +79,8 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)
55 if (adev == NULL) 79 if (adev == NULL)
56 return; 80 return;
57 81
82 amdgpu_unregister_gpu_instance(adev);
83
58 if (adev->rmmio == NULL) 84 if (adev->rmmio == NULL)
59 goto done_free; 85 goto done_free;
60 86
@@ -75,6 +101,31 @@ done_free:
75 dev->dev_private = NULL; 101 dev->dev_private = NULL;
76} 102}
77 103
104static void amdgpu_register_gpu_instance(struct amdgpu_device *adev)
105{
106 struct amdgpu_gpu_instance *gpu_instance;
107
108 mutex_lock(&mgpu_info.mutex);
109
110 if (mgpu_info.num_gpu >= MAX_GPU_INSTANCE) {
111 DRM_ERROR("Cannot register more gpu instance\n");
112 mutex_unlock(&mgpu_info.mutex);
113 return;
114 }
115
116 gpu_instance = &(mgpu_info.gpu_ins[mgpu_info.num_gpu]);
117 gpu_instance->adev = adev;
118 gpu_instance->mgpu_fan_enabled = 0;
119
120 mgpu_info.num_gpu++;
121 if (adev->flags & AMD_IS_APU)
122 mgpu_info.num_apu++;
123 else
124 mgpu_info.num_dgpu++;
125
126 mutex_unlock(&mgpu_info.mutex);
127}
128
78/** 129/**
79 * amdgpu_driver_load_kms - Main load function for KMS. 130 * amdgpu_driver_load_kms - Main load function for KMS.
80 * 131 *
@@ -169,6 +220,7 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
169 pm_runtime_put_autosuspend(dev->dev); 220 pm_runtime_put_autosuspend(dev->dev);
170 } 221 }
171 222
223 amdgpu_register_gpu_instance(adev);
172out: 224out:
173 if (r) { 225 if (r) {
174 /* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */ 226 /* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */