aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2013-03-26 19:44:56 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-03-27 19:50:07 -0400
commit50f3b016b055dbc83094bc2d7a91c3c69edbc88b (patch)
tree1fc07db2382b87c21d9687624ebe855fb4eb4008 /drivers/gpu/drm/i915
parent5bfe2ac00395ca37219b7187299cd9d23ae06682 (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.c13
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c2
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h12
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c5
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c5
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 */
5209static void intel_set_pipe_csc(struct drm_crtc *crtc, 5209static 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
112struct intel_framebuffer { 107struct 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}