diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_mst.c | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 631fd1537252..c8e2215628e6 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c | |||
@@ -41,8 +41,12 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
41 | struct drm_connector *connector = conn_state->connector; | 41 | struct drm_connector *connector = conn_state->connector; |
42 | void *port = to_intel_connector(connector)->port; | 42 | void *port = to_intel_connector(connector)->port; |
43 | struct drm_atomic_state *state = pipe_config->base.state; | 43 | struct drm_atomic_state *state = pipe_config->base.state; |
44 | struct drm_crtc *crtc = pipe_config->base.crtc; | ||
45 | struct drm_crtc_state *old_crtc_state = | ||
46 | drm_atomic_get_old_crtc_state(state, crtc); | ||
44 | int bpp; | 47 | int bpp; |
45 | int lane_count, slots = 0; | 48 | int lane_count, slots = |
49 | to_intel_crtc_state(old_crtc_state)->dp_m_n.tu; | ||
46 | const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; | 50 | const struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; |
47 | int mst_pbn; | 51 | int mst_pbn; |
48 | bool constant_n = drm_dp_has_quirk(&intel_dp->desc, | 52 | bool constant_n = drm_dp_has_quirk(&intel_dp->desc, |
@@ -107,35 +111,39 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder, | |||
107 | return true; | 111 | return true; |
108 | } | 112 | } |
109 | 113 | ||
110 | static int intel_dp_mst_atomic_check(struct drm_connector *connector, | 114 | static int |
111 | struct drm_connector_state *new_conn_state) | 115 | intel_dp_mst_atomic_check(struct drm_connector *connector, |
116 | struct drm_connector_state *new_conn_state) | ||
112 | { | 117 | { |
113 | struct drm_atomic_state *state = new_conn_state->state; | 118 | struct drm_atomic_state *state = new_conn_state->state; |
114 | struct drm_connector_state *old_conn_state; | 119 | struct drm_connector_state *old_conn_state = |
115 | struct drm_crtc *old_crtc; | 120 | drm_atomic_get_old_connector_state(state, connector); |
121 | struct intel_connector *intel_connector = | ||
122 | to_intel_connector(connector); | ||
123 | struct drm_crtc *new_crtc = new_conn_state->crtc; | ||
116 | struct drm_crtc_state *crtc_state; | 124 | struct drm_crtc_state *crtc_state; |
117 | int slots, ret = 0; | 125 | struct drm_dp_mst_topology_mgr *mgr; |
126 | int ret = 0; | ||
118 | 127 | ||
119 | old_conn_state = drm_atomic_get_old_connector_state(state, connector); | 128 | if (!old_conn_state->crtc) |
120 | old_crtc = old_conn_state->crtc; | 129 | return 0; |
121 | if (!old_crtc) | ||
122 | return ret; | ||
123 | |||
124 | crtc_state = drm_atomic_get_new_crtc_state(state, old_crtc); | ||
125 | slots = to_intel_crtc_state(crtc_state)->dp_m_n.tu; | ||
126 | if (drm_atomic_crtc_needs_modeset(crtc_state) && slots > 0) { | ||
127 | struct drm_dp_mst_topology_mgr *mgr; | ||
128 | struct drm_encoder *old_encoder; | ||
129 | 130 | ||
130 | old_encoder = old_conn_state->best_encoder; | 131 | /* We only want to free VCPI if this state disables the CRTC on this |
131 | mgr = &enc_to_mst(old_encoder)->primary->dp.mst_mgr; | 132 | * connector |
133 | */ | ||
134 | if (new_crtc) { | ||
135 | crtc_state = drm_atomic_get_new_crtc_state(state, new_crtc); | ||
132 | 136 | ||
133 | ret = drm_dp_atomic_release_vcpi_slots(state, mgr, slots); | 137 | if (!crtc_state || |
134 | if (ret) | 138 | !drm_atomic_crtc_needs_modeset(crtc_state) || |
135 | DRM_DEBUG_KMS("failed releasing %d vcpi slots:%d\n", slots, ret); | 139 | crtc_state->enable) |
136 | else | 140 | return 0; |
137 | to_intel_crtc_state(crtc_state)->dp_m_n.tu = 0; | ||
138 | } | 141 | } |
142 | |||
143 | mgr = &enc_to_mst(old_conn_state->best_encoder)->primary->dp.mst_mgr; | ||
144 | ret = drm_dp_atomic_release_vcpi_slots(state, mgr, | ||
145 | intel_connector->port); | ||
146 | |||
139 | return ret; | 147 | return ret; |
140 | } | 148 | } |
141 | 149 | ||