|
@@ -167,8 +167,67 @@ err_gem_object_unreference:
|
|
|
return ERR_PTR(ret);
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+rockchip_drm_psr_inhibit_get_state(struct drm_atomic_state *state)
|
|
|
+{
|
|
|
+ struct drm_crtc *crtc;
|
|
|
+ struct drm_crtc_state *crtc_state;
|
|
|
+ struct drm_encoder *encoder;
|
|
|
+ u32 encoder_mask = 0;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for_each_old_crtc_in_state(state, crtc, crtc_state, i) {
|
|
|
+ encoder_mask |= crtc_state->encoder_mask;
|
|
|
+ encoder_mask |= crtc->state->encoder_mask;
|
|
|
+ }
|
|
|
+
|
|
|
+ drm_for_each_encoder_mask(encoder, state->dev, encoder_mask)
|
|
|
+ rockchip_drm_psr_inhibit_get(encoder);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+rockchip_drm_psr_inhibit_put_state(struct drm_atomic_state *state)
|
|
|
+{
|
|
|
+ struct drm_crtc *crtc;
|
|
|
+ struct drm_crtc_state *crtc_state;
|
|
|
+ struct drm_encoder *encoder;
|
|
|
+ u32 encoder_mask = 0;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for_each_old_crtc_in_state(state, crtc, crtc_state, i) {
|
|
|
+ encoder_mask |= crtc_state->encoder_mask;
|
|
|
+ encoder_mask |= crtc->state->encoder_mask;
|
|
|
+ }
|
|
|
+
|
|
|
+ drm_for_each_encoder_mask(encoder, state->dev, encoder_mask)
|
|
|
+ rockchip_drm_psr_inhibit_put(encoder);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+rockchip_atomic_helper_commit_tail_rpm(struct drm_atomic_state *old_state)
|
|
|
+{
|
|
|
+ struct drm_device *dev = old_state->dev;
|
|
|
+
|
|
|
+ rockchip_drm_psr_inhibit_get_state(old_state);
|
|
|
+
|
|
|
+ drm_atomic_helper_commit_modeset_disables(dev, old_state);
|
|
|
+
|
|
|
+ drm_atomic_helper_commit_modeset_enables(dev, old_state);
|
|
|
+
|
|
|
+ drm_atomic_helper_commit_planes(dev, old_state,
|
|
|
+ DRM_PLANE_COMMIT_ACTIVE_ONLY);
|
|
|
+
|
|
|
+ rockchip_drm_psr_inhibit_put_state(old_state);
|
|
|
+
|
|
|
+ drm_atomic_helper_commit_hw_done(old_state);
|
|
|
+
|
|
|
+ drm_atomic_helper_wait_for_vblanks(dev, old_state);
|
|
|
+
|
|
|
+ drm_atomic_helper_cleanup_planes(dev, old_state);
|
|
|
+}
|
|
|
+
|
|
|
static const struct drm_mode_config_helper_funcs rockchip_mode_config_helpers = {
|
|
|
- .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
|
|
|
+ .atomic_commit_tail = rockchip_atomic_helper_commit_tail_rpm,
|
|
|
};
|
|
|
|
|
|
static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = {
|