diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 86 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 86 |
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 | ||
6354 | static 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 | |||
6369 | void 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 | |||
6440 | static void ironlake_init_clock_gating(struct drm_device *dev) | 6354 | static 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 | ||
2495 | static 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 | |||
2510 | void 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 | |||