aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_lvds.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-07-14 23:50:58 -0400
committerDave Airlie <airlied@redhat.com>2016-07-14 23:50:58 -0400
commitff37c05a996bb96eccc21f4fb1b32ba0e24f3443 (patch)
treec09b09b37521f2f8f3f7a9bb3b0a33a2b3bde1a1 /drivers/gpu/drm/i915/intel_lvds.c
parent6c181c82106e12dced317e93a7a396cbb8c64f75 (diff)
parent0b2c0582f1570bfc95aa9ac1cd340a215d8e8335 (diff)
Merge tag 'drm-intel-next-2016-07-11' of git://anongit.freedesktop.org/drm-intel into drm-next
- select igt testing depencies for CONFIG_DRM_I915_DEBUG (Chris) - track outputs in crtc state and clean up all our ad-hoc connector/encoder walking in modest code (Ville) - demidlayer drm_device/drm_i915_private (Chris Wilson) - thundering herd fix from Chris Wilson, with lots of help from Tvrtko Ursulin - piles of assorted clean and fallout from the thundering herd fix - documentation and more tuning for waitboosting (Chris) - pooled EU support on bxt (Arun Siluvery) - bxt support is no longer considered prelimary! - ring/engine vfunc cleanup from Tvrtko - introduce intel_wait_for_register helper (Chris) - opregion updates (Jani Nukla) - tuning and fixes for wait_for macros (Tvrkto&Imre) - more kabylake pci ids (Rodrigo) - pps cleanup and fixes for bxt (Imre) - move sink crc support over to atomic state (Maarten) - fix up async fbdev init ordering (Chris) - fbc fixes from Paulo and Chris * tag 'drm-intel-next-2016-07-11' of git://anongit.freedesktop.org/drm-intel: (223 commits) drm/i915: Update DRIVER_DATE to 20160711 drm/i915: Select DRM_VGEM for igt drm/i915: Select X86_MSR for igt drm/i915: Fill unused GGTT with scratch pages for VT-d drm/i915: Introduce Kabypoint PCH for Kabylake H/DT. drm/i915:gen9: implement WaMediaPoolStateCmdInWABB drm/i915: Check for invalid cloning earlier during modeset drm/i915: Simplify hdmi_12bpc_possible() drm/i915: Kill has_dsi_encoder drm/i915: s/INTEL_OUTPUT_DISPLAYPORT/INTEL_OUTPUT_DP/ drm/i915: Replace some open coded intel_crtc_has_dp_encoder()s drm/i915: Kill has_dp_encoder from pipe_config drm/i915: Replace manual lvds and sdvo/hdmi counting with intel_crtc_has_type() drm/i915: Unify intel_pipe_has_type() and intel_pipe_will_have_type() drm/i915: Add output_types bitmask into the crtc state drm/i915: Remove encoder type checks from MST suspend/resume drm/i915: Don't mark eDP encoders as MST capable drm/i915: avoid wait_for_atomic() in non-atomic host2guc_action() drm/i915: Group the irq breadcrumb variables into the same cacheline drm/i915: Wake up the bottom-half if we steal their interrupt ...
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lvds.c')
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c51
1 files changed, 26 insertions, 25 deletions
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index e9082185a375..49550470483e 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -72,7 +72,7 @@ static bool intel_lvds_get_hw_state(struct intel_encoder *encoder,
72 enum pipe *pipe) 72 enum pipe *pipe)
73{ 73{
74 struct drm_device *dev = encoder->base.dev; 74 struct drm_device *dev = encoder->base.dev;
75 struct drm_i915_private *dev_priv = dev->dev_private; 75 struct drm_i915_private *dev_priv = to_i915(dev);
76 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); 76 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
77 enum intel_display_power_domain power_domain; 77 enum intel_display_power_domain power_domain;
78 u32 tmp; 78 u32 tmp;
@@ -106,7 +106,7 @@ static void intel_lvds_get_config(struct intel_encoder *encoder,
106 struct intel_crtc_state *pipe_config) 106 struct intel_crtc_state *pipe_config)
107{ 107{
108 struct drm_device *dev = encoder->base.dev; 108 struct drm_device *dev = encoder->base.dev;
109 struct drm_i915_private *dev_priv = dev->dev_private; 109 struct drm_i915_private *dev_priv = to_i915(dev);
110 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); 110 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
111 u32 tmp, flags = 0; 111 u32 tmp, flags = 0;
112 112
@@ -140,7 +140,7 @@ static void intel_pre_enable_lvds(struct intel_encoder *encoder)
140{ 140{
141 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); 141 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
142 struct drm_device *dev = encoder->base.dev; 142 struct drm_device *dev = encoder->base.dev;
143 struct drm_i915_private *dev_priv = dev->dev_private; 143 struct drm_i915_private *dev_priv = to_i915(dev);
144 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); 144 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
145 const struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode; 145 const struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
146 int pipe = crtc->pipe; 146 int pipe = crtc->pipe;
@@ -184,8 +184,8 @@ static void intel_pre_enable_lvds(struct intel_encoder *encoder)
184 * panels behave in the two modes. For now, let's just maintain the 184 * panels behave in the two modes. For now, let's just maintain the
185 * value we got from the BIOS. 185 * value we got from the BIOS.
186 */ 186 */
187 temp &= ~LVDS_A3_POWER_MASK; 187 temp &= ~LVDS_A3_POWER_MASK;
188 temp |= lvds_encoder->a3_power; 188 temp |= lvds_encoder->a3_power;
189 189
190 /* Set the dithering flag on LVDS as needed, note that there is no 190 /* Set the dithering flag on LVDS as needed, note that there is no
191 * special lvds dither control bit on pch-split platforms, dithering is 191 * special lvds dither control bit on pch-split platforms, dithering is
@@ -216,7 +216,7 @@ static void intel_enable_lvds(struct intel_encoder *encoder)
216 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); 216 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
217 struct intel_connector *intel_connector = 217 struct intel_connector *intel_connector =
218 &lvds_encoder->attached_connector->base; 218 &lvds_encoder->attached_connector->base;
219 struct drm_i915_private *dev_priv = dev->dev_private; 219 struct drm_i915_private *dev_priv = to_i915(dev);
220 i915_reg_t ctl_reg, stat_reg; 220 i915_reg_t ctl_reg, stat_reg;
221 221
222 if (HAS_PCH_SPLIT(dev)) { 222 if (HAS_PCH_SPLIT(dev)) {
@@ -231,7 +231,7 @@ static void intel_enable_lvds(struct intel_encoder *encoder)
231 231
232 I915_WRITE(ctl_reg, I915_READ(ctl_reg) | POWER_TARGET_ON); 232 I915_WRITE(ctl_reg, I915_READ(ctl_reg) | POWER_TARGET_ON);
233 POSTING_READ(lvds_encoder->reg); 233 POSTING_READ(lvds_encoder->reg);
234 if (wait_for((I915_READ(stat_reg) & PP_ON) != 0, 1000)) 234 if (intel_wait_for_register(dev_priv, stat_reg, PP_ON, PP_ON, 1000))
235 DRM_ERROR("timed out waiting for panel to power on\n"); 235 DRM_ERROR("timed out waiting for panel to power on\n");
236 236
237 intel_panel_enable_backlight(intel_connector); 237 intel_panel_enable_backlight(intel_connector);
@@ -241,7 +241,7 @@ static void intel_disable_lvds(struct intel_encoder *encoder)
241{ 241{
242 struct drm_device *dev = encoder->base.dev; 242 struct drm_device *dev = encoder->base.dev;
243 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base); 243 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
244 struct drm_i915_private *dev_priv = dev->dev_private; 244 struct drm_i915_private *dev_priv = to_i915(dev);
245 i915_reg_t ctl_reg, stat_reg; 245 i915_reg_t ctl_reg, stat_reg;
246 246
247 if (HAS_PCH_SPLIT(dev)) { 247 if (HAS_PCH_SPLIT(dev)) {
@@ -253,7 +253,7 @@ static void intel_disable_lvds(struct intel_encoder *encoder)
253 } 253 }
254 254
255 I915_WRITE(ctl_reg, I915_READ(ctl_reg) & ~POWER_TARGET_ON); 255 I915_WRITE(ctl_reg, I915_READ(ctl_reg) & ~POWER_TARGET_ON);
256 if (wait_for((I915_READ(stat_reg) & PP_ON) == 0, 1000)) 256 if (intel_wait_for_register(dev_priv, stat_reg, PP_ON, 0, 1000))
257 DRM_ERROR("timed out waiting for panel to power off\n"); 257 DRM_ERROR("timed out waiting for panel to power off\n");
258 258
259 I915_WRITE(lvds_encoder->reg, I915_READ(lvds_encoder->reg) & ~LVDS_PORT_EN); 259 I915_WRITE(lvds_encoder->reg, I915_READ(lvds_encoder->reg) & ~LVDS_PORT_EN);
@@ -442,7 +442,7 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val,
442 container_of(nb, struct intel_lvds_connector, lid_notifier); 442 container_of(nb, struct intel_lvds_connector, lid_notifier);
443 struct drm_connector *connector = &lvds_connector->base.base; 443 struct drm_connector *connector = &lvds_connector->base.base;
444 struct drm_device *dev = connector->dev; 444 struct drm_device *dev = connector->dev;
445 struct drm_i915_private *dev_priv = dev->dev_private; 445 struct drm_i915_private *dev_priv = to_i915(dev);
446 446
447 if (dev->switch_power_state != DRM_SWITCH_POWER_ON) 447 if (dev->switch_power_state != DRM_SWITCH_POWER_ON)
448 return NOTIFY_OK; 448 return NOTIFY_OK;
@@ -555,6 +555,7 @@ static const struct drm_connector_funcs intel_lvds_connector_funcs = {
555 .fill_modes = drm_helper_probe_single_connector_modes, 555 .fill_modes = drm_helper_probe_single_connector_modes,
556 .set_property = intel_lvds_set_property, 556 .set_property = intel_lvds_set_property,
557 .atomic_get_property = intel_connector_atomic_get_property, 557 .atomic_get_property = intel_connector_atomic_get_property,
558 .late_register = intel_connector_register,
558 .early_unregister = intel_connector_unregister, 559 .early_unregister = intel_connector_unregister,
559 .destroy = intel_lvds_destroy, 560 .destroy = intel_lvds_destroy,
560 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 561 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
@@ -810,27 +811,29 @@ static const struct dmi_system_id intel_dual_link_lvds[] = {
810 { } /* terminating entry */ 811 { } /* terminating entry */
811}; 812};
812 813
813bool intel_is_dual_link_lvds(struct drm_device *dev) 814struct intel_encoder *intel_get_lvds_encoder(struct drm_device *dev)
814{ 815{
815 struct intel_encoder *encoder; 816 struct intel_encoder *intel_encoder;
816 struct intel_lvds_encoder *lvds_encoder;
817 817
818 for_each_intel_encoder(dev, encoder) { 818 for_each_intel_encoder(dev, intel_encoder)
819 if (encoder->type == INTEL_OUTPUT_LVDS) { 819 if (intel_encoder->type == INTEL_OUTPUT_LVDS)
820 lvds_encoder = to_lvds_encoder(&encoder->base); 820 return intel_encoder;
821 821
822 return lvds_encoder->is_dual_link; 822 return NULL;
823 } 823}
824 }
825 824
826 return false; 825bool intel_is_dual_link_lvds(struct drm_device *dev)
826{
827 struct intel_encoder *encoder = intel_get_lvds_encoder(dev);
828
829 return encoder && to_lvds_encoder(&encoder->base)->is_dual_link;
827} 830}
828 831
829static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder) 832static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder)
830{ 833{
831 struct drm_device *dev = lvds_encoder->base.base.dev; 834 struct drm_device *dev = lvds_encoder->base.base.dev;
832 unsigned int val; 835 unsigned int val;
833 struct drm_i915_private *dev_priv = dev->dev_private; 836 struct drm_i915_private *dev_priv = to_i915(dev);
834 837
835 /* use the module option value if specified */ 838 /* use the module option value if specified */
836 if (i915.lvds_channel_mode > 0) 839 if (i915.lvds_channel_mode > 0)
@@ -880,7 +883,7 @@ static bool intel_lvds_supported(struct drm_device *dev)
880 */ 883 */
881void intel_lvds_init(struct drm_device *dev) 884void intel_lvds_init(struct drm_device *dev)
882{ 885{
883 struct drm_i915_private *dev_priv = dev->dev_private; 886 struct drm_i915_private *dev_priv = to_i915(dev);
884 struct intel_lvds_encoder *lvds_encoder; 887 struct intel_lvds_encoder *lvds_encoder;
885 struct intel_encoder *intel_encoder; 888 struct intel_encoder *intel_encoder;
886 struct intel_lvds_connector *lvds_connector; 889 struct intel_lvds_connector *lvds_connector;
@@ -1118,6 +1121,7 @@ out:
1118 mutex_unlock(&dev->mode_config.mutex); 1121 mutex_unlock(&dev->mode_config.mutex);
1119 1122
1120 intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode); 1123 intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
1124 intel_panel_setup_backlight(connector, INVALID_PIPE);
1121 1125
1122 lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder); 1126 lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder);
1123 DRM_DEBUG_KMS("detected %s-link lvds configuration\n", 1127 DRM_DEBUG_KMS("detected %s-link lvds configuration\n",
@@ -1130,9 +1134,6 @@ out:
1130 DRM_DEBUG_KMS("lid notifier registration failed\n"); 1134 DRM_DEBUG_KMS("lid notifier registration failed\n");
1131 lvds_connector->lid_notifier.notifier_call = NULL; 1135 lvds_connector->lid_notifier.notifier_call = NULL;
1132 } 1136 }
1133 drm_connector_register(connector);
1134
1135 intel_panel_setup_backlight(connector, INVALID_PIPE);
1136 1137
1137 return; 1138 return;
1138 1139