aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h18
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c52
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
86struct amdgpu_gpu_instance
87{
88 struct amdgpu_device *adev;
89 int mgpu_fan_enabled;
90};
91
92struct 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;
134extern int amdgpu_gpu_recovery; 151extern int amdgpu_gpu_recovery;
135extern int amdgpu_emu_mode; 152extern int amdgpu_emu_mode;
136extern uint amdgpu_smu_memory_pool_size; 153extern uint amdgpu_smu_memory_pool_size;
154extern struct amdgpu_mgpu_info mgpu_info;
137 155
138#ifdef CONFIG_DRM_AMDGPU_SI 156#ifdef CONFIG_DRM_AMDGPU_SI
139extern int amdgpu_si_support; 157extern 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;
127int amdgpu_gpu_recovery = -1; /* auto */ 127int amdgpu_gpu_recovery = -1; /* auto */
128int amdgpu_emu_mode = 0; 128int amdgpu_emu_mode = 0;
129uint amdgpu_smu_memory_pool_size = 0; 129uint amdgpu_smu_memory_pool_size = 0;
130struct 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
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 */