diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_cdclk.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_cdclk.c | 57 |
1 files changed, 11 insertions, 46 deletions
diff --git a/drivers/gpu/drm/i915/intel_cdclk.c b/drivers/gpu/drm/i915/intel_cdclk.c index 29075c763428..25e3aba9cded 100644 --- a/drivers/gpu/drm/i915/intel_cdclk.c +++ b/drivers/gpu/drm/i915/intel_cdclk.c | |||
@@ -2138,16 +2138,8 @@ void intel_set_cdclk(struct drm_i915_private *dev_priv, | |||
2138 | static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv, | 2138 | static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv, |
2139 | int pixel_rate) | 2139 | int pixel_rate) |
2140 | { | 2140 | { |
2141 | if (INTEL_GEN(dev_priv) >= 10) | 2141 | if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) |
2142 | return DIV_ROUND_UP(pixel_rate, 2); | 2142 | return DIV_ROUND_UP(pixel_rate, 2); |
2143 | else if (IS_GEMINILAKE(dev_priv)) | ||
2144 | /* | ||
2145 | * FIXME: Avoid using a pixel clock that is more than 99% of the cdclk | ||
2146 | * as a temporary workaround. Use a higher cdclk instead. (Note that | ||
2147 | * intel_compute_max_dotclk() limits the max pixel clock to 99% of max | ||
2148 | * cdclk.) | ||
2149 | */ | ||
2150 | return DIV_ROUND_UP(pixel_rate * 100, 2 * 99); | ||
2151 | else if (IS_GEN9(dev_priv) || | 2143 | else if (IS_GEN9(dev_priv) || |
2152 | IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) | 2144 | IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) |
2153 | return pixel_rate; | 2145 | return pixel_rate; |
@@ -2543,14 +2535,8 @@ static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv) | |||
2543 | { | 2535 | { |
2544 | int max_cdclk_freq = dev_priv->max_cdclk_freq; | 2536 | int max_cdclk_freq = dev_priv->max_cdclk_freq; |
2545 | 2537 | ||
2546 | if (INTEL_GEN(dev_priv) >= 10) | 2538 | if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) |
2547 | return 2 * max_cdclk_freq; | 2539 | return 2 * max_cdclk_freq; |
2548 | else if (IS_GEMINILAKE(dev_priv)) | ||
2549 | /* | ||
2550 | * FIXME: Limiting to 99% as a temporary workaround. See | ||
2551 | * intel_min_cdclk() for details. | ||
2552 | */ | ||
2553 | return 2 * max_cdclk_freq * 99 / 100; | ||
2554 | else if (IS_GEN9(dev_priv) || | 2540 | else if (IS_GEN9(dev_priv) || |
2555 | IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) | 2541 | IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) |
2556 | return max_cdclk_freq; | 2542 | return max_cdclk_freq; |
@@ -2674,37 +2660,18 @@ static int cnp_rawclk(struct drm_i915_private *dev_priv) | |||
2674 | fraction = 200; | 2660 | fraction = 200; |
2675 | } | 2661 | } |
2676 | 2662 | ||
2677 | rawclk = CNP_RAWCLK_DIV((divider / 1000) - 1); | 2663 | rawclk = CNP_RAWCLK_DIV(divider / 1000); |
2678 | if (fraction) | 2664 | if (fraction) { |
2679 | rawclk |= CNP_RAWCLK_FRAC(DIV_ROUND_CLOSEST(1000, | 2665 | int numerator = 1; |
2680 | fraction) - 1); | ||
2681 | |||
2682 | I915_WRITE(PCH_RAWCLK_FREQ, rawclk); | ||
2683 | return divider + fraction; | ||
2684 | } | ||
2685 | 2666 | ||
2686 | static int icp_rawclk(struct drm_i915_private *dev_priv) | 2667 | rawclk |= CNP_RAWCLK_DEN(DIV_ROUND_CLOSEST(numerator * 1000, |
2687 | { | 2668 | fraction) - 1); |
2688 | u32 rawclk; | 2669 | if (HAS_PCH_ICP(dev_priv)) |
2689 | int divider, numerator, denominator, frequency; | 2670 | rawclk |= ICP_RAWCLK_NUM(numerator); |
2690 | |||
2691 | if (I915_READ(SFUSE_STRAP) & SFUSE_STRAP_RAW_FREQUENCY) { | ||
2692 | frequency = 24000; | ||
2693 | divider = 23; | ||
2694 | numerator = 0; | ||
2695 | denominator = 0; | ||
2696 | } else { | ||
2697 | frequency = 19200; | ||
2698 | divider = 18; | ||
2699 | numerator = 1; | ||
2700 | denominator = 4; | ||
2701 | } | 2671 | } |
2702 | 2672 | ||
2703 | rawclk = CNP_RAWCLK_DIV(divider) | ICP_RAWCLK_NUM(numerator) | | ||
2704 | ICP_RAWCLK_DEN(denominator); | ||
2705 | |||
2706 | I915_WRITE(PCH_RAWCLK_FREQ, rawclk); | 2673 | I915_WRITE(PCH_RAWCLK_FREQ, rawclk); |
2707 | return frequency; | 2674 | return divider + fraction; |
2708 | } | 2675 | } |
2709 | 2676 | ||
2710 | static int pch_rawclk(struct drm_i915_private *dev_priv) | 2677 | static int pch_rawclk(struct drm_i915_private *dev_priv) |
@@ -2754,9 +2721,7 @@ static int g4x_hrawclk(struct drm_i915_private *dev_priv) | |||
2754 | */ | 2721 | */ |
2755 | void intel_update_rawclk(struct drm_i915_private *dev_priv) | 2722 | void intel_update_rawclk(struct drm_i915_private *dev_priv) |
2756 | { | 2723 | { |
2757 | if (HAS_PCH_ICP(dev_priv)) | 2724 | if (HAS_PCH_CNP(dev_priv) || HAS_PCH_ICP(dev_priv)) |
2758 | dev_priv->rawclk_freq = icp_rawclk(dev_priv); | ||
2759 | else if (HAS_PCH_CNP(dev_priv)) | ||
2760 | dev_priv->rawclk_freq = cnp_rawclk(dev_priv); | 2725 | dev_priv->rawclk_freq = cnp_rawclk(dev_priv); |
2761 | else if (HAS_PCH_SPLIT(dev_priv)) | 2726 | else if (HAS_PCH_SPLIT(dev_priv)) |
2762 | dev_priv->rawclk_freq = pch_rawclk(dev_priv); | 2727 | dev_priv->rawclk_freq = pch_rawclk(dev_priv); |