diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-04-26 17:28:17 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-05-03 05:18:31 -0400 |
commit | c921aba84ae5bf74b5386b4d2e01a5706ae4b878 (patch) | |
tree | 67ae23e30e2f031349ea6a584c97ea2e9a89e875 /drivers/gpu/drm/i915/intel_pm.c | |
parent | 4225d0f219d22440e33a5686bf806356cb25bcf5 (diff) |
drm/i915: move pnv|ilk_gem_mem_freq to intel_pm.c
Because this is the place where we actually use the results of
them.
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index e0f016c24dce..6ddf80774335 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -526,6 +526,113 @@ out_disable: | |||
526 | } | 526 | } |
527 | } | 527 | } |
528 | 528 | ||
529 | static void i915_pineview_get_mem_freq(struct drm_device *dev) | ||
530 | { | ||
531 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
532 | u32 tmp; | ||
533 | |||
534 | tmp = I915_READ(CLKCFG); | ||
535 | |||
536 | switch (tmp & CLKCFG_FSB_MASK) { | ||
537 | case CLKCFG_FSB_533: | ||
538 | dev_priv->fsb_freq = 533; /* 133*4 */ | ||
539 | break; | ||
540 | case CLKCFG_FSB_800: | ||
541 | dev_priv->fsb_freq = 800; /* 200*4 */ | ||
542 | break; | ||
543 | case CLKCFG_FSB_667: | ||
544 | dev_priv->fsb_freq = 667; /* 167*4 */ | ||
545 | break; | ||
546 | case CLKCFG_FSB_400: | ||
547 | dev_priv->fsb_freq = 400; /* 100*4 */ | ||
548 | break; | ||
549 | } | ||
550 | |||
551 | switch (tmp & CLKCFG_MEM_MASK) { | ||
552 | case CLKCFG_MEM_533: | ||
553 | dev_priv->mem_freq = 533; | ||
554 | break; | ||
555 | case CLKCFG_MEM_667: | ||
556 | dev_priv->mem_freq = 667; | ||
557 | break; | ||
558 | case CLKCFG_MEM_800: | ||
559 | dev_priv->mem_freq = 800; | ||
560 | break; | ||
561 | } | ||
562 | |||
563 | /* detect pineview DDR3 setting */ | ||
564 | tmp = I915_READ(CSHRDDR3CTL); | ||
565 | dev_priv->is_ddr3 = (tmp & CSHRDDR3CTL_DDR3) ? 1 : 0; | ||
566 | } | ||
567 | |||
568 | static void i915_ironlake_get_mem_freq(struct drm_device *dev) | ||
569 | { | ||
570 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
571 | u16 ddrpll, csipll; | ||
572 | |||
573 | ddrpll = I915_READ16(DDRMPLL1); | ||
574 | csipll = I915_READ16(CSIPLL0); | ||
575 | |||
576 | switch (ddrpll & 0xff) { | ||
577 | case 0xc: | ||
578 | dev_priv->mem_freq = 800; | ||
579 | break; | ||
580 | case 0x10: | ||
581 | dev_priv->mem_freq = 1066; | ||
582 | break; | ||
583 | case 0x14: | ||
584 | dev_priv->mem_freq = 1333; | ||
585 | break; | ||
586 | case 0x18: | ||
587 | dev_priv->mem_freq = 1600; | ||
588 | break; | ||
589 | default: | ||
590 | DRM_DEBUG_DRIVER("unknown memory frequency 0x%02x\n", | ||
591 | ddrpll & 0xff); | ||
592 | dev_priv->mem_freq = 0; | ||
593 | break; | ||
594 | } | ||
595 | |||
596 | dev_priv->r_t = dev_priv->mem_freq; | ||
597 | |||
598 | switch (csipll & 0x3ff) { | ||
599 | case 0x00c: | ||
600 | dev_priv->fsb_freq = 3200; | ||
601 | break; | ||
602 | case 0x00e: | ||
603 | dev_priv->fsb_freq = 3733; | ||
604 | break; | ||
605 | case 0x010: | ||
606 | dev_priv->fsb_freq = 4266; | ||
607 | break; | ||
608 | case 0x012: | ||
609 | dev_priv->fsb_freq = 4800; | ||
610 | break; | ||
611 | case 0x014: | ||
612 | dev_priv->fsb_freq = 5333; | ||
613 | break; | ||
614 | case 0x016: | ||
615 | dev_priv->fsb_freq = 5866; | ||
616 | break; | ||
617 | case 0x018: | ||
618 | dev_priv->fsb_freq = 6400; | ||
619 | break; | ||
620 | default: | ||
621 | DRM_DEBUG_DRIVER("unknown fsb frequency 0x%04x\n", | ||
622 | csipll & 0x3ff); | ||
623 | dev_priv->fsb_freq = 0; | ||
624 | break; | ||
625 | } | ||
626 | |||
627 | if (dev_priv->fsb_freq == 3200) { | ||
628 | dev_priv->c_m = 0; | ||
629 | } else if (dev_priv->fsb_freq > 3200 && dev_priv->fsb_freq <= 4800) { | ||
630 | dev_priv->c_m = 1; | ||
631 | } else { | ||
632 | dev_priv->c_m = 2; | ||
633 | } | ||
634 | } | ||
635 | |||
529 | static const struct cxsr_latency cxsr_latency_table[] = { | 636 | static const struct cxsr_latency cxsr_latency_table[] = { |
530 | {1, 0, 800, 400, 3382, 33382, 3983, 33983}, /* DDR2-400 SC */ | 637 | {1, 0, 800, 400, 3382, 33382, 3983, 33983}, /* DDR2-400 SC */ |
531 | {1, 0, 800, 667, 3354, 33354, 3807, 33807}, /* DDR2-667 SC */ | 638 | {1, 0, 800, 667, 3354, 33354, 3807, 33807}, /* DDR2-667 SC */ |
@@ -3440,6 +3547,12 @@ void intel_init_pm(struct drm_device *dev) | |||
3440 | /* 855GM needs testing */ | 3547 | /* 855GM needs testing */ |
3441 | } | 3548 | } |
3442 | 3549 | ||
3550 | /* For cxsr */ | ||
3551 | if (IS_PINEVIEW(dev)) | ||
3552 | i915_pineview_get_mem_freq(dev); | ||
3553 | else if (IS_GEN5(dev)) | ||
3554 | i915_ironlake_get_mem_freq(dev); | ||
3555 | |||
3443 | /* For FIFO watermark updates */ | 3556 | /* For FIFO watermark updates */ |
3444 | if (HAS_PCH_SPLIT(dev)) { | 3557 | if (HAS_PCH_SPLIT(dev)) { |
3445 | dev_priv->display.force_wake_get = __gen6_gt_force_wake_get; | 3558 | dev_priv->display.force_wake_get = __gen6_gt_force_wake_get; |