diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 1202 |
1 files changed, 826 insertions, 376 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index e1fc35a72656..5874716774a7 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -92,12 +92,12 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc) | |||
92 | { | 92 | { |
93 | struct drm_device *dev = crtc->dev; | 93 | struct drm_device *dev = crtc->dev; |
94 | struct drm_i915_private *dev_priv = dev->dev_private; | 94 | struct drm_i915_private *dev_priv = dev->dev_private; |
95 | struct drm_framebuffer *fb = crtc->fb; | 95 | struct drm_framebuffer *fb = crtc->primary->fb; |
96 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); | 96 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); |
97 | struct drm_i915_gem_object *obj = intel_fb->obj; | 97 | struct drm_i915_gem_object *obj = intel_fb->obj; |
98 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 98 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
99 | int cfb_pitch; | 99 | int cfb_pitch; |
100 | int plane, i; | 100 | int i; |
101 | u32 fbc_ctl; | 101 | u32 fbc_ctl; |
102 | 102 | ||
103 | cfb_pitch = dev_priv->fbc.size / FBC_LL_SIZE; | 103 | cfb_pitch = dev_priv->fbc.size / FBC_LL_SIZE; |
@@ -109,7 +109,6 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc) | |||
109 | cfb_pitch = (cfb_pitch / 32) - 1; | 109 | cfb_pitch = (cfb_pitch / 32) - 1; |
110 | else | 110 | else |
111 | cfb_pitch = (cfb_pitch / 64) - 1; | 111 | cfb_pitch = (cfb_pitch / 64) - 1; |
112 | plane = intel_crtc->plane == 0 ? FBC_CTL_PLANEA : FBC_CTL_PLANEB; | ||
113 | 112 | ||
114 | /* Clear old tags */ | 113 | /* Clear old tags */ |
115 | for (i = 0; i < (FBC_LL_SIZE / 32) + 1; i++) | 114 | for (i = 0; i < (FBC_LL_SIZE / 32) + 1; i++) |
@@ -120,7 +119,7 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc) | |||
120 | 119 | ||
121 | /* Set it up... */ | 120 | /* Set it up... */ |
122 | fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM | FBC_CTL_CPU_FENCE; | 121 | fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM | FBC_CTL_CPU_FENCE; |
123 | fbc_ctl2 |= plane; | 122 | fbc_ctl2 |= FBC_CTL_PLANE(intel_crtc->plane); |
124 | I915_WRITE(FBC_CONTROL2, fbc_ctl2); | 123 | I915_WRITE(FBC_CONTROL2, fbc_ctl2); |
125 | I915_WRITE(FBC_FENCE_OFF, crtc->y); | 124 | I915_WRITE(FBC_FENCE_OFF, crtc->y); |
126 | } | 125 | } |
@@ -135,7 +134,7 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc) | |||
135 | fbc_ctl |= obj->fence_reg; | 134 | fbc_ctl |= obj->fence_reg; |
136 | I915_WRITE(FBC_CONTROL, fbc_ctl); | 135 | I915_WRITE(FBC_CONTROL, fbc_ctl); |
137 | 136 | ||
138 | DRM_DEBUG_KMS("enabled FBC, pitch %d, yoff %d, plane %c, ", | 137 | DRM_DEBUG_KMS("enabled FBC, pitch %d, yoff %d, plane %c\n", |
139 | cfb_pitch, crtc->y, plane_name(intel_crtc->plane)); | 138 | cfb_pitch, crtc->y, plane_name(intel_crtc->plane)); |
140 | } | 139 | } |
141 | 140 | ||
@@ -150,21 +149,23 @@ static void g4x_enable_fbc(struct drm_crtc *crtc) | |||
150 | { | 149 | { |
151 | struct drm_device *dev = crtc->dev; | 150 | struct drm_device *dev = crtc->dev; |
152 | struct drm_i915_private *dev_priv = dev->dev_private; | 151 | struct drm_i915_private *dev_priv = dev->dev_private; |
153 | struct drm_framebuffer *fb = crtc->fb; | 152 | struct drm_framebuffer *fb = crtc->primary->fb; |
154 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); | 153 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); |
155 | struct drm_i915_gem_object *obj = intel_fb->obj; | 154 | struct drm_i915_gem_object *obj = intel_fb->obj; |
156 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 155 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
157 | int plane = intel_crtc->plane == 0 ? DPFC_CTL_PLANEA : DPFC_CTL_PLANEB; | ||
158 | u32 dpfc_ctl; | 156 | u32 dpfc_ctl; |
159 | 157 | ||
160 | dpfc_ctl = plane | DPFC_SR_EN | DPFC_CTL_LIMIT_1X; | 158 | dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane) | DPFC_SR_EN; |
159 | if (drm_format_plane_cpp(fb->pixel_format, 0) == 2) | ||
160 | dpfc_ctl |= DPFC_CTL_LIMIT_2X; | ||
161 | else | ||
162 | dpfc_ctl |= DPFC_CTL_LIMIT_1X; | ||
161 | dpfc_ctl |= DPFC_CTL_FENCE_EN | obj->fence_reg; | 163 | dpfc_ctl |= DPFC_CTL_FENCE_EN | obj->fence_reg; |
162 | I915_WRITE(DPFC_CHICKEN, DPFC_HT_MODIFY); | ||
163 | 164 | ||
164 | I915_WRITE(DPFC_FENCE_YOFF, crtc->y); | 165 | I915_WRITE(DPFC_FENCE_YOFF, crtc->y); |
165 | 166 | ||
166 | /* enable it... */ | 167 | /* enable it... */ |
167 | I915_WRITE(DPFC_CONTROL, I915_READ(DPFC_CONTROL) | DPFC_CTL_EN); | 168 | I915_WRITE(DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN); |
168 | 169 | ||
169 | DRM_DEBUG_KMS("enabled fbc on plane %c\n", plane_name(intel_crtc->plane)); | 170 | DRM_DEBUG_KMS("enabled fbc on plane %c\n", plane_name(intel_crtc->plane)); |
170 | } | 171 | } |
@@ -220,22 +221,20 @@ static void ironlake_enable_fbc(struct drm_crtc *crtc) | |||
220 | { | 221 | { |
221 | struct drm_device *dev = crtc->dev; | 222 | struct drm_device *dev = crtc->dev; |
222 | struct drm_i915_private *dev_priv = dev->dev_private; | 223 | struct drm_i915_private *dev_priv = dev->dev_private; |
223 | struct drm_framebuffer *fb = crtc->fb; | 224 | struct drm_framebuffer *fb = crtc->primary->fb; |
224 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); | 225 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); |
225 | struct drm_i915_gem_object *obj = intel_fb->obj; | 226 | struct drm_i915_gem_object *obj = intel_fb->obj; |
226 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 227 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
227 | int plane = intel_crtc->plane == 0 ? DPFC_CTL_PLANEA : DPFC_CTL_PLANEB; | ||
228 | u32 dpfc_ctl; | 228 | u32 dpfc_ctl; |
229 | 229 | ||
230 | dpfc_ctl = I915_READ(ILK_DPFC_CONTROL); | 230 | dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane); |
231 | dpfc_ctl &= DPFC_RESERVED; | 231 | if (drm_format_plane_cpp(fb->pixel_format, 0) == 2) |
232 | dpfc_ctl |= (plane | DPFC_CTL_LIMIT_1X); | 232 | dpfc_ctl |= DPFC_CTL_LIMIT_2X; |
233 | /* Set persistent mode for front-buffer rendering, ala X. */ | 233 | else |
234 | dpfc_ctl |= DPFC_CTL_PERSISTENT_MODE; | 234 | dpfc_ctl |= DPFC_CTL_LIMIT_1X; |
235 | dpfc_ctl |= DPFC_CTL_FENCE_EN; | 235 | dpfc_ctl |= DPFC_CTL_FENCE_EN; |
236 | if (IS_GEN5(dev)) | 236 | if (IS_GEN5(dev)) |
237 | dpfc_ctl |= obj->fence_reg; | 237 | dpfc_ctl |= obj->fence_reg; |
238 | I915_WRITE(ILK_DPFC_CHICKEN, DPFC_HT_MODIFY); | ||
239 | 238 | ||
240 | I915_WRITE(ILK_DPFC_FENCE_YOFF, crtc->y); | 239 | I915_WRITE(ILK_DPFC_FENCE_YOFF, crtc->y); |
241 | I915_WRITE(ILK_FBC_RT_BASE, i915_gem_obj_ggtt_offset(obj) | ILK_FBC_RT_VALID); | 240 | I915_WRITE(ILK_FBC_RT_BASE, i915_gem_obj_ggtt_offset(obj) | ILK_FBC_RT_VALID); |
@@ -278,24 +277,31 @@ static void gen7_enable_fbc(struct drm_crtc *crtc) | |||
278 | { | 277 | { |
279 | struct drm_device *dev = crtc->dev; | 278 | struct drm_device *dev = crtc->dev; |
280 | struct drm_i915_private *dev_priv = dev->dev_private; | 279 | struct drm_i915_private *dev_priv = dev->dev_private; |
281 | struct drm_framebuffer *fb = crtc->fb; | 280 | struct drm_framebuffer *fb = crtc->primary->fb; |
282 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); | 281 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); |
283 | struct drm_i915_gem_object *obj = intel_fb->obj; | 282 | struct drm_i915_gem_object *obj = intel_fb->obj; |
284 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 283 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
284 | u32 dpfc_ctl; | ||
285 | 285 | ||
286 | I915_WRITE(IVB_FBC_RT_BASE, i915_gem_obj_ggtt_offset(obj)); | 286 | dpfc_ctl = IVB_DPFC_CTL_PLANE(intel_crtc->plane); |
287 | if (drm_format_plane_cpp(fb->pixel_format, 0) == 2) | ||
288 | dpfc_ctl |= DPFC_CTL_LIMIT_2X; | ||
289 | else | ||
290 | dpfc_ctl |= DPFC_CTL_LIMIT_1X; | ||
291 | dpfc_ctl |= IVB_DPFC_CTL_FENCE_EN; | ||
287 | 292 | ||
288 | I915_WRITE(ILK_DPFC_CONTROL, DPFC_CTL_EN | DPFC_CTL_LIMIT_1X | | 293 | I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN); |
289 | IVB_DPFC_CTL_FENCE_EN | | ||
290 | intel_crtc->plane << IVB_DPFC_CTL_PLANE_SHIFT); | ||
291 | 294 | ||
292 | if (IS_IVYBRIDGE(dev)) { | 295 | if (IS_IVYBRIDGE(dev)) { |
293 | /* WaFbcAsynchFlipDisableFbcQueue:ivb */ | 296 | /* WaFbcAsynchFlipDisableFbcQueue:ivb */ |
294 | I915_WRITE(ILK_DISPLAY_CHICKEN1, ILK_FBCQ_DIS); | 297 | I915_WRITE(ILK_DISPLAY_CHICKEN1, |
298 | I915_READ(ILK_DISPLAY_CHICKEN1) | | ||
299 | ILK_FBCQ_DIS); | ||
295 | } else { | 300 | } else { |
296 | /* WaFbcAsynchFlipDisableFbcQueue:hsw */ | 301 | /* WaFbcAsynchFlipDisableFbcQueue:hsw,bdw */ |
297 | I915_WRITE(HSW_PIPE_SLICE_CHICKEN_1(intel_crtc->pipe), | 302 | I915_WRITE(CHICKEN_PIPESL_1(intel_crtc->pipe), |
298 | HSW_BYPASS_FBC_QUEUE); | 303 | I915_READ(CHICKEN_PIPESL_1(intel_crtc->pipe)) | |
304 | HSW_FBCQ_DIS); | ||
299 | } | 305 | } |
300 | 306 | ||
301 | I915_WRITE(SNB_DPFC_CTL_SA, | 307 | I915_WRITE(SNB_DPFC_CTL_SA, |
@@ -330,11 +336,11 @@ static void intel_fbc_work_fn(struct work_struct *__work) | |||
330 | /* Double check that we haven't switched fb without cancelling | 336 | /* Double check that we haven't switched fb without cancelling |
331 | * the prior work. | 337 | * the prior work. |
332 | */ | 338 | */ |
333 | if (work->crtc->fb == work->fb) { | 339 | if (work->crtc->primary->fb == work->fb) { |
334 | dev_priv->display.enable_fbc(work->crtc); | 340 | dev_priv->display.enable_fbc(work->crtc); |
335 | 341 | ||
336 | dev_priv->fbc.plane = to_intel_crtc(work->crtc)->plane; | 342 | dev_priv->fbc.plane = to_intel_crtc(work->crtc)->plane; |
337 | dev_priv->fbc.fb_id = work->crtc->fb->base.id; | 343 | dev_priv->fbc.fb_id = work->crtc->primary->fb->base.id; |
338 | dev_priv->fbc.y = work->crtc->y; | 344 | dev_priv->fbc.y = work->crtc->y; |
339 | } | 345 | } |
340 | 346 | ||
@@ -387,7 +393,7 @@ static void intel_enable_fbc(struct drm_crtc *crtc) | |||
387 | } | 393 | } |
388 | 394 | ||
389 | work->crtc = crtc; | 395 | work->crtc = crtc; |
390 | work->fb = crtc->fb; | 396 | work->fb = crtc->primary->fb; |
391 | INIT_DELAYED_WORK(&work->work, intel_fbc_work_fn); | 397 | INIT_DELAYED_WORK(&work->work, intel_fbc_work_fn); |
392 | 398 | ||
393 | dev_priv->fbc.fbc_work = work; | 399 | dev_priv->fbc.fbc_work = work; |
@@ -466,7 +472,7 @@ void intel_update_fbc(struct drm_device *dev) | |||
466 | return; | 472 | return; |
467 | } | 473 | } |
468 | 474 | ||
469 | if (!i915_powersave) { | 475 | if (!i915.powersave) { |
470 | if (set_no_fbc_reason(dev_priv, FBC_MODULE_PARAM)) | 476 | if (set_no_fbc_reason(dev_priv, FBC_MODULE_PARAM)) |
471 | DRM_DEBUG_KMS("fbc disabled per module param\n"); | 477 | DRM_DEBUG_KMS("fbc disabled per module param\n"); |
472 | return; | 478 | return; |
@@ -493,25 +499,25 @@ void intel_update_fbc(struct drm_device *dev) | |||
493 | } | 499 | } |
494 | } | 500 | } |
495 | 501 | ||
496 | if (!crtc || crtc->fb == NULL) { | 502 | if (!crtc || crtc->primary->fb == NULL) { |
497 | if (set_no_fbc_reason(dev_priv, FBC_NO_OUTPUT)) | 503 | if (set_no_fbc_reason(dev_priv, FBC_NO_OUTPUT)) |
498 | DRM_DEBUG_KMS("no output, disabling\n"); | 504 | DRM_DEBUG_KMS("no output, disabling\n"); |
499 | goto out_disable; | 505 | goto out_disable; |
500 | } | 506 | } |
501 | 507 | ||
502 | intel_crtc = to_intel_crtc(crtc); | 508 | intel_crtc = to_intel_crtc(crtc); |
503 | fb = crtc->fb; | 509 | fb = crtc->primary->fb; |
504 | intel_fb = to_intel_framebuffer(fb); | 510 | intel_fb = to_intel_framebuffer(fb); |
505 | obj = intel_fb->obj; | 511 | obj = intel_fb->obj; |
506 | adjusted_mode = &intel_crtc->config.adjusted_mode; | 512 | adjusted_mode = &intel_crtc->config.adjusted_mode; |
507 | 513 | ||
508 | if (i915_enable_fbc < 0 && | 514 | if (i915.enable_fbc < 0 && |
509 | INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev)) { | 515 | INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev)) { |
510 | if (set_no_fbc_reason(dev_priv, FBC_CHIP_DEFAULT)) | 516 | if (set_no_fbc_reason(dev_priv, FBC_CHIP_DEFAULT)) |
511 | DRM_DEBUG_KMS("disabled per chip default\n"); | 517 | DRM_DEBUG_KMS("disabled per chip default\n"); |
512 | goto out_disable; | 518 | goto out_disable; |
513 | } | 519 | } |
514 | if (!i915_enable_fbc) { | 520 | if (!i915.enable_fbc) { |
515 | if (set_no_fbc_reason(dev_priv, FBC_MODULE_PARAM)) | 521 | if (set_no_fbc_reason(dev_priv, FBC_MODULE_PARAM)) |
516 | DRM_DEBUG_KMS("fbc disabled per module param\n"); | 522 | DRM_DEBUG_KMS("fbc disabled per module param\n"); |
517 | goto out_disable; | 523 | goto out_disable; |
@@ -537,7 +543,7 @@ void intel_update_fbc(struct drm_device *dev) | |||
537 | DRM_DEBUG_KMS("mode too large for compression, disabling\n"); | 543 | DRM_DEBUG_KMS("mode too large for compression, disabling\n"); |
538 | goto out_disable; | 544 | goto out_disable; |
539 | } | 545 | } |
540 | if ((INTEL_INFO(dev)->gen < 4 || IS_HASWELL(dev)) && | 546 | if ((INTEL_INFO(dev)->gen < 4 || HAS_DDI(dev)) && |
541 | intel_crtc->plane != PLANE_A) { | 547 | intel_crtc->plane != PLANE_A) { |
542 | if (set_no_fbc_reason(dev_priv, FBC_BAD_PLANE)) | 548 | if (set_no_fbc_reason(dev_priv, FBC_BAD_PLANE)) |
543 | DRM_DEBUG_KMS("plane not A, disabling compression\n"); | 549 | DRM_DEBUG_KMS("plane not A, disabling compression\n"); |
@@ -617,7 +623,7 @@ out_disable: | |||
617 | 623 | ||
618 | static void i915_pineview_get_mem_freq(struct drm_device *dev) | 624 | static void i915_pineview_get_mem_freq(struct drm_device *dev) |
619 | { | 625 | { |
620 | drm_i915_private_t *dev_priv = dev->dev_private; | 626 | struct drm_i915_private *dev_priv = dev->dev_private; |
621 | u32 tmp; | 627 | u32 tmp; |
622 | 628 | ||
623 | tmp = I915_READ(CLKCFG); | 629 | tmp = I915_READ(CLKCFG); |
@@ -656,7 +662,7 @@ static void i915_pineview_get_mem_freq(struct drm_device *dev) | |||
656 | 662 | ||
657 | static void i915_ironlake_get_mem_freq(struct drm_device *dev) | 663 | static void i915_ironlake_get_mem_freq(struct drm_device *dev) |
658 | { | 664 | { |
659 | drm_i915_private_t *dev_priv = dev->dev_private; | 665 | struct drm_i915_private *dev_priv = dev->dev_private; |
660 | u16 ddrpll, csipll; | 666 | u16 ddrpll, csipll; |
661 | 667 | ||
662 | ddrpll = I915_READ16(DDRMPLL1); | 668 | ddrpll = I915_READ16(DDRMPLL1); |
@@ -1035,7 +1041,7 @@ static void pineview_update_wm(struct drm_crtc *unused_crtc) | |||
1035 | crtc = single_enabled_crtc(dev); | 1041 | crtc = single_enabled_crtc(dev); |
1036 | if (crtc) { | 1042 | if (crtc) { |
1037 | const struct drm_display_mode *adjusted_mode; | 1043 | const struct drm_display_mode *adjusted_mode; |
1038 | int pixel_size = crtc->fb->bits_per_pixel / 8; | 1044 | int pixel_size = crtc->primary->fb->bits_per_pixel / 8; |
1039 | int clock; | 1045 | int clock; |
1040 | 1046 | ||
1041 | adjusted_mode = &to_intel_crtc(crtc)->config.adjusted_mode; | 1047 | adjusted_mode = &to_intel_crtc(crtc)->config.adjusted_mode; |
@@ -1115,7 +1121,7 @@ static bool g4x_compute_wm0(struct drm_device *dev, | |||
1115 | clock = adjusted_mode->crtc_clock; | 1121 | clock = adjusted_mode->crtc_clock; |
1116 | htotal = adjusted_mode->crtc_htotal; | 1122 | htotal = adjusted_mode->crtc_htotal; |
1117 | hdisplay = to_intel_crtc(crtc)->config.pipe_src_w; | 1123 | hdisplay = to_intel_crtc(crtc)->config.pipe_src_w; |
1118 | pixel_size = crtc->fb->bits_per_pixel / 8; | 1124 | pixel_size = crtc->primary->fb->bits_per_pixel / 8; |
1119 | 1125 | ||
1120 | /* Use the small buffer method to calculate plane watermark */ | 1126 | /* Use the small buffer method to calculate plane watermark */ |
1121 | entries = ((clock * pixel_size / 1000) * display_latency_ns) / 1000; | 1127 | entries = ((clock * pixel_size / 1000) * display_latency_ns) / 1000; |
@@ -1128,9 +1134,9 @@ static bool g4x_compute_wm0(struct drm_device *dev, | |||
1128 | *plane_wm = display->max_wm; | 1134 | *plane_wm = display->max_wm; |
1129 | 1135 | ||
1130 | /* Use the large buffer method to calculate cursor watermark */ | 1136 | /* Use the large buffer method to calculate cursor watermark */ |
1131 | line_time_us = ((htotal * 1000) / clock); | 1137 | line_time_us = max(htotal * 1000 / clock, 1); |
1132 | line_count = (cursor_latency_ns / line_time_us + 1000) / 1000; | 1138 | line_count = (cursor_latency_ns / line_time_us + 1000) / 1000; |
1133 | entries = line_count * 64 * pixel_size; | 1139 | entries = line_count * to_intel_crtc(crtc)->cursor_width * pixel_size; |
1134 | tlb_miss = cursor->fifo_size*cursor->cacheline_size - hdisplay * 8; | 1140 | tlb_miss = cursor->fifo_size*cursor->cacheline_size - hdisplay * 8; |
1135 | if (tlb_miss > 0) | 1141 | if (tlb_miss > 0) |
1136 | entries += tlb_miss; | 1142 | entries += tlb_miss; |
@@ -1202,9 +1208,9 @@ static bool g4x_compute_srwm(struct drm_device *dev, | |||
1202 | clock = adjusted_mode->crtc_clock; | 1208 | clock = adjusted_mode->crtc_clock; |
1203 | htotal = adjusted_mode->crtc_htotal; | 1209 | htotal = adjusted_mode->crtc_htotal; |
1204 | hdisplay = to_intel_crtc(crtc)->config.pipe_src_w; | 1210 | hdisplay = to_intel_crtc(crtc)->config.pipe_src_w; |
1205 | pixel_size = crtc->fb->bits_per_pixel / 8; | 1211 | pixel_size = crtc->primary->fb->bits_per_pixel / 8; |
1206 | 1212 | ||
1207 | line_time_us = (htotal * 1000) / clock; | 1213 | line_time_us = max(htotal * 1000 / clock, 1); |
1208 | line_count = (latency_ns / line_time_us + 1000) / 1000; | 1214 | line_count = (latency_ns / line_time_us + 1000) / 1000; |
1209 | line_size = hdisplay * pixel_size; | 1215 | line_size = hdisplay * pixel_size; |
1210 | 1216 | ||
@@ -1216,7 +1222,7 @@ static bool g4x_compute_srwm(struct drm_device *dev, | |||
1216 | *display_wm = entries + display->guard_size; | 1222 | *display_wm = entries + display->guard_size; |
1217 | 1223 | ||
1218 | /* calculate the self-refresh watermark for display cursor */ | 1224 | /* calculate the self-refresh watermark for display cursor */ |
1219 | entries = line_count * pixel_size * 64; | 1225 | entries = line_count * pixel_size * to_intel_crtc(crtc)->cursor_width; |
1220 | entries = DIV_ROUND_UP(entries, cursor->cacheline_size); | 1226 | entries = DIV_ROUND_UP(entries, cursor->cacheline_size); |
1221 | *cursor_wm = entries + cursor->guard_size; | 1227 | *cursor_wm = entries + cursor->guard_size; |
1222 | 1228 | ||
@@ -1241,7 +1247,7 @@ static bool vlv_compute_drain_latency(struct drm_device *dev, | |||
1241 | return false; | 1247 | return false; |
1242 | 1248 | ||
1243 | clock = to_intel_crtc(crtc)->config.adjusted_mode.crtc_clock; | 1249 | clock = to_intel_crtc(crtc)->config.adjusted_mode.crtc_clock; |
1244 | pixel_size = crtc->fb->bits_per_pixel / 8; /* BPP */ | 1250 | pixel_size = crtc->primary->fb->bits_per_pixel / 8; /* BPP */ |
1245 | 1251 | ||
1246 | entries = (clock / 1000) * pixel_size; | 1252 | entries = (clock / 1000) * pixel_size; |
1247 | *plane_prec_mult = (entries > 256) ? | 1253 | *plane_prec_mult = (entries > 256) ? |
@@ -1433,11 +1439,11 @@ static void i965_update_wm(struct drm_crtc *unused_crtc) | |||
1433 | int clock = adjusted_mode->crtc_clock; | 1439 | int clock = adjusted_mode->crtc_clock; |
1434 | int htotal = adjusted_mode->crtc_htotal; | 1440 | int htotal = adjusted_mode->crtc_htotal; |
1435 | int hdisplay = to_intel_crtc(crtc)->config.pipe_src_w; | 1441 | int hdisplay = to_intel_crtc(crtc)->config.pipe_src_w; |
1436 | int pixel_size = crtc->fb->bits_per_pixel / 8; | 1442 | int pixel_size = crtc->primary->fb->bits_per_pixel / 8; |
1437 | unsigned long line_time_us; | 1443 | unsigned long line_time_us; |
1438 | int entries; | 1444 | int entries; |
1439 | 1445 | ||
1440 | line_time_us = ((htotal * 1000) / clock); | 1446 | line_time_us = max(htotal * 1000 / clock, 1); |
1441 | 1447 | ||
1442 | /* Use ns/us then divide to preserve precision */ | 1448 | /* Use ns/us then divide to preserve precision */ |
1443 | entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * | 1449 | entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * |
@@ -1451,7 +1457,7 @@ static void i965_update_wm(struct drm_crtc *unused_crtc) | |||
1451 | entries, srwm); | 1457 | entries, srwm); |
1452 | 1458 | ||
1453 | entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * | 1459 | entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * |
1454 | pixel_size * 64; | 1460 | pixel_size * to_intel_crtc(crtc)->cursor_width; |
1455 | entries = DIV_ROUND_UP(entries, | 1461 | entries = DIV_ROUND_UP(entries, |
1456 | i965_cursor_wm_info.cacheline_size); | 1462 | i965_cursor_wm_info.cacheline_size); |
1457 | cursor_sr = i965_cursor_wm_info.fifo_size - | 1463 | cursor_sr = i965_cursor_wm_info.fifo_size - |
@@ -1506,7 +1512,7 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc) | |||
1506 | crtc = intel_get_crtc_for_plane(dev, 0); | 1512 | crtc = intel_get_crtc_for_plane(dev, 0); |
1507 | if (intel_crtc_active(crtc)) { | 1513 | if (intel_crtc_active(crtc)) { |
1508 | const struct drm_display_mode *adjusted_mode; | 1514 | const struct drm_display_mode *adjusted_mode; |
1509 | int cpp = crtc->fb->bits_per_pixel / 8; | 1515 | int cpp = crtc->primary->fb->bits_per_pixel / 8; |
1510 | if (IS_GEN2(dev)) | 1516 | if (IS_GEN2(dev)) |
1511 | cpp = 4; | 1517 | cpp = 4; |
1512 | 1518 | ||
@@ -1522,7 +1528,7 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc) | |||
1522 | crtc = intel_get_crtc_for_plane(dev, 1); | 1528 | crtc = intel_get_crtc_for_plane(dev, 1); |
1523 | if (intel_crtc_active(crtc)) { | 1529 | if (intel_crtc_active(crtc)) { |
1524 | const struct drm_display_mode *adjusted_mode; | 1530 | const struct drm_display_mode *adjusted_mode; |
1525 | int cpp = crtc->fb->bits_per_pixel / 8; | 1531 | int cpp = crtc->primary->fb->bits_per_pixel / 8; |
1526 | if (IS_GEN2(dev)) | 1532 | if (IS_GEN2(dev)) |
1527 | cpp = 4; | 1533 | cpp = 4; |
1528 | 1534 | ||
@@ -1559,11 +1565,11 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc) | |||
1559 | int clock = adjusted_mode->crtc_clock; | 1565 | int clock = adjusted_mode->crtc_clock; |
1560 | int htotal = adjusted_mode->crtc_htotal; | 1566 | int htotal = adjusted_mode->crtc_htotal; |
1561 | int hdisplay = to_intel_crtc(enabled)->config.pipe_src_w; | 1567 | int hdisplay = to_intel_crtc(enabled)->config.pipe_src_w; |
1562 | int pixel_size = enabled->fb->bits_per_pixel / 8; | 1568 | int pixel_size = enabled->primary->fb->bits_per_pixel / 8; |
1563 | unsigned long line_time_us; | 1569 | unsigned long line_time_us; |
1564 | int entries; | 1570 | int entries; |
1565 | 1571 | ||
1566 | line_time_us = (htotal * 1000) / clock; | 1572 | line_time_us = max(htotal * 1000 / clock, 1); |
1567 | 1573 | ||
1568 | /* Use ns/us then divide to preserve precision */ | 1574 | /* Use ns/us then divide to preserve precision */ |
1569 | entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * | 1575 | entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * |
@@ -1886,7 +1892,7 @@ static unsigned int ilk_cursor_wm_max(const struct drm_device *dev, | |||
1886 | } | 1892 | } |
1887 | 1893 | ||
1888 | /* Calculate the maximum FBC watermark */ | 1894 | /* Calculate the maximum FBC watermark */ |
1889 | static unsigned int ilk_fbc_wm_max(struct drm_device *dev) | 1895 | static unsigned int ilk_fbc_wm_max(const struct drm_device *dev) |
1890 | { | 1896 | { |
1891 | /* max that registers can hold */ | 1897 | /* max that registers can hold */ |
1892 | if (INTEL_INFO(dev)->gen >= 8) | 1898 | if (INTEL_INFO(dev)->gen >= 8) |
@@ -1895,7 +1901,7 @@ static unsigned int ilk_fbc_wm_max(struct drm_device *dev) | |||
1895 | return 15; | 1901 | return 15; |
1896 | } | 1902 | } |
1897 | 1903 | ||
1898 | static void ilk_compute_wm_maximums(struct drm_device *dev, | 1904 | static void ilk_compute_wm_maximums(const struct drm_device *dev, |
1899 | int level, | 1905 | int level, |
1900 | const struct intel_wm_config *config, | 1906 | const struct intel_wm_config *config, |
1901 | enum intel_ddb_partitioning ddb_partitioning, | 1907 | enum intel_ddb_partitioning ddb_partitioning, |
@@ -1948,7 +1954,7 @@ static bool ilk_validate_wm_level(int level, | |||
1948 | return ret; | 1954 | return ret; |
1949 | } | 1955 | } |
1950 | 1956 | ||
1951 | static void ilk_compute_wm_level(struct drm_i915_private *dev_priv, | 1957 | static void ilk_compute_wm_level(const struct drm_i915_private *dev_priv, |
1952 | int level, | 1958 | int level, |
1953 | const struct ilk_pipe_wm_parameters *p, | 1959 | const struct ilk_pipe_wm_parameters *p, |
1954 | struct intel_wm_level *result) | 1960 | struct intel_wm_level *result) |
@@ -2079,7 +2085,7 @@ static void intel_print_wm_latency(struct drm_device *dev, | |||
2079 | } | 2085 | } |
2080 | } | 2086 | } |
2081 | 2087 | ||
2082 | static void intel_setup_wm_latency(struct drm_device *dev) | 2088 | static void ilk_setup_wm_latency(struct drm_device *dev) |
2083 | { | 2089 | { |
2084 | struct drm_i915_private *dev_priv = dev->dev_private; | 2090 | struct drm_i915_private *dev_priv = dev->dev_private; |
2085 | 2091 | ||
@@ -2111,10 +2117,10 @@ static void ilk_compute_wm_parameters(struct drm_crtc *crtc, | |||
2111 | if (p->active) { | 2117 | if (p->active) { |
2112 | p->pipe_htotal = intel_crtc->config.adjusted_mode.crtc_htotal; | 2118 | p->pipe_htotal = intel_crtc->config.adjusted_mode.crtc_htotal; |
2113 | p->pixel_rate = ilk_pipe_pixel_rate(dev, crtc); | 2119 | p->pixel_rate = ilk_pipe_pixel_rate(dev, crtc); |
2114 | p->pri.bytes_per_pixel = crtc->fb->bits_per_pixel / 8; | 2120 | p->pri.bytes_per_pixel = crtc->primary->fb->bits_per_pixel / 8; |
2115 | p->cur.bytes_per_pixel = 4; | 2121 | p->cur.bytes_per_pixel = 4; |
2116 | p->pri.horiz_pixels = intel_crtc->config.pipe_src_w; | 2122 | p->pri.horiz_pixels = intel_crtc->config.pipe_src_w; |
2117 | p->cur.horiz_pixels = 64; | 2123 | p->cur.horiz_pixels = intel_crtc->cursor_width; |
2118 | /* TODO: for now, assume primary and cursor planes are always enabled. */ | 2124 | /* TODO: for now, assume primary and cursor planes are always enabled. */ |
2119 | p->pri.enabled = true; | 2125 | p->pri.enabled = true; |
2120 | p->cur.enabled = true; | 2126 | p->cur.enabled = true; |
@@ -2123,7 +2129,7 @@ static void ilk_compute_wm_parameters(struct drm_crtc *crtc, | |||
2123 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) | 2129 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) |
2124 | config->num_pipes_active += intel_crtc_active(crtc); | 2130 | config->num_pipes_active += intel_crtc_active(crtc); |
2125 | 2131 | ||
2126 | list_for_each_entry(plane, &dev->mode_config.plane_list, head) { | 2132 | drm_for_each_legacy_plane(plane, &dev->mode_config.plane_list) { |
2127 | struct intel_plane *intel_plane = to_intel_plane(plane); | 2133 | struct intel_plane *intel_plane = to_intel_plane(plane); |
2128 | 2134 | ||
2129 | if (intel_plane->pipe == pipe) | 2135 | if (intel_plane->pipe == pipe) |
@@ -2140,7 +2146,7 @@ static bool intel_compute_pipe_wm(struct drm_crtc *crtc, | |||
2140 | struct intel_pipe_wm *pipe_wm) | 2146 | struct intel_pipe_wm *pipe_wm) |
2141 | { | 2147 | { |
2142 | struct drm_device *dev = crtc->dev; | 2148 | struct drm_device *dev = crtc->dev; |
2143 | struct drm_i915_private *dev_priv = dev->dev_private; | 2149 | const struct drm_i915_private *dev_priv = dev->dev_private; |
2144 | int level, max_level = ilk_wm_max_level(dev); | 2150 | int level, max_level = ilk_wm_max_level(dev); |
2145 | /* LP0 watermark maximums depend on this pipe alone */ | 2151 | /* LP0 watermark maximums depend on this pipe alone */ |
2146 | struct intel_wm_config config = { | 2152 | struct intel_wm_config config = { |
@@ -2738,7 +2744,7 @@ intel_alloc_context_page(struct drm_device *dev) | |||
2738 | return NULL; | 2744 | return NULL; |
2739 | } | 2745 | } |
2740 | 2746 | ||
2741 | ret = i915_gem_obj_ggtt_pin(ctx, 4096, true, false); | 2747 | ret = i915_gem_obj_ggtt_pin(ctx, 4096, 0); |
2742 | if (ret) { | 2748 | if (ret) { |
2743 | DRM_ERROR("failed to pin power context: %d\n", ret); | 2749 | DRM_ERROR("failed to pin power context: %d\n", ret); |
2744 | goto err_unref; | 2750 | goto err_unref; |
@@ -2753,7 +2759,7 @@ intel_alloc_context_page(struct drm_device *dev) | |||
2753 | return ctx; | 2759 | return ctx; |
2754 | 2760 | ||
2755 | err_unpin: | 2761 | err_unpin: |
2756 | i915_gem_object_unpin(ctx); | 2762 | i915_gem_object_ggtt_unpin(ctx); |
2757 | err_unref: | 2763 | err_unref: |
2758 | drm_gem_object_unreference(&ctx->base); | 2764 | drm_gem_object_unreference(&ctx->base); |
2759 | return NULL; | 2765 | return NULL; |
@@ -2901,9 +2907,9 @@ static u32 gen6_rps_limits(struct drm_i915_private *dev_priv, u8 val) | |||
2901 | * the hw runs at the minimal clock before selecting the desired | 2907 | * the hw runs at the minimal clock before selecting the desired |
2902 | * frequency, if the down threshold expires in that window we will not | 2908 | * frequency, if the down threshold expires in that window we will not |
2903 | * receive a down interrupt. */ | 2909 | * receive a down interrupt. */ |
2904 | limits = dev_priv->rps.max_delay << 24; | 2910 | limits = dev_priv->rps.max_freq_softlimit << 24; |
2905 | if (val <= dev_priv->rps.min_delay) | 2911 | if (val <= dev_priv->rps.min_freq_softlimit) |
2906 | limits |= dev_priv->rps.min_delay << 16; | 2912 | limits |= dev_priv->rps.min_freq_softlimit << 16; |
2907 | 2913 | ||
2908 | return limits; | 2914 | return limits; |
2909 | } | 2915 | } |
@@ -2915,26 +2921,26 @@ static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) | |||
2915 | new_power = dev_priv->rps.power; | 2921 | new_power = dev_priv->rps.power; |
2916 | switch (dev_priv->rps.power) { | 2922 | switch (dev_priv->rps.power) { |
2917 | case LOW_POWER: | 2923 | case LOW_POWER: |
2918 | if (val > dev_priv->rps.rpe_delay + 1 && val > dev_priv->rps.cur_delay) | 2924 | if (val > dev_priv->rps.efficient_freq + 1 && val > dev_priv->rps.cur_freq) |
2919 | new_power = BETWEEN; | 2925 | new_power = BETWEEN; |
2920 | break; | 2926 | break; |
2921 | 2927 | ||
2922 | case BETWEEN: | 2928 | case BETWEEN: |
2923 | if (val <= dev_priv->rps.rpe_delay && val < dev_priv->rps.cur_delay) | 2929 | if (val <= dev_priv->rps.efficient_freq && val < dev_priv->rps.cur_freq) |
2924 | new_power = LOW_POWER; | 2930 | new_power = LOW_POWER; |
2925 | else if (val >= dev_priv->rps.rp0_delay && val > dev_priv->rps.cur_delay) | 2931 | else if (val >= dev_priv->rps.rp0_freq && val > dev_priv->rps.cur_freq) |
2926 | new_power = HIGH_POWER; | 2932 | new_power = HIGH_POWER; |
2927 | break; | 2933 | break; |
2928 | 2934 | ||
2929 | case HIGH_POWER: | 2935 | case HIGH_POWER: |
2930 | if (val < (dev_priv->rps.rp1_delay + dev_priv->rps.rp0_delay) >> 1 && val < dev_priv->rps.cur_delay) | 2936 | if (val < (dev_priv->rps.rp1_freq + dev_priv->rps.rp0_freq) >> 1 && val < dev_priv->rps.cur_freq) |
2931 | new_power = BETWEEN; | 2937 | new_power = BETWEEN; |
2932 | break; | 2938 | break; |
2933 | } | 2939 | } |
2934 | /* Max/min bins are special */ | 2940 | /* Max/min bins are special */ |
2935 | if (val == dev_priv->rps.min_delay) | 2941 | if (val == dev_priv->rps.min_freq_softlimit) |
2936 | new_power = LOW_POWER; | 2942 | new_power = LOW_POWER; |
2937 | if (val == dev_priv->rps.max_delay) | 2943 | if (val == dev_priv->rps.max_freq_softlimit) |
2938 | new_power = HIGH_POWER; | 2944 | new_power = HIGH_POWER; |
2939 | if (new_power == dev_priv->rps.power) | 2945 | if (new_power == dev_priv->rps.power) |
2940 | return; | 2946 | return; |
@@ -3000,41 +3006,113 @@ static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) | |||
3000 | dev_priv->rps.last_adj = 0; | 3006 | dev_priv->rps.last_adj = 0; |
3001 | } | 3007 | } |
3002 | 3008 | ||
3009 | static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val) | ||
3010 | { | ||
3011 | u32 mask = 0; | ||
3012 | |||
3013 | if (val > dev_priv->rps.min_freq_softlimit) | ||
3014 | mask |= GEN6_PM_RP_DOWN_THRESHOLD | GEN6_PM_RP_DOWN_TIMEOUT; | ||
3015 | if (val < dev_priv->rps.max_freq_softlimit) | ||
3016 | mask |= GEN6_PM_RP_UP_THRESHOLD; | ||
3017 | |||
3018 | /* IVB and SNB hard hangs on looping batchbuffer | ||
3019 | * if GEN6_PM_UP_EI_EXPIRED is masked. | ||
3020 | */ | ||
3021 | if (INTEL_INFO(dev_priv->dev)->gen <= 7 && !IS_HASWELL(dev_priv->dev)) | ||
3022 | mask |= GEN6_PM_RP_UP_EI_EXPIRED; | ||
3023 | |||
3024 | return ~mask; | ||
3025 | } | ||
3026 | |||
3027 | /* gen6_set_rps is called to update the frequency request, but should also be | ||
3028 | * called when the range (min_delay and max_delay) is modified so that we can | ||
3029 | * update the GEN6_RP_INTERRUPT_LIMITS register accordingly. */ | ||
3003 | void gen6_set_rps(struct drm_device *dev, u8 val) | 3030 | void gen6_set_rps(struct drm_device *dev, u8 val) |
3004 | { | 3031 | { |
3005 | struct drm_i915_private *dev_priv = dev->dev_private; | 3032 | struct drm_i915_private *dev_priv = dev->dev_private; |
3006 | 3033 | ||
3007 | WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); | 3034 | WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); |
3008 | WARN_ON(val > dev_priv->rps.max_delay); | 3035 | WARN_ON(val > dev_priv->rps.max_freq_softlimit); |
3009 | WARN_ON(val < dev_priv->rps.min_delay); | 3036 | WARN_ON(val < dev_priv->rps.min_freq_softlimit); |
3010 | |||
3011 | if (val == dev_priv->rps.cur_delay) | ||
3012 | return; | ||
3013 | 3037 | ||
3014 | gen6_set_rps_thresholds(dev_priv, val); | 3038 | /* min/max delay may still have been modified so be sure to |
3039 | * write the limits value. | ||
3040 | */ | ||
3041 | if (val != dev_priv->rps.cur_freq) { | ||
3042 | gen6_set_rps_thresholds(dev_priv, val); | ||
3015 | 3043 | ||
3016 | if (IS_HASWELL(dev)) | 3044 | if (IS_HASWELL(dev)) |
3017 | I915_WRITE(GEN6_RPNSWREQ, | 3045 | I915_WRITE(GEN6_RPNSWREQ, |
3018 | HSW_FREQUENCY(val)); | 3046 | HSW_FREQUENCY(val)); |
3019 | else | 3047 | else |
3020 | I915_WRITE(GEN6_RPNSWREQ, | 3048 | I915_WRITE(GEN6_RPNSWREQ, |
3021 | GEN6_FREQUENCY(val) | | 3049 | GEN6_FREQUENCY(val) | |
3022 | GEN6_OFFSET(0) | | 3050 | GEN6_OFFSET(0) | |
3023 | GEN6_AGGRESSIVE_TURBO); | 3051 | GEN6_AGGRESSIVE_TURBO); |
3052 | } | ||
3024 | 3053 | ||
3025 | /* Make sure we continue to get interrupts | 3054 | /* Make sure we continue to get interrupts |
3026 | * until we hit the minimum or maximum frequencies. | 3055 | * until we hit the minimum or maximum frequencies. |
3027 | */ | 3056 | */ |
3028 | I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, | 3057 | I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, gen6_rps_limits(dev_priv, val)); |
3029 | gen6_rps_limits(dev_priv, val)); | 3058 | I915_WRITE(GEN6_PMINTRMSK, gen6_rps_pm_mask(dev_priv, val)); |
3030 | 3059 | ||
3031 | POSTING_READ(GEN6_RPNSWREQ); | 3060 | POSTING_READ(GEN6_RPNSWREQ); |
3032 | 3061 | ||
3033 | dev_priv->rps.cur_delay = val; | 3062 | dev_priv->rps.cur_freq = val; |
3034 | |||
3035 | trace_intel_gpu_freq_change(val * 50); | 3063 | trace_intel_gpu_freq_change(val * 50); |
3036 | } | 3064 | } |
3037 | 3065 | ||
3066 | /* vlv_set_rps_idle: Set the frequency to Rpn if Gfx clocks are down | ||
3067 | * | ||
3068 | * * If Gfx is Idle, then | ||
3069 | * 1. Mask Turbo interrupts | ||
3070 | * 2. Bring up Gfx clock | ||
3071 | * 3. Change the freq to Rpn and wait till P-Unit updates freq | ||
3072 | * 4. Clear the Force GFX CLK ON bit so that Gfx can down | ||
3073 | * 5. Unmask Turbo interrupts | ||
3074 | */ | ||
3075 | static void vlv_set_rps_idle(struct drm_i915_private *dev_priv) | ||
3076 | { | ||
3077 | /* | ||
3078 | * When we are idle. Drop to min voltage state. | ||
3079 | */ | ||
3080 | |||
3081 | if (dev_priv->rps.cur_freq <= dev_priv->rps.min_freq_softlimit) | ||
3082 | return; | ||
3083 | |||
3084 | /* Mask turbo interrupt so that they will not come in between */ | ||
3085 | I915_WRITE(GEN6_PMINTRMSK, 0xffffffff); | ||
3086 | |||
3087 | /* Bring up the Gfx clock */ | ||
3088 | I915_WRITE(VLV_GTLC_SURVIVABILITY_REG, | ||
3089 | I915_READ(VLV_GTLC_SURVIVABILITY_REG) | | ||
3090 | VLV_GFX_CLK_FORCE_ON_BIT); | ||
3091 | |||
3092 | if (wait_for(((VLV_GFX_CLK_STATUS_BIT & | ||
3093 | I915_READ(VLV_GTLC_SURVIVABILITY_REG)) != 0), 5)) { | ||
3094 | DRM_ERROR("GFX_CLK_ON request timed out\n"); | ||
3095 | return; | ||
3096 | } | ||
3097 | |||
3098 | dev_priv->rps.cur_freq = dev_priv->rps.min_freq_softlimit; | ||
3099 | |||
3100 | vlv_punit_write(dev_priv, PUNIT_REG_GPU_FREQ_REQ, | ||
3101 | dev_priv->rps.min_freq_softlimit); | ||
3102 | |||
3103 | if (wait_for(((vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS)) | ||
3104 | & GENFREQSTATUS) == 0, 5)) | ||
3105 | DRM_ERROR("timed out waiting for Punit\n"); | ||
3106 | |||
3107 | /* Release the Gfx clock */ | ||
3108 | I915_WRITE(VLV_GTLC_SURVIVABILITY_REG, | ||
3109 | I915_READ(VLV_GTLC_SURVIVABILITY_REG) & | ||
3110 | ~VLV_GFX_CLK_FORCE_ON_BIT); | ||
3111 | |||
3112 | I915_WRITE(GEN6_PMINTRMSK, | ||
3113 | gen6_rps_pm_mask(dev_priv, dev_priv->rps.cur_freq)); | ||
3114 | } | ||
3115 | |||
3038 | void gen6_rps_idle(struct drm_i915_private *dev_priv) | 3116 | void gen6_rps_idle(struct drm_i915_private *dev_priv) |
3039 | { | 3117 | { |
3040 | struct drm_device *dev = dev_priv->dev; | 3118 | struct drm_device *dev = dev_priv->dev; |
@@ -3042,9 +3120,9 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv) | |||
3042 | mutex_lock(&dev_priv->rps.hw_lock); | 3120 | mutex_lock(&dev_priv->rps.hw_lock); |
3043 | if (dev_priv->rps.enabled) { | 3121 | if (dev_priv->rps.enabled) { |
3044 | if (IS_VALLEYVIEW(dev)) | 3122 | if (IS_VALLEYVIEW(dev)) |
3045 | valleyview_set_rps(dev_priv->dev, dev_priv->rps.min_delay); | 3123 | vlv_set_rps_idle(dev_priv); |
3046 | else | 3124 | else |
3047 | gen6_set_rps(dev_priv->dev, dev_priv->rps.min_delay); | 3125 | gen6_set_rps(dev_priv->dev, dev_priv->rps.min_freq_softlimit); |
3048 | dev_priv->rps.last_adj = 0; | 3126 | dev_priv->rps.last_adj = 0; |
3049 | } | 3127 | } |
3050 | mutex_unlock(&dev_priv->rps.hw_lock); | 3128 | mutex_unlock(&dev_priv->rps.hw_lock); |
@@ -3057,9 +3135,9 @@ void gen6_rps_boost(struct drm_i915_private *dev_priv) | |||
3057 | mutex_lock(&dev_priv->rps.hw_lock); | 3135 | mutex_lock(&dev_priv->rps.hw_lock); |
3058 | if (dev_priv->rps.enabled) { | 3136 | if (dev_priv->rps.enabled) { |
3059 | if (IS_VALLEYVIEW(dev)) | 3137 | if (IS_VALLEYVIEW(dev)) |
3060 | valleyview_set_rps(dev_priv->dev, dev_priv->rps.max_delay); | 3138 | valleyview_set_rps(dev_priv->dev, dev_priv->rps.max_freq_softlimit); |
3061 | else | 3139 | else |
3062 | gen6_set_rps(dev_priv->dev, dev_priv->rps.max_delay); | 3140 | gen6_set_rps(dev_priv->dev, dev_priv->rps.max_freq_softlimit); |
3063 | dev_priv->rps.last_adj = 0; | 3141 | dev_priv->rps.last_adj = 0; |
3064 | } | 3142 | } |
3065 | mutex_unlock(&dev_priv->rps.hw_lock); | 3143 | mutex_unlock(&dev_priv->rps.hw_lock); |
@@ -3070,21 +3148,20 @@ void valleyview_set_rps(struct drm_device *dev, u8 val) | |||
3070 | struct drm_i915_private *dev_priv = dev->dev_private; | 3148 | struct drm_i915_private *dev_priv = dev->dev_private; |
3071 | 3149 | ||
3072 | WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); | 3150 | WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); |
3073 | WARN_ON(val > dev_priv->rps.max_delay); | 3151 | WARN_ON(val > dev_priv->rps.max_freq_softlimit); |
3074 | WARN_ON(val < dev_priv->rps.min_delay); | 3152 | WARN_ON(val < dev_priv->rps.min_freq_softlimit); |
3075 | 3153 | ||
3076 | DRM_DEBUG_DRIVER("GPU freq request from %d MHz (%u) to %d MHz (%u)\n", | 3154 | DRM_DEBUG_DRIVER("GPU freq request from %d MHz (%u) to %d MHz (%u)\n", |
3077 | vlv_gpu_freq(dev_priv, dev_priv->rps.cur_delay), | 3155 | vlv_gpu_freq(dev_priv, dev_priv->rps.cur_freq), |
3078 | dev_priv->rps.cur_delay, | 3156 | dev_priv->rps.cur_freq, |
3079 | vlv_gpu_freq(dev_priv, val), val); | 3157 | vlv_gpu_freq(dev_priv, val), val); |
3080 | 3158 | ||
3081 | if (val == dev_priv->rps.cur_delay) | 3159 | if (val != dev_priv->rps.cur_freq) |
3082 | return; | 3160 | vlv_punit_write(dev_priv, PUNIT_REG_GPU_FREQ_REQ, val); |
3083 | |||
3084 | vlv_punit_write(dev_priv, PUNIT_REG_GPU_FREQ_REQ, val); | ||
3085 | 3161 | ||
3086 | dev_priv->rps.cur_delay = val; | 3162 | I915_WRITE(GEN6_PMINTRMSK, gen6_rps_pm_mask(dev_priv, val)); |
3087 | 3163 | ||
3164 | dev_priv->rps.cur_freq = val; | ||
3088 | trace_intel_gpu_freq_change(vlv_gpu_freq(dev_priv, val)); | 3165 | trace_intel_gpu_freq_change(vlv_gpu_freq(dev_priv, val)); |
3089 | } | 3166 | } |
3090 | 3167 | ||
@@ -3093,7 +3170,8 @@ static void gen6_disable_rps_interrupts(struct drm_device *dev) | |||
3093 | struct drm_i915_private *dev_priv = dev->dev_private; | 3170 | struct drm_i915_private *dev_priv = dev->dev_private; |
3094 | 3171 | ||
3095 | I915_WRITE(GEN6_PMINTRMSK, 0xffffffff); | 3172 | I915_WRITE(GEN6_PMINTRMSK, 0xffffffff); |
3096 | I915_WRITE(GEN6_PMIER, I915_READ(GEN6_PMIER) & ~GEN6_PM_RPS_EVENTS); | 3173 | I915_WRITE(GEN6_PMIER, I915_READ(GEN6_PMIER) & |
3174 | ~dev_priv->pm_rps_events); | ||
3097 | /* Complete PM interrupt masking here doesn't race with the rps work | 3175 | /* Complete PM interrupt masking here doesn't race with the rps work |
3098 | * item again unmasking PM interrupts because that is using a different | 3176 | * item again unmasking PM interrupts because that is using a different |
3099 | * register (PMIMR) to mask PM interrupts. The only risk is in leaving | 3177 | * register (PMIMR) to mask PM interrupts. The only risk is in leaving |
@@ -3103,7 +3181,7 @@ static void gen6_disable_rps_interrupts(struct drm_device *dev) | |||
3103 | dev_priv->rps.pm_iir = 0; | 3181 | dev_priv->rps.pm_iir = 0; |
3104 | spin_unlock_irq(&dev_priv->irq_lock); | 3182 | spin_unlock_irq(&dev_priv->irq_lock); |
3105 | 3183 | ||
3106 | I915_WRITE(GEN6_PMIIR, GEN6_PM_RPS_EVENTS); | 3184 | I915_WRITE(GEN6_PMIIR, dev_priv->pm_rps_events); |
3107 | } | 3185 | } |
3108 | 3186 | ||
3109 | static void gen6_disable_rps(struct drm_device *dev) | 3187 | static void gen6_disable_rps(struct drm_device *dev) |
@@ -3123,25 +3201,14 @@ static void valleyview_disable_rps(struct drm_device *dev) | |||
3123 | I915_WRITE(GEN6_RC_CONTROL, 0); | 3201 | I915_WRITE(GEN6_RC_CONTROL, 0); |
3124 | 3202 | ||
3125 | gen6_disable_rps_interrupts(dev); | 3203 | gen6_disable_rps_interrupts(dev); |
3126 | |||
3127 | if (dev_priv->vlv_pctx) { | ||
3128 | drm_gem_object_unreference(&dev_priv->vlv_pctx->base); | ||
3129 | dev_priv->vlv_pctx = NULL; | ||
3130 | } | ||
3131 | } | 3204 | } |
3132 | 3205 | ||
3133 | static void intel_print_rc6_info(struct drm_device *dev, u32 mode) | 3206 | static void intel_print_rc6_info(struct drm_device *dev, u32 mode) |
3134 | { | 3207 | { |
3135 | if (IS_GEN6(dev)) | ||
3136 | DRM_DEBUG_DRIVER("Sandybridge: deep RC6 disabled\n"); | ||
3137 | |||
3138 | if (IS_HASWELL(dev)) | ||
3139 | DRM_DEBUG_DRIVER("Haswell: only RC6 available\n"); | ||
3140 | |||
3141 | DRM_INFO("Enabling RC6 states: RC6 %s, RC6p %s, RC6pp %s\n", | 3208 | DRM_INFO("Enabling RC6 states: RC6 %s, RC6p %s, RC6pp %s\n", |
3142 | (mode & GEN6_RC_CTL_RC6_ENABLE) ? "on" : "off", | 3209 | (mode & GEN6_RC_CTL_RC6_ENABLE) ? "on" : "off", |
3143 | (mode & GEN6_RC_CTL_RC6p_ENABLE) ? "on" : "off", | 3210 | (mode & GEN6_RC_CTL_RC6p_ENABLE) ? "on" : "off", |
3144 | (mode & GEN6_RC_CTL_RC6pp_ENABLE) ? "on" : "off"); | 3211 | (mode & GEN6_RC_CTL_RC6pp_ENABLE) ? "on" : "off"); |
3145 | } | 3212 | } |
3146 | 3213 | ||
3147 | int intel_enable_rc6(const struct drm_device *dev) | 3214 | int intel_enable_rc6(const struct drm_device *dev) |
@@ -3151,44 +3218,28 @@ int intel_enable_rc6(const struct drm_device *dev) | |||
3151 | return 0; | 3218 | return 0; |
3152 | 3219 | ||
3153 | /* Respect the kernel parameter if it is set */ | 3220 | /* Respect the kernel parameter if it is set */ |
3154 | if (i915_enable_rc6 >= 0) | 3221 | if (i915.enable_rc6 >= 0) |
3155 | return i915_enable_rc6; | 3222 | return i915.enable_rc6; |
3156 | 3223 | ||
3157 | /* Disable RC6 on Ironlake */ | 3224 | /* Disable RC6 on Ironlake */ |
3158 | if (INTEL_INFO(dev)->gen == 5) | 3225 | if (INTEL_INFO(dev)->gen == 5) |
3159 | return 0; | 3226 | return 0; |
3160 | 3227 | ||
3161 | if (IS_HASWELL(dev)) | 3228 | if (IS_IVYBRIDGE(dev)) |
3162 | return INTEL_RC6_ENABLE; | 3229 | return (INTEL_RC6_ENABLE | INTEL_RC6p_ENABLE); |
3163 | |||
3164 | /* snb/ivb have more than one rc6 state. */ | ||
3165 | if (INTEL_INFO(dev)->gen == 6) | ||
3166 | return INTEL_RC6_ENABLE; | ||
3167 | 3230 | ||
3168 | return (INTEL_RC6_ENABLE | INTEL_RC6p_ENABLE); | 3231 | return INTEL_RC6_ENABLE; |
3169 | } | 3232 | } |
3170 | 3233 | ||
3171 | static void gen6_enable_rps_interrupts(struct drm_device *dev) | 3234 | static void gen6_enable_rps_interrupts(struct drm_device *dev) |
3172 | { | 3235 | { |
3173 | struct drm_i915_private *dev_priv = dev->dev_private; | 3236 | struct drm_i915_private *dev_priv = dev->dev_private; |
3174 | u32 enabled_intrs; | ||
3175 | 3237 | ||
3176 | spin_lock_irq(&dev_priv->irq_lock); | 3238 | spin_lock_irq(&dev_priv->irq_lock); |
3177 | WARN_ON(dev_priv->rps.pm_iir); | 3239 | WARN_ON(dev_priv->rps.pm_iir); |
3178 | snb_enable_pm_irq(dev_priv, GEN6_PM_RPS_EVENTS); | 3240 | snb_enable_pm_irq(dev_priv, dev_priv->pm_rps_events); |
3179 | I915_WRITE(GEN6_PMIIR, GEN6_PM_RPS_EVENTS); | 3241 | I915_WRITE(GEN6_PMIIR, dev_priv->pm_rps_events); |
3180 | spin_unlock_irq(&dev_priv->irq_lock); | 3242 | spin_unlock_irq(&dev_priv->irq_lock); |
3181 | |||
3182 | /* only unmask PM interrupts we need. Mask all others. */ | ||
3183 | enabled_intrs = GEN6_PM_RPS_EVENTS; | ||
3184 | |||
3185 | /* IVB and SNB hard hangs on looping batchbuffer | ||
3186 | * if GEN6_PM_UP_EI_EXPIRED is masked. | ||
3187 | */ | ||
3188 | if (INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev)) | ||
3189 | enabled_intrs |= GEN6_PM_RP_UP_EI_EXPIRED; | ||
3190 | |||
3191 | I915_WRITE(GEN6_PMINTRMSK, ~enabled_intrs); | ||
3192 | } | 3243 | } |
3193 | 3244 | ||
3194 | static void gen8_enable_rps(struct drm_device *dev) | 3245 | static void gen8_enable_rps(struct drm_device *dev) |
@@ -3222,10 +3273,10 @@ static void gen8_enable_rps(struct drm_device *dev) | |||
3222 | /* 3: Enable RC6 */ | 3273 | /* 3: Enable RC6 */ |
3223 | if (intel_enable_rc6(dev) & INTEL_RC6_ENABLE) | 3274 | if (intel_enable_rc6(dev) & INTEL_RC6_ENABLE) |
3224 | rc6_mask = GEN6_RC_CTL_RC6_ENABLE; | 3275 | rc6_mask = GEN6_RC_CTL_RC6_ENABLE; |
3225 | DRM_INFO("RC6 %s\n", (rc6_mask & GEN6_RC_CTL_RC6_ENABLE) ? "on" : "off"); | 3276 | intel_print_rc6_info(dev, rc6_mask); |
3226 | I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE | | 3277 | I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE | |
3227 | GEN6_RC_CTL_EI_MODE(1) | | 3278 | GEN6_RC_CTL_EI_MODE(1) | |
3228 | rc6_mask); | 3279 | rc6_mask); |
3229 | 3280 | ||
3230 | /* 4 Program defaults and thresholds for RPS*/ | 3281 | /* 4 Program defaults and thresholds for RPS*/ |
3231 | I915_WRITE(GEN6_RPNSWREQ, HSW_FREQUENCY(10)); /* Request 500 MHz */ | 3282 | I915_WRITE(GEN6_RPNSWREQ, HSW_FREQUENCY(10)); /* Request 500 MHz */ |
@@ -3235,8 +3286,8 @@ static void gen8_enable_rps(struct drm_device *dev) | |||
3235 | 3286 | ||
3236 | /* Docs recommend 900MHz, and 300 MHz respectively */ | 3287 | /* Docs recommend 900MHz, and 300 MHz respectively */ |
3237 | I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, | 3288 | I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, |
3238 | dev_priv->rps.max_delay << 24 | | 3289 | dev_priv->rps.max_freq_softlimit << 24 | |
3239 | dev_priv->rps.min_delay << 16); | 3290 | dev_priv->rps.min_freq_softlimit << 16); |
3240 | 3291 | ||
3241 | I915_WRITE(GEN6_RP_UP_THRESHOLD, 7600000 / 128); /* 76ms busyness per EI, 90% */ | 3292 | I915_WRITE(GEN6_RP_UP_THRESHOLD, 7600000 / 128); /* 76ms busyness per EI, 90% */ |
3242 | I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 31300000 / 128); /* 313ms busyness per EI, 70%*/ | 3293 | I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 31300000 / 128); /* 313ms busyness per EI, 70%*/ |
@@ -3269,7 +3320,7 @@ static void gen6_enable_rps(struct drm_device *dev) | |||
3269 | struct intel_ring_buffer *ring; | 3320 | struct intel_ring_buffer *ring; |
3270 | u32 rp_state_cap; | 3321 | u32 rp_state_cap; |
3271 | u32 gt_perf_status; | 3322 | u32 gt_perf_status; |
3272 | u32 rc6vids, pcu_mbox, rc6_mask = 0; | 3323 | u32 rc6vids, pcu_mbox = 0, rc6_mask = 0; |
3273 | u32 gtfifodbg; | 3324 | u32 gtfifodbg; |
3274 | int rc6_mode; | 3325 | int rc6_mode; |
3275 | int i, ret; | 3326 | int i, ret; |
@@ -3295,13 +3346,23 @@ static void gen6_enable_rps(struct drm_device *dev) | |||
3295 | rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); | 3346 | rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); |
3296 | gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS); | 3347 | gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS); |
3297 | 3348 | ||
3298 | /* In units of 50MHz */ | 3349 | /* All of these values are in units of 50MHz */ |
3299 | dev_priv->rps.hw_max = dev_priv->rps.max_delay = rp_state_cap & 0xff; | 3350 | dev_priv->rps.cur_freq = 0; |
3300 | dev_priv->rps.min_delay = (rp_state_cap >> 16) & 0xff; | 3351 | /* static values from HW: RP0 < RPe < RP1 < RPn (min_freq) */ |
3301 | dev_priv->rps.rp1_delay = (rp_state_cap >> 8) & 0xff; | 3352 | dev_priv->rps.rp1_freq = (rp_state_cap >> 8) & 0xff; |
3302 | dev_priv->rps.rp0_delay = (rp_state_cap >> 0) & 0xff; | 3353 | dev_priv->rps.rp0_freq = (rp_state_cap >> 0) & 0xff; |
3303 | dev_priv->rps.rpe_delay = dev_priv->rps.rp1_delay; | 3354 | dev_priv->rps.min_freq = (rp_state_cap >> 16) & 0xff; |
3304 | dev_priv->rps.cur_delay = 0; | 3355 | /* XXX: only BYT has a special efficient freq */ |
3356 | dev_priv->rps.efficient_freq = dev_priv->rps.rp1_freq; | ||
3357 | /* hw_max = RP0 until we check for overclocking */ | ||
3358 | dev_priv->rps.max_freq = dev_priv->rps.rp0_freq; | ||
3359 | |||
3360 | /* Preserve min/max settings in case of re-init */ | ||
3361 | if (dev_priv->rps.max_freq_softlimit == 0) | ||
3362 | dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq; | ||
3363 | |||
3364 | if (dev_priv->rps.min_freq_softlimit == 0) | ||
3365 | dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq; | ||
3305 | 3366 | ||
3306 | /* disable the counters and set deterministic thresholds */ | 3367 | /* disable the counters and set deterministic thresholds */ |
3307 | I915_WRITE(GEN6_RC_CONTROL, 0); | 3368 | I915_WRITE(GEN6_RC_CONTROL, 0); |
@@ -3350,21 +3411,19 @@ static void gen6_enable_rps(struct drm_device *dev) | |||
3350 | I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); | 3411 | I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); |
3351 | 3412 | ||
3352 | ret = sandybridge_pcode_write(dev_priv, GEN6_PCODE_WRITE_MIN_FREQ_TABLE, 0); | 3413 | ret = sandybridge_pcode_write(dev_priv, GEN6_PCODE_WRITE_MIN_FREQ_TABLE, 0); |
3353 | if (!ret) { | 3414 | if (ret) |
3354 | pcu_mbox = 0; | ||
3355 | ret = sandybridge_pcode_read(dev_priv, GEN6_READ_OC_PARAMS, &pcu_mbox); | ||
3356 | if (!ret && (pcu_mbox & (1<<31))) { /* OC supported */ | ||
3357 | DRM_DEBUG_DRIVER("Overclocking supported. Max: %dMHz, Overclock max: %dMHz\n", | ||
3358 | (dev_priv->rps.max_delay & 0xff) * 50, | ||
3359 | (pcu_mbox & 0xff) * 50); | ||
3360 | dev_priv->rps.hw_max = pcu_mbox & 0xff; | ||
3361 | } | ||
3362 | } else { | ||
3363 | DRM_DEBUG_DRIVER("Failed to set the min frequency\n"); | 3415 | DRM_DEBUG_DRIVER("Failed to set the min frequency\n"); |
3416 | |||
3417 | ret = sandybridge_pcode_read(dev_priv, GEN6_READ_OC_PARAMS, &pcu_mbox); | ||
3418 | if (!ret && (pcu_mbox & (1<<31))) { /* OC supported */ | ||
3419 | DRM_DEBUG_DRIVER("Overclocking supported. Max: %dMHz, Overclock max: %dMHz\n", | ||
3420 | (dev_priv->rps.max_freq_softlimit & 0xff) * 50, | ||
3421 | (pcu_mbox & 0xff) * 50); | ||
3422 | dev_priv->rps.max_freq = pcu_mbox & 0xff; | ||
3364 | } | 3423 | } |
3365 | 3424 | ||
3366 | dev_priv->rps.power = HIGH_POWER; /* force a reset */ | 3425 | dev_priv->rps.power = HIGH_POWER; /* force a reset */ |
3367 | gen6_set_rps(dev_priv->dev, dev_priv->rps.min_delay); | 3426 | gen6_set_rps(dev_priv->dev, dev_priv->rps.min_freq_softlimit); |
3368 | 3427 | ||
3369 | gen6_enable_rps_interrupts(dev); | 3428 | gen6_enable_rps_interrupts(dev); |
3370 | 3429 | ||
@@ -3420,9 +3479,9 @@ void gen6_update_ring_freq(struct drm_device *dev) | |||
3420 | * to use for memory access. We do this by specifying the IA frequency | 3479 | * to use for memory access. We do this by specifying the IA frequency |
3421 | * the PCU should use as a reference to determine the ring frequency. | 3480 | * the PCU should use as a reference to determine the ring frequency. |
3422 | */ | 3481 | */ |
3423 | for (gpu_freq = dev_priv->rps.max_delay; gpu_freq >= dev_priv->rps.min_delay; | 3482 | for (gpu_freq = dev_priv->rps.max_freq_softlimit; gpu_freq >= dev_priv->rps.min_freq_softlimit; |
3424 | gpu_freq--) { | 3483 | gpu_freq--) { |
3425 | int diff = dev_priv->rps.max_delay - gpu_freq; | 3484 | int diff = dev_priv->rps.max_freq_softlimit - gpu_freq; |
3426 | unsigned int ia_freq = 0, ring_freq = 0; | 3485 | unsigned int ia_freq = 0, ring_freq = 0; |
3427 | 3486 | ||
3428 | if (INTEL_INFO(dev)->gen >= 8) { | 3487 | if (INTEL_INFO(dev)->gen >= 8) { |
@@ -3485,6 +3544,15 @@ int valleyview_rps_min_freq(struct drm_i915_private *dev_priv) | |||
3485 | return vlv_punit_read(dev_priv, PUNIT_REG_GPU_LFM) & 0xff; | 3544 | return vlv_punit_read(dev_priv, PUNIT_REG_GPU_LFM) & 0xff; |
3486 | } | 3545 | } |
3487 | 3546 | ||
3547 | /* Check that the pctx buffer wasn't move under us. */ | ||
3548 | static void valleyview_check_pctx(struct drm_i915_private *dev_priv) | ||
3549 | { | ||
3550 | unsigned long pctx_addr = I915_READ(VLV_PCBR) & ~4095; | ||
3551 | |||
3552 | WARN_ON(pctx_addr != dev_priv->mm.stolen_base + | ||
3553 | dev_priv->vlv_pctx->stolen->start); | ||
3554 | } | ||
3555 | |||
3488 | static void valleyview_setup_pctx(struct drm_device *dev) | 3556 | static void valleyview_setup_pctx(struct drm_device *dev) |
3489 | { | 3557 | { |
3490 | struct drm_i915_private *dev_priv = dev->dev_private; | 3558 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -3529,6 +3597,17 @@ out: | |||
3529 | dev_priv->vlv_pctx = pctx; | 3597 | dev_priv->vlv_pctx = pctx; |
3530 | } | 3598 | } |
3531 | 3599 | ||
3600 | static void valleyview_cleanup_pctx(struct drm_device *dev) | ||
3601 | { | ||
3602 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
3603 | |||
3604 | if (WARN_ON(!dev_priv->vlv_pctx)) | ||
3605 | return; | ||
3606 | |||
3607 | drm_gem_object_unreference(&dev_priv->vlv_pctx->base); | ||
3608 | dev_priv->vlv_pctx = NULL; | ||
3609 | } | ||
3610 | |||
3532 | static void valleyview_enable_rps(struct drm_device *dev) | 3611 | static void valleyview_enable_rps(struct drm_device *dev) |
3533 | { | 3612 | { |
3534 | struct drm_i915_private *dev_priv = dev->dev_private; | 3613 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -3538,6 +3617,8 @@ static void valleyview_enable_rps(struct drm_device *dev) | |||
3538 | 3617 | ||
3539 | WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); | 3618 | WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock)); |
3540 | 3619 | ||
3620 | valleyview_check_pctx(dev_priv); | ||
3621 | |||
3541 | if ((gtfifodbg = I915_READ(GTFIFODBG))) { | 3622 | if ((gtfifodbg = I915_READ(GTFIFODBG))) { |
3542 | DRM_DEBUG_DRIVER("GT fifo had a previous error %x\n", | 3623 | DRM_DEBUG_DRIVER("GT fifo had a previous error %x\n", |
3543 | gtfifodbg); | 3624 | gtfifodbg); |
@@ -3588,32 +3669,39 @@ static void valleyview_enable_rps(struct drm_device *dev) | |||
3588 | DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no"); | 3669 | DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no"); |
3589 | DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val); | 3670 | DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val); |
3590 | 3671 | ||
3591 | dev_priv->rps.cur_delay = (val >> 8) & 0xff; | 3672 | dev_priv->rps.cur_freq = (val >> 8) & 0xff; |
3592 | DRM_DEBUG_DRIVER("current GPU freq: %d MHz (%u)\n", | 3673 | DRM_DEBUG_DRIVER("current GPU freq: %d MHz (%u)\n", |
3593 | vlv_gpu_freq(dev_priv, dev_priv->rps.cur_delay), | 3674 | vlv_gpu_freq(dev_priv, dev_priv->rps.cur_freq), |
3594 | dev_priv->rps.cur_delay); | 3675 | dev_priv->rps.cur_freq); |
3595 | 3676 | ||
3596 | dev_priv->rps.max_delay = valleyview_rps_max_freq(dev_priv); | 3677 | dev_priv->rps.max_freq = valleyview_rps_max_freq(dev_priv); |
3597 | dev_priv->rps.hw_max = dev_priv->rps.max_delay; | 3678 | dev_priv->rps.rp0_freq = dev_priv->rps.max_freq; |
3598 | DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n", | 3679 | DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n", |
3599 | vlv_gpu_freq(dev_priv, dev_priv->rps.max_delay), | 3680 | vlv_gpu_freq(dev_priv, dev_priv->rps.max_freq), |
3600 | dev_priv->rps.max_delay); | 3681 | dev_priv->rps.max_freq); |
3601 | 3682 | ||
3602 | dev_priv->rps.rpe_delay = valleyview_rps_rpe_freq(dev_priv); | 3683 | dev_priv->rps.efficient_freq = valleyview_rps_rpe_freq(dev_priv); |
3603 | DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n", | 3684 | DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n", |
3604 | vlv_gpu_freq(dev_priv, dev_priv->rps.rpe_delay), | 3685 | vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq), |
3605 | dev_priv->rps.rpe_delay); | 3686 | dev_priv->rps.efficient_freq); |
3606 | 3687 | ||
3607 | dev_priv->rps.min_delay = valleyview_rps_min_freq(dev_priv); | 3688 | dev_priv->rps.min_freq = valleyview_rps_min_freq(dev_priv); |
3608 | DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n", | 3689 | DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n", |
3609 | vlv_gpu_freq(dev_priv, dev_priv->rps.min_delay), | 3690 | vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq), |
3610 | dev_priv->rps.min_delay); | 3691 | dev_priv->rps.min_freq); |
3692 | |||
3693 | /* Preserve min/max settings in case of re-init */ | ||
3694 | if (dev_priv->rps.max_freq_softlimit == 0) | ||
3695 | dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq; | ||
3696 | |||
3697 | if (dev_priv->rps.min_freq_softlimit == 0) | ||
3698 | dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq; | ||
3611 | 3699 | ||
3612 | DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n", | 3700 | DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n", |
3613 | vlv_gpu_freq(dev_priv, dev_priv->rps.rpe_delay), | 3701 | vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq), |
3614 | dev_priv->rps.rpe_delay); | 3702 | dev_priv->rps.efficient_freq); |
3615 | 3703 | ||
3616 | valleyview_set_rps(dev_priv->dev, dev_priv->rps.rpe_delay); | 3704 | valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq); |
3617 | 3705 | ||
3618 | gen6_enable_rps_interrupts(dev); | 3706 | gen6_enable_rps_interrupts(dev); |
3619 | 3707 | ||
@@ -3625,13 +3713,13 @@ void ironlake_teardown_rc6(struct drm_device *dev) | |||
3625 | struct drm_i915_private *dev_priv = dev->dev_private; | 3713 | struct drm_i915_private *dev_priv = dev->dev_private; |
3626 | 3714 | ||
3627 | if (dev_priv->ips.renderctx) { | 3715 | if (dev_priv->ips.renderctx) { |
3628 | i915_gem_object_unpin(dev_priv->ips.renderctx); | 3716 | i915_gem_object_ggtt_unpin(dev_priv->ips.renderctx); |
3629 | drm_gem_object_unreference(&dev_priv->ips.renderctx->base); | 3717 | drm_gem_object_unreference(&dev_priv->ips.renderctx->base); |
3630 | dev_priv->ips.renderctx = NULL; | 3718 | dev_priv->ips.renderctx = NULL; |
3631 | } | 3719 | } |
3632 | 3720 | ||
3633 | if (dev_priv->ips.pwrctx) { | 3721 | if (dev_priv->ips.pwrctx) { |
3634 | i915_gem_object_unpin(dev_priv->ips.pwrctx); | 3722 | i915_gem_object_ggtt_unpin(dev_priv->ips.pwrctx); |
3635 | drm_gem_object_unreference(&dev_priv->ips.pwrctx->base); | 3723 | drm_gem_object_unreference(&dev_priv->ips.pwrctx->base); |
3636 | dev_priv->ips.pwrctx = NULL; | 3724 | dev_priv->ips.pwrctx = NULL; |
3637 | } | 3725 | } |
@@ -3823,9 +3911,10 @@ static unsigned long __i915_chipset_val(struct drm_i915_private *dev_priv) | |||
3823 | 3911 | ||
3824 | unsigned long i915_chipset_val(struct drm_i915_private *dev_priv) | 3912 | unsigned long i915_chipset_val(struct drm_i915_private *dev_priv) |
3825 | { | 3913 | { |
3914 | struct drm_device *dev = dev_priv->dev; | ||
3826 | unsigned long val; | 3915 | unsigned long val; |
3827 | 3916 | ||
3828 | if (dev_priv->info->gen != 5) | 3917 | if (INTEL_INFO(dev)->gen != 5) |
3829 | return 0; | 3918 | return 0; |
3830 | 3919 | ||
3831 | spin_lock_irq(&mchdev_lock); | 3920 | spin_lock_irq(&mchdev_lock); |
@@ -3854,6 +3943,7 @@ unsigned long i915_mch_val(struct drm_i915_private *dev_priv) | |||
3854 | 3943 | ||
3855 | static u16 pvid_to_extvid(struct drm_i915_private *dev_priv, u8 pxvid) | 3944 | static u16 pvid_to_extvid(struct drm_i915_private *dev_priv, u8 pxvid) |
3856 | { | 3945 | { |
3946 | struct drm_device *dev = dev_priv->dev; | ||
3857 | static const struct v_table { | 3947 | static const struct v_table { |
3858 | u16 vd; /* in .1 mil */ | 3948 | u16 vd; /* in .1 mil */ |
3859 | u16 vm; /* in .1 mil */ | 3949 | u16 vm; /* in .1 mil */ |
@@ -3987,7 +4077,7 @@ static u16 pvid_to_extvid(struct drm_i915_private *dev_priv, u8 pxvid) | |||
3987 | { 16000, 14875, }, | 4077 | { 16000, 14875, }, |
3988 | { 16125, 15000, }, | 4078 | { 16125, 15000, }, |
3989 | }; | 4079 | }; |
3990 | if (dev_priv->info->is_mobile) | 4080 | if (INTEL_INFO(dev)->is_mobile) |
3991 | return v_table[pxvid].vm; | 4081 | return v_table[pxvid].vm; |
3992 | else | 4082 | else |
3993 | return v_table[pxvid].vd; | 4083 | return v_table[pxvid].vd; |
@@ -4030,7 +4120,9 @@ static void __i915_update_gfx_val(struct drm_i915_private *dev_priv) | |||
4030 | 4120 | ||
4031 | void i915_update_gfx_val(struct drm_i915_private *dev_priv) | 4121 | void i915_update_gfx_val(struct drm_i915_private *dev_priv) |
4032 | { | 4122 | { |
4033 | if (dev_priv->info->gen != 5) | 4123 | struct drm_device *dev = dev_priv->dev; |
4124 | |||
4125 | if (INTEL_INFO(dev)->gen != 5) | ||
4034 | return; | 4126 | return; |
4035 | 4127 | ||
4036 | spin_lock_irq(&mchdev_lock); | 4128 | spin_lock_irq(&mchdev_lock); |
@@ -4047,7 +4139,7 @@ static unsigned long __i915_gfx_val(struct drm_i915_private *dev_priv) | |||
4047 | 4139 | ||
4048 | assert_spin_locked(&mchdev_lock); | 4140 | assert_spin_locked(&mchdev_lock); |
4049 | 4141 | ||
4050 | pxvid = I915_READ(PXVFREQ_BASE + (dev_priv->rps.cur_delay * 4)); | 4142 | pxvid = I915_READ(PXVFREQ_BASE + (dev_priv->rps.cur_freq * 4)); |
4051 | pxvid = (pxvid >> 24) & 0x7f; | 4143 | pxvid = (pxvid >> 24) & 0x7f; |
4052 | ext_v = pvid_to_extvid(dev_priv, pxvid); | 4144 | ext_v = pvid_to_extvid(dev_priv, pxvid); |
4053 | 4145 | ||
@@ -4079,9 +4171,10 @@ static unsigned long __i915_gfx_val(struct drm_i915_private *dev_priv) | |||
4079 | 4171 | ||
4080 | unsigned long i915_gfx_val(struct drm_i915_private *dev_priv) | 4172 | unsigned long i915_gfx_val(struct drm_i915_private *dev_priv) |
4081 | { | 4173 | { |
4174 | struct drm_device *dev = dev_priv->dev; | ||
4082 | unsigned long val; | 4175 | unsigned long val; |
4083 | 4176 | ||
4084 | if (dev_priv->info->gen != 5) | 4177 | if (INTEL_INFO(dev)->gen != 5) |
4085 | return 0; | 4178 | return 0; |
4086 | 4179 | ||
4087 | spin_lock_irq(&mchdev_lock); | 4180 | spin_lock_irq(&mchdev_lock); |
@@ -4270,6 +4363,7 @@ void intel_gpu_ips_teardown(void) | |||
4270 | i915_mch_dev = NULL; | 4363 | i915_mch_dev = NULL; |
4271 | spin_unlock_irq(&mchdev_lock); | 4364 | spin_unlock_irq(&mchdev_lock); |
4272 | } | 4365 | } |
4366 | |||
4273 | static void intel_init_emon(struct drm_device *dev) | 4367 | static void intel_init_emon(struct drm_device *dev) |
4274 | { | 4368 | { |
4275 | struct drm_i915_private *dev_priv = dev->dev_private; | 4369 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -4341,6 +4435,18 @@ static void intel_init_emon(struct drm_device *dev) | |||
4341 | dev_priv->ips.corr = (lcfuse & LCFUSE_HIV_MASK); | 4435 | dev_priv->ips.corr = (lcfuse & LCFUSE_HIV_MASK); |
4342 | } | 4436 | } |
4343 | 4437 | ||
4438 | void intel_init_gt_powersave(struct drm_device *dev) | ||
4439 | { | ||
4440 | if (IS_VALLEYVIEW(dev)) | ||
4441 | valleyview_setup_pctx(dev); | ||
4442 | } | ||
4443 | |||
4444 | void intel_cleanup_gt_powersave(struct drm_device *dev) | ||
4445 | { | ||
4446 | if (IS_VALLEYVIEW(dev)) | ||
4447 | valleyview_cleanup_pctx(dev); | ||
4448 | } | ||
4449 | |||
4344 | void intel_disable_gt_powersave(struct drm_device *dev) | 4450 | void intel_disable_gt_powersave(struct drm_device *dev) |
4345 | { | 4451 | { |
4346 | struct drm_i915_private *dev_priv = dev->dev_private; | 4452 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -4395,8 +4501,6 @@ void intel_enable_gt_powersave(struct drm_device *dev) | |||
4395 | ironlake_enable_rc6(dev); | 4501 | ironlake_enable_rc6(dev); |
4396 | intel_init_emon(dev); | 4502 | intel_init_emon(dev); |
4397 | } else if (IS_GEN6(dev) || IS_GEN7(dev)) { | 4503 | } else if (IS_GEN6(dev) || IS_GEN7(dev)) { |
4398 | if (IS_VALLEYVIEW(dev)) | ||
4399 | valleyview_setup_pctx(dev); | ||
4400 | /* | 4504 | /* |
4401 | * PCU communication is slow and this doesn't need to be | 4505 | * PCU communication is slow and this doesn't need to be |
4402 | * done at any specific time, so do this out of our fast path | 4506 | * done at any specific time, so do this out of our fast path |
@@ -4587,6 +4691,17 @@ static void gen6_init_clock_gating(struct drm_device *dev) | |||
4587 | I915_WRITE(GEN6_GT_MODE, | 4691 | I915_WRITE(GEN6_GT_MODE, |
4588 | _MASKED_BIT_ENABLE(GEN6_TD_FOUR_ROW_DISPATCH_DISABLE)); | 4692 | _MASKED_BIT_ENABLE(GEN6_TD_FOUR_ROW_DISPATCH_DISABLE)); |
4589 | 4693 | ||
4694 | /* | ||
4695 | * BSpec recoomends 8x4 when MSAA is used, | ||
4696 | * however in practice 16x4 seems fastest. | ||
4697 | * | ||
4698 | * Note that PS/WM thread counts depend on the WIZ hashing | ||
4699 | * disable bit, which we don't touch here, but it's good | ||
4700 | * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). | ||
4701 | */ | ||
4702 | I915_WRITE(GEN6_GT_MODE, | ||
4703 | GEN6_WIZ_HASHING_MASK | GEN6_WIZ_HASHING_16x4); | ||
4704 | |||
4590 | ilk_init_lp_watermarks(dev); | 4705 | ilk_init_lp_watermarks(dev); |
4591 | 4706 | ||
4592 | I915_WRITE(CACHE_MODE_0, | 4707 | I915_WRITE(CACHE_MODE_0, |
@@ -4607,17 +4722,24 @@ static void gen6_init_clock_gating(struct drm_device *dev) | |||
4607 | * According to the spec, bit 11 (RCCUNIT) must also be set, | 4722 | * According to the spec, bit 11 (RCCUNIT) must also be set, |
4608 | * but we didn't debug actual testcases to find it out. | 4723 | * but we didn't debug actual testcases to find it out. |
4609 | * | 4724 | * |
4610 | * Also apply WaDisableVDSUnitClockGating:snb and | 4725 | * WaDisableRCCUnitClockGating:snb |
4611 | * WaDisableRCPBUnitClockGating:snb. | 4726 | * WaDisableRCPBUnitClockGating:snb |
4612 | */ | 4727 | */ |
4613 | I915_WRITE(GEN6_UCGCTL2, | 4728 | I915_WRITE(GEN6_UCGCTL2, |
4614 | GEN7_VDSUNIT_CLOCK_GATE_DISABLE | | ||
4615 | GEN6_RCPBUNIT_CLOCK_GATE_DISABLE | | 4729 | GEN6_RCPBUNIT_CLOCK_GATE_DISABLE | |
4616 | GEN6_RCCUNIT_CLOCK_GATE_DISABLE); | 4730 | GEN6_RCCUNIT_CLOCK_GATE_DISABLE); |
4617 | 4731 | ||
4618 | /* Bspec says we need to always set all mask bits. */ | 4732 | /* WaStripsFansDisableFastClipPerformanceFix:snb */ |
4619 | I915_WRITE(_3D_CHICKEN3, (0xFFFF << 16) | | 4733 | I915_WRITE(_3D_CHICKEN3, |
4620 | _3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL); | 4734 | _MASKED_BIT_ENABLE(_3D_CHICKEN3_SF_DISABLE_FASTCLIP_CULL)); |
4735 | |||
4736 | /* | ||
4737 | * Bspec says: | ||
4738 | * "This bit must be set if 3DSTATE_CLIP clip mode is set to normal and | ||
4739 | * 3DSTATE_SF number of SF output attributes is more than 16." | ||
4740 | */ | ||
4741 | I915_WRITE(_3D_CHICKEN3, | ||
4742 | _MASKED_BIT_ENABLE(_3D_CHICKEN3_SF_DISABLE_PIPELINED_ATTR_FETCH)); | ||
4621 | 4743 | ||
4622 | /* | 4744 | /* |
4623 | * According to the spec the following bits should be | 4745 | * According to the spec the following bits should be |
@@ -4643,11 +4765,6 @@ static void gen6_init_clock_gating(struct drm_device *dev) | |||
4643 | 4765 | ||
4644 | g4x_disable_trickle_feed(dev); | 4766 | g4x_disable_trickle_feed(dev); |
4645 | 4767 | ||
4646 | /* The default value should be 0x200 according to docs, but the two | ||
4647 | * platforms I checked have a 0 for this. (Maybe BIOS overrides?) */ | ||
4648 | I915_WRITE(GEN6_GT_MODE, _MASKED_BIT_DISABLE(0xffff)); | ||
4649 | I915_WRITE(GEN6_GT_MODE, _MASKED_BIT_ENABLE(GEN6_GT_MODE_HI)); | ||
4650 | |||
4651 | cpt_init_clock_gating(dev); | 4768 | cpt_init_clock_gating(dev); |
4652 | 4769 | ||
4653 | gen6_check_mch_setup(dev); | 4770 | gen6_check_mch_setup(dev); |
@@ -4657,14 +4774,17 @@ static void gen7_setup_fixed_func_scheduler(struct drm_i915_private *dev_priv) | |||
4657 | { | 4774 | { |
4658 | uint32_t reg = I915_READ(GEN7_FF_THREAD_MODE); | 4775 | uint32_t reg = I915_READ(GEN7_FF_THREAD_MODE); |
4659 | 4776 | ||
4777 | /* | ||
4778 | * WaVSThreadDispatchOverride:ivb,vlv | ||
4779 | * | ||
4780 | * This actually overrides the dispatch | ||
4781 | * mode for all thread types. | ||
4782 | */ | ||
4660 | reg &= ~GEN7_FF_SCHED_MASK; | 4783 | reg &= ~GEN7_FF_SCHED_MASK; |
4661 | reg |= GEN7_FF_TS_SCHED_HW; | 4784 | reg |= GEN7_FF_TS_SCHED_HW; |
4662 | reg |= GEN7_FF_VS_SCHED_HW; | 4785 | reg |= GEN7_FF_VS_SCHED_HW; |
4663 | reg |= GEN7_FF_DS_SCHED_HW; | 4786 | reg |= GEN7_FF_DS_SCHED_HW; |
4664 | 4787 | ||
4665 | if (IS_HASWELL(dev_priv->dev)) | ||
4666 | reg &= ~GEN7_FF_VS_REF_CNT_FFME; | ||
4667 | |||
4668 | I915_WRITE(GEN7_FF_THREAD_MODE, reg); | 4788 | I915_WRITE(GEN7_FF_THREAD_MODE, reg); |
4669 | } | 4789 | } |
4670 | 4790 | ||
@@ -4702,7 +4822,7 @@ static void lpt_suspend_hw(struct drm_device *dev) | |||
4702 | static void gen8_init_clock_gating(struct drm_device *dev) | 4822 | static void gen8_init_clock_gating(struct drm_device *dev) |
4703 | { | 4823 | { |
4704 | struct drm_i915_private *dev_priv = dev->dev_private; | 4824 | struct drm_i915_private *dev_priv = dev->dev_private; |
4705 | enum pipe i; | 4825 | enum pipe pipe; |
4706 | 4826 | ||
4707 | I915_WRITE(WM3_LP_ILK, 0); | 4827 | I915_WRITE(WM3_LP_ILK, 0); |
4708 | I915_WRITE(WM2_LP_ILK, 0); | 4828 | I915_WRITE(WM2_LP_ILK, 0); |
@@ -4711,8 +4831,19 @@ static void gen8_init_clock_gating(struct drm_device *dev) | |||
4711 | /* FIXME(BDW): Check all the w/a, some might only apply to | 4831 | /* FIXME(BDW): Check all the w/a, some might only apply to |
4712 | * pre-production hw. */ | 4832 | * pre-production hw. */ |
4713 | 4833 | ||
4714 | WARN(!i915_preliminary_hw_support, | 4834 | /* WaDisablePartialInstShootdown:bdw */ |
4715 | "GEN8_CENTROID_PIXEL_OPT_DIS not be needed for production\n"); | 4835 | I915_WRITE(GEN8_ROW_CHICKEN, |
4836 | _MASKED_BIT_ENABLE(PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE)); | ||
4837 | |||
4838 | /* WaDisableThreadStallDopClockGating:bdw */ | ||
4839 | /* FIXME: Unclear whether we really need this on production bdw. */ | ||
4840 | I915_WRITE(GEN8_ROW_CHICKEN, | ||
4841 | _MASKED_BIT_ENABLE(STALL_DOP_GATING_DISABLE)); | ||
4842 | |||
4843 | /* | ||
4844 | * This GEN8_CENTROID_PIXEL_OPT_DIS W/A is only needed for | ||
4845 | * pre-production hardware | ||
4846 | */ | ||
4716 | I915_WRITE(HALF_SLICE_CHICKEN3, | 4847 | I915_WRITE(HALF_SLICE_CHICKEN3, |
4717 | _MASKED_BIT_ENABLE(GEN8_CENTROID_PIXEL_OPT_DIS)); | 4848 | _MASKED_BIT_ENABLE(GEN8_CENTROID_PIXEL_OPT_DIS)); |
4718 | I915_WRITE(HALF_SLICE_CHICKEN3, | 4849 | I915_WRITE(HALF_SLICE_CHICKEN3, |
@@ -4736,10 +4867,10 @@ static void gen8_init_clock_gating(struct drm_device *dev) | |||
4736 | I915_READ(CHICKEN_PAR1_1) | DPA_MASK_VBLANK_SRD); | 4867 | I915_READ(CHICKEN_PAR1_1) | DPA_MASK_VBLANK_SRD); |
4737 | 4868 | ||
4738 | /* WaPsrDPRSUnmaskVBlankInSRD:bdw */ | 4869 | /* WaPsrDPRSUnmaskVBlankInSRD:bdw */ |
4739 | for_each_pipe(i) { | 4870 | for_each_pipe(pipe) { |
4740 | I915_WRITE(CHICKEN_PIPESL_1(i), | 4871 | I915_WRITE(CHICKEN_PIPESL_1(pipe), |
4741 | I915_READ(CHICKEN_PIPESL_1(i) | | 4872 | I915_READ(CHICKEN_PIPESL_1(pipe)) | |
4742 | DPRS_MASK_VBLANK_SRD)); | 4873 | BDW_DPRS_MASK_VBLANK_SRD); |
4743 | } | 4874 | } |
4744 | 4875 | ||
4745 | /* Use Force Non-Coherent whenever executing a 3D context. This is a | 4876 | /* Use Force Non-Coherent whenever executing a 3D context. This is a |
@@ -4755,6 +4886,28 @@ static void gen8_init_clock_gating(struct drm_device *dev) | |||
4755 | I915_WRITE(GEN7_FF_THREAD_MODE, | 4886 | I915_WRITE(GEN7_FF_THREAD_MODE, |
4756 | I915_READ(GEN7_FF_THREAD_MODE) & | 4887 | I915_READ(GEN7_FF_THREAD_MODE) & |
4757 | ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME)); | 4888 | ~(GEN8_FF_DS_REF_CNT_FFME | GEN7_FF_VS_REF_CNT_FFME)); |
4889 | |||
4890 | /* | ||
4891 | * BSpec recommends 8x4 when MSAA is used, | ||
4892 | * however in practice 16x4 seems fastest. | ||
4893 | * | ||
4894 | * Note that PS/WM thread counts depend on the WIZ hashing | ||
4895 | * disable bit, which we don't touch here, but it's good | ||
4896 | * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). | ||
4897 | */ | ||
4898 | I915_WRITE(GEN7_GT_MODE, | ||
4899 | GEN6_WIZ_HASHING_MASK | GEN6_WIZ_HASHING_16x4); | ||
4900 | |||
4901 | I915_WRITE(GEN6_RC_SLEEP_PSMI_CONTROL, | ||
4902 | _MASKED_BIT_ENABLE(GEN8_RC_SEMA_IDLE_MSG_DISABLE)); | ||
4903 | |||
4904 | /* WaDisableSDEUnitClockGating:bdw */ | ||
4905 | I915_WRITE(GEN8_UCGCTL6, I915_READ(GEN8_UCGCTL6) | | ||
4906 | GEN8_SDEUNIT_CLOCK_GATE_DISABLE); | ||
4907 | |||
4908 | /* Wa4x4STCOptimizationDisable:bdw */ | ||
4909 | I915_WRITE(CACHE_MODE_1, | ||
4910 | _MASKED_BIT_ENABLE(GEN8_4x4_STC_OPTIMIZATION_DISABLE)); | ||
4758 | } | 4911 | } |
4759 | 4912 | ||
4760 | static void haswell_init_clock_gating(struct drm_device *dev) | 4913 | static void haswell_init_clock_gating(struct drm_device *dev) |
@@ -4763,21 +4916,6 @@ static void haswell_init_clock_gating(struct drm_device *dev) | |||
4763 | 4916 | ||
4764 | ilk_init_lp_watermarks(dev); | 4917 | ilk_init_lp_watermarks(dev); |
4765 | 4918 | ||
4766 | /* According to the spec, bit 13 (RCZUNIT) must be set on IVB. | ||
4767 | * This implements the WaDisableRCZUnitClockGating:hsw workaround. | ||
4768 | */ | ||
4769 | I915_WRITE(GEN6_UCGCTL2, GEN6_RCZUNIT_CLOCK_GATE_DISABLE); | ||
4770 | |||
4771 | /* Apply the WaDisableRHWOOptimizationForRenderHang:hsw workaround. */ | ||
4772 | I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1, | ||
4773 | GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC); | ||
4774 | |||
4775 | /* WaApplyL3ControlAndL3ChickenMode:hsw */ | ||
4776 | I915_WRITE(GEN7_L3CNTLREG1, | ||
4777 | GEN7_WA_FOR_GEN7_L3_CONTROL); | ||
4778 | I915_WRITE(GEN7_L3_CHICKEN_MODE_REGISTER, | ||
4779 | GEN7_WA_L3_CHICKEN_MODE); | ||
4780 | |||
4781 | /* L3 caching of data atomics doesn't work -- disable it. */ | 4919 | /* L3 caching of data atomics doesn't work -- disable it. */ |
4782 | I915_WRITE(HSW_SCRATCH1, HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE); | 4920 | I915_WRITE(HSW_SCRATCH1, HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE); |
4783 | I915_WRITE(HSW_ROW_CHICKEN3, | 4921 | I915_WRITE(HSW_ROW_CHICKEN3, |
@@ -4789,12 +4927,28 @@ static void haswell_init_clock_gating(struct drm_device *dev) | |||
4789 | GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); | 4927 | GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); |
4790 | 4928 | ||
4791 | /* WaVSRefCountFullforceMissDisable:hsw */ | 4929 | /* WaVSRefCountFullforceMissDisable:hsw */ |
4792 | gen7_setup_fixed_func_scheduler(dev_priv); | 4930 | I915_WRITE(GEN7_FF_THREAD_MODE, |
4931 | I915_READ(GEN7_FF_THREAD_MODE) & ~GEN7_FF_VS_REF_CNT_FFME); | ||
4932 | |||
4933 | /* enable HiZ Raw Stall Optimization */ | ||
4934 | I915_WRITE(CACHE_MODE_0_GEN7, | ||
4935 | _MASKED_BIT_DISABLE(HIZ_RAW_STALL_OPT_DISABLE)); | ||
4793 | 4936 | ||
4794 | /* WaDisable4x2SubspanOptimization:hsw */ | 4937 | /* WaDisable4x2SubspanOptimization:hsw */ |
4795 | I915_WRITE(CACHE_MODE_1, | 4938 | I915_WRITE(CACHE_MODE_1, |
4796 | _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE)); | 4939 | _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE)); |
4797 | 4940 | ||
4941 | /* | ||
4942 | * BSpec recommends 8x4 when MSAA is used, | ||
4943 | * however in practice 16x4 seems fastest. | ||
4944 | * | ||
4945 | * Note that PS/WM thread counts depend on the WIZ hashing | ||
4946 | * disable bit, which we don't touch here, but it's good | ||
4947 | * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). | ||
4948 | */ | ||
4949 | I915_WRITE(GEN7_GT_MODE, | ||
4950 | GEN6_WIZ_HASHING_MASK | GEN6_WIZ_HASHING_16x4); | ||
4951 | |||
4798 | /* WaSwitchSolVfFArbitrationPriority:hsw */ | 4952 | /* WaSwitchSolVfFArbitrationPriority:hsw */ |
4799 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); | 4953 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); |
4800 | 4954 | ||
@@ -4827,9 +4981,6 @@ static void ivybridge_init_clock_gating(struct drm_device *dev) | |||
4827 | if (IS_IVB_GT1(dev)) | 4981 | if (IS_IVB_GT1(dev)) |
4828 | I915_WRITE(GEN7_HALF_SLICE_CHICKEN1, | 4982 | I915_WRITE(GEN7_HALF_SLICE_CHICKEN1, |
4829 | _MASKED_BIT_ENABLE(GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE)); | 4983 | _MASKED_BIT_ENABLE(GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE)); |
4830 | else | ||
4831 | I915_WRITE(GEN7_HALF_SLICE_CHICKEN1_GT2, | ||
4832 | _MASKED_BIT_ENABLE(GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE)); | ||
4833 | 4984 | ||
4834 | /* Apply the WaDisableRHWOOptimizationForRenderHang:ivb workaround. */ | 4985 | /* Apply the WaDisableRHWOOptimizationForRenderHang:ivb workaround. */ |
4835 | I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1, | 4986 | I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1, |
@@ -4843,31 +4994,24 @@ static void ivybridge_init_clock_gating(struct drm_device *dev) | |||
4843 | if (IS_IVB_GT1(dev)) | 4994 | if (IS_IVB_GT1(dev)) |
4844 | I915_WRITE(GEN7_ROW_CHICKEN2, | 4995 | I915_WRITE(GEN7_ROW_CHICKEN2, |
4845 | _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); | 4996 | _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); |
4846 | else | 4997 | else { |
4998 | /* must write both registers */ | ||
4999 | I915_WRITE(GEN7_ROW_CHICKEN2, | ||
5000 | _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); | ||
4847 | I915_WRITE(GEN7_ROW_CHICKEN2_GT2, | 5001 | I915_WRITE(GEN7_ROW_CHICKEN2_GT2, |
4848 | _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); | 5002 | _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); |
4849 | 5003 | } | |
4850 | 5004 | ||
4851 | /* WaForceL3Serialization:ivb */ | 5005 | /* WaForceL3Serialization:ivb */ |
4852 | I915_WRITE(GEN7_L3SQCREG4, I915_READ(GEN7_L3SQCREG4) & | 5006 | I915_WRITE(GEN7_L3SQCREG4, I915_READ(GEN7_L3SQCREG4) & |
4853 | ~L3SQ_URB_READ_CAM_MATCH_DISABLE); | 5007 | ~L3SQ_URB_READ_CAM_MATCH_DISABLE); |
4854 | 5008 | ||
4855 | /* According to the BSpec vol1g, bit 12 (RCPBUNIT) clock | 5009 | /* |
4856 | * gating disable must be set. Failure to set it results in | ||
4857 | * flickering pixels due to Z write ordering failures after | ||
4858 | * some amount of runtime in the Mesa "fire" demo, and Unigine | ||
4859 | * Sanctuary and Tropics, and apparently anything else with | ||
4860 | * alpha test or pixel discard. | ||
4861 | * | ||
4862 | * According to the spec, bit 11 (RCCUNIT) must also be set, | ||
4863 | * but we didn't debug actual testcases to find it out. | ||
4864 | * | ||
4865 | * According to the spec, bit 13 (RCZUNIT) must be set on IVB. | 5010 | * According to the spec, bit 13 (RCZUNIT) must be set on IVB. |
4866 | * This implements the WaDisableRCZUnitClockGating:ivb workaround. | 5011 | * This implements the WaDisableRCZUnitClockGating:ivb workaround. |
4867 | */ | 5012 | */ |
4868 | I915_WRITE(GEN6_UCGCTL2, | 5013 | I915_WRITE(GEN6_UCGCTL2, |
4869 | GEN6_RCZUNIT_CLOCK_GATE_DISABLE | | 5014 | GEN6_RCZUNIT_CLOCK_GATE_DISABLE); |
4870 | GEN6_RCCUNIT_CLOCK_GATE_DISABLE); | ||
4871 | 5015 | ||
4872 | /* This is required by WaCatErrorRejectionIssue:ivb */ | 5016 | /* This is required by WaCatErrorRejectionIssue:ivb */ |
4873 | I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, | 5017 | I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, |
@@ -4876,13 +5020,29 @@ static void ivybridge_init_clock_gating(struct drm_device *dev) | |||
4876 | 5020 | ||
4877 | g4x_disable_trickle_feed(dev); | 5021 | g4x_disable_trickle_feed(dev); |
4878 | 5022 | ||
4879 | /* WaVSRefCountFullforceMissDisable:ivb */ | ||
4880 | gen7_setup_fixed_func_scheduler(dev_priv); | 5023 | gen7_setup_fixed_func_scheduler(dev_priv); |
4881 | 5024 | ||
5025 | if (0) { /* causes HiZ corruption on ivb:gt1 */ | ||
5026 | /* enable HiZ Raw Stall Optimization */ | ||
5027 | I915_WRITE(CACHE_MODE_0_GEN7, | ||
5028 | _MASKED_BIT_DISABLE(HIZ_RAW_STALL_OPT_DISABLE)); | ||
5029 | } | ||
5030 | |||
4882 | /* WaDisable4x2SubspanOptimization:ivb */ | 5031 | /* WaDisable4x2SubspanOptimization:ivb */ |
4883 | I915_WRITE(CACHE_MODE_1, | 5032 | I915_WRITE(CACHE_MODE_1, |
4884 | _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE)); | 5033 | _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE)); |
4885 | 5034 | ||
5035 | /* | ||
5036 | * BSpec recommends 8x4 when MSAA is used, | ||
5037 | * however in practice 16x4 seems fastest. | ||
5038 | * | ||
5039 | * Note that PS/WM thread counts depend on the WIZ hashing | ||
5040 | * disable bit, which we don't touch here, but it's good | ||
5041 | * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). | ||
5042 | */ | ||
5043 | I915_WRITE(GEN7_GT_MODE, | ||
5044 | GEN6_WIZ_HASHING_MASK | GEN6_WIZ_HASHING_16x4); | ||
5045 | |||
4886 | snpcr = I915_READ(GEN6_MBCUNIT_SNPCR); | 5046 | snpcr = I915_READ(GEN6_MBCUNIT_SNPCR); |
4887 | snpcr &= ~GEN6_MBC_SNPCR_MASK; | 5047 | snpcr &= ~GEN6_MBC_SNPCR_MASK; |
4888 | snpcr |= GEN6_MBC_SNPCR_MED; | 5048 | snpcr |= GEN6_MBC_SNPCR_MED; |
@@ -4904,13 +5064,11 @@ static void valleyview_init_clock_gating(struct drm_device *dev) | |||
4904 | mutex_unlock(&dev_priv->rps.hw_lock); | 5064 | mutex_unlock(&dev_priv->rps.hw_lock); |
4905 | switch ((val >> 6) & 3) { | 5065 | switch ((val >> 6) & 3) { |
4906 | case 0: | 5066 | case 0: |
4907 | dev_priv->mem_freq = 800; | ||
4908 | break; | ||
4909 | case 1: | 5067 | case 1: |
4910 | dev_priv->mem_freq = 1066; | 5068 | dev_priv->mem_freq = 800; |
4911 | break; | 5069 | break; |
4912 | case 2: | 5070 | case 2: |
4913 | dev_priv->mem_freq = 1333; | 5071 | dev_priv->mem_freq = 1066; |
4914 | break; | 5072 | break; |
4915 | case 3: | 5073 | case 3: |
4916 | dev_priv->mem_freq = 1333; | 5074 | dev_priv->mem_freq = 1333; |
@@ -4929,19 +5087,12 @@ static void valleyview_init_clock_gating(struct drm_device *dev) | |||
4929 | CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | | 5087 | CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | |
4930 | CHICKEN3_DGMG_DONE_FIX_DISABLE); | 5088 | CHICKEN3_DGMG_DONE_FIX_DISABLE); |
4931 | 5089 | ||
5090 | /* WaPsdDispatchEnable:vlv */ | ||
4932 | /* WaDisablePSDDualDispatchEnable:vlv */ | 5091 | /* WaDisablePSDDualDispatchEnable:vlv */ |
4933 | I915_WRITE(GEN7_HALF_SLICE_CHICKEN1, | 5092 | I915_WRITE(GEN7_HALF_SLICE_CHICKEN1, |
4934 | _MASKED_BIT_ENABLE(GEN7_MAX_PS_THREAD_DEP | | 5093 | _MASKED_BIT_ENABLE(GEN7_MAX_PS_THREAD_DEP | |
4935 | GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE)); | 5094 | GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE)); |
4936 | 5095 | ||
4937 | /* Apply the WaDisableRHWOOptimizationForRenderHang:vlv workaround. */ | ||
4938 | I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1, | ||
4939 | GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC); | ||
4940 | |||
4941 | /* WaApplyL3ControlAndL3ChickenMode:vlv */ | ||
4942 | I915_WRITE(GEN7_L3CNTLREG1, I915_READ(GEN7_L3CNTLREG1) | GEN7_L3AGDIS); | ||
4943 | I915_WRITE(GEN7_L3_CHICKEN_MODE_REGISTER, GEN7_WA_L3_CHICKEN_MODE); | ||
4944 | |||
4945 | /* WaForceL3Serialization:vlv */ | 5096 | /* WaForceL3Serialization:vlv */ |
4946 | I915_WRITE(GEN7_L3SQCREG4, I915_READ(GEN7_L3SQCREG4) & | 5097 | I915_WRITE(GEN7_L3SQCREG4, I915_READ(GEN7_L3SQCREG4) & |
4947 | ~L3SQ_URB_READ_CAM_MATCH_DISABLE); | 5098 | ~L3SQ_URB_READ_CAM_MATCH_DISABLE); |
@@ -4955,51 +5106,39 @@ static void valleyview_init_clock_gating(struct drm_device *dev) | |||
4955 | I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | | 5106 | I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | |
4956 | GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); | 5107 | GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); |
4957 | 5108 | ||
4958 | /* According to the BSpec vol1g, bit 12 (RCPBUNIT) clock | 5109 | gen7_setup_fixed_func_scheduler(dev_priv); |
4959 | * gating disable must be set. Failure to set it results in | 5110 | |
4960 | * flickering pixels due to Z write ordering failures after | 5111 | /* |
4961 | * some amount of runtime in the Mesa "fire" demo, and Unigine | ||
4962 | * Sanctuary and Tropics, and apparently anything else with | ||
4963 | * alpha test or pixel discard. | ||
4964 | * | ||
4965 | * According to the spec, bit 11 (RCCUNIT) must also be set, | ||
4966 | * but we didn't debug actual testcases to find it out. | ||
4967 | * | ||
4968 | * According to the spec, bit 13 (RCZUNIT) must be set on IVB. | 5112 | * According to the spec, bit 13 (RCZUNIT) must be set on IVB. |
4969 | * This implements the WaDisableRCZUnitClockGating:vlv workaround. | 5113 | * This implements the WaDisableRCZUnitClockGating:vlv workaround. |
4970 | * | ||
4971 | * Also apply WaDisableVDSUnitClockGating:vlv and | ||
4972 | * WaDisableRCPBUnitClockGating:vlv. | ||
4973 | */ | 5114 | */ |
4974 | I915_WRITE(GEN6_UCGCTL2, | 5115 | I915_WRITE(GEN6_UCGCTL2, |
4975 | GEN7_VDSUNIT_CLOCK_GATE_DISABLE | | 5116 | GEN6_RCZUNIT_CLOCK_GATE_DISABLE); |
4976 | GEN7_TDLUNIT_CLOCK_GATE_DISABLE | | ||
4977 | GEN6_RCZUNIT_CLOCK_GATE_DISABLE | | ||
4978 | GEN6_RCPBUNIT_CLOCK_GATE_DISABLE | | ||
4979 | GEN6_RCCUNIT_CLOCK_GATE_DISABLE); | ||
4980 | 5117 | ||
5118 | /* WaDisableL3Bank2xClockGate:vlv */ | ||
4981 | I915_WRITE(GEN7_UCGCTL4, GEN7_L3BANK2X_CLOCK_GATE_DISABLE); | 5119 | I915_WRITE(GEN7_UCGCTL4, GEN7_L3BANK2X_CLOCK_GATE_DISABLE); |
4982 | 5120 | ||
4983 | I915_WRITE(MI_ARB_VLV, MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE); | 5121 | I915_WRITE(MI_ARB_VLV, MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE); |
4984 | 5122 | ||
5123 | /* | ||
5124 | * BSpec says this must be set, even though | ||
5125 | * WaDisable4x2SubspanOptimization isn't listed for VLV. | ||
5126 | */ | ||
4985 | I915_WRITE(CACHE_MODE_1, | 5127 | I915_WRITE(CACHE_MODE_1, |
4986 | _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE)); | 5128 | _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE)); |
4987 | 5129 | ||
4988 | /* | 5130 | /* |
5131 | * WaIncreaseL3CreditsForVLVB0:vlv | ||
5132 | * This is the hardware default actually. | ||
5133 | */ | ||
5134 | I915_WRITE(GEN7_L3SQCREG1, VLV_B0_WA_L3SQCREG1_VALUE); | ||
5135 | |||
5136 | /* | ||
4989 | * WaDisableVLVClockGating_VBIIssue:vlv | 5137 | * WaDisableVLVClockGating_VBIIssue:vlv |
4990 | * Disable clock gating on th GCFG unit to prevent a delay | 5138 | * Disable clock gating on th GCFG unit to prevent a delay |
4991 | * in the reporting of vblank events. | 5139 | * in the reporting of vblank events. |
4992 | */ | 5140 | */ |
4993 | I915_WRITE(VLV_GUNIT_CLOCK_GATE, 0xffffffff); | 5141 | I915_WRITE(VLV_GUNIT_CLOCK_GATE, GCFG_DIS); |
4994 | |||
4995 | /* Conservative clock gating settings for now */ | ||
4996 | I915_WRITE(0x9400, 0xffffffff); | ||
4997 | I915_WRITE(0x9404, 0xffffffff); | ||
4998 | I915_WRITE(0x9408, 0xffffffff); | ||
4999 | I915_WRITE(0x940c, 0xffffffff); | ||
5000 | I915_WRITE(0x9410, 0xffffffff); | ||
5001 | I915_WRITE(0x9414, 0xffffffff); | ||
5002 | I915_WRITE(0x9418, 0xffffffff); | ||
5003 | } | 5142 | } |
5004 | 5143 | ||
5005 | static void g4x_init_clock_gating(struct drm_device *dev) | 5144 | static void g4x_init_clock_gating(struct drm_device *dev) |
@@ -5114,19 +5253,16 @@ void intel_suspend_hw(struct drm_device *dev) | |||
5114 | * enable it, so check if it's enabled and also check if we've requested it to | 5253 | * enable it, so check if it's enabled and also check if we've requested it to |
5115 | * be enabled. | 5254 | * be enabled. |
5116 | */ | 5255 | */ |
5117 | static bool hsw_power_well_enabled(struct drm_device *dev, | 5256 | static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv, |
5118 | struct i915_power_well *power_well) | 5257 | struct i915_power_well *power_well) |
5119 | { | 5258 | { |
5120 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5121 | |||
5122 | return I915_READ(HSW_PWR_WELL_DRIVER) == | 5259 | return I915_READ(HSW_PWR_WELL_DRIVER) == |
5123 | (HSW_PWR_WELL_ENABLE_REQUEST | HSW_PWR_WELL_STATE_ENABLED); | 5260 | (HSW_PWR_WELL_ENABLE_REQUEST | HSW_PWR_WELL_STATE_ENABLED); |
5124 | } | 5261 | } |
5125 | 5262 | ||
5126 | bool intel_display_power_enabled_sw(struct drm_device *dev, | 5263 | bool intel_display_power_enabled_sw(struct drm_i915_private *dev_priv, |
5127 | enum intel_display_power_domain domain) | 5264 | enum intel_display_power_domain domain) |
5128 | { | 5265 | { |
5129 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5130 | struct i915_power_domains *power_domains; | 5266 | struct i915_power_domains *power_domains; |
5131 | 5267 | ||
5132 | power_domains = &dev_priv->power_domains; | 5268 | power_domains = &dev_priv->power_domains; |
@@ -5134,15 +5270,17 @@ bool intel_display_power_enabled_sw(struct drm_device *dev, | |||
5134 | return power_domains->domain_use_count[domain]; | 5270 | return power_domains->domain_use_count[domain]; |
5135 | } | 5271 | } |
5136 | 5272 | ||
5137 | bool intel_display_power_enabled(struct drm_device *dev, | 5273 | bool intel_display_power_enabled(struct drm_i915_private *dev_priv, |
5138 | enum intel_display_power_domain domain) | 5274 | enum intel_display_power_domain domain) |
5139 | { | 5275 | { |
5140 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5141 | struct i915_power_domains *power_domains; | 5276 | struct i915_power_domains *power_domains; |
5142 | struct i915_power_well *power_well; | 5277 | struct i915_power_well *power_well; |
5143 | bool is_enabled; | 5278 | bool is_enabled; |
5144 | int i; | 5279 | int i; |
5145 | 5280 | ||
5281 | if (dev_priv->pm.suspended) | ||
5282 | return false; | ||
5283 | |||
5146 | power_domains = &dev_priv->power_domains; | 5284 | power_domains = &dev_priv->power_domains; |
5147 | 5285 | ||
5148 | is_enabled = true; | 5286 | is_enabled = true; |
@@ -5152,7 +5290,7 @@ bool intel_display_power_enabled(struct drm_device *dev, | |||
5152 | if (power_well->always_on) | 5290 | if (power_well->always_on) |
5153 | continue; | 5291 | continue; |
5154 | 5292 | ||
5155 | if (!power_well->is_enabled(dev, power_well)) { | 5293 | if (!power_well->ops->is_enabled(dev_priv, power_well)) { |
5156 | is_enabled = false; | 5294 | is_enabled = false; |
5157 | break; | 5295 | break; |
5158 | } | 5296 | } |
@@ -5162,6 +5300,12 @@ bool intel_display_power_enabled(struct drm_device *dev, | |||
5162 | return is_enabled; | 5300 | return is_enabled; |
5163 | } | 5301 | } |
5164 | 5302 | ||
5303 | /* | ||
5304 | * Starting with Haswell, we have a "Power Down Well" that can be turned off | ||
5305 | * when not needed anymore. We have 4 registers that can request the power well | ||
5306 | * to be enabled, and it will only be disabled if none of the registers is | ||
5307 | * requesting it to be enabled. | ||
5308 | */ | ||
5165 | static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv) | 5309 | static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv) |
5166 | { | 5310 | { |
5167 | struct drm_device *dev = dev_priv->dev; | 5311 | struct drm_device *dev = dev_priv->dev; |
@@ -5198,10 +5342,17 @@ static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv) | |||
5198 | } | 5342 | } |
5199 | } | 5343 | } |
5200 | 5344 | ||
5345 | static void reset_vblank_counter(struct drm_device *dev, enum pipe pipe) | ||
5346 | { | ||
5347 | assert_spin_locked(&dev->vbl_lock); | ||
5348 | |||
5349 | dev->vblank[pipe].last = 0; | ||
5350 | } | ||
5351 | |||
5201 | static void hsw_power_well_post_disable(struct drm_i915_private *dev_priv) | 5352 | static void hsw_power_well_post_disable(struct drm_i915_private *dev_priv) |
5202 | { | 5353 | { |
5203 | struct drm_device *dev = dev_priv->dev; | 5354 | struct drm_device *dev = dev_priv->dev; |
5204 | enum pipe p; | 5355 | enum pipe pipe; |
5205 | unsigned long irqflags; | 5356 | unsigned long irqflags; |
5206 | 5357 | ||
5207 | /* | 5358 | /* |
@@ -5212,21 +5363,18 @@ static void hsw_power_well_post_disable(struct drm_i915_private *dev_priv) | |||
5212 | * FIXME: Should we do this in general in drm_vblank_post_modeset? | 5363 | * FIXME: Should we do this in general in drm_vblank_post_modeset? |
5213 | */ | 5364 | */ |
5214 | spin_lock_irqsave(&dev->vbl_lock, irqflags); | 5365 | spin_lock_irqsave(&dev->vbl_lock, irqflags); |
5215 | for_each_pipe(p) | 5366 | for_each_pipe(pipe) |
5216 | if (p != PIPE_A) | 5367 | if (pipe != PIPE_A) |
5217 | dev->vblank[p].last = 0; | 5368 | reset_vblank_counter(dev, pipe); |
5218 | spin_unlock_irqrestore(&dev->vbl_lock, irqflags); | 5369 | spin_unlock_irqrestore(&dev->vbl_lock, irqflags); |
5219 | } | 5370 | } |
5220 | 5371 | ||
5221 | static void hsw_set_power_well(struct drm_device *dev, | 5372 | static void hsw_set_power_well(struct drm_i915_private *dev_priv, |
5222 | struct i915_power_well *power_well, bool enable) | 5373 | struct i915_power_well *power_well, bool enable) |
5223 | { | 5374 | { |
5224 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5225 | bool is_enabled, enable_requested; | 5375 | bool is_enabled, enable_requested; |
5226 | uint32_t tmp; | 5376 | uint32_t tmp; |
5227 | 5377 | ||
5228 | WARN_ON(dev_priv->pc8.enabled); | ||
5229 | |||
5230 | tmp = I915_READ(HSW_PWR_WELL_DRIVER); | 5378 | tmp = I915_READ(HSW_PWR_WELL_DRIVER); |
5231 | is_enabled = tmp & HSW_PWR_WELL_STATE_ENABLED; | 5379 | is_enabled = tmp & HSW_PWR_WELL_STATE_ENABLED; |
5232 | enable_requested = tmp & HSW_PWR_WELL_ENABLE_REQUEST; | 5380 | enable_requested = tmp & HSW_PWR_WELL_ENABLE_REQUEST; |
@@ -5255,55 +5403,229 @@ static void hsw_set_power_well(struct drm_device *dev, | |||
5255 | } | 5403 | } |
5256 | } | 5404 | } |
5257 | 5405 | ||
5258 | static void __intel_power_well_get(struct drm_device *dev, | 5406 | static void hsw_power_well_sync_hw(struct drm_i915_private *dev_priv, |
5259 | struct i915_power_well *power_well) | 5407 | struct i915_power_well *power_well) |
5260 | { | 5408 | { |
5261 | struct drm_i915_private *dev_priv = dev->dev_private; | 5409 | hsw_set_power_well(dev_priv, power_well, power_well->count > 0); |
5262 | 5410 | ||
5263 | if (!power_well->count++ && power_well->set) { | 5411 | /* |
5264 | hsw_disable_package_c8(dev_priv); | 5412 | * We're taking over the BIOS, so clear any requests made by it since |
5265 | power_well->set(dev, power_well, true); | 5413 | * the driver is in charge now. |
5266 | } | 5414 | */ |
5415 | if (I915_READ(HSW_PWR_WELL_BIOS) & HSW_PWR_WELL_ENABLE_REQUEST) | ||
5416 | I915_WRITE(HSW_PWR_WELL_BIOS, 0); | ||
5417 | } | ||
5418 | |||
5419 | static void hsw_power_well_enable(struct drm_i915_private *dev_priv, | ||
5420 | struct i915_power_well *power_well) | ||
5421 | { | ||
5422 | hsw_set_power_well(dev_priv, power_well, true); | ||
5267 | } | 5423 | } |
5268 | 5424 | ||
5269 | static void __intel_power_well_put(struct drm_device *dev, | 5425 | static void hsw_power_well_disable(struct drm_i915_private *dev_priv, |
5270 | struct i915_power_well *power_well) | 5426 | struct i915_power_well *power_well) |
5271 | { | 5427 | { |
5272 | struct drm_i915_private *dev_priv = dev->dev_private; | 5428 | hsw_set_power_well(dev_priv, power_well, false); |
5429 | } | ||
5430 | |||
5431 | static void i9xx_always_on_power_well_noop(struct drm_i915_private *dev_priv, | ||
5432 | struct i915_power_well *power_well) | ||
5433 | { | ||
5434 | } | ||
5435 | |||
5436 | static bool i9xx_always_on_power_well_enabled(struct drm_i915_private *dev_priv, | ||
5437 | struct i915_power_well *power_well) | ||
5438 | { | ||
5439 | return true; | ||
5440 | } | ||
5441 | |||
5442 | static void vlv_set_power_well(struct drm_i915_private *dev_priv, | ||
5443 | struct i915_power_well *power_well, bool enable) | ||
5444 | { | ||
5445 | enum punit_power_well power_well_id = power_well->data; | ||
5446 | u32 mask; | ||
5447 | u32 state; | ||
5448 | u32 ctrl; | ||
5449 | |||
5450 | mask = PUNIT_PWRGT_MASK(power_well_id); | ||
5451 | state = enable ? PUNIT_PWRGT_PWR_ON(power_well_id) : | ||
5452 | PUNIT_PWRGT_PWR_GATE(power_well_id); | ||
5453 | |||
5454 | mutex_lock(&dev_priv->rps.hw_lock); | ||
5455 | |||
5456 | #define COND \ | ||
5457 | ((vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_STATUS) & mask) == state) | ||
5458 | |||
5459 | if (COND) | ||
5460 | goto out; | ||
5461 | |||
5462 | ctrl = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL); | ||
5463 | ctrl &= ~mask; | ||
5464 | ctrl |= state; | ||
5465 | vlv_punit_write(dev_priv, PUNIT_REG_PWRGT_CTRL, ctrl); | ||
5466 | |||
5467 | if (wait_for(COND, 100)) | ||
5468 | DRM_ERROR("timout setting power well state %08x (%08x)\n", | ||
5469 | state, | ||
5470 | vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL)); | ||
5471 | |||
5472 | #undef COND | ||
5473 | |||
5474 | out: | ||
5475 | mutex_unlock(&dev_priv->rps.hw_lock); | ||
5476 | } | ||
5477 | |||
5478 | static void vlv_power_well_sync_hw(struct drm_i915_private *dev_priv, | ||
5479 | struct i915_power_well *power_well) | ||
5480 | { | ||
5481 | vlv_set_power_well(dev_priv, power_well, power_well->count > 0); | ||
5482 | } | ||
5483 | |||
5484 | static void vlv_power_well_enable(struct drm_i915_private *dev_priv, | ||
5485 | struct i915_power_well *power_well) | ||
5486 | { | ||
5487 | vlv_set_power_well(dev_priv, power_well, true); | ||
5488 | } | ||
5489 | |||
5490 | static void vlv_power_well_disable(struct drm_i915_private *dev_priv, | ||
5491 | struct i915_power_well *power_well) | ||
5492 | { | ||
5493 | vlv_set_power_well(dev_priv, power_well, false); | ||
5494 | } | ||
5495 | |||
5496 | static bool vlv_power_well_enabled(struct drm_i915_private *dev_priv, | ||
5497 | struct i915_power_well *power_well) | ||
5498 | { | ||
5499 | int power_well_id = power_well->data; | ||
5500 | bool enabled = false; | ||
5501 | u32 mask; | ||
5502 | u32 state; | ||
5503 | u32 ctrl; | ||
5504 | |||
5505 | mask = PUNIT_PWRGT_MASK(power_well_id); | ||
5506 | ctrl = PUNIT_PWRGT_PWR_ON(power_well_id); | ||
5507 | |||
5508 | mutex_lock(&dev_priv->rps.hw_lock); | ||
5509 | |||
5510 | state = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_STATUS) & mask; | ||
5511 | /* | ||
5512 | * We only ever set the power-on and power-gate states, anything | ||
5513 | * else is unexpected. | ||
5514 | */ | ||
5515 | WARN_ON(state != PUNIT_PWRGT_PWR_ON(power_well_id) && | ||
5516 | state != PUNIT_PWRGT_PWR_GATE(power_well_id)); | ||
5517 | if (state == ctrl) | ||
5518 | enabled = true; | ||
5519 | |||
5520 | /* | ||
5521 | * A transient state at this point would mean some unexpected party | ||
5522 | * is poking at the power controls too. | ||
5523 | */ | ||
5524 | ctrl = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL) & mask; | ||
5525 | WARN_ON(ctrl != state); | ||
5526 | |||
5527 | mutex_unlock(&dev_priv->rps.hw_lock); | ||
5528 | |||
5529 | return enabled; | ||
5530 | } | ||
5273 | 5531 | ||
5274 | WARN_ON(!power_well->count); | 5532 | static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv, |
5533 | struct i915_power_well *power_well) | ||
5534 | { | ||
5535 | WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DISP2D); | ||
5536 | |||
5537 | vlv_set_power_well(dev_priv, power_well, true); | ||
5538 | |||
5539 | spin_lock_irq(&dev_priv->irq_lock); | ||
5540 | valleyview_enable_display_irqs(dev_priv); | ||
5541 | spin_unlock_irq(&dev_priv->irq_lock); | ||
5542 | |||
5543 | /* | ||
5544 | * During driver initialization we need to defer enabling hotplug | ||
5545 | * processing until fbdev is set up. | ||
5546 | */ | ||
5547 | if (dev_priv->enable_hotplug_processing) | ||
5548 | intel_hpd_init(dev_priv->dev); | ||
5549 | |||
5550 | i915_redisable_vga_power_on(dev_priv->dev); | ||
5551 | } | ||
5552 | |||
5553 | static void vlv_display_power_well_disable(struct drm_i915_private *dev_priv, | ||
5554 | struct i915_power_well *power_well) | ||
5555 | { | ||
5556 | struct drm_device *dev = dev_priv->dev; | ||
5557 | enum pipe pipe; | ||
5558 | |||
5559 | WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DISP2D); | ||
5560 | |||
5561 | spin_lock_irq(&dev_priv->irq_lock); | ||
5562 | for_each_pipe(pipe) | ||
5563 | __intel_set_cpu_fifo_underrun_reporting(dev, pipe, false); | ||
5564 | |||
5565 | valleyview_disable_display_irqs(dev_priv); | ||
5566 | spin_unlock_irq(&dev_priv->irq_lock); | ||
5567 | |||
5568 | spin_lock_irq(&dev->vbl_lock); | ||
5569 | for_each_pipe(pipe) | ||
5570 | reset_vblank_counter(dev, pipe); | ||
5571 | spin_unlock_irq(&dev->vbl_lock); | ||
5572 | |||
5573 | vlv_set_power_well(dev_priv, power_well, false); | ||
5574 | } | ||
5275 | 5575 | ||
5276 | if (!--power_well->count && power_well->set && | 5576 | static void check_power_well_state(struct drm_i915_private *dev_priv, |
5277 | i915_disable_power_well) { | 5577 | struct i915_power_well *power_well) |
5278 | power_well->set(dev, power_well, false); | 5578 | { |
5279 | hsw_enable_package_c8(dev_priv); | 5579 | bool enabled = power_well->ops->is_enabled(dev_priv, power_well); |
5580 | |||
5581 | if (power_well->always_on || !i915.disable_power_well) { | ||
5582 | if (!enabled) | ||
5583 | goto mismatch; | ||
5584 | |||
5585 | return; | ||
5280 | } | 5586 | } |
5587 | |||
5588 | if (enabled != (power_well->count > 0)) | ||
5589 | goto mismatch; | ||
5590 | |||
5591 | return; | ||
5592 | |||
5593 | mismatch: | ||
5594 | WARN(1, "state mismatch for '%s' (always_on %d hw state %d use-count %d disable_power_well %d\n", | ||
5595 | power_well->name, power_well->always_on, enabled, | ||
5596 | power_well->count, i915.disable_power_well); | ||
5281 | } | 5597 | } |
5282 | 5598 | ||
5283 | void intel_display_power_get(struct drm_device *dev, | 5599 | void intel_display_power_get(struct drm_i915_private *dev_priv, |
5284 | enum intel_display_power_domain domain) | 5600 | enum intel_display_power_domain domain) |
5285 | { | 5601 | { |
5286 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5287 | struct i915_power_domains *power_domains; | 5602 | struct i915_power_domains *power_domains; |
5288 | struct i915_power_well *power_well; | 5603 | struct i915_power_well *power_well; |
5289 | int i; | 5604 | int i; |
5290 | 5605 | ||
5606 | intel_runtime_pm_get(dev_priv); | ||
5607 | |||
5291 | power_domains = &dev_priv->power_domains; | 5608 | power_domains = &dev_priv->power_domains; |
5292 | 5609 | ||
5293 | mutex_lock(&power_domains->lock); | 5610 | mutex_lock(&power_domains->lock); |
5294 | 5611 | ||
5295 | for_each_power_well(i, power_well, BIT(domain), power_domains) | 5612 | for_each_power_well(i, power_well, BIT(domain), power_domains) { |
5296 | __intel_power_well_get(dev, power_well); | 5613 | if (!power_well->count++) { |
5614 | DRM_DEBUG_KMS("enabling %s\n", power_well->name); | ||
5615 | power_well->ops->enable(dev_priv, power_well); | ||
5616 | } | ||
5617 | |||
5618 | check_power_well_state(dev_priv, power_well); | ||
5619 | } | ||
5297 | 5620 | ||
5298 | power_domains->domain_use_count[domain]++; | 5621 | power_domains->domain_use_count[domain]++; |
5299 | 5622 | ||
5300 | mutex_unlock(&power_domains->lock); | 5623 | mutex_unlock(&power_domains->lock); |
5301 | } | 5624 | } |
5302 | 5625 | ||
5303 | void intel_display_power_put(struct drm_device *dev, | 5626 | void intel_display_power_put(struct drm_i915_private *dev_priv, |
5304 | enum intel_display_power_domain domain) | 5627 | enum intel_display_power_domain domain) |
5305 | { | 5628 | { |
5306 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5307 | struct i915_power_domains *power_domains; | 5629 | struct i915_power_domains *power_domains; |
5308 | struct i915_power_well *power_well; | 5630 | struct i915_power_well *power_well; |
5309 | int i; | 5631 | int i; |
@@ -5315,10 +5637,20 @@ void intel_display_power_put(struct drm_device *dev, | |||
5315 | WARN_ON(!power_domains->domain_use_count[domain]); | 5637 | WARN_ON(!power_domains->domain_use_count[domain]); |
5316 | power_domains->domain_use_count[domain]--; | 5638 | power_domains->domain_use_count[domain]--; |
5317 | 5639 | ||
5318 | for_each_power_well_rev(i, power_well, BIT(domain), power_domains) | 5640 | for_each_power_well_rev(i, power_well, BIT(domain), power_domains) { |
5319 | __intel_power_well_put(dev, power_well); | 5641 | WARN_ON(!power_well->count); |
5642 | |||
5643 | if (!--power_well->count && i915.disable_power_well) { | ||
5644 | DRM_DEBUG_KMS("disabling %s\n", power_well->name); | ||
5645 | power_well->ops->disable(dev_priv, power_well); | ||
5646 | } | ||
5647 | |||
5648 | check_power_well_state(dev_priv, power_well); | ||
5649 | } | ||
5320 | 5650 | ||
5321 | mutex_unlock(&power_domains->lock); | 5651 | mutex_unlock(&power_domains->lock); |
5652 | |||
5653 | intel_runtime_pm_put(dev_priv); | ||
5322 | } | 5654 | } |
5323 | 5655 | ||
5324 | static struct i915_power_domains *hsw_pwr; | 5656 | static struct i915_power_domains *hsw_pwr; |
@@ -5333,7 +5665,7 @@ void i915_request_power_well(void) | |||
5333 | 5665 | ||
5334 | dev_priv = container_of(hsw_pwr, struct drm_i915_private, | 5666 | dev_priv = container_of(hsw_pwr, struct drm_i915_private, |
5335 | power_domains); | 5667 | power_domains); |
5336 | intel_display_power_get(dev_priv->dev, POWER_DOMAIN_AUDIO); | 5668 | intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO); |
5337 | } | 5669 | } |
5338 | EXPORT_SYMBOL_GPL(i915_request_power_well); | 5670 | EXPORT_SYMBOL_GPL(i915_request_power_well); |
5339 | 5671 | ||
@@ -5347,29 +5679,99 @@ void i915_release_power_well(void) | |||
5347 | 5679 | ||
5348 | dev_priv = container_of(hsw_pwr, struct drm_i915_private, | 5680 | dev_priv = container_of(hsw_pwr, struct drm_i915_private, |
5349 | power_domains); | 5681 | power_domains); |
5350 | intel_display_power_put(dev_priv->dev, POWER_DOMAIN_AUDIO); | 5682 | intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO); |
5351 | } | 5683 | } |
5352 | EXPORT_SYMBOL_GPL(i915_release_power_well); | 5684 | EXPORT_SYMBOL_GPL(i915_release_power_well); |
5353 | 5685 | ||
5686 | #define POWER_DOMAIN_MASK (BIT(POWER_DOMAIN_NUM) - 1) | ||
5687 | |||
5688 | #define HSW_ALWAYS_ON_POWER_DOMAINS ( \ | ||
5689 | BIT(POWER_DOMAIN_PIPE_A) | \ | ||
5690 | BIT(POWER_DOMAIN_TRANSCODER_EDP) | \ | ||
5691 | BIT(POWER_DOMAIN_PORT_DDI_A_2_LANES) | \ | ||
5692 | BIT(POWER_DOMAIN_PORT_DDI_A_4_LANES) | \ | ||
5693 | BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ | ||
5694 | BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ | ||
5695 | BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ | ||
5696 | BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ | ||
5697 | BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) | \ | ||
5698 | BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) | \ | ||
5699 | BIT(POWER_DOMAIN_PORT_CRT) | \ | ||
5700 | BIT(POWER_DOMAIN_INIT)) | ||
5701 | #define HSW_DISPLAY_POWER_DOMAINS ( \ | ||
5702 | (POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS) | \ | ||
5703 | BIT(POWER_DOMAIN_INIT)) | ||
5704 | |||
5705 | #define BDW_ALWAYS_ON_POWER_DOMAINS ( \ | ||
5706 | HSW_ALWAYS_ON_POWER_DOMAINS | \ | ||
5707 | BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER)) | ||
5708 | #define BDW_DISPLAY_POWER_DOMAINS ( \ | ||
5709 | (POWER_DOMAIN_MASK & ~BDW_ALWAYS_ON_POWER_DOMAINS) | \ | ||
5710 | BIT(POWER_DOMAIN_INIT)) | ||
5711 | |||
5712 | #define VLV_ALWAYS_ON_POWER_DOMAINS BIT(POWER_DOMAIN_INIT) | ||
5713 | #define VLV_DISPLAY_POWER_DOMAINS POWER_DOMAIN_MASK | ||
5714 | |||
5715 | #define VLV_DPIO_CMN_BC_POWER_DOMAINS ( \ | ||
5716 | BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ | ||
5717 | BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ | ||
5718 | BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ | ||
5719 | BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ | ||
5720 | BIT(POWER_DOMAIN_PORT_CRT) | \ | ||
5721 | BIT(POWER_DOMAIN_INIT)) | ||
5722 | |||
5723 | #define VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS ( \ | ||
5724 | BIT(POWER_DOMAIN_PORT_DDI_B_2_LANES) | \ | ||
5725 | BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ | ||
5726 | BIT(POWER_DOMAIN_INIT)) | ||
5727 | |||
5728 | #define VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS ( \ | ||
5729 | BIT(POWER_DOMAIN_PORT_DDI_B_4_LANES) | \ | ||
5730 | BIT(POWER_DOMAIN_INIT)) | ||
5731 | |||
5732 | #define VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS ( \ | ||
5733 | BIT(POWER_DOMAIN_PORT_DDI_C_2_LANES) | \ | ||
5734 | BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ | ||
5735 | BIT(POWER_DOMAIN_INIT)) | ||
5736 | |||
5737 | #define VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS ( \ | ||
5738 | BIT(POWER_DOMAIN_PORT_DDI_C_4_LANES) | \ | ||
5739 | BIT(POWER_DOMAIN_INIT)) | ||
5740 | |||
5741 | static const struct i915_power_well_ops i9xx_always_on_power_well_ops = { | ||
5742 | .sync_hw = i9xx_always_on_power_well_noop, | ||
5743 | .enable = i9xx_always_on_power_well_noop, | ||
5744 | .disable = i9xx_always_on_power_well_noop, | ||
5745 | .is_enabled = i9xx_always_on_power_well_enabled, | ||
5746 | }; | ||
5747 | |||
5354 | static struct i915_power_well i9xx_always_on_power_well[] = { | 5748 | static struct i915_power_well i9xx_always_on_power_well[] = { |
5355 | { | 5749 | { |
5356 | .name = "always-on", | 5750 | .name = "always-on", |
5357 | .always_on = 1, | 5751 | .always_on = 1, |
5358 | .domains = POWER_DOMAIN_MASK, | 5752 | .domains = POWER_DOMAIN_MASK, |
5753 | .ops = &i9xx_always_on_power_well_ops, | ||
5359 | }, | 5754 | }, |
5360 | }; | 5755 | }; |
5361 | 5756 | ||
5757 | static const struct i915_power_well_ops hsw_power_well_ops = { | ||
5758 | .sync_hw = hsw_power_well_sync_hw, | ||
5759 | .enable = hsw_power_well_enable, | ||
5760 | .disable = hsw_power_well_disable, | ||
5761 | .is_enabled = hsw_power_well_enabled, | ||
5762 | }; | ||
5763 | |||
5362 | static struct i915_power_well hsw_power_wells[] = { | 5764 | static struct i915_power_well hsw_power_wells[] = { |
5363 | { | 5765 | { |
5364 | .name = "always-on", | 5766 | .name = "always-on", |
5365 | .always_on = 1, | 5767 | .always_on = 1, |
5366 | .domains = HSW_ALWAYS_ON_POWER_DOMAINS, | 5768 | .domains = HSW_ALWAYS_ON_POWER_DOMAINS, |
5769 | .ops = &i9xx_always_on_power_well_ops, | ||
5367 | }, | 5770 | }, |
5368 | { | 5771 | { |
5369 | .name = "display", | 5772 | .name = "display", |
5370 | .domains = POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS, | 5773 | .domains = HSW_DISPLAY_POWER_DOMAINS, |
5371 | .is_enabled = hsw_power_well_enabled, | 5774 | .ops = &hsw_power_well_ops, |
5372 | .set = hsw_set_power_well, | ||
5373 | }, | 5775 | }, |
5374 | }; | 5776 | }; |
5375 | 5777 | ||
@@ -5378,12 +5780,83 @@ static struct i915_power_well bdw_power_wells[] = { | |||
5378 | .name = "always-on", | 5780 | .name = "always-on", |
5379 | .always_on = 1, | 5781 | .always_on = 1, |
5380 | .domains = BDW_ALWAYS_ON_POWER_DOMAINS, | 5782 | .domains = BDW_ALWAYS_ON_POWER_DOMAINS, |
5783 | .ops = &i9xx_always_on_power_well_ops, | ||
5381 | }, | 5784 | }, |
5382 | { | 5785 | { |
5383 | .name = "display", | 5786 | .name = "display", |
5384 | .domains = POWER_DOMAIN_MASK & ~BDW_ALWAYS_ON_POWER_DOMAINS, | 5787 | .domains = BDW_DISPLAY_POWER_DOMAINS, |
5385 | .is_enabled = hsw_power_well_enabled, | 5788 | .ops = &hsw_power_well_ops, |
5386 | .set = hsw_set_power_well, | 5789 | }, |
5790 | }; | ||
5791 | |||
5792 | static const struct i915_power_well_ops vlv_display_power_well_ops = { | ||
5793 | .sync_hw = vlv_power_well_sync_hw, | ||
5794 | .enable = vlv_display_power_well_enable, | ||
5795 | .disable = vlv_display_power_well_disable, | ||
5796 | .is_enabled = vlv_power_well_enabled, | ||
5797 | }; | ||
5798 | |||
5799 | static const struct i915_power_well_ops vlv_dpio_power_well_ops = { | ||
5800 | .sync_hw = vlv_power_well_sync_hw, | ||
5801 | .enable = vlv_power_well_enable, | ||
5802 | .disable = vlv_power_well_disable, | ||
5803 | .is_enabled = vlv_power_well_enabled, | ||
5804 | }; | ||
5805 | |||
5806 | static struct i915_power_well vlv_power_wells[] = { | ||
5807 | { | ||
5808 | .name = "always-on", | ||
5809 | .always_on = 1, | ||
5810 | .domains = VLV_ALWAYS_ON_POWER_DOMAINS, | ||
5811 | .ops = &i9xx_always_on_power_well_ops, | ||
5812 | }, | ||
5813 | { | ||
5814 | .name = "display", | ||
5815 | .domains = VLV_DISPLAY_POWER_DOMAINS, | ||
5816 | .data = PUNIT_POWER_WELL_DISP2D, | ||
5817 | .ops = &vlv_display_power_well_ops, | ||
5818 | }, | ||
5819 | { | ||
5820 | .name = "dpio-common", | ||
5821 | .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS, | ||
5822 | .data = PUNIT_POWER_WELL_DPIO_CMN_BC, | ||
5823 | .ops = &vlv_dpio_power_well_ops, | ||
5824 | }, | ||
5825 | { | ||
5826 | .name = "dpio-tx-b-01", | ||
5827 | .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | | ||
5828 | VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | | ||
5829 | VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | | ||
5830 | VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, | ||
5831 | .ops = &vlv_dpio_power_well_ops, | ||
5832 | .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_01, | ||
5833 | }, | ||
5834 | { | ||
5835 | .name = "dpio-tx-b-23", | ||
5836 | .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | | ||
5837 | VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | | ||
5838 | VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | | ||
5839 | VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, | ||
5840 | .ops = &vlv_dpio_power_well_ops, | ||
5841 | .data = PUNIT_POWER_WELL_DPIO_TX_B_LANES_23, | ||
5842 | }, | ||
5843 | { | ||
5844 | .name = "dpio-tx-c-01", | ||
5845 | .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | | ||
5846 | VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | | ||
5847 | VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | | ||
5848 | VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, | ||
5849 | .ops = &vlv_dpio_power_well_ops, | ||
5850 | .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_01, | ||
5851 | }, | ||
5852 | { | ||
5853 | .name = "dpio-tx-c-23", | ||
5854 | .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | | ||
5855 | VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | | ||
5856 | VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | | ||
5857 | VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, | ||
5858 | .ops = &vlv_dpio_power_well_ops, | ||
5859 | .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23, | ||
5387 | }, | 5860 | }, |
5388 | }; | 5861 | }; |
5389 | 5862 | ||
@@ -5392,9 +5865,8 @@ static struct i915_power_well bdw_power_wells[] = { | |||
5392 | (power_domains)->power_well_count = ARRAY_SIZE(__power_wells); \ | 5865 | (power_domains)->power_well_count = ARRAY_SIZE(__power_wells); \ |
5393 | }) | 5866 | }) |
5394 | 5867 | ||
5395 | int intel_power_domains_init(struct drm_device *dev) | 5868 | int intel_power_domains_init(struct drm_i915_private *dev_priv) |
5396 | { | 5869 | { |
5397 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5398 | struct i915_power_domains *power_domains = &dev_priv->power_domains; | 5870 | struct i915_power_domains *power_domains = &dev_priv->power_domains; |
5399 | 5871 | ||
5400 | mutex_init(&power_domains->lock); | 5872 | mutex_init(&power_domains->lock); |
@@ -5403,12 +5875,14 @@ int intel_power_domains_init(struct drm_device *dev) | |||
5403 | * The enabling order will be from lower to higher indexed wells, | 5875 | * The enabling order will be from lower to higher indexed wells, |
5404 | * the disabling order is reversed. | 5876 | * the disabling order is reversed. |
5405 | */ | 5877 | */ |
5406 | if (IS_HASWELL(dev)) { | 5878 | if (IS_HASWELL(dev_priv->dev)) { |
5407 | set_power_wells(power_domains, hsw_power_wells); | 5879 | set_power_wells(power_domains, hsw_power_wells); |
5408 | hsw_pwr = power_domains; | 5880 | hsw_pwr = power_domains; |
5409 | } else if (IS_BROADWELL(dev)) { | 5881 | } else if (IS_BROADWELL(dev_priv->dev)) { |
5410 | set_power_wells(power_domains, bdw_power_wells); | 5882 | set_power_wells(power_domains, bdw_power_wells); |
5411 | hsw_pwr = power_domains; | 5883 | hsw_pwr = power_domains; |
5884 | } else if (IS_VALLEYVIEW(dev_priv->dev)) { | ||
5885 | set_power_wells(power_domains, vlv_power_wells); | ||
5412 | } else { | 5886 | } else { |
5413 | set_power_wells(power_domains, i9xx_always_on_power_well); | 5887 | set_power_wells(power_domains, i9xx_always_on_power_well); |
5414 | } | 5888 | } |
@@ -5416,58 +5890,38 @@ int intel_power_domains_init(struct drm_device *dev) | |||
5416 | return 0; | 5890 | return 0; |
5417 | } | 5891 | } |
5418 | 5892 | ||
5419 | void intel_power_domains_remove(struct drm_device *dev) | 5893 | void intel_power_domains_remove(struct drm_i915_private *dev_priv) |
5420 | { | 5894 | { |
5421 | hsw_pwr = NULL; | 5895 | hsw_pwr = NULL; |
5422 | } | 5896 | } |
5423 | 5897 | ||
5424 | static void intel_power_domains_resume(struct drm_device *dev) | 5898 | static void intel_power_domains_resume(struct drm_i915_private *dev_priv) |
5425 | { | 5899 | { |
5426 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5427 | struct i915_power_domains *power_domains = &dev_priv->power_domains; | 5900 | struct i915_power_domains *power_domains = &dev_priv->power_domains; |
5428 | struct i915_power_well *power_well; | 5901 | struct i915_power_well *power_well; |
5429 | int i; | 5902 | int i; |
5430 | 5903 | ||
5431 | mutex_lock(&power_domains->lock); | 5904 | mutex_lock(&power_domains->lock); |
5432 | for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains) { | 5905 | for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains) |
5433 | if (power_well->set) | 5906 | power_well->ops->sync_hw(dev_priv, power_well); |
5434 | power_well->set(dev, power_well, power_well->count > 0); | ||
5435 | } | ||
5436 | mutex_unlock(&power_domains->lock); | 5907 | mutex_unlock(&power_domains->lock); |
5437 | } | 5908 | } |
5438 | 5909 | ||
5439 | /* | 5910 | void intel_power_domains_init_hw(struct drm_i915_private *dev_priv) |
5440 | * Starting with Haswell, we have a "Power Down Well" that can be turned off | ||
5441 | * when not needed anymore. We have 4 registers that can request the power well | ||
5442 | * to be enabled, and it will only be disabled if none of the registers is | ||
5443 | * requesting it to be enabled. | ||
5444 | */ | ||
5445 | void intel_power_domains_init_hw(struct drm_device *dev) | ||
5446 | { | 5911 | { |
5447 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5448 | |||
5449 | /* For now, we need the power well to be always enabled. */ | 5912 | /* For now, we need the power well to be always enabled. */ |
5450 | intel_display_set_init_power(dev, true); | 5913 | intel_display_set_init_power(dev_priv, true); |
5451 | intel_power_domains_resume(dev); | 5914 | intel_power_domains_resume(dev_priv); |
5452 | |||
5453 | if (!(IS_HASWELL(dev) || IS_BROADWELL(dev))) | ||
5454 | return; | ||
5455 | |||
5456 | /* We're taking over the BIOS, so clear any requests made by it since | ||
5457 | * the driver is in charge now. */ | ||
5458 | if (I915_READ(HSW_PWR_WELL_BIOS) & HSW_PWR_WELL_ENABLE_REQUEST) | ||
5459 | I915_WRITE(HSW_PWR_WELL_BIOS, 0); | ||
5460 | } | 5915 | } |
5461 | 5916 | ||
5462 | /* Disables PC8 so we can use the GMBUS and DP AUX interrupts. */ | ||
5463 | void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv) | 5917 | void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv) |
5464 | { | 5918 | { |
5465 | hsw_disable_package_c8(dev_priv); | 5919 | intel_runtime_pm_get(dev_priv); |
5466 | } | 5920 | } |
5467 | 5921 | ||
5468 | void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv) | 5922 | void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv) |
5469 | { | 5923 | { |
5470 | hsw_enable_package_c8(dev_priv); | 5924 | intel_runtime_pm_put(dev_priv); |
5471 | } | 5925 | } |
5472 | 5926 | ||
5473 | void intel_runtime_pm_get(struct drm_i915_private *dev_priv) | 5927 | void intel_runtime_pm_get(struct drm_i915_private *dev_priv) |
@@ -5499,8 +5953,6 @@ void intel_init_runtime_pm(struct drm_i915_private *dev_priv) | |||
5499 | struct drm_device *dev = dev_priv->dev; | 5953 | struct drm_device *dev = dev_priv->dev; |
5500 | struct device *device = &dev->pdev->dev; | 5954 | struct device *device = &dev->pdev->dev; |
5501 | 5955 | ||
5502 | dev_priv->pm.suspended = false; | ||
5503 | |||
5504 | if (!HAS_RUNTIME_PM(dev)) | 5956 | if (!HAS_RUNTIME_PM(dev)) |
5505 | return; | 5957 | return; |
5506 | 5958 | ||
@@ -5509,6 +5961,8 @@ void intel_init_runtime_pm(struct drm_i915_private *dev_priv) | |||
5509 | pm_runtime_set_autosuspend_delay(device, 10000); /* 10s */ | 5961 | pm_runtime_set_autosuspend_delay(device, 10000); /* 10s */ |
5510 | pm_runtime_mark_last_busy(device); | 5962 | pm_runtime_mark_last_busy(device); |
5511 | pm_runtime_use_autosuspend(device); | 5963 | pm_runtime_use_autosuspend(device); |
5964 | |||
5965 | pm_runtime_put_autosuspend(device); | ||
5512 | } | 5966 | } |
5513 | 5967 | ||
5514 | void intel_fini_runtime_pm(struct drm_i915_private *dev_priv) | 5968 | void intel_fini_runtime_pm(struct drm_i915_private *dev_priv) |
@@ -5560,7 +6014,7 @@ void intel_init_pm(struct drm_device *dev) | |||
5560 | 6014 | ||
5561 | /* For FIFO watermark updates */ | 6015 | /* For FIFO watermark updates */ |
5562 | if (HAS_PCH_SPLIT(dev)) { | 6016 | if (HAS_PCH_SPLIT(dev)) { |
5563 | intel_setup_wm_latency(dev); | 6017 | ilk_setup_wm_latency(dev); |
5564 | 6018 | ||
5565 | if ((IS_GEN5(dev) && dev_priv->wm.pri_latency[1] && | 6019 | if ((IS_GEN5(dev) && dev_priv->wm.pri_latency[1] && |
5566 | dev_priv->wm.spr_latency[1] && dev_priv->wm.cur_latency[1]) || | 6020 | dev_priv->wm.spr_latency[1] && dev_priv->wm.cur_latency[1]) || |
@@ -5731,13 +6185,9 @@ void intel_pm_setup(struct drm_device *dev) | |||
5731 | 6185 | ||
5732 | mutex_init(&dev_priv->rps.hw_lock); | 6186 | mutex_init(&dev_priv->rps.hw_lock); |
5733 | 6187 | ||
5734 | mutex_init(&dev_priv->pc8.lock); | ||
5735 | dev_priv->pc8.requirements_met = false; | ||
5736 | dev_priv->pc8.gpu_idle = false; | ||
5737 | dev_priv->pc8.irqs_disabled = false; | ||
5738 | dev_priv->pc8.enabled = false; | ||
5739 | dev_priv->pc8.disable_count = 2; /* requirements_met + gpu_idle */ | ||
5740 | INIT_DELAYED_WORK(&dev_priv->pc8.enable_work, hsw_enable_pc8_work); | ||
5741 | INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work, | 6188 | INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work, |
5742 | intel_gen6_powersave_work); | 6189 | intel_gen6_powersave_work); |
6190 | |||
6191 | dev_priv->pm.suspended = false; | ||
6192 | dev_priv->pm.irqs_disabled = false; | ||
5743 | } | 6193 | } |