aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dp.c
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/intel_dp.c
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/intel_dp.c')
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c39
1 files changed, 3 insertions, 36 deletions
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),