aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_display.c86
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c86
2 files changed, 86 insertions, 86 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index d3982e9c6ff6..4fb1982475d2 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6351,92 +6351,6 @@ static const struct drm_mode_config_funcs intel_mode_funcs = {
6351 .output_poll_changed = intel_fb_output_poll_changed, 6351 .output_poll_changed = intel_fb_output_poll_changed,
6352}; 6352};
6353 6353
6354static unsigned long intel_pxfreq(u32 vidfreq)
6355{
6356 unsigned long freq;
6357 int div = (vidfreq & 0x3f0000) >> 16;
6358 int post = (vidfreq & 0x3000) >> 12;
6359 int pre = (vidfreq & 0x7);
6360
6361 if (!pre)
6362 return 0;
6363
6364 freq = ((div * 133333) / ((1<<post) * pre));
6365
6366 return freq;
6367}
6368
6369void intel_init_emon(struct drm_device *dev)
6370{
6371 struct drm_i915_private *dev_priv = dev->dev_private;
6372 u32 lcfuse;
6373 u8 pxw[16];
6374 int i;
6375
6376 /* Disable to program */
6377 I915_WRITE(ECR, 0);
6378 POSTING_READ(ECR);
6379
6380 /* Program energy weights for various events */
6381 I915_WRITE(SDEW, 0x15040d00);
6382 I915_WRITE(CSIEW0, 0x007f0000);
6383 I915_WRITE(CSIEW1, 0x1e220004);
6384 I915_WRITE(CSIEW2, 0x04000004);
6385
6386 for (i = 0; i < 5; i++)
6387 I915_WRITE(PEW + (i * 4), 0);
6388 for (i = 0; i < 3; i++)
6389 I915_WRITE(DEW + (i * 4), 0);
6390
6391 /* Program P-state weights to account for frequency power adjustment */
6392 for (i = 0; i < 16; i++) {
6393 u32 pxvidfreq = I915_READ(PXVFREQ_BASE + (i * 4));
6394 unsigned long freq = intel_pxfreq(pxvidfreq);
6395 unsigned long vid = (pxvidfreq & PXVFREQ_PX_MASK) >>
6396 PXVFREQ_PX_SHIFT;
6397 unsigned long val;
6398
6399 val = vid * vid;
6400 val *= (freq / 1000);
6401 val *= 255;
6402 val /= (127*127*900);
6403 if (val > 0xff)
6404 DRM_ERROR("bad pxval: %ld\n", val);
6405 pxw[i] = val;
6406 }
6407 /* Render standby states get 0 weight */
6408 pxw[14] = 0;
6409 pxw[15] = 0;
6410
6411 for (i = 0; i < 4; i++) {
6412 u32 val = (pxw[i*4] << 24) | (pxw[(i*4)+1] << 16) |
6413 (pxw[(i*4)+2] << 8) | (pxw[(i*4)+3]);
6414 I915_WRITE(PXW + (i * 4), val);
6415 }
6416
6417 /* Adjust magic regs to magic values (more experimental results) */
6418 I915_WRITE(OGW0, 0);
6419 I915_WRITE(OGW1, 0);
6420 I915_WRITE(EG0, 0x00007f00);
6421 I915_WRITE(EG1, 0x0000000e);
6422 I915_WRITE(EG2, 0x000e0000);
6423 I915_WRITE(EG3, 0x68000300);
6424 I915_WRITE(EG4, 0x42000000);
6425 I915_WRITE(EG5, 0x00140031);
6426 I915_WRITE(EG6, 0);
6427 I915_WRITE(EG7, 0);
6428
6429 for (i = 0; i < 8; i++)
6430 I915_WRITE(PXWL + (i * 4), 0);
6431
6432 /* Enable PMON + select events */
6433 I915_WRITE(ECR, 0x80000019);
6434
6435 lcfuse = I915_READ(LCFUSE02);
6436
6437 dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK);
6438}
6439
6440static void ironlake_init_clock_gating(struct drm_device *dev) 6354static void ironlake_init_clock_gating(struct drm_device *dev)
6441{ 6355{
6442 struct drm_i915_private *dev_priv = dev->dev_private; 6356 struct drm_i915_private *dev_priv = dev->dev_private;
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 2f45de3339bf..832130e57731 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2492,3 +2492,89 @@ void ironlake_enable_rc6(struct drm_device *dev)
2492 mutex_unlock(&dev->struct_mutex); 2492 mutex_unlock(&dev->struct_mutex);
2493} 2493}
2494 2494
2495static unsigned long intel_pxfreq(u32 vidfreq)
2496{
2497 unsigned long freq;
2498 int div = (vidfreq & 0x3f0000) >> 16;
2499 int post = (vidfreq & 0x3000) >> 12;
2500 int pre = (vidfreq & 0x7);
2501
2502 if (!pre)
2503 return 0;
2504
2505 freq = ((div * 133333) / ((1<<post) * pre));
2506
2507 return freq;
2508}
2509
2510void intel_init_emon(struct drm_device *dev)
2511{
2512 struct drm_i915_private *dev_priv = dev->dev_private;
2513 u32 lcfuse;
2514 u8 pxw[16];
2515 int i;
2516
2517 /* Disable to program */
2518 I915_WRITE(ECR, 0);
2519 POSTING_READ(ECR);
2520
2521 /* Program energy weights for various events */
2522 I915_WRITE(SDEW, 0x15040d00);
2523 I915_WRITE(CSIEW0, 0x007f0000);
2524 I915_WRITE(CSIEW1, 0x1e220004);
2525 I915_WRITE(CSIEW2, 0x04000004);
2526
2527 for (i = 0; i < 5; i++)
2528 I915_WRITE(PEW + (i * 4), 0);
2529 for (i = 0; i < 3; i++)
2530 I915_WRITE(DEW + (i * 4), 0);
2531
2532 /* Program P-state weights to account for frequency power adjustment */
2533 for (i = 0; i < 16; i++) {
2534 u32 pxvidfreq = I915_READ(PXVFREQ_BASE + (i * 4));
2535 unsigned long freq = intel_pxfreq(pxvidfreq);
2536 unsigned long vid = (pxvidfreq & PXVFREQ_PX_MASK) >>
2537 PXVFREQ_PX_SHIFT;
2538 unsigned long val;
2539
2540 val = vid * vid;
2541 val *= (freq / 1000);
2542 val *= 255;
2543 val /= (127*127*900);
2544 if (val > 0xff)
2545 DRM_ERROR("bad pxval: %ld\n", val);
2546 pxw[i] = val;
2547 }
2548 /* Render standby states get 0 weight */
2549 pxw[14] = 0;
2550 pxw[15] = 0;
2551
2552 for (i = 0; i < 4; i++) {
2553 u32 val = (pxw[i*4] << 24) | (pxw[(i*4)+1] << 16) |
2554 (pxw[(i*4)+2] << 8) | (pxw[(i*4)+3]);
2555 I915_WRITE(PXW + (i * 4), val);
2556 }
2557
2558 /* Adjust magic regs to magic values (more experimental results) */
2559 I915_WRITE(OGW0, 0);
2560 I915_WRITE(OGW1, 0);
2561 I915_WRITE(EG0, 0x00007f00);
2562 I915_WRITE(EG1, 0x0000000e);
2563 I915_WRITE(EG2, 0x000e0000);
2564 I915_WRITE(EG3, 0x68000300);
2565 I915_WRITE(EG4, 0x42000000);
2566 I915_WRITE(EG5, 0x00140031);
2567 I915_WRITE(EG6, 0);
2568 I915_WRITE(EG7, 0);
2569
2570 for (i = 0; i < 8; i++)
2571 I915_WRITE(PXWL + (i * 4), 0);
2572
2573 /* Enable PMON + select events */
2574 I915_WRITE(ECR, 0x80000019);
2575
2576 lcfuse = I915_READ(LCFUSE02);
2577
2578 dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK);
2579}
2580