diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 95 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 36 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 39 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 26 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 66 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_tv.c | 43 |
11 files changed, 229 insertions, 99 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index cfb56d0ff367..0ad533f06af9 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -46,6 +46,9 @@ module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400); | |||
| 46 | unsigned int i915_powersave = 1; | 46 | unsigned int i915_powersave = 1; |
| 47 | module_param_named(powersave, i915_powersave, int, 0600); | 47 | module_param_named(powersave, i915_powersave, int, 0600); |
| 48 | 48 | ||
| 49 | unsigned int i915_enable_rc6 = 0; | ||
| 50 | module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); | ||
| 51 | |||
| 49 | unsigned int i915_lvds_downclock = 0; | 52 | unsigned int i915_lvds_downclock = 0; |
| 50 | module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400); | 53 | module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400); |
| 51 | 54 | ||
| @@ -360,7 +363,7 @@ static int i915_drm_thaw(struct drm_device *dev) | |||
| 360 | /* Resume the modeset for every activated CRTC */ | 363 | /* Resume the modeset for every activated CRTC */ |
| 361 | drm_helper_resume_force_mode(dev); | 364 | drm_helper_resume_force_mode(dev); |
| 362 | 365 | ||
| 363 | if (dev_priv->renderctx && dev_priv->pwrctx) | 366 | if (IS_IRONLAKE_M(dev)) |
| 364 | ironlake_enable_rc6(dev); | 367 | ironlake_enable_rc6(dev); |
| 365 | } | 368 | } |
| 366 | 369 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index a0149c619cdd..65dfe81d0035 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -958,6 +958,7 @@ extern unsigned int i915_fbpercrtc; | |||
| 958 | extern unsigned int i915_powersave; | 958 | extern unsigned int i915_powersave; |
| 959 | extern unsigned int i915_lvds_downclock; | 959 | extern unsigned int i915_lvds_downclock; |
| 960 | extern unsigned int i915_panel_use_ssc; | 960 | extern unsigned int i915_panel_use_ssc; |
| 961 | extern unsigned int i915_enable_rc6; | ||
| 961 | 962 | ||
| 962 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); | 963 | extern int i915_suspend(struct drm_device *dev, pm_message_t state); |
| 963 | extern int i915_resume(struct drm_device *dev); | 964 | extern int i915_resume(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 5cfc68940f17..15d94c63918c 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -174,7 +174,9 @@ | |||
| 174 | * address/value pairs. Don't overdue it, though, x <= 2^4 must hold! | 174 | * address/value pairs. Don't overdue it, though, x <= 2^4 must hold! |
| 175 | */ | 175 | */ |
| 176 | #define MI_LOAD_REGISTER_IMM(x) MI_INSTR(0x22, 2*x-1) | 176 | #define MI_LOAD_REGISTER_IMM(x) MI_INSTR(0x22, 2*x-1) |
| 177 | #define MI_FLUSH_DW MI_INSTR(0x26, 2) /* for GEN6 */ | 177 | #define MI_FLUSH_DW MI_INSTR(0x26, 1) /* for GEN6 */ |
| 178 | #define MI_INVALIDATE_TLB (1<<18) | ||
| 179 | #define MI_INVALIDATE_BSD (1<<7) | ||
| 178 | #define MI_BATCH_BUFFER MI_INSTR(0x30, 1) | 180 | #define MI_BATCH_BUFFER MI_INSTR(0x30, 1) |
| 179 | #define MI_BATCH_NON_SECURE (1) | 181 | #define MI_BATCH_NON_SECURE (1) |
| 180 | #define MI_BATCH_NON_SECURE_I965 (1<<8) | 182 | #define MI_BATCH_NON_SECURE_I965 (1<<8) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 7e42aa586504..3b006536b3d2 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -5558,9 +5558,7 @@ static void intel_crtc_reset(struct drm_crtc *crtc) | |||
| 5558 | /* Reset flags back to the 'unknown' status so that they | 5558 | /* Reset flags back to the 'unknown' status so that they |
| 5559 | * will be correctly set on the initial modeset. | 5559 | * will be correctly set on the initial modeset. |
| 5560 | */ | 5560 | */ |
| 5561 | intel_crtc->cursor_addr = 0; | ||
| 5562 | intel_crtc->dpms_mode = -1; | 5561 | intel_crtc->dpms_mode = -1; |
| 5563 | intel_crtc->active = true; /* force the pipe off on setup_init_config */ | ||
| 5564 | } | 5562 | } |
| 5565 | 5563 | ||
| 5566 | static struct drm_crtc_helper_funcs intel_helper_funcs = { | 5564 | static struct drm_crtc_helper_funcs intel_helper_funcs = { |
| @@ -5666,6 +5664,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe) | |||
| 5666 | dev_priv->pipe_to_crtc_mapping[intel_crtc->pipe] = &intel_crtc->base; | 5664 | dev_priv->pipe_to_crtc_mapping[intel_crtc->pipe] = &intel_crtc->base; |
| 5667 | 5665 | ||
| 5668 | intel_crtc_reset(&intel_crtc->base); | 5666 | intel_crtc_reset(&intel_crtc->base); |
| 5667 | intel_crtc->active = true; /* force the pipe off on setup_init_config */ | ||
| 5669 | 5668 | ||
| 5670 | if (HAS_PCH_SPLIT(dev)) { | 5669 | if (HAS_PCH_SPLIT(dev)) { |
| 5671 | intel_helper_funcs.prepare = ironlake_crtc_prepare; | 5670 | intel_helper_funcs.prepare = ironlake_crtc_prepare; |
| @@ -6463,52 +6462,60 @@ void intel_enable_clock_gating(struct drm_device *dev) | |||
| 6463 | } | 6462 | } |
| 6464 | } | 6463 | } |
| 6465 | 6464 | ||
| 6466 | void intel_disable_clock_gating(struct drm_device *dev) | 6465 | static void ironlake_teardown_rc6(struct drm_device *dev) |
| 6467 | { | 6466 | { |
| 6468 | struct drm_i915_private *dev_priv = dev->dev_private; | 6467 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 6469 | 6468 | ||
| 6470 | if (dev_priv->renderctx) { | 6469 | if (dev_priv->renderctx) { |
| 6471 | struct drm_i915_gem_object *obj = dev_priv->renderctx; | 6470 | i915_gem_object_unpin(dev_priv->renderctx); |
| 6472 | 6471 | drm_gem_object_unreference(&dev_priv->renderctx->base); | |
| 6473 | I915_WRITE(CCID, 0); | ||
| 6474 | POSTING_READ(CCID); | ||
| 6475 | |||
| 6476 | i915_gem_object_unpin(obj); | ||
| 6477 | drm_gem_object_unreference(&obj->base); | ||
| 6478 | dev_priv->renderctx = NULL; | 6472 | dev_priv->renderctx = NULL; |
| 6479 | } | 6473 | } |
| 6480 | 6474 | ||
| 6481 | if (dev_priv->pwrctx) { | 6475 | if (dev_priv->pwrctx) { |
| 6482 | struct drm_i915_gem_object *obj = dev_priv->pwrctx; | 6476 | i915_gem_object_unpin(dev_priv->pwrctx); |
| 6477 | drm_gem_object_unreference(&dev_priv->pwrctx->base); | ||
| 6478 | dev_priv->pwrctx = NULL; | ||
| 6479 | } | ||
| 6480 | } | ||
| 6481 | |||
| 6482 | static void ironlake_disable_rc6(struct drm_device *dev) | ||
| 6483 | { | ||
| 6484 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 6485 | |||
| 6486 | if (I915_READ(PWRCTXA)) { | ||
| 6487 | /* Wake the GPU, prevent RC6, then restore RSTDBYCTL */ | ||
| 6488 | I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) | RCX_SW_EXIT); | ||
| 6489 | wait_for(((I915_READ(RSTDBYCTL) & RSX_STATUS_MASK) == RSX_STATUS_ON), | ||
| 6490 | 50); | ||
| 6483 | 6491 | ||
| 6484 | I915_WRITE(PWRCTXA, 0); | 6492 | I915_WRITE(PWRCTXA, 0); |
| 6485 | POSTING_READ(PWRCTXA); | 6493 | POSTING_READ(PWRCTXA); |
| 6486 | 6494 | ||
| 6487 | i915_gem_object_unpin(obj); | 6495 | I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT); |
| 6488 | drm_gem_object_unreference(&obj->base); | 6496 | POSTING_READ(RSTDBYCTL); |
| 6489 | dev_priv->pwrctx = NULL; | ||
| 6490 | } | 6497 | } |
| 6498 | |||
| 6499 | ironlake_disable_rc6(dev); | ||
| 6491 | } | 6500 | } |
| 6492 | 6501 | ||
| 6493 | static void ironlake_disable_rc6(struct drm_device *dev) | 6502 | static int ironlake_setup_rc6(struct drm_device *dev) |
| 6494 | { | 6503 | { |
| 6495 | struct drm_i915_private *dev_priv = dev->dev_private; | 6504 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 6496 | 6505 | ||
| 6497 | /* Wake the GPU, prevent RC6, then restore RSTDBYCTL */ | 6506 | if (dev_priv->renderctx == NULL) |
| 6498 | I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) | RCX_SW_EXIT); | 6507 | dev_priv->renderctx = intel_alloc_context_page(dev); |
| 6499 | wait_for(((I915_READ(RSTDBYCTL) & RSX_STATUS_MASK) == RSX_STATUS_ON), | 6508 | if (!dev_priv->renderctx) |
| 6500 | 10); | 6509 | return -ENOMEM; |
| 6501 | POSTING_READ(CCID); | 6510 | |
| 6502 | I915_WRITE(PWRCTXA, 0); | 6511 | if (dev_priv->pwrctx == NULL) |
| 6503 | POSTING_READ(PWRCTXA); | 6512 | dev_priv->pwrctx = intel_alloc_context_page(dev); |
| 6504 | I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT); | 6513 | if (!dev_priv->pwrctx) { |
| 6505 | POSTING_READ(RSTDBYCTL); | 6514 | ironlake_teardown_rc6(dev); |
| 6506 | i915_gem_object_unpin(dev_priv->renderctx); | 6515 | return -ENOMEM; |
| 6507 | drm_gem_object_unreference(&dev_priv->renderctx->base); | 6516 | } |
| 6508 | dev_priv->renderctx = NULL; | 6517 | |
| 6509 | i915_gem_object_unpin(dev_priv->pwrctx); | 6518 | return 0; |
| 6510 | drm_gem_object_unreference(&dev_priv->pwrctx->base); | ||
| 6511 | dev_priv->pwrctx = NULL; | ||
| 6512 | } | 6519 | } |
| 6513 | 6520 | ||
| 6514 | void ironlake_enable_rc6(struct drm_device *dev) | 6521 | |
