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: Abhinav Kumar <abhinavk@codeaurora.org> CC: Rob Clark <robdclark@chromium.org> Signed-off-by: Mark Yacoub <markyacoub@chromium.org> Reviewed-by: Abhinav Kumar <abhinavk@codeaurora.org> Link: https://lore.kernel.org/r/20210830181359.124267-1-markyacoub@chromium.org Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
parent
f25f656608
commit
885455d6bf
3 changed files with 9 additions and 19 deletions
|
@ -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,
|
||||||
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,
|
||||||
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__ */
|
||||||
|
|
Loading…
Add table
Reference in a new issue