diff options
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 73 |
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 | ||
| 4417 | static struct drm_gem_object * | ||
| 4418 | intel_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 | |||
| 4445 | err_unpin: | ||
| 4446 | i915_gem_object_unpin(pwrctx); | ||
| 4447 | err_unref: | ||
| 4448 | drm_gem_object_unreference(pwrctx); | ||
| 4449 | mutex_unlock(&dev->struct_mutex); | ||
| 4450 | return NULL; | ||
| 4451 | } | ||
| 4452 | |||
| 4417 | void intel_init_clock_gating(struct drm_device *dev) | 4453 | void 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 | |||
| 4503 | out: | ||
| 4504 | return; | ||
| 4505 | } | 4526 | } |
| 4506 | 4527 | ||
| 4507 | /* Set up chip specific display functions */ | 4528 | /* Set up chip specific display functions */ |
