aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_display.c73
1 files changed, 47 insertions, 26 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index af61dd915f2b..84705b7e01ec 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4414,6 +4414,42 @@ static const struct drm_mode_config_funcs intel_mode_funcs = {
4414 .fb_changed = intelfb_probe, 4414 .fb_changed = intelfb_probe,
4415}; 4415};
4416 4416
4417static struct drm_gem_object *
4418intel_alloc_power_context(struct drm_device *dev)
4419{
4420 struct drm_gem_object *pwrctx;
4421 int ret;
4422
4423 pwrctx = drm_gem_object_alloc(dev, 4096);
4424 if (!pwrctx) {
4425 DRM_DEBUG("failed to alloc power context, RC6 disabled\n");
4426 return NULL;
4427 }
4428
4429 mutex_lock(&dev->struct_mutex);
4430 ret = i915_gem_object_pin(pwrctx, 4096);
4431 if (ret) {
4432 DRM_ERROR("failed to pin power context: %d\n", ret);
4433 goto err_unref;
4434 }
4435
4436 ret = i915_gem_object_set_to_gtt_domain(pwrctx, 1);
4437 if (ret) {
4438 DRM_ERROR("failed to set-domain on power context: %d\n", ret);
4439 goto err_unpin;
4440 }
4441 mutex_unlock(&dev->struct_mutex);
4442
4443 return pwrctx;
4444
4445err_unpin:
4446 i915_gem_object_unpin(pwrctx);
4447err_unref:
4448 drm_gem_object_unreference(pwrctx);
4449 mutex_unlock(&dev->struct_mutex);
4450 return NULL;
4451}
4452
4417void intel_init_clock_gating(struct drm_device *dev) 4453void intel_init_clock_gating(struct drm_device *dev)
4418{ 4454{
4419 struct drm_i915_private *dev_priv = dev->dev_private; 4455 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -4467,41 +4503,26 @@ void intel_init_clock_gating(struct drm_device *dev)
4467 * to save state. 4503 * to save state.
4468 */ 4504 */
4469 if (I915_HAS_RC6(dev) && drm_core_check_feature(dev, DRIVER_MODESET)) { 4505 if (I915_HAS_RC6(dev) && drm_core_check_feature(dev, DRIVER_MODESET)) {
4470 struct drm_gem_object *pwrctx; 4506 struct drm_i915_gem_object *obj_priv = NULL;
4471 struct drm_i915_gem_object *obj_priv;
4472 int ret;
4473 4507
4474 if (dev_priv->pwrctx) { 4508 if (dev_priv->pwrctx) {
4475 obj_priv = dev_priv->pwrctx->driver_private; 4509 obj_priv = dev_priv->pwrctx->driver_private;
4476 } else { 4510 } else {
4477 pwrctx = drm_gem_object_alloc(dev, 4096); 4511 struct drm_gem_object *pwrctx;
4478 if (!pwrctx) {
4479 DRM_DEBUG("failed to alloc power context, "
4480 "RC6 disabled\n");
4481 goto out;
4482 }
4483 4512
4484 ret = i915_gem_object_pin(pwrctx, 4096); 4513 pwrctx = intel_alloc_power_context(dev);
4485 if (ret) { 4514 if (pwrctx) {
4486 DRM_ERROR("failed to pin power context: %d\n", 4515 dev_priv->pwrctx = pwrctx;
4487 ret); 4516 obj_priv = pwrctx->driver_private;
4488 drm_gem_object_unreference(pwrctx);
4489 goto out;
4490 } 4517 }
4491
4492 i915_gem_object_set_to_gtt_domain(pwrctx, 1);
4493
4494 dev_priv->pwrctx = pwrctx;
4495 obj_priv = pwrctx->driver_private;
4496 } 4518 }
4497 4519
4498 I915_WRITE(PWRCTXA, obj_priv->gtt_offset | PWRCTX_EN); 4520 if (obj_priv) {
4499 I915_WRITE(MCHBAR_RENDER_STANDBY, 4521 I915_WRITE(PWRCTXA, obj_priv->gtt_offset | PWRCTX_EN);
4500 I915_READ(MCHBAR_RENDER_STANDBY) & ~RCX_SW_EXIT); 4522 I915_WRITE(MCHBAR_RENDER_STANDBY,
4523 I915_READ(MCHBAR_RENDER_STANDBY) & ~RCX_SW_EXIT);
4524 }
4501 } 4525 }
4502
4503out:
4504 return;
4505} 4526}
4506 4527
4507/* Set up chip specific display functions */ 4528/* Set up chip specific display functions */