aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dp_mst.c
diff options
context:
space:
mode:
authorRodrigo Vivi <rodrigo.vivi@intel.com>2019-01-22 17:51:36 -0500
committerRodrigo Vivi <rodrigo.vivi@intel.com>2019-01-22 17:51:36 -0500
commitf42fb2317ffcbd005eeb22b1e49020821a11e23a (patch)
treed89ccd0c9086c492a32da7ce4c2486c99ed3e805 /drivers/gpu/drm/i915/intel_dp_mst.c
parent25f9cebd7a52ddf15405d74fb5fd4c374f301983 (diff)
parentf164a94c2c87752caeb1a3cbe068c440e7f7921f (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.c65
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
109static int intel_dp_mst_atomic_check(struct drm_connector *connector, 113static int
110 struct drm_connector_state *new_conn_state) 114intel_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
519static 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
528static const struct drm_dp_mst_topology_cbs mst_cbs = { 528static 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
535static struct intel_dp_mst_encoder * 534static struct intel_dp_mst_encoder *