mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-16 23:45:31 +08:00
86de88cfeb
drm_self_refresh_helper_update_avg_times() was incorrectly accessing the
new incoming state after drm_atomic_helper_commit_hw_done(). But this
state might have already been superceeded by an !nonblock atomic update
resulting in dereferencing an already free'd crtc_state.
TODO I *think* this will more or less do the right thing.. althought I'm
not 100% sure if, for example, we enter psr in a nonblock commit, and
then leave psr in a !nonblock commit that overtakes the completion of
the nonblock commit. Not sure if this sort of scenario can happen in
practice. But not crashing is better than crashing, so I guess we
should either take this patch or rever the self-refresh helpers until
Sean can figure out a better solution.
Fixes: d4da4e3334
("drm: Measure Self Refresh Entry/Exit times to avoid thrashing")
Cc: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Rob Clark <robdclark@chromium.org>
[seanpaul fixed up some checkpatch warns]
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20191104173737.142558-1-robdclark@gmail.com
22 lines
594 B
C
22 lines
594 B
C
// SPDX-License-Identifier: MIT
|
|
/*
|
|
* Copyright (C) 2019 Google, Inc.
|
|
*
|
|
* Authors:
|
|
* Sean Paul <seanpaul@chromium.org>
|
|
*/
|
|
#ifndef DRM_SELF_REFRESH_HELPER_H_
|
|
#define DRM_SELF_REFRESH_HELPER_H_
|
|
|
|
struct drm_atomic_state;
|
|
struct drm_crtc;
|
|
|
|
void drm_self_refresh_helper_alter_state(struct drm_atomic_state *state);
|
|
void drm_self_refresh_helper_update_avg_times(struct drm_atomic_state *state,
|
|
unsigned int commit_time_ms,
|
|
unsigned int new_self_refresh_mask);
|
|
|
|
int drm_self_refresh_helper_init(struct drm_crtc *crtc);
|
|
void drm_self_refresh_helper_cleanup(struct drm_crtc *crtc);
|
|
#endif
|