diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-06-06 06:45:25 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-06-06 08:58:36 -0400 |
commit | 6c49f24180c308a07be3f1d59ee7af33184ba17e (patch) | |
tree | be3c4ae4cd11f18bb379fe9d5d0038882d75428e /drivers/gpu/drm/i915/intel_sdvo.c | |
parent | 14420bd0065c1757a353e36ebc9cc4bdc6932dcd (diff) |
drm/i915: hw state readout support for pixel_multiplier
Incomplete since ilk+ support needs proper pch dpll tracking first.
SDVO get_config parts based on a patch from Jesse Barnes, but fixed up
to actually work.
v2: Make sure that we call encoder->get_config _after_ we
get_pipe_config to be consistent in both setup_hw_state and the
modeset state checker. Otherwise the clever trick with handling the
pixel mutliplier on i915G/GM where the encoder overrides the default
value of 1 from the crtc get_pipe_config function doesn't work.
Spotted by Imre Deak.
v3: Actually cross-check the pixel mutliplier (but not on pch split
platforms for now). Now actually also tested on a i915G with a sdvo
encoder plugged in.
Cc: Imre Deak <imre.deak@intel.com>
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sdvo.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index f4588a2c65ac..5c816dd75bec 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -1313,9 +1313,13 @@ static bool intel_sdvo_get_hw_state(struct intel_encoder *encoder, | |||
1313 | static void intel_sdvo_get_config(struct intel_encoder *encoder, | 1313 | static void intel_sdvo_get_config(struct intel_encoder *encoder, |
1314 | struct intel_crtc_config *pipe_config) | 1314 | struct intel_crtc_config *pipe_config) |
1315 | { | 1315 | { |
1316 | struct drm_device *dev = encoder->base.dev; | ||
1317 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1316 | struct intel_sdvo *intel_sdvo = to_intel_sdvo(&encoder->base); | 1318 | struct intel_sdvo *intel_sdvo = to_intel_sdvo(&encoder->base); |
1317 | struct intel_sdvo_dtd dtd; | 1319 | struct intel_sdvo_dtd dtd; |
1318 | u32 flags = 0; | 1320 | int encoder_pixel_multiplier = 0; |
1321 | u32 flags = 0, sdvox; | ||
1322 | u8 val; | ||
1319 | bool ret; | 1323 | bool ret; |
1320 | 1324 | ||
1321 | ret = intel_sdvo_get_input_timing(intel_sdvo, &dtd); | 1325 | ret = intel_sdvo_get_input_timing(intel_sdvo, &dtd); |
@@ -1335,6 +1339,30 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder, | |||
1335 | flags |= DRM_MODE_FLAG_NVSYNC; | 1339 | flags |= DRM_MODE_FLAG_NVSYNC; |
1336 | 1340 | ||
1337 | pipe_config->adjusted_mode.flags |= flags; | 1341 | pipe_config->adjusted_mode.flags |= flags; |
1342 | |||
1343 | if (IS_I915G(dev) || IS_I915GM(dev)) { | ||
1344 | sdvox = I915_READ(intel_sdvo->sdvo_reg); | ||
1345 | pipe_config->pixel_multiplier = | ||
1346 | ((sdvox & SDVO_PORT_MULTIPLY_MASK) | ||
1347 | >> SDVO_PORT_MULTIPLY_SHIFT) + 1; | ||
1348 | } | ||
1349 | |||
1350 | /* Cross check the port pixel multiplier with the sdvo encoder state. */ | ||
1351 | intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_CLOCK_RATE_MULT, &val, 1); | ||
1352 | switch (val) { | ||
1353 | case SDVO_CLOCK_RATE_MULT_1X: | ||
1354 | encoder_pixel_multiplier = 1; | ||
1355 | break; | ||
1356 | case SDVO_CLOCK_RATE_MULT_2X: | ||
1357 | encoder_pixel_multiplier = 2; | ||
1358 | break; | ||
1359 | case SDVO_CLOCK_RATE_MULT_4X: | ||
1360 | encoder_pixel_multiplier = 4; | ||
1361 | break; | ||
1362 | } | ||
1363 | WARN(encoder_pixel_multiplier != pipe_config->pixel_multiplier, | ||
1364 | "SDVO pixel multiplier mismatch, port: %i, encoder: %i\n", | ||
1365 | pipe_config->pixel_multiplier, encoder_pixel_multiplier); | ||
1338 | } | 1366 | } |
1339 | 1367 | ||
1340 | static void intel_disable_sdvo(struct intel_encoder *encoder) | 1368 | static void intel_disable_sdvo(struct intel_encoder *encoder) |