Commit 885455d6 authored by Mark Yacoub's avatar Mark Yacoub Committed by Rob Clark

drm/msm: Change dpu_crtc_get_vblank_counter to use vsync count.

[why]
vsync_cnt atomic counter increments for every hw vsync. On the other
hand, frame count is a register that increments when the frame gets
actually pushed out. We cannnot read this register whenever the timing
engine is off, but vblank counter should still return a valid number.
This behavior also matches the downstream driver.

[How]
Read the encoder vsync count instead of the dpu_encoder_phys frame
count.
Suggested-by: default avatarAbhinav Kumar <abhinavk@codeaurora.org>
CC: Rob Clark <robdclark@chromium.org>
Signed-off-by: default avatarMark Yacoub <markyacoub@chromium.org>
Reviewed-by: default avatarAbhinav Kumar <abhinavk@codeaurora.org>
Link: https://lore.kernel.org/r/20210830181359.124267-1-markyacoub@chromium.orgSigned-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
parent f25f6566
...@@ -72,15 +72,13 @@ static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc) ...@@ -72,15 +72,13 @@ static struct drm_encoder *get_encoder_from_crtc(struct drm_crtc *crtc)
static u32 dpu_crtc_get_vblank_counter(struct drm_crtc *crtc) static u32 dpu_crtc_get_vblank_counter(struct drm_crtc *crtc)
{ {
struct drm_encoder *encoder; struct drm_encoder *encoder = get_encoder_from_crtc(crtc);
encoder = get_encoder_from_crtc(crtc);
if (!encoder) { if (!encoder) {
DRM_ERROR("no encoder found for crtc %d\n", crtc->index); DRM_ERROR("no encoder found for crtc %d\n", crtc->index);
return false; return 0;
} }
return dpu_encoder_get_frame_count(encoder); return dpu_encoder_get_vsync_count(encoder);
} }
static bool dpu_crtc_get_scanout_position(struct drm_crtc *crtc, static bool dpu_crtc_get_scanout_position(struct drm_crtc *crtc,
......
...@@ -395,19 +395,11 @@ int dpu_encoder_helper_unregister_irq(struct dpu_encoder_phys *phys_enc, ...@@ -395,19 +395,11 @@ int dpu_encoder_helper_unregister_irq(struct dpu_encoder_phys *phys_enc,
return 0; return 0;
} }
int dpu_encoder_get_frame_count(struct drm_encoder *drm_enc) int dpu_encoder_get_vsync_count(struct drm_encoder *drm_enc)
{ {
struct dpu_encoder_virt *dpu_enc; struct dpu_encoder_virt *dpu_enc = to_dpu_encoder_virt(drm_enc);
struct dpu_encoder_phys *phys; struct dpu_encoder_phys *phys = dpu_enc ? dpu_enc->cur_master : NULL;
int framecount = 0; return phys ? atomic_read(&phys->vsync_cnt) : 0;
dpu_enc = to_dpu_encoder_virt(drm_enc);
phys = dpu_enc ? dpu_enc->cur_master : NULL;
if (phys && phys->ops.get_frame_count)
framecount = phys->ops.get_frame_count(phys);
return framecount;
} }
int dpu_encoder_get_linecount(struct drm_encoder *drm_enc) int dpu_encoder_get_linecount(struct drm_encoder *drm_enc)
......
...@@ -163,9 +163,9 @@ void dpu_encoder_set_idle_timeout(struct drm_encoder *drm_enc, ...@@ -163,9 +163,9 @@ void dpu_encoder_set_idle_timeout(struct drm_encoder *drm_enc,
int dpu_encoder_get_linecount(struct drm_encoder *drm_enc); int dpu_encoder_get_linecount(struct drm_encoder *drm_enc);
/** /**
* dpu_encoder_get_frame_count - get interface frame count for the encoder. * dpu_encoder_get_vsync_count - get vsync count for the encoder.
* @drm_enc: Pointer to previously created drm encoder structure * @drm_enc: Pointer to previously created drm encoder structure
*/ */
int dpu_encoder_get_frame_count(struct drm_encoder *drm_enc); int dpu_encoder_get_vsync_count(struct drm_encoder *drm_enc);
#endif /* __DPU_ENCODER_H__ */ #endif /* __DPU_ENCODER_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment