aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-03-26 19:45:01 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-03-27 20:09:35 -0400
commit5d2d38ddcac991f71c19d03d95bde8e14abc0352 (patch)
tree05fb22e794ab4b1ccea0e78cb90dfd03f4197264 /drivers
parentbaba133ae50e563c5896d39e150b6617857a9d8e (diff)
drm/i915: clean up pipe bpp confusion
- gen4 and earlier (save for g4x) only really have a 8bpc pipe, with the possibility to dither to 6bpc using the panel fitter - g4x has hdmi, but no 12 bpc pipe ... !? Clamp hdmi accordingly. - TV/SDVO out are the only connectors available on platforms with a pipe bpp != 8, add code to force the pipe to 8bpc unconditionally. <rant> The dither handling on gmch platforms is one giant disaster. I'm hoping somewhat that vlv enabling will fix this up, but given that the 6bpc handling for edp was simply added with another quick hack, I don't have high hopes ... </rant> v2: Neither vlv nor g4x have 12bpc pipes. Still set pipe_bpp to 12*3, but let the crtc code clamp things down to 10bpc on these platforms. v3: Fix a bpc vs. bpp mixup in the gen4 and earlier pipe_bpp limiter code. v4: Drop the hunk in intel_hdmi.c about g4x/vlv 12bpc, it was wrong. Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c8
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c3
-rw-r--r--drivers/gpu/drm/i915/intel_tv.c14
3 files changed, 19 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 70c22b12b7c9..84bd8d36ce02 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3971,6 +3971,14 @@ static bool intel_crtc_compute_config(struct drm_crtc *crtc,
3971 adjusted_mode->hsync_start == adjusted_mode->hdisplay) 3971 adjusted_mode->hsync_start == adjusted_mode->hdisplay)
3972 return false; 3972 return false;
3973 3973
3974 if ((IS_G4X(dev) || IS_VALLEYVIEW(dev)) && pipe_config->pipe_bpp > 10) {
3975 pipe_config->pipe_bpp = 10*3; /* 12bpc is gen5+ */
3976 } else if (INTEL_INFO(dev)->gen <= 4 && pipe_config->pipe_bpp > 8) {
3977 /* only a 8bpc pipe, with 6bpc dither through the panel fitter
3978 * for lvds. */
3979 pipe_config->pipe_bpp = 8*3;
3980 }
3981
3974 return true; 3982 return true;
3975} 3983}
3976 3984
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index c6fbfd1afc05..80f8680337df 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -1048,6 +1048,9 @@ static bool intel_sdvo_compute_config(struct intel_encoder *encoder,
1048 struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode; 1048 struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode;
1049 struct drm_display_mode *mode = &pipe_config->requested_mode; 1049 struct drm_display_mode *mode = &pipe_config->requested_mode;
1050 1050
1051 DRM_DEBUG_KMS("forcing bpc to 8 for SDVO\n");
1052 pipe_config->pipe_bpp = 8*3;
1053
1051 if (HAS_PCH_SPLIT(encoder->base.dev)) 1054 if (HAS_PCH_SPLIT(encoder->base.dev))
1052 pipe_config->has_pch_encoder = true; 1055 pipe_config->has_pch_encoder = true;
1053 1056
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index d808421c1c80..66737265200f 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -905,11 +905,10 @@ intel_tv_mode_valid(struct drm_connector *connector,
905 905
906 906
907static bool 907static bool
908intel_tv_mode_fixup(struct drm_encoder *encoder, 908intel_tv_compute_config(struct intel_encoder *encoder,
909 const struct drm_display_mode *mode, 909 struct intel_crtc_config *pipe_config)
910 struct drm_display_mode *adjusted_mode)
911{ 910{
912 struct intel_tv *intel_tv = enc_to_intel_tv(encoder); 911 struct intel_tv *intel_tv = enc_to_intel_tv(&encoder->base);
913 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); 912 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv);
914 913
915 if (!tv_mode) 914 if (!tv_mode)
@@ -918,7 +917,10 @@ intel_tv_mode_fixup(struct drm_encoder *encoder,
918 if (intel_encoder_check_is_cloned(&intel_tv->base)) 917 if (intel_encoder_check_is_cloned(&intel_tv->base))
919 return false; 918 return false;
920 919
921 adjusted_mode->clock = tv_mode->clock; 920 pipe_config->adjusted_mode.clock = tv_mode->clock;
921 DRM_DEBUG_KMS("forcing bpc to 8 for TV\n");
922 pipe_config->pipe_bpp = 8*3;
923
922 return true; 924 return true;
923} 925}
924 926
@@ -1485,7 +1487,6 @@ out:
1485} 1487}
1486 1488
1487static const struct drm_encoder_helper_funcs intel_tv_helper_funcs = { 1489static const struct drm_encoder_helper_funcs intel_tv_helper_funcs = {
1488 .mode_fixup = intel_tv_mode_fixup,
1489 .mode_set = intel_tv_mode_set, 1490 .mode_set = intel_tv_mode_set,
1490}; 1491};
1491 1492
@@ -1620,6 +1621,7 @@ intel_tv_init(struct drm_device *dev)
1620 drm_encoder_init(dev, &intel_encoder->base, &intel_tv_enc_funcs, 1621 drm_encoder_init(dev, &intel_encoder->base, &intel_tv_enc_funcs,
1621 DRM_MODE_ENCODER_TVDAC); 1622 DRM_MODE_ENCODER_TVDAC);
1622 1623
1624 intel_encoder->compute_config = intel_tv_compute_config;
1623 intel_encoder->enable = intel_enable_tv; 1625 intel_encoder->enable = intel_enable_tv;
1624 intel_encoder->disable = intel_disable_tv; 1626 intel_encoder->disable = intel_disable_tv;
1625 intel_encoder->get_hw_state = intel_tv_get_hw_state; 1627 intel_encoder->get_hw_state = intel_tv_get_hw_state;