diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-03-26 19:44:56 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-03-27 19:50:07 -0400 |
commit | 50f3b016b055dbc83094bc2d7a91c3c69edbc88b (patch) | |
tree | 1fc07db2382b87c21d9687624ebe855fb4eb4008 /drivers/gpu/drm/i915 | |
parent | 5bfe2ac00395ca37219b7187299cd9d23ae06682 (diff) |
drm/i915: add pipe_config->limited_color_range
Now that we have a useful struct for this, let's use it. Some neat
pointer-chasing required, but it's all there already.
v2: Rebased on top of the added Haswell limited color range support.
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 5 |
5 files changed, 20 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 14e7e919ca51..dfcdfca6b230 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -5190,7 +5190,7 @@ static void ironlake_set_pipeconf(struct drm_crtc *crtc, | |||
5190 | else | 5190 | else |
5191 | val |= PIPECONF_PROGRESSIVE; | 5191 | val |= PIPECONF_PROGRESSIVE; |
5192 | 5192 | ||
5193 | if (adjusted_mode->private_flags & INTEL_MODE_LIMITED_COLOR_RANGE) | 5193 | if (intel_crtc->config.limited_color_range) |
5194 | val |= PIPECONF_COLOR_RANGE_SELECT; | 5194 | val |= PIPECONF_COLOR_RANGE_SELECT; |
5195 | else | 5195 | else |
5196 | val &= ~PIPECONF_COLOR_RANGE_SELECT; | 5196 | val &= ~PIPECONF_COLOR_RANGE_SELECT; |
@@ -5206,8 +5206,7 @@ static void ironlake_set_pipeconf(struct drm_crtc *crtc, | |||
5206 | * is supported, but eventually this should handle various | 5206 | * is supported, but eventually this should handle various |
5207 | * RGB<->YCbCr scenarios as well. | 5207 | * RGB<->YCbCr scenarios as well. |
5208 | */ | 5208 | */ |
5209 | static void intel_set_pipe_csc(struct drm_crtc *crtc, | 5209 | static void intel_set_pipe_csc(struct drm_crtc *crtc) |
5210 | const struct drm_display_mode *adjusted_mode) | ||
5211 | { | 5210 | { |
5212 | struct drm_device *dev = crtc->dev; | 5211 | struct drm_device *dev = crtc->dev; |
5213 | struct drm_i915_private *dev_priv = dev->dev_private; | 5212 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -5222,7 +5221,7 @@ static void intel_set_pipe_csc(struct drm_crtc *crtc, | |||
5222 | * consideration. | 5221 | * consideration. |
5223 | */ | 5222 | */ |
5224 | 5223 | ||
5225 | if (adjusted_mode->private_flags & INTEL_MODE_LIMITED_COLOR_RANGE) | 5224 | if (intel_crtc->config.limited_color_range) |
5226 | coeff = ((235 - 16) * (1 << 12) / 255) & 0xff8; /* 0.xxx... */ | 5225 | coeff = ((235 - 16) * (1 << 12) / 255) & 0xff8; /* 0.xxx... */ |
5227 | 5226 | ||
5228 | /* | 5227 | /* |
@@ -5246,7 +5245,7 @@ static void intel_set_pipe_csc(struct drm_crtc *crtc, | |||
5246 | if (INTEL_INFO(dev)->gen > 6) { | 5245 | if (INTEL_INFO(dev)->gen > 6) { |
5247 | uint16_t postoff = 0; | 5246 | uint16_t postoff = 0; |
5248 | 5247 | ||
5249 | if (adjusted_mode->private_flags & INTEL_MODE_LIMITED_COLOR_RANGE) | 5248 | if (intel_crtc->config.limited_color_range) |
5250 | postoff = (16 * (1 << 13) / 255) & 0x1fff; | 5249 | postoff = (16 * (1 << 13) / 255) & 0x1fff; |
5251 | 5250 | ||
5252 | I915_WRITE(PIPE_CSC_POSTOFF_HI(pipe), postoff); | 5251 | I915_WRITE(PIPE_CSC_POSTOFF_HI(pipe), postoff); |
@@ -5257,7 +5256,7 @@ static void intel_set_pipe_csc(struct drm_crtc *crtc, | |||
5257 | } else { | 5256 | } else { |
5258 | uint32_t mode = CSC_MODE_YUV_TO_RGB; | 5257 | uint32_t mode = CSC_MODE_YUV_TO_RGB; |
5259 | 5258 | ||
5260 | if (adjusted_mode->private_flags & INTEL_MODE_LIMITED_COLOR_RANGE) | 5259 | if (intel_crtc->config.limited_color_range) |
5261 | mode |= CSC_BLACK_SCREEN_OFFSET; | 5260 | mode |= CSC_BLACK_SCREEN_OFFSET; |
5262 | 5261 | ||
5263 | I915_WRITE(PIPE_CSC_MODE(pipe), mode); | 5262 | I915_WRITE(PIPE_CSC_MODE(pipe), mode); |
@@ -5853,7 +5852,7 @@ static int haswell_crtc_mode_set(struct drm_crtc *crtc, | |||
5853 | 5852 | ||
5854 | haswell_set_pipeconf(crtc, adjusted_mode, dither); | 5853 | haswell_set_pipeconf(crtc, adjusted_mode, dither); |
5855 | 5854 | ||
5856 | intel_set_pipe_csc(crtc, adjusted_mode); | 5855 | intel_set_pipe_csc(crtc); |
5857 | 5856 | ||
5858 | /* Set up the display plane register */ | 5857 | /* Set up the display plane register */ |
5859 | I915_WRITE(DSPCNTR(plane), DISPPLANE_GAMMA_ENABLE | DISPPLANE_PIPE_CSC_ENABLE); | 5858 | I915_WRITE(DSPCNTR(plane), DISPPLANE_GAMMA_ENABLE | DISPPLANE_PIPE_CSC_ENABLE); |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 65550e467464..80ac7d77e053 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -739,7 +739,7 @@ intel_dp_compute_config(struct intel_encoder *encoder, | |||
739 | } | 739 | } |
740 | 740 | ||
741 | if (intel_dp->color_range) | 741 | if (intel_dp->color_range) |
742 | adjusted_mode->private_flags |= INTEL_MODE_LIMITED_COLOR_RANGE; | 742 | pipe_config->limited_color_range = true; |
743 | 743 | ||
744 | mode_rate = intel_dp_link_required(adjusted_mode->clock, bpp); | 744 | mode_rate = intel_dp_link_required(adjusted_mode->clock, bpp); |
745 | 745 | ||
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 8de1855f5872..63160c650cf9 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -103,11 +103,6 @@ | |||
103 | 103 | ||
104 | /* drm_display_mode->private_flags */ | 104 | /* drm_display_mode->private_flags */ |
105 | #define INTEL_MODE_DP_FORCE_6BPC (0x10) | 105 | #define INTEL_MODE_DP_FORCE_6BPC (0x10) |
106 | /* | ||
107 | * Set when limited 16-235 (as opposed to full 0-255) RGB color range is | ||
108 | * to be used. | ||
109 | */ | ||
110 | #define INTEL_MODE_LIMITED_COLOR_RANGE (0x40) | ||
111 | 106 | ||
112 | struct intel_framebuffer { | 107 | struct intel_framebuffer { |
113 | struct drm_framebuffer base; | 108 | struct drm_framebuffer base; |
@@ -193,6 +188,13 @@ struct intel_crtc_config { | |||
193 | /* Whether to set up the PCH/FDI. Note that we never allow sharing | 188 | /* Whether to set up the PCH/FDI. Note that we never allow sharing |
194 | * between pch encoders and cpu encoders. */ | 189 | * between pch encoders and cpu encoders. */ |
195 | bool has_pch_encoder; | 190 | bool has_pch_encoder; |
191 | |||
192 | /* | ||
193 | * Use reduced/limited/broadcast rbg range, compressing from the full | ||
194 | * range fed into the crtcs. | ||
195 | */ | ||
196 | bool limited_color_range; | ||
197 | |||
196 | /* Used by SDVO (and if we ever fix it, HDMI). */ | 198 | /* Used by SDVO (and if we ever fix it, HDMI). */ |
197 | unsigned pixel_multiplier; | 199 | unsigned pixel_multiplier; |
198 | }; | 200 | }; |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index b588e6c547e2..5508687ea2a6 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -333,6 +333,7 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder, | |||
333 | struct drm_display_mode *adjusted_mode) | 333 | struct drm_display_mode *adjusted_mode) |
334 | { | 334 | { |
335 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); | 335 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); |
336 | struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); | ||
336 | struct dip_infoframe avi_if = { | 337 | struct dip_infoframe avi_if = { |
337 | .type = DIP_TYPE_AVI, | 338 | .type = DIP_TYPE_AVI, |
338 | .ver = DIP_VERSION_AVI, | 339 | .ver = DIP_VERSION_AVI, |
@@ -343,7 +344,7 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder, | |||
343 | avi_if.body.avi.YQ_CN_PR |= DIP_AVI_PR_2; | 344 | avi_if.body.avi.YQ_CN_PR |= DIP_AVI_PR_2; |
344 | 345 | ||
345 | if (intel_hdmi->rgb_quant_range_selectable) { | 346 | if (intel_hdmi->rgb_quant_range_selectable) { |
346 | if (adjusted_mode->private_flags & INTEL_MODE_LIMITED_COLOR_RANGE) | 347 | if (intel_crtc->config.limited_color_range) |
347 | avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_LIMITED; | 348 | avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_LIMITED; |
348 | else | 349 | else |
349 | avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL; | 350 | avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL; |
@@ -785,7 +786,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder, | |||
785 | } | 786 | } |
786 | 787 | ||
787 | if (intel_hdmi->color_range) | 788 | if (intel_hdmi->color_range) |
788 | adjusted_mode->private_flags |= INTEL_MODE_LIMITED_COLOR_RANGE; | 789 | pipe_config->limited_color_range = true; |
789 | 790 | ||
790 | if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev)) | 791 | if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev)) |
791 | pipe_config->has_pch_encoder = true; | 792 | pipe_config->has_pch_encoder = true; |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 5f3f9e9e661e..c6fbfd1afc05 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -956,9 +956,10 @@ static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo, | |||
956 | .len = DIP_LEN_AVI, | 956 | .len = DIP_LEN_AVI, |
957 | }; | 957 | }; |
958 | uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)]; | 958 | uint8_t sdvo_data[4 + sizeof(avi_if.body.avi)]; |
959 | struct intel_crtc *intel_crtc = to_intel_crtc(intel_sdvo->base.base.crtc); | ||
959 | 960 | ||
960 | if (intel_sdvo->rgb_quant_range_selectable) { | 961 | if (intel_sdvo->rgb_quant_range_selectable) { |
961 | if (adjusted_mode->private_flags & INTEL_MODE_LIMITED_COLOR_RANGE) | 962 | if (intel_crtc->config.limited_color_range) |
962 | avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_LIMITED; | 963 | avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_LIMITED; |
963 | else | 964 | else |
964 | avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL; | 965 | avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL; |
@@ -1091,7 +1092,7 @@ static bool intel_sdvo_compute_config(struct intel_encoder *encoder, | |||
1091 | } | 1092 | } |
1092 | 1093 | ||
1093 | if (intel_sdvo->color_range) | 1094 | if (intel_sdvo->color_range) |
1094 | adjusted_mode->private_flags |= INTEL_MODE_LIMITED_COLOR_RANGE; | 1095 | pipe_config->limited_color_range = true; |
1095 | 1096 | ||
1096 | return true; | 1097 | return true; |
1097 | } | 1098 | } |