diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 31 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 39 |
3 files changed, 26 insertions, 57 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index a00ee3da632f..e9ac3603fbdb 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -107,6 +107,19 @@ struct intel_pch_pll { | |||
107 | }; | 107 | }; |
108 | #define I915_NUM_PLLS 2 | 108 | #define I915_NUM_PLLS 2 |
109 | 109 | ||
110 | /* Used by dp and fdi links */ | ||
111 | struct intel_link_m_n { | ||
112 | uint32_t tu; | ||
113 | uint32_t gmch_m; | ||
114 | uint32_t gmch_n; | ||
115 | uint32_t link_m; | ||
116 | uint32_t link_n; | ||
117 | }; | ||
118 | |||
119 | void intel_link_compute_m_n(int bpp, int nlanes, | ||
120 | int pixel_clock, int link_clock, | ||
121 | struct intel_link_m_n *m_n); | ||
122 | |||
110 | struct intel_ddi_plls { | 123 | struct intel_ddi_plls { |
111 | int spll_refcount; | 124 | int spll_refcount; |
112 | int wrpll1_refcount; | 125 | int wrpll1_refcount; |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 953796c84fbd..34832bc04931 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -3951,16 +3951,8 @@ static int i830_get_display_clock_speed(struct drm_device *dev) | |||
3951 | return 133000; | 3951 | return 133000; |
3952 | } | 3952 | } |
3953 | 3953 | ||
3954 | struct fdi_m_n { | ||
3955 | u32 tu; | ||
3956 | u32 gmch_m; | ||
3957 | u32 gmch_n; | ||
3958 | u32 link_m; | ||
3959 | u32 link_n; | ||
3960 | }; | ||
3961 | |||
3962 | static void | 3954 | static void |
3963 | fdi_reduce_ratio(u32 *num, u32 *den) | 3955 | intel_reduce_ratio(uint32_t *num, uint32_t *den) |
3964 | { | 3956 | { |
3965 | while (*num > 0xffffff || *den > 0xffffff) { | 3957 | while (*num > 0xffffff || *den > 0xffffff) { |
3966 | *num >>= 1; | 3958 | *num >>= 1; |
@@ -3968,20 +3960,18 @@ fdi_reduce_ratio(u32 *num, u32 *den) | |||
3968 | } | 3960 | } |
3969 | } | 3961 | } |
3970 | 3962 | ||
3971 | static void | 3963 | void |
3972 | ironlake_compute_m_n(int bits_per_pixel, int nlanes, int pixel_clock, | 3964 | intel_link_compute_m_n(int bits_per_pixel, int nlanes, |
3973 | int link_clock, struct fdi_m_n *m_n) | 3965 | int pixel_clock, int link_clock, |
3966 | struct intel_link_m_n *m_n) | ||
3974 | { | 3967 | { |
3975 | m_n->tu = 64; /* default size */ | 3968 | m_n->tu = 64; |
3976 | |||
3977 | /* BUG_ON(pixel_clock > INT_MAX / 36); */ | ||
3978 | m_n->gmch_m = bits_per_pixel * pixel_clock; | 3969 | m_n->gmch_m = bits_per_pixel * pixel_clock; |
3979 | m_n->gmch_n = link_clock * nlanes * 8; | 3970 | m_n->gmch_n = link_clock * nlanes * 8; |
3980 | fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); | 3971 | intel_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); |
3981 | |||
3982 | m_n->link_m = pixel_clock; | 3972 | m_n->link_m = pixel_clock; |
3983 | m_n->link_n = link_clock; | 3973 | m_n->link_n = link_clock; |
3984 | fdi_reduce_ratio(&m_n->link_m, &m_n->link_n); | 3974 | intel_reduce_ratio(&m_n->link_m, &m_n->link_n); |
3985 | } | 3975 | } |
3986 | 3976 | ||
3987 | static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) | 3977 | static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) |
@@ -5095,7 +5085,7 @@ static void ironlake_set_m_n(struct drm_crtc *crtc, | |||
5095 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 5085 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
5096 | enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder; | 5086 | enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder; |
5097 | struct intel_encoder *intel_encoder, *edp_encoder = NULL; | 5087 | struct intel_encoder *intel_encoder, *edp_encoder = NULL; |
5098 | struct fdi_m_n m_n = {0}; | 5088 | struct intel_link_m_n m_n = {0}; |
5099 | int target_clock, pixel_multiplier, lane, link_bw; | 5089 | int target_clock, pixel_multiplier, lane, link_bw; |
5100 | bool is_dp = false, is_cpu_edp = false; | 5090 | bool is_dp = false, is_cpu_edp = false; |
5101 | 5091 | ||
@@ -5153,8 +5143,7 @@ static void ironlake_set_m_n(struct drm_crtc *crtc, | |||
5153 | 5143 | ||
5154 | if (pixel_multiplier > 1) | 5144 | if (pixel_multiplier > 1) |
5155 | link_bw *= pixel_multiplier; | 5145 | link_bw *= pixel_multiplier; |
5156 | ironlake_compute_m_n(intel_crtc->bpp, lane, target_clock, link_bw, | 5146 | intel_link_compute_m_n(intel_crtc->bpp, lane, target_clock, link_bw, &m_n); |
5157 | &m_n); | ||
5158 | 5147 | ||
5159 | I915_WRITE(PIPE_DATA_M1(cpu_transcoder), TU_SIZE(m_n.tu) | m_n.gmch_m); | 5148 | I915_WRITE(PIPE_DATA_M1(cpu_transcoder), TU_SIZE(m_n.tu) | m_n.gmch_m); |
5160 | I915_WRITE(PIPE_DATA_N1(cpu_transcoder), m_n.gmch_n); | 5149 | I915_WRITE(PIPE_DATA_N1(cpu_transcoder), m_n.gmch_n); |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 84652ca3b161..b2130bc6c297 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -790,39 +790,6 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, | |||
790 | return false; | 790 | return false; |
791 | } | 791 | } |
792 | 792 | ||
793 | struct intel_dp_m_n { | ||
794 | uint32_t tu; | ||
795 | uint32_t gmch_m; | ||
796 | uint32_t gmch_n; | ||
797 | uint32_t link_m; | ||
798 | uint32_t link_n; | ||
799 | }; | ||
800 | |||
801 | static void | ||
802 | intel_reduce_ratio(uint32_t *num, uint32_t *den) | ||
803 | { | ||
804 | while (*num > 0xffffff || *den > 0xffffff) { | ||
805 | *num >>= 1; | ||
806 | *den >>= 1; | ||
807 | } | ||
808 | } | ||
809 | |||
810 | static void | ||
811 | intel_dp_compute_m_n(int bpp, | ||
812 | int nlanes, | ||
813 | int pixel_clock, | ||
814 | int link_clock, | ||
815 | struct intel_dp_m_n *m_n) | ||
816 | { | ||
817 | m_n->tu = 64; | ||
818 | m_n->gmch_m = (pixel_clock * bpp) >> 3; | ||
819 | m_n->gmch_n = link_clock * nlanes; | ||
820 | intel_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); | ||
821 | m_n->link_m = pixel_clock; | ||
822 | m_n->link_n = link_clock; | ||
823 | intel_reduce_ratio(&m_n->link_m, &m_n->link_n); | ||
824 | } | ||
825 | |||
826 | void | 793 | void |
827 | intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, | 794 | intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, |
828 | struct drm_display_mode *adjusted_mode) | 795 | struct drm_display_mode *adjusted_mode) |
@@ -833,7 +800,7 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, | |||
833 | struct drm_i915_private *dev_priv = dev->dev_private; | 800 | struct drm_i915_private *dev_priv = dev->dev_private; |
834 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 801 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
835 | int lane_count = 4; | 802 | int lane_count = 4; |
836 | struct intel_dp_m_n m_n; | 803 | struct intel_link_m_n m_n; |
837 | int pipe = intel_crtc->pipe; | 804 | int pipe = intel_crtc->pipe; |
838 | enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder; | 805 | enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder; |
839 | 806 | ||
@@ -856,8 +823,8 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, | |||
856 | * the number of bytes_per_pixel post-LUT, which we always | 823 | * the number of bytes_per_pixel post-LUT, which we always |
857 | * set up for 8-bits of R/G/B, or 3 bytes total. | 824 | * set up for 8-bits of R/G/B, or 3 bytes total. |
858 | */ | 825 | */ |
859 | intel_dp_compute_m_n(intel_crtc->bpp, lane_count, | 826 | intel_link_compute_m_n(intel_crtc->bpp, lane_count, |
860 | mode->clock, adjusted_mode->clock, &m_n); | 827 | mode->clock, adjusted_mode->clock, &m_n); |
861 | 828 | ||
862 | if (IS_HASWELL(dev)) { | 829 | if (IS_HASWELL(dev)) { |
863 | I915_WRITE(PIPE_DATA_M1(cpu_transcoder), | 830 | I915_WRITE(PIPE_DATA_M1(cpu_transcoder), |