diff options
author | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2019-01-22 17:51:36 -0500 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2019-01-22 17:51:36 -0500 |
commit | f42fb2317ffcbd005eeb22b1e49020821a11e23a (patch) | |
tree | d89ccd0c9086c492a32da7ce4c2486c99ed3e805 /drivers/gpu/drm/i915/intel_dp_mst.c | |
parent | 25f9cebd7a52ddf15405d74fb5fd4c374f301983 (diff) | |
parent | f164a94c2c87752caeb1a3cbe068c440e7f7921f (diff) |
Merge drm/drm-next into drm-intel-next-queued
We need avi infoframe stuff who got merged via drm-misc
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 65 |
1 files changed, 32 insertions, 33 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 909b9f555458..f90041cb336d 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -40,8 +40,12 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
40 | struct drm_connector *connector = conn_state->connector; | 40 | struct drm_connector *connector = conn_state->connector; |
41 | void *port = to_intel_connector(connector)->port; | 41 | void *port = to_intel_connector(connector)->port; |
42 | struct drm_atomic_state *state = pipe_config->base.state; | 42 | struct drm_atomic_state *state = pipe_config->base.state; |
43 | struct drm_crtc *crtc = pipe_config->base.crtc; | ||
44 | struct drm_crtc_state *old_crtc_state = | ||
45 | drm_atomic_get_old_crtc_state(state, crtc); | ||
43 | int bpp; | 46 | int bpp; |
44 | int lane_count, slots = 0; | 47 | int lane_count, slots = |
48 | to_intel_crtc_state(old_crtc_state)->dp_m_n.tu; | ||
45 | const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; | 49 | const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; |
46 | int mst_pbn; | 50 | int mst_pbn; |
47 | bool constant_n = drm_dp_has_quirk(&intel_dp->desc, | 51 | bool constant_n = drm_dp_has_quirk(&intel_dp->desc, |
@@ -106,35 +110,39 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
106 | return 0; | 110 | return 0; |
107 | } | 111 | } |
108 | 112 | ||
109 | static int intel_dp_mst_atomic_check(struct drm_connector *connector, | 113 | static int |
110 | struct drm_connector_state *new_conn_state) | 114 | intel_dp_mst_atomic_check(struct drm_connector *connector, |
115 | struct drm_connector_state *new_conn_state) | ||
111 | { | 116 | { |
112 | struct drm_atomic_state *state = new_conn_state->state; | 117 | struct drm_atomic_state *state = new_conn_state->state; |
113 | struct drm_connector_state *old_conn_state; | 118 | struct drm_connector_state *old_conn_state = |
114 | struct drm_crtc *old_crtc; | 119 | drm_atomic_get_old_connector_state(state, connector); |
120 | struct intel_connector *intel_connector = | ||
121 | to_intel_connector(connector); | ||
122 | struct drm_crtc *new_crtc = new_conn_state->crtc; | ||
115 | struct drm_crtc_state *crtc_state; | 123 | struct drm_crtc_state *crtc_state; |
116 | int slots, ret = 0; | 124 | struct drm_dp_mst_topology_mgr *mgr; |
125 | int ret = 0; | ||
117 | 126 | ||
118 | old_conn_state = drm_atomic_get_old_connector_state(state, connector); | 127 | if (!old_conn_state->crtc) |
119 | old_crtc = old_conn_state->crtc; | 128 | return 0; |
120 | if (!old_crtc) | ||
121 | return ret; | ||
122 | |||
123 | crtc_state = drm_atomic_get_new_crtc_state(state, old_crtc); | ||
124 | slots = to_intel_crtc_state(crtc_state)->dp_m_n.tu; | ||
125 | if (drm_atomic_crtc_needs_modeset(crtc_state) && slots > 0) { | ||
126 | struct drm_dp_mst_topology_mgr *mgr; | ||
127 | struct drm_encoder *old_encoder; | ||
128 | 129 | ||
129 | old_encoder = old_conn_state->best_encoder; | 130 | /* We only want to free VCPI if this state disables the CRTC on this |
130 | mgr = &enc_to_mst(old_encoder)->primary->dp.mst_mgr; | 131 | * connector |
132 | */ | ||
133 | if (new_crtc) { | ||
134 | crtc_state = drm_atomic_get_new_crtc_state(state, new_crtc); | ||
131 | 135 | ||
132 | ret = drm_dp_atomic_release_vcpi_slots(state, mgr, slots); | 136 | if (!crtc_state || |
133 | if (ret) | 137 | !drm_atomic_crtc_needs_modeset(crtc_state) || |
134 | DRM_DEBUG_KMS("failed releasing %d vcpi slots:%d\n", slots, ret); | 138 | crtc_state->enable) |
135 | else | 139 | return 0; |
136 | to_intel_crtc_state(crtc_state)->dp_m_n.tu = 0; | ||
137 | } | 140 | } |
141 | |||
142 | mgr = &enc_to_mst(old_conn_state->best_encoder)->primary->dp.mst_mgr; | ||
143 | ret = drm_dp_atomic_release_vcpi_slots(state, mgr, | ||
144 | intel_connector->port); | ||
145 | |||
138 | return ret; | 146 | return ret; |
139 | } | 147 | } |
140 | 148 | ||
@@ -456,6 +464,7 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo | |||
456 | intel_connector->get_hw_state = intel_dp_mst_get_hw_state; | 464 | intel_connector->get_hw_state = intel_dp_mst_get_hw_state; |
457 | intel_connector->mst_port = intel_dp; | 465 | intel_connector->mst_port = intel_dp; |
458 | intel_connector->port = port; | 466 | intel_connector->port = port; |
467 | drm_dp_mst_get_port_malloc(port); | ||
459 | 468 | ||
460 | connector = &intel_connector->base; | 469 | connector = &intel_connector->base; |
461 | ret = drm_connector_init(dev, connector, &intel_dp_mst_connector_funcs, | 470 | ret = drm_connector_init(dev, connector, &intel_dp_mst_connector_funcs, |
@@ -516,20 +525,10 @@ static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, | |||
516 | drm_connector_put(connector); | 525 | drm_connector_put(connector); |
517 | } | 526 | } |
518 | 527 | ||
519 | static void intel_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) | ||
520 | { | ||
521 | struct intel_dp *intel_dp = container_of(mgr, struct intel_dp, mst_mgr); | ||
522 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | ||
523 | struct drm_device *dev = intel_dig_port->base.base.dev; | ||
524 | |||
525 | drm_kms_helper_hotplug_event(dev); | ||
526 | } | ||
527 | |||
528 | static const struct drm_dp_mst_topology_cbs mst_cbs = { | 528 | static const struct drm_dp_mst_topology_cbs mst_cbs = { |
529 | .add_connector = intel_dp_add_mst_connector, | 529 | .add_connector = intel_dp_add_mst_connector, |
530 | .register_connector = intel_dp_register_mst_connector, | 530 | .register_connector = intel_dp_register_mst_connector, |
531 | .destroy_connector = intel_dp_destroy_mst_connector, | 531 | .destroy_connector = intel_dp_destroy_mst_connector, |
532 | .hotplug = intel_dp_mst_hotplug, | ||
533 | }; | 532 | }; |
534 | 533 | ||
535 | static struct intel_dp_mst_encoder * | 534 | static struct intel_dp_mst_encoder * |