Lines Matching +full:hdmi +full:- +full:connector

1 // SPDX-License-Identifier: MIT
5 * HDMI support for G4x,ILK,SNB,IVB,VLV,CHV (HSW+ handled by the DDI code).
29 struct drm_device *dev = encoder->base.dev; in intel_hdmi_prepare()
31 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_hdmi_prepare()
33 const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; in intel_hdmi_prepare()
39 if (!HAS_PCH_SPLIT(dev_priv) && crtc_state->limited_color_range) in intel_hdmi_prepare()
41 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) in intel_hdmi_prepare()
43 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) in intel_hdmi_prepare()
46 if (crtc_state->pipe_bpp > 24) in intel_hdmi_prepare()
51 if (crtc_state->has_hdmi_sink) in intel_hdmi_prepare()
55 hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe); in intel_hdmi_prepare()
57 hdmi_val |= SDVO_PIPE_SEL_CHV(crtc->pipe); in intel_hdmi_prepare()
59 hdmi_val |= SDVO_PIPE_SEL(crtc->pipe); in intel_hdmi_prepare()
61 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, hdmi_val); in intel_hdmi_prepare()
62 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in intel_hdmi_prepare()
68 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); in intel_hdmi_get_hw_state()
74 encoder->power_domain); in intel_hdmi_get_hw_state()
78 ret = intel_sdvo_port_enabled(dev_priv, intel_hdmi->hdmi_reg, pipe); in intel_hdmi_get_hw_state()
80 intel_display_power_put(dev_priv, encoder->power_domain, wakeref); in intel_hdmi_get_hw_state()
85 static bool connector_is_hdmi(struct drm_connector *connector) in connector_is_hdmi() argument
88 intel_attached_encoder(to_intel_connector(connector)); in connector_is_hdmi()
90 return encoder && encoder->type == INTEL_OUTPUT_HDMI; in connector_is_hdmi()
97 struct drm_connector *connector; in g4x_compute_has_hdmi_sink() local
101 * On g4x only one HDMI port can transmit infoframes/audio at in g4x_compute_has_hdmi_sink()
106 for_each_new_connector_in_state(&state->base, connector, conn_state, i) { in g4x_compute_has_hdmi_sink()
107 struct intel_encoder *encoder = to_intel_encoder(conn_state->best_encoder); in g4x_compute_has_hdmi_sink()
111 if (!connector_is_hdmi(connector)) in g4x_compute_has_hdmi_sink()
114 crtc = to_intel_crtc(conn_state->crtc); in g4x_compute_has_hdmi_sink()
133 struct intel_atomic_state *state = to_intel_atomic_state(crtc_state->uapi.state); in g4x_hdmi_compute_config()
134 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in g4x_hdmi_compute_config()
135 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in g4x_hdmi_compute_config()
138 crtc_state->has_pch_encoder = true; in g4x_hdmi_compute_config()
140 return -EINVAL; in g4x_hdmi_compute_config()
144 crtc_state->has_hdmi_sink = g4x_compute_has_hdmi_sink(state, crtc); in g4x_hdmi_compute_config()
146 crtc_state->has_hdmi_sink = in g4x_hdmi_compute_config()
156 struct drm_device *dev = encoder->base.dev; in intel_hdmi_get_config()
161 pipe_config->output_types |= BIT(INTEL_OUTPUT_HDMI); in intel_hdmi_get_config()
163 tmp = intel_de_read(dev_priv, intel_hdmi->hdmi_reg); in intel_hdmi_get_config()
176 pipe_config->has_hdmi_sink = true; in intel_hdmi_get_config()
178 pipe_config->infoframes.enable |= in intel_hdmi_get_config()
181 if (pipe_config->infoframes.enable) in intel_hdmi_get_config()
182 pipe_config->has_infoframe = true; in intel_hdmi_get_config()
185 pipe_config->has_audio = true; in intel_hdmi_get_config()
189 pipe_config->limited_color_range = true; in intel_hdmi_get_config()
191 pipe_config->hw.adjusted_mode.flags |= flags; in intel_hdmi_get_config()
194 dotclock = DIV_ROUND_CLOSEST(pipe_config->port_clock * 2, 3); in intel_hdmi_get_config()
196 dotclock = pipe_config->port_clock; in intel_hdmi_get_config()
198 if (pipe_config->pixel_multiplier) in intel_hdmi_get_config()
199 dotclock /= pipe_config->pixel_multiplier; in intel_hdmi_get_config()
201 pipe_config->hw.adjusted_mode.crtc_clock = dotclock; in intel_hdmi_get_config()
203 pipe_config->lane_count = 4; in intel_hdmi_get_config()
209 &pipe_config->infoframes.avi); in intel_hdmi_get_config()
212 &pipe_config->infoframes.spd); in intel_hdmi_get_config()
215 &pipe_config->infoframes.hdmi); in intel_hdmi_get_config()
223 struct drm_device *dev = encoder->base.dev; in g4x_hdmi_enable_port()
228 temp = intel_de_read(dev_priv, intel_hdmi->hdmi_reg); in g4x_hdmi_enable_port()
232 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp); in g4x_hdmi_enable_port()
233 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in g4x_hdmi_enable_port()
240 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in g4x_hdmi_audio_enable()
241 struct intel_hdmi *hdmi = enc_to_intel_hdmi(encoder); in g4x_hdmi_audio_enable() local
243 if (!crtc_state->has_audio) in g4x_hdmi_audio_enable()
246 drm_WARN_ON(&i915->drm, !crtc_state->has_hdmi_sink); in g4x_hdmi_audio_enable()
249 intel_de_rmw(i915, hdmi->hdmi_reg, 0, HDMI_AUDIO_ENABLE); in g4x_hdmi_audio_enable()
258 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in g4x_hdmi_audio_disable()
259 struct intel_hdmi *hdmi = enc_to_intel_hdmi(encoder); in g4x_hdmi_audio_disable() local
261 if (!old_crtc_state->has_audio) in g4x_hdmi_audio_disable()
267 intel_de_rmw(i915, hdmi->hdmi_reg, HDMI_AUDIO_ENABLE, 0); in g4x_hdmi_audio_disable()
283 struct drm_device *dev = encoder->base.dev; in ibx_enable_hdmi()
288 temp = intel_de_read(dev_priv, intel_hdmi->hdmi_reg); in ibx_enable_hdmi()
296 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp); in ibx_enable_hdmi()
297 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in ibx_enable_hdmi()
298 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp); in ibx_enable_hdmi()
299 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in ibx_enable_hdmi()
308 if (pipe_config->pipe_bpp > 24 && in ibx_enable_hdmi()
309 pipe_config->pixel_multiplier > 1) { in ibx_enable_hdmi()
310 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, in ibx_enable_hdmi()
312 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in ibx_enable_hdmi()
318 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp); in ibx_enable_hdmi()
319 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in ibx_enable_hdmi()
320 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp); in ibx_enable_hdmi()
321 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in ibx_enable_hdmi()
330 struct drm_device *dev = encoder->base.dev; in cpt_enable_hdmi()
332 struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); in cpt_enable_hdmi()
334 enum pipe pipe = crtc->pipe; in cpt_enable_hdmi()
337 temp = intel_de_read(dev_priv, intel_hdmi->hdmi_reg); in cpt_enable_hdmi()
345 * 1. disable HDMI clock gating in cpt_enable_hdmi()
346 * 2. enable HDMI with 8bpc in cpt_enable_hdmi()
347 * 3. enable HDMI with 12bpc in cpt_enable_hdmi()
348 * 4. enable HDMI clock gating in cpt_enable_hdmi()
351 if (pipe_config->pipe_bpp > 24) { in cpt_enable_hdmi()
359 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp); in cpt_enable_hdmi()
360 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in cpt_enable_hdmi()
362 if (pipe_config->pipe_bpp > 24) { in cpt_enable_hdmi()
366 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp); in cpt_enable_hdmi()
367 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in cpt_enable_hdmi()
386 struct drm_device *dev = encoder->base.dev; in intel_disable_hdmi()
391 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc); in intel_disable_hdmi()
394 temp = intel_de_read(dev_priv, intel_hdmi->hdmi_reg); in intel_disable_hdmi()
397 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp); in intel_disable_hdmi()
398 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in intel_disable_hdmi()
405 if (HAS_PCH_IBX(dev_priv) && crtc->pipe == PIPE_B) { in intel_disable_hdmi()
419 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp); in intel_disable_hdmi()
420 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in intel_disable_hdmi()
421 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp); in intel_disable_hdmi()
422 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in intel_disable_hdmi()
425 intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp); in intel_disable_hdmi()
426 intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg); in intel_disable_hdmi()
433 dig_port->set_infoframes(encoder, in intel_disable_hdmi()
473 dig_port->set_infoframes(encoder, in intel_hdmi_pre_enable()
474 pipe_config->has_infoframe, in intel_hdmi_pre_enable()
484 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); in vlv_hdmi_pre_enable()
488 /* HDMI 1.0V-2dB */ in vlv_hdmi_pre_enable()
493 dig_port->set_infoframes(encoder, in vlv_hdmi_pre_enable()
494 pipe_config->has_infoframe, in vlv_hdmi_pre_enable()
535 /* Reset lanes to avoid HDMI flicker (VLV w/a) */ in vlv_hdmi_post_disable()
544 struct drm_device *dev = encoder->base.dev; in chv_hdmi_post_disable()
561 struct drm_device *dev = encoder->base.dev; in chv_hdmi_pre_enable()
566 /* FIXME: Program the support xxx V-dB */ in chv_hdmi_pre_enable()
567 /* Use 800mV-0dB */ in chv_hdmi_pre_enable()
570 dig_port->set_infoframes(encoder, in chv_hdmi_pre_enable()
571 pipe_config->has_infoframe, in chv_hdmi_pre_enable()
588 struct intel_connector *connector) in intel_hdmi_hotplug() argument
592 state = intel_encoder_hotplug(encoder, connector); in intel_hdmi_hotplug()
595 * On many platforms the HDMI live state signal is known to be in intel_hdmi_hotplug()
601 * connector pins are specified) and so we'll still be able to get a in intel_hdmi_hotplug()
606 if (state == INTEL_HOTPLUG_UNCHANGED && !connector->hotplug_retries) in intel_hdmi_hotplug()
612 int g4x_hdmi_connector_atomic_check(struct drm_connector *connector, in g4x_hdmi_connector_atomic_check() argument
615 struct drm_i915_private *i915 = to_i915(state->dev); in g4x_hdmi_connector_atomic_check()
620 ret = intel_digital_connector_atomic_check(connector, state); in g4x_hdmi_connector_atomic_check()
627 if (!intel_connector_needs_modeset(to_intel_atomic_state(state), connector)) in g4x_hdmi_connector_atomic_check()
631 * On g4x only one HDMI port can transmit infoframes/audio in g4x_hdmi_connector_atomic_check()
632 * at any given time. Make sure all enabled HDMI ports are in g4x_hdmi_connector_atomic_check()
638 drm_connector_list_iter_begin(&i915->drm, &conn_iter); in g4x_hdmi_connector_atomic_check()
647 drm_dbg_kms(&i915->drm, "Adding [CONNECTOR:%d:%s]\n", in g4x_hdmi_connector_atomic_check()
648 conn->base.id, conn->name); in g4x_hdmi_connector_atomic_check()
656 crtc = conn_state->crtc; in g4x_hdmi_connector_atomic_check()
661 crtc_state->mode_changed = true; in g4x_hdmi_connector_atomic_check()
682 return !drm_WARN(&i915->drm, !is_hdmi_port_valid(i915, port), in assert_hdmi_port_valid()
683 "Platform does not support HDMI %c\n", port_name(port)); in assert_hdmi_port_valid()
704 drm_dbg_kms(&dev_priv->drm, "No VBT child device for HDMI-%c\n", in g4x_hdmi_init()
711 dig_port->aux_ch = AUX_CH_NONE; in g4x_hdmi_init()
719 intel_encoder = &dig_port->base; in g4x_hdmi_init()
721 intel_encoder->devdata = devdata; in g4x_hdmi_init()
723 mutex_init(&dig_port->hdcp_mutex); in g4x_hdmi_init()
725 drm_encoder_init(&dev_priv->drm, &intel_encoder->base, in g4x_hdmi_init()
727 "HDMI %c", port_name(port)); in g4x_hdmi_init()
729 intel_encoder->hotplug = intel_hdmi_hotplug; in g4x_hdmi_init()
730 intel_encoder->compute_config = g4x_hdmi_compute_config; in g4x_hdmi_init()
732 intel_encoder->disable = pch_disable_hdmi; in g4x_hdmi_init()
733 intel_encoder->post_disable = pch_post_disable_hdmi; in g4x_hdmi_init()
735 intel_encoder->disable = g4x_disable_hdmi; in g4x_hdmi_init()
737 intel_encoder->get_hw_state = intel_hdmi_get_hw_state; in g4x_hdmi_init()
738 intel_encoder->get_config = intel_hdmi_get_config; in g4x_hdmi_init()
740 intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable; in g4x_hdmi_init()
741 intel_encoder->pre_enable = chv_hdmi_pre_enable; in g4x_hdmi_init()
742 intel_encoder->enable = vlv_enable_hdmi; in g4x_hdmi_init()
743 intel_encoder->post_disable = chv_hdmi_post_disable; in g4x_hdmi_init()
744 intel_encoder->post_pll_disable = chv_hdmi_post_pll_disable; in g4x_hdmi_init()
746 intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable; in g4x_hdmi_init()
747 intel_encoder->pre_enable = vlv_hdmi_pre_enable; in g4x_hdmi_init()
748 intel_encoder->enable = vlv_enable_hdmi; in g4x_hdmi_init()
749 intel_encoder->post_disable = vlv_hdmi_post_disable; in g4x_hdmi_init()
751 intel_encoder->pre_enable = intel_hdmi_pre_enable; in g4x_hdmi_init()
753 intel_encoder->enable = cpt_enable_hdmi; in g4x_hdmi_init()
755 intel_encoder->enable = ibx_enable_hdmi; in g4x_hdmi_init()
757 intel_encoder->enable = g4x_enable_hdmi; in g4x_hdmi_init()
759 intel_encoder->audio_enable = g4x_hdmi_audio_enable; in g4x_hdmi_init()
760 intel_encoder->audio_disable = g4x_hdmi_audio_disable; in g4x_hdmi_init()
761 intel_encoder->shutdown = intel_hdmi_encoder_shutdown; in g4x_hdmi_init()
763 intel_encoder->type = INTEL_OUTPUT_HDMI; in g4x_hdmi_init()
764 intel_encoder->power_domain = intel_display_power_ddi_lanes_domain(dev_priv, port); in g4x_hdmi_init()
765 intel_encoder->port = port; in g4x_hdmi_init()
768 intel_encoder->pipe_mask = BIT(PIPE_C); in g4x_hdmi_init()
770 intel_encoder->pipe_mask = BIT(PIPE_A) | BIT(PIPE_B); in g4x_hdmi_init()
772 intel_encoder->pipe_mask = ~0; in g4x_hdmi_init()
774 intel_encoder->cloneable = BIT(INTEL_OUTPUT_ANALOG); in g4x_hdmi_init()
775 intel_encoder->hpd_pin = intel_hpd_pin_default(dev_priv, port); in g4x_hdmi_init()
777 * BSpec is unclear about HDMI+HDMI cloning on g4x, but it seems in g4x_hdmi_init()
782 intel_encoder->cloneable |= BIT(INTEL_OUTPUT_HDMI); in g4x_hdmi_init()
784 dig_port->hdmi.hdmi_reg = hdmi_reg; in g4x_hdmi_init()
785 dig_port->dp.output_reg = INVALID_MMIO_REG; in g4x_hdmi_init()
786 dig_port->max_lanes = 4; in g4x_hdmi_init()