diff options
author | Evan Quan <evan.quan@amd.com> | 2018-09-27 01:26:58 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-10-09 17:59:33 -0400 |
commit | 62d73fbcfb367104db57253a186f410020289517 (patch) | |
tree | 5af88c81f02a5cee2aea2d96816610ec42446b5f | |
parent | e92b83e50839eced31aede94a39901581b71bada (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>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 52 |
3 files changed, 73 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index c05b39438663..bd6f236ab7e7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -81,6 +81,23 @@ | |||
81 | #include "amdgpu_bo_list.h" | 81 | #include "amdgpu_bo_list.h" |
82 | #include "amdgpu_gem.h" | 82 | #include "amdgpu_gem.h" |
83 | 83 | ||
84 | #define MAX_GPU_INSTANCE 16 | ||
85 | |||
86 | struct amdgpu_gpu_instance | ||
87 | { | ||
88 | struct amdgpu_device *adev; | ||
89 | int mgpu_fan_enabled; | ||
90 | }; | ||
91 | |||
92 | struct amdgpu_mgpu_info | ||
93 | { | ||
94 | struct amdgpu_gpu_instance gpu_ins[MAX_GPU_INSTANCE]; | ||
95 | struct mutex mutex; | ||
96 | uint32_t num_gpu; | ||
97 | uint32_t num_dgpu; | ||
98 | uint32_t num_apu; | ||
99 | }; | ||
100 | |||
84 | /* | 101 | /* |
85 | * Modules parameters. | 102 | * Modules parameters. |
86 | */ | 103 | */ |
@@ -134,6 +151,7 @@ extern int amdgpu_compute_multipipe; | |||
134 | extern int amdgpu_gpu_recovery; | 151 | extern int amdgpu_gpu_recovery; |
135 | extern int amdgpu_emu_mode; | 152 | extern int amdgpu_emu_mode; |
136 | extern uint amdgpu_smu_memory_pool_size; | 153 | extern uint amdgpu_smu_memory_pool_size; |
154 | extern struct amdgpu_mgpu_info mgpu_info; | ||
137 | 155 | ||
138 | #ifdef CONFIG_DRM_AMDGPU_SI | 156 | #ifdef CONFIG_DRM_AMDGPU_SI |
139 | extern int amdgpu_si_support; | 157 | 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 723f0f7754bd..28781414d71c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | |||
@@ -127,6 +127,9 @@ int amdgpu_compute_multipipe = -1; | |||
127 | int amdgpu_gpu_recovery = -1; /* auto */ | 127 | int amdgpu_gpu_recovery = -1; /* auto */ |
128 | int amdgpu_emu_mode = 0; | 128 | int amdgpu_emu_mode = 0; |
129 | uint amdgpu_smu_memory_pool_size = 0; | 129 | uint amdgpu_smu_memory_pool_size = 0; |
130 | struct amdgpu_mgpu_info mgpu_info = { | ||
131 | .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex), | ||
132 | }; | ||
130 | 133 | ||
131 | /** | 134 | /** |
132 | * DOC: vramlimit (int) | 135 | * DOC: vramlimit (int) |
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 | ||
43 | static 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 | ||
104 | static 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); | ||
172 | out: | 224 | out: |
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 */ |