static int intel_dp_mst_atomic_check(struct drm_connector *connector, struct drm_connector_state *new_conn_state) { struct drm_atomic_state *state = new_conn_state->state; struct drm_connector_state *old_conn_state; struct drm_crtc *old_crtc; struct drm_crtc_state *crtc_state; int slots, ret = 0; old_conn_state = drm_atomic_get_old_connector_state(state, connector); old_crtc = old_conn_state->crtc; if (!old_crtc) return ret; crtc_state = drm_atomic_get_new_crtc_state(state, old_crtc); slots = to_intel_crtc_state(crtc_state)->dp_m_n.tu; if (drm_atomic_crtc_needs_modeset(crtc_state) && slots > 0) { struct drm_dp_mst_topology_mgr *mgr; struct drm_encoder *old_encoder; old_encoder = old_conn_state->best_encoder; mgr = &enc_to_mst(old_encoder)->primary->dp.mst_mgr; ret = drm_dp_atomic_release_vcpi_slots(state, mgr, slots); if (ret) DRM_DEBUG_KMS("failed releasing %d vcpi slots:%d\n", slots, ret); else to_intel_crtc_state(crtc_state)->dp_m_n.tu = 0; } return ret; }
static int drm_simple_kms_plane_atomic_check(struct drm_plane *plane, struct drm_plane_state *plane_state) { struct drm_simple_display_pipe *pipe; struct drm_crtc_state *crtc_state; int ret; pipe = container_of(plane, struct drm_simple_display_pipe, plane); crtc_state = drm_atomic_get_new_crtc_state(plane_state->state, &pipe->crtc); ret = drm_atomic_helper_check_plane_state(plane_state, crtc_state, DRM_PLANE_HELPER_NO_SCALING, DRM_PLANE_HELPER_NO_SCALING, false, true); if (ret) return ret; if (!plane_state->visible) return 0; if (!pipe->funcs || !pipe->funcs->check) return 0; return pipe->funcs->check(pipe, plane_state, crtc_state); }
static int intel_plane_atomic_check(struct drm_plane *plane, struct drm_plane_state *new_plane_state) { struct drm_atomic_state *state = new_plane_state->state; const struct drm_plane_state *old_plane_state = drm_atomic_get_old_plane_state(state, plane); struct drm_crtc *crtc = new_plane_state->crtc ?: old_plane_state->crtc; const struct drm_crtc_state *old_crtc_state; struct drm_crtc_state *new_crtc_state; if (!crtc) return 0; old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc); new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc); return intel_plane_atomic_check_with_state(to_intel_crtc_state(old_crtc_state), to_intel_crtc_state(new_crtc_state), to_intel_plane_state(old_plane_state), to_intel_plane_state(new_plane_state)); }
static int intel_dp_mst_atomic_check(struct drm_connector *connector, struct drm_connector_state *new_conn_state) { struct drm_atomic_state *state = new_conn_state->state; struct drm_connector_state *old_conn_state = drm_atomic_get_old_connector_state(state, connector); struct intel_connector *intel_connector = to_intel_connector(connector); struct drm_crtc *new_crtc = new_conn_state->crtc; struct drm_crtc_state *crtc_state; struct drm_dp_mst_topology_mgr *mgr; int ret; ret = intel_digital_connector_atomic_check(connector, new_conn_state); if (ret) return ret; if (!old_conn_state->crtc) return 0; /* We only want to free VCPI if this state disables the CRTC on this * connector */ if (new_crtc) { crtc_state = drm_atomic_get_new_crtc_state(state, new_crtc); if (!crtc_state || !drm_atomic_crtc_needs_modeset(crtc_state) || crtc_state->enable) return 0; } mgr = &enc_to_mst(old_conn_state->best_encoder)->primary->dp.mst_mgr; ret = drm_dp_atomic_release_vcpi_slots(state, mgr, intel_connector->port); return ret; }