|
@@ -40,6 +40,30 @@
|
|
#include "amdgpu_gem.h"
|
|
#include "amdgpu_gem.h"
|
|
#include "amdgpu_display.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.
|
|
* 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)
|
|
if (adev == NULL)
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
+ amdgpu_unregister_gpu_instance(adev);
|
|
|
|
+
|
|
if (adev->rmmio == NULL)
|
|
if (adev->rmmio == NULL)
|
|
goto done_free;
|
|
goto done_free;
|
|
|
|
|
|
@@ -75,6 +101,31 @@ done_free:
|
|
dev->dev_private = NULL;
|
|
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.
|
|
* 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);
|
|
pm_runtime_put_autosuspend(dev->dev);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ amdgpu_register_gpu_instance(adev);
|
|
out:
|
|
out:
|
|
if (r) {
|
|
if (r) {
|
|
/* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */
|
|
/* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */
|