aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h13
-rw-r--r--drivers/gpu/drm/i915/intel_display.c31
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c39
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 */
111struct 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
119void 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
110struct intel_ddi_plls { 123struct 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
3954struct fdi_m_n {
3955 u32 tu;
3956 u32 gmch_m;
3957 u32 gmch_n;
3958 u32 link_m;
3959 u32 link_n;
3960};
3961
3962static void 3954static void
3963fdi_reduce_ratio(u32 *num, u32 *den) 3955intel_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
3971static void 3963void
3972ironlake_compute_m_n(int bits_per_pixel, int nlanes, int pixel_clock, 3964intel_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
3987static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) 3977static 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
793struct 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
801static void
802intel_reduce_ratio(uint32_t *num, uint32_t *den)
803{
804 while (*num > 0xffffff || *den > 0xffffff) {
805 *num >>= 1;
806 *den >>= 1;
807 }
808}
809
810static void
811intel_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
826void 793void
827intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, 794intel_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),