aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-11-29 09:59:36 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-12-06 08:37:01 -0500
commite69d0bc1c67520c302e070ac078975ea9c786de8 (patch)
tree46b534c9332f59acd373c0c326b3278392c703eb /drivers/gpu/drm/i915
parent2f0c2ad18b88691496e23d1ddbc2d0af8f6df5fa (diff)
drm/i915: extract common link_m_n helpers
Both the dp and fdi code use the exact same computations (ignore minor differences in conversion between bits and bytes). This makes it even more apparent that we have a _massive_ mess between cpu transcoder/fdi link/pch transcoder and pch link settings. And also that we have hilarious amounts of confusion between edp and dp (despite that they're identical at a link level). Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915')
-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),