disp: msm: sde: implement drm hooks to get precise vblank timestamp

Add precise vblank timestamp support through the DRM framework.
Implement the vblank related hooks to get the vblank count and
timestamp. Use MDSS 8.x, hardware feature that supports logging
of the vsync timestamp counter which can be used to derive the
accurate kernel timestamp. The current ktime would be returned
for older targets to support backward compatibility.

Change-Id: I2d35ed4a643a519e602278b6d16e67ccee16a60b
Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
This commit is contained in:
Veera Sundaram Sankaran
2020-09-17 15:20:37 -07:00
parent b554f01a10
commit 3cef1faa29
6 changed files with 147 additions and 13 deletions

View File

@@ -220,7 +220,7 @@ struct sde_encoder_virt {
bool intfs_swapped;
bool qdss_status;
void (*crtc_vblank_cb)(void *data);
void (*crtc_vblank_cb)(void *data, ktime_t ts);
void *crtc_vblank_cb_data;
struct dentry *debugfs_root;
@@ -290,7 +290,7 @@ void sde_encoder_early_wakeup(struct drm_encoder *drm_enc);
* @data: user data provided to callback
*/
void sde_encoder_register_vblank_callback(struct drm_encoder *encoder,
void (*cb)(void *), void *data);
void (*cb)(void *, ktime_t), void *data);
/**
* sde_encoder_register_frame_event_callback - provide callback to encoder that
@@ -386,6 +386,20 @@ u32 sde_encoder_get_fps(struct drm_encoder *encoder);
*/
enum sde_intf_mode sde_encoder_get_intf_mode(struct drm_encoder *encoder);
/*
* sde_encoder_get_frame_count - get hardware frame count of the given encoder
* @encoder: Pointer to drm encoder object
*/
u32 sde_encoder_get_frame_count(struct drm_encoder *encoder);
/*
* sde_encoder_get_vblank_timestamp - get the last vsync timestamp
* @encoder: Pointer to drm encoder object
* @tvblank: vblank timestamp
*/
bool sde_encoder_get_vblank_timestamp(struct drm_encoder *encoder,
ktime_t *tvblank);
/**
* sde_encoder_control_te - control enabling/disabling VSYNC_IN_EN
* @encoder: encoder pointer