diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2020-08-07 16:41:01 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2020-08-07 16:41:01 -0700 | 
| commit | 9e8238020c5beba64e7ffafbb7ea0fb02fe68270 (patch) | |
| tree | 37c7fd953cfa7ebd3d6c476bc4c7d4de2302cdc3 /drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | |
| parent | a50ca29523b18baea548bdf5df9b4b923c2bb4f6 (diff) | |
| parent | d862a3068ea593dc904ef524d8548467755ce36f (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 5.9 merge window.
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 83 | 
1 files changed, 57 insertions, 26 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 42f4febe24c6..a735d79a717b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -85,9 +85,10 @@   * - 3.34.0 - Non-DC can flip correctly between buffers with different pitches   * - 3.35.0 - Add drm_amdgpu_info_device::tcc_disabled_mask   * - 3.36.0 - Allow reading more status registers on si/cik + * - 3.37.0 - L2 is invalidated before SDMA IBs, needed for correctness   */  #define KMS_DRIVER_MAJOR	3 -#define KMS_DRIVER_MINOR	36 +#define KMS_DRIVER_MINOR	37  #define KMS_DRIVER_PATCHLEVEL	0  int amdgpu_vram_limit = 0; @@ -1021,6 +1022,7 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,  			    const struct pci_device_id *ent)  {  	struct drm_device *dev; +	struct amdgpu_device *adev;  	unsigned long flags = ent->driver_data;  	int ret, retry = 0;  	bool supports_atomic = false; @@ -1090,6 +1092,8 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,  	pci_set_drvdata(pdev, dev); +	amdgpu_driver_load_kms(dev, ent->driver_data); +  retry_init:  	ret = drm_dev_register(dev, ent->driver_data);  	if (ret == -EAGAIN && ++retry <= 3) { @@ -1100,6 +1104,11 @@ retry_init:  	} else if (ret)  		goto err_pci; +	adev = dev->dev_private; +	ret = amdgpu_debugfs_init(adev); +	if (ret) +		DRM_ERROR("Creating debugfs files failed (%d).\n", ret); +  	return 0;  err_pci: @@ -1119,9 +1128,10 @@ amdgpu_pci_remove(struct pci_dev *pdev)  #endif  		DRM_ERROR("Hotplug removal is not supported\n");  	drm_dev_unplug(dev); -	drm_dev_put(dev); +	amdgpu_driver_unload_kms(dev);  	pci_disable_device(pdev);  	pci_set_drvdata(pdev, NULL); +	drm_dev_put(dev);  }  static void @@ -1171,7 +1181,9 @@ static int amdgpu_pmops_freeze(struct device *dev)  	struct amdgpu_device *adev = drm_dev->dev_private;  	int r; +	adev->in_hibernate = true;  	r = amdgpu_device_suspend(drm_dev, true); +	adev->in_hibernate = false;  	if (r)  		return r;  	return amdgpu_asic_reset(adev); @@ -1220,11 +1232,15 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)  		}  	} +	adev->in_runpm = true;  	if (amdgpu_device_supports_boco(drm_dev))  		drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;  	drm_kms_helper_poll_disable(drm_dev);  	ret = amdgpu_device_suspend(drm_dev, false); +	if (ret) +		return ret; +  	if (amdgpu_device_supports_boco(drm_dev)) {  		/* Only need to handle PCI state in the driver for ATPX  		 * PCI core handles it for _PR3. @@ -1278,6 +1294,7 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)  	drm_kms_helper_poll_enable(drm_dev);  	if (amdgpu_device_supports_boco(drm_dev))  		drm_dev->switch_power_state = DRM_SWITCH_POWER_ON; +	adev->in_runpm = false;  	return 0;  } @@ -1285,24 +1302,55 @@ static int amdgpu_pmops_runtime_idle(struct device *dev)  {  	struct drm_device *drm_dev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = drm_dev->dev_private; -	struct drm_crtc *crtc; +	/* we don't want the main rpm_idle to call suspend - we want to autosuspend */ +	int ret = 1;  	if (!adev->runpm) {  		pm_runtime_forbid(dev);  		return -EBUSY;  	} -	list_for_each_entry(crtc, &drm_dev->mode_config.crtc_list, head) { -		if (crtc->enabled) { -			DRM_DEBUG_DRIVER("failing to power off - crtc active\n"); -			return -EBUSY; +	if (amdgpu_device_has_dc_support(adev)) { +		struct drm_crtc *crtc; + +		drm_modeset_lock_all(drm_dev); + +		drm_for_each_crtc(crtc, drm_dev) { +			if (crtc->state->active) { +				ret = -EBUSY; +				break; +			} +		} + +		drm_modeset_unlock_all(drm_dev); + +	} else { +		struct drm_connector *list_connector; +		struct drm_connector_list_iter iter; + +		mutex_lock(&drm_dev->mode_config.mutex); +		drm_modeset_lock(&drm_dev->mode_config.connection_mutex, NULL); + +		drm_connector_list_iter_begin(drm_dev, &iter); +		drm_for_each_connector_iter(list_connector, &iter) { +			if (list_connector->dpms ==  DRM_MODE_DPMS_ON) { +				ret = -EBUSY; +				break; +			}  		} + +		drm_connector_list_iter_end(&iter); + +		drm_modeset_unlock(&drm_dev->mode_config.connection_mutex); +		mutex_unlock(&drm_dev->mode_config.mutex);  	} +	if (ret == -EBUSY) +		DRM_DEBUG_DRIVER("failing to power off - crtc active\n"); +  	pm_runtime_mark_last_busy(dev);  	pm_runtime_autosuspend(dev); -	/* we don't want the main rpm_idle to call suspend - we want to autosuspend */ -	return 1; +	return ret;  }  long amdgpu_drm_ioctl(struct file *filp, @@ -1377,32 +1425,15 @@ int amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv)  	return 0;  } -static bool -amdgpu_get_crtc_scanout_position(struct drm_device *dev, unsigned int pipe, -				 bool in_vblank_irq, int *vpos, int *hpos, -				 ktime_t *stime, ktime_t *etime, -				 const struct drm_display_mode *mode) -{ -	return amdgpu_display_get_crtc_scanoutpos(dev, pipe, 0, vpos, hpos, -						  stime, etime, mode); -} -  static struct drm_driver kms_driver = {  	.driver_features =  	    DRIVER_ATOMIC |  	    DRIVER_GEM |  	    DRIVER_RENDER | DRIVER_MODESET | DRIVER_SYNCOBJ |  	    DRIVER_SYNCOBJ_TIMELINE, -	.load = amdgpu_driver_load_kms,  	.open = amdgpu_driver_open_kms,  	.postclose = amdgpu_driver_postclose_kms,  	.lastclose = amdgpu_driver_lastclose_kms, -	.unload = amdgpu_driver_unload_kms, -	.get_vblank_counter = amdgpu_get_vblank_counter_kms, -	.enable_vblank = amdgpu_enable_vblank_kms, -	.disable_vblank = amdgpu_disable_vblank_kms, -	.get_vblank_timestamp = drm_calc_vbltimestamp_from_scanoutpos, -	.get_scanout_position = amdgpu_get_crtc_scanout_position,  	.irq_handler = amdgpu_irq_handler,  	.ioctls = amdgpu_ioctls_kms,  	.gem_free_object_unlocked = amdgpu_gem_object_free, | 
