diff options
Diffstat (limited to 'drivers/gpu/drm/radeon')
| -rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 31 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 105 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_gem.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 6 | 
6 files changed, 70 insertions, 80 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index d3045a371a55..7c73bc7e2f85 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c @@ -3221,35 +3221,8 @@ static void cik_gpu_init(struct radeon_device *rdev)  	case CHIP_KAVERI:  		rdev->config.cik.max_shader_engines = 1;  		rdev->config.cik.max_tile_pipes = 4; -		if ((rdev->pdev->device == 0x1304) || -		    (rdev->pdev->device == 0x1305) || -		    (rdev->pdev->device == 0x130C) || -		    (rdev->pdev->device == 0x130F) || -		    (rdev->pdev->device == 0x1310) || -		    (rdev->pdev->device == 0x1311) || -		    (rdev->pdev->device == 0x131C)) { -			rdev->config.cik.max_cu_per_sh = 8; -			rdev->config.cik.max_backends_per_se = 2; -		} else if ((rdev->pdev->device == 0x1309) || -			   (rdev->pdev->device == 0x130A) || -			   (rdev->pdev->device == 0x130D) || -			   (rdev->pdev->device == 0x1313) || -			   (rdev->pdev->device == 0x131D)) { -			rdev->config.cik.max_cu_per_sh = 6; -			rdev->config.cik.max_backends_per_se = 2; -		} else if ((rdev->pdev->device == 0x1306) || -			   (rdev->pdev->device == 0x1307) || -			   (rdev->pdev->device == 0x130B) || -			   (rdev->pdev->device == 0x130E) || -			   (rdev->pdev->device == 0x1315) || -			   (rdev->pdev->device == 0x1318) || -			   (rdev->pdev->device == 0x131B)) { -			rdev->config.cik.max_cu_per_sh = 4; -			rdev->config.cik.max_backends_per_se = 1; -		} else { -			rdev->config.cik.max_cu_per_sh = 3; -			rdev->config.cik.max_backends_per_se = 1; -		} +		rdev->config.cik.max_cu_per_sh = 8; +		rdev->config.cik.max_backends_per_se = 2;  		rdev->config.cik.max_sh_per_se = 1;  		rdev->config.cik.max_texture_channel_caches = 4;  		rdev->config.cik.max_gprs = 256; diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 5012f5e47a1e..df9469a8fdb1 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c @@ -90,25 +90,18 @@ void radeon_connector_hotplug(struct drm_connector *connector)  		/* don't do anything if sink is not display port, i.e.,  		 * passive dp->(dvi|hdmi) adaptor  		 */ -		if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { -			int saved_dpms = connector->dpms; -			/* Only turn off the display if it's physically disconnected */ -			if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { -				drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); -			} else if (radeon_dp_needs_link_train(radeon_connector)) { -				/* Don't try to start link training before we -				 * have the dpcd */ -				if (!radeon_dp_getdpcd(radeon_connector)) -					return; - -				/* set it to OFF so that drm_helper_connector_dpms() -				 * won't return immediately since the current state -				 * is ON at this point. -				 */ -				connector->dpms = DRM_MODE_DPMS_OFF; -				drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); -			} -			connector->dpms = saved_dpms; +		if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT && +		    radeon_hpd_sense(rdev, radeon_connector->hpd.hpd) && +		    radeon_dp_needs_link_train(radeon_connector)) { +			/* Don't start link training before we have the DPCD */ +			if (!radeon_dp_getdpcd(radeon_connector)) +				return; + +			/* Turn the connector off and back on immediately, which +			 * will trigger link training +			 */ +			drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); +			drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);  		}  	}  } @@ -899,9 +892,11 @@ radeon_lvds_detect(struct drm_connector *connector, bool force)  	enum drm_connector_status ret = connector_status_disconnected;  	int r; -	r = pm_runtime_get_sync(connector->dev->dev); -	if (r < 0) -		return connector_status_disconnected; +	if (!drm_kms_helper_is_poll_worker()) { +		r = pm_runtime_get_sync(connector->dev->dev); +		if (r < 0) +			return connector_status_disconnected; +	}  	if (encoder) {  		struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); @@ -924,8 +919,12 @@ radeon_lvds_detect(struct drm_connector *connector, bool force)  	/* check acpi lid status ??? */  	radeon_connector_update_scratch_regs(connector, ret); -	pm_runtime_mark_last_busy(connector->dev->dev); -	pm_runtime_put_autosuspend(connector->dev->dev); + +	if (!drm_kms_helper_is_poll_worker()) { +		pm_runtime_mark_last_busy(connector->dev->dev); +		pm_runtime_put_autosuspend(connector->dev->dev); +	} +  	return ret;  } @@ -1039,9 +1038,11 @@ radeon_vga_detect(struct drm_connector *connector, bool force)  	enum drm_connector_status ret = connector_status_disconnected;  	int r; -	r = pm_runtime_get_sync(connector->dev->dev); -	if (r < 0) -		return connector_status_disconnected; +	if (!drm_kms_helper_is_poll_worker()) { +		r = pm_runtime_get_sync(connector->dev->dev); +		if (r < 0) +			return connector_status_disconnected; +	}  	encoder = radeon_best_single_encoder(connector);  	if (!encoder) @@ -1108,8 +1109,10 @@ radeon_vga_detect(struct drm_connector *connector, bool force)  	radeon_connector_update_scratch_regs(connector, ret);  out: -	pm_runtime_mark_last_busy(connector->dev->dev); -	pm_runtime_put_autosuspend(connector->dev->dev); +	if (!drm_kms_helper_is_poll_worker()) { +		pm_runtime_mark_last_busy(connector->dev->dev); +		pm_runtime_put_autosuspend(connector->dev->dev); +	}  	return ret;  } @@ -1173,9 +1176,11 @@ radeon_tv_detect(struct drm_connector *connector, bool force)  	if (!radeon_connector->dac_load_detect)  		return ret; -	r = pm_runtime_get_sync(connector->dev->dev); -	if (r < 0) -		return connector_status_disconnected; +	if (!drm_kms_helper_is_poll_worker()) { +		r = pm_runtime_get_sync(connector->dev->dev); +		if (r < 0) +			return connector_status_disconnected; +	}  	encoder = radeon_best_single_encoder(connector);  	if (!encoder) @@ -1187,8 +1192,12 @@ radeon_tv_detect(struct drm_connector *connector, bool force)  	if (ret == connector_status_connected)  		ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, false);  	radeon_connector_update_scratch_regs(connector, ret); -	pm_runtime_mark_last_busy(connector->dev->dev); -	pm_runtime_put_autosuspend(connector->dev->dev); + +	if (!drm_kms_helper_is_poll_worker()) { +		pm_runtime_mark_last_busy(connector->dev->dev); +		pm_runtime_put_autosuspend(connector->dev->dev); +	} +  	return ret;  } @@ -1251,9 +1260,11 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)  	enum drm_connector_status ret = connector_status_disconnected;  	bool dret = false, broken_edid = false; -	r = pm_runtime_get_sync(connector->dev->dev); -	if (r < 0) -		return connector_status_disconnected; +	if (!drm_kms_helper_is_poll_worker()) { +		r = pm_runtime_get_sync(connector->dev->dev); +		if (r < 0) +			return connector_status_disconnected; +	}  	if (radeon_connector->detected_hpd_without_ddc) {  		force = true; @@ -1436,8 +1447,10 @@ out:  	}  exit: -	pm_runtime_mark_last_busy(connector->dev->dev); -	pm_runtime_put_autosuspend(connector->dev->dev); +	if (!drm_kms_helper_is_poll_worker()) { +		pm_runtime_mark_last_busy(connector->dev->dev); +		pm_runtime_put_autosuspend(connector->dev->dev); +	}  	return ret;  } @@ -1688,9 +1701,11 @@ radeon_dp_detect(struct drm_connector *connector, bool force)  	if (radeon_dig_connector->is_mst)  		return connector_status_disconnected; -	r = pm_runtime_get_sync(connector->dev->dev); -	if (r < 0) -		return connector_status_disconnected; +	if (!drm_kms_helper_is_poll_worker()) { +		r = pm_runtime_get_sync(connector->dev->dev); +		if (r < 0) +			return connector_status_disconnected; +	}  	if (!force && radeon_check_hpd_status_unchanged(connector)) {  		ret = connector->status; @@ -1777,8 +1792,10 @@ radeon_dp_detect(struct drm_connector *connector, bool force)  	}  out: -	pm_runtime_mark_last_busy(connector->dev->dev); -	pm_runtime_put_autosuspend(connector->dev->dev); +	if (!drm_kms_helper_is_poll_worker()) { +		pm_runtime_mark_last_busy(connector->dev->dev); +		pm_runtime_put_autosuspend(connector->dev->dev); +	}  	return ret;  } diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 8d3e3d2e0090..7828a5e10629 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c @@ -1365,6 +1365,10 @@ int radeon_device_init(struct radeon_device *rdev,  	if ((rdev->flags & RADEON_IS_PCI) &&  	    (rdev->family <= CHIP_RS740))  		rdev->need_dma32 = true; +#ifdef CONFIG_PPC64 +	if (rdev->family == CHIP_CEDAR) +		rdev->need_dma32 = true; +#endif  	dma_bits = rdev->need_dma32 ? 32 : 40;  	r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits)); diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index a9962ffba720..27d8e7dd2d06 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c @@ -34,8 +34,6 @@ void radeon_gem_object_free(struct drm_gem_object *gobj)  	struct radeon_bo *robj = gem_to_radeon_bo(gobj);  	if (robj) { -		if (robj->gem_base.import_attach) -			drm_prime_gem_destroy(&robj->gem_base, robj->tbo.sg);  		radeon_mn_unregister(robj);  		radeon_bo_unref(&robj);  	} diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 15404af9d740..31f5ad605e59 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c @@ -82,6 +82,8 @@ static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo)  	mutex_unlock(&bo->rdev->gem.mutex);  	radeon_bo_clear_surface_reg(bo);  	WARN_ON_ONCE(!list_empty(&bo->va)); +	if (bo->gem_base.import_attach) +		drm_prime_gem_destroy(&bo->gem_base, bo->tbo.sg);  	drm_gem_object_release(&bo->gem_base);  	kfree(bo);  } diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 326ad068c15a..4b6542538ff9 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c @@ -47,7 +47,6 @@ static bool radeon_pm_in_vbl(struct radeon_device *rdev);  static bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish);  static void radeon_pm_update_profile(struct radeon_device *rdev);  static void radeon_pm_set_clocks(struct radeon_device *rdev); -static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev);  int radeon_pm_get_type_index(struct radeon_device *rdev,  			     enum radeon_pm_state_type ps_type, @@ -80,8 +79,6 @@ void radeon_pm_acpi_event_handler(struct radeon_device *rdev)  				radeon_dpm_enable_bapm(rdev, rdev->pm.dpm.ac_power);  		}  		mutex_unlock(&rdev->pm.mutex); -		/* allow new DPM state to be picked */ -		radeon_pm_compute_clocks_dpm(rdev);  	} else if (rdev->pm.pm_method == PM_METHOD_PROFILE) {  		if (rdev->pm.profile == PM_PROFILE_AUTO) {  			mutex_lock(&rdev->pm.mutex); @@ -885,8 +882,7 @@ static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev,  		dpm_state = POWER_STATE_TYPE_INTERNAL_3DPERF;  	/* balanced states don't exist at the moment */  	if (dpm_state == POWER_STATE_TYPE_BALANCED) -		dpm_state = rdev->pm.dpm.ac_power ? -			POWER_STATE_TYPE_PERFORMANCE : POWER_STATE_TYPE_BATTERY; +		dpm_state = POWER_STATE_TYPE_PERFORMANCE;  restart_search:  	/* Pick the best power state based on current conditions */  | 

