diff options
| author | Dmitry Torokhov <[email protected]> | 2022-12-12 10:47:03 -0800 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2022-12-12 10:47:03 -0800 | 
| commit | e291c116f60f3c1ca98090f0f8e7c77e658562fb (patch) | |
| tree | 2fbe810f2a6f8b29f1cdaefd87b24debbfa0ec07 /drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | |
| parent | 8c9a59939deb4bfafdc451100c03d1e848b4169b (diff) | |
| parent | c3991107a28a5ad0bd90660ca3bbf8c2c220ea98 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.2 merge window.
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 57 | 
1 files changed, 53 insertions, 4 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 429fcdf28836..3c9fecdd6b2f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -38,6 +38,8 @@  #include <linux/mmu_notifier.h>  #include <linux/suspend.h>  #include <linux/cc_platform.h> +#include <linux/fb.h> +#include <linux/dynamic_debug.h>  #include "amdgpu.h"  #include "amdgpu_irq.h" @@ -102,9 +104,10 @@   * - 3.46.0 - To enable hot plug amdgpu tests in libdrm   * - 3.47.0 - Add AMDGPU_GEM_CREATE_DISCARDABLE and AMDGPU_VM_NOALLOC flags   * - 3.48.0 - Add IP discovery version info to HW INFO + *   3.49.0 - Add gang submit into CS IOCTL   */  #define KMS_DRIVER_MAJOR	3 -#define KMS_DRIVER_MINOR	48 +#define KMS_DRIVER_MINOR	49  #define KMS_DRIVER_PATCHLEVEL	0  int amdgpu_vram_limit; @@ -185,6 +188,18 @@ int amdgpu_vcnfw_log;  static void amdgpu_drv_delayed_reset_work_handler(struct work_struct *work); +DECLARE_DYNDBG_CLASSMAP(drm_debug_classes, DD_CLASS_TYPE_DISJOINT_BITS, 0, +			"DRM_UT_CORE", +			"DRM_UT_DRIVER", +			"DRM_UT_KMS", +			"DRM_UT_PRIME", +			"DRM_UT_ATOMIC", +			"DRM_UT_VBL", +			"DRM_UT_STATE", +			"DRM_UT_LEASE", +			"DRM_UT_DP", +			"DRM_UT_DRMRES"); +  struct amdgpu_mgpu_info mgpu_info = {  	.mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),  	.delayed_reset_work = __DELAYED_WORK_INITIALIZER( @@ -2181,15 +2196,46 @@ amdgpu_pci_remove(struct pci_dev *pdev)  	struct drm_device *dev = pci_get_drvdata(pdev);  	struct amdgpu_device *adev = drm_to_adev(dev); -	drm_dev_unplug(dev); -  	if (adev->pm.rpm_mode != AMDGPU_RUNPM_NONE) {  		pm_runtime_get_sync(dev->dev);  		pm_runtime_forbid(dev->dev);  	} +	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 2)) { +		bool need_to_reset_gpu = false; + +		if (adev->gmc.xgmi.num_physical_nodes > 1) { +			struct amdgpu_hive_info *hive; + +			hive = amdgpu_get_xgmi_hive(adev); +			if (hive->device_remove_count == 0) +				need_to_reset_gpu = true; +			hive->device_remove_count++; +			amdgpu_put_xgmi_hive(hive); +		} else { +			need_to_reset_gpu = true; +		} + +		/* Workaround for ASICs need to reset SMU. +		 * Called only when the first device is removed. +		 */ +		if (need_to_reset_gpu) { +			struct amdgpu_reset_context reset_context; + +			adev->shutdown = true; +			memset(&reset_context, 0, sizeof(reset_context)); +			reset_context.method = AMD_RESET_METHOD_NONE; +			reset_context.reset_req_dev = adev; +			set_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags); +			set_bit(AMDGPU_RESET_FOR_DEVICE_REMOVE, &reset_context.flags); +			amdgpu_device_gpu_recover(adev, NULL, &reset_context); +		} +	} +  	amdgpu_driver_unload_kms(dev); +	drm_dev_unplug(dev); +  	/*  	 * Flush any in flight DMA operations from device.  	 * Clear the Bus Master Enable bit and then wait on the PCIe Device @@ -2563,8 +2609,11 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)  		amdgpu_device_baco_exit(drm_dev);  	}  	ret = amdgpu_device_resume(drm_dev, false); -	if (ret) +	if (ret) { +		if (amdgpu_device_supports_px(drm_dev)) +			pci_disable_device(pdev);  		return ret; +	}  	if (amdgpu_device_supports_px(drm_dev))  		drm_dev->switch_power_state = DRM_SWITCH_POWER_ON; |