diff --git a/include/uapi/display/drm/sde_drm.h b/include/uapi/display/drm/sde_drm.h index 0df3a78cee..11186fc815 100644 --- a/include/uapi/display/drm/sde_drm.h +++ b/include/uapi/display/drm/sde_drm.h @@ -814,6 +814,7 @@ struct drm_msm_noise_layer_cfg { #define DRM_EVENT_MMRM_CB 0X8000000B #define DRM_EVENT_FRAME_DATA 0x8000000C #define DRM_EVENT_DIMMING_BL 0X8000000D +#define DRM_EVENT_VM_RELEASE 0X8000000E #ifndef DRM_MODE_FLAG_VID_MODE_PANEL #define DRM_MODE_FLAG_VID_MODE_PANEL 0x01 diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index 5e024cb106..7b161ebaf1 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -70,6 +70,9 @@ static int sde_crtc_pm_event_handler(struct drm_crtc *crtc, bool en, static int _sde_crtc_set_noise_layer(struct sde_crtc *sde_crtc, struct sde_crtc_state *cstate, void __user *usr_ptr); +static int sde_crtc_vm_release_handler(struct drm_crtc *crtc_drm, + bool en, struct sde_irq_callback *irq); + static struct sde_crtc_custom_events custom_events[] = { {DRM_EVENT_AD_BACKLIGHT, sde_cp_ad_interrupt}, @@ -81,6 +84,7 @@ static struct sde_crtc_custom_events custom_events[] = { {DRM_EVENT_LTM_WB_PB, sde_cp_ltm_wb_pb_interrupt}, {DRM_EVENT_LTM_OFF, sde_cp_ltm_off_event_handler}, {DRM_EVENT_MMRM_CB, sde_crtc_mmrm_interrupt_handler}, + {DRM_EVENT_VM_RELEASE, sde_crtc_vm_release_handler}, }; /* default input fence timeout, in ms */ @@ -7506,6 +7510,11 @@ static int sde_crtc_mmrm_interrupt_handler(struct drm_crtc *crtc_drm, return 0; } +static int sde_crtc_vm_release_handler(struct drm_crtc *crtc_drm, + bool en, struct sde_irq_callback *irq) +{ + return 0; +} /** * sde_crtc_update_cont_splash_settings - update mixer settings * and initial clk during device bootup for cont_splash use case @@ -7662,3 +7671,8 @@ void sde_crtc_disable_cp_features(struct drm_crtc *crtc) { sde_cp_disable_features(crtc); } + +void _sde_crtc_vm_release_notify(struct drm_crtc *crtc) +{ + sde_crtc_event_notify(crtc, DRM_EVENT_VM_RELEASE, sizeof(uint32_t), 1); +} diff --git a/msm/sde/sde_crtc.h b/msm/sde/sde_crtc.h index 44d94ce990..1b74a0efcc 100644 --- a/msm/sde/sde_crtc.h +++ b/msm/sde/sde_crtc.h @@ -1063,4 +1063,9 @@ void sde_crtc_cancel_delayed_work(struct drm_crtc *crtc); */ struct drm_encoder *sde_crtc_get_src_encoder_of_clone(struct drm_crtc *crtc); +/* + * _sde_crtc_vm_release_notify- send event to usermode on vm release + */ +void _sde_crtc_vm_release_notify(struct drm_crtc *crtc); + #endif /* _SDE_CRTC_H_ */ diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index e43a42dbf3..158f2f896e 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -1466,6 +1466,8 @@ int sde_kms_vm_primary_post_commit(struct sde_kms *sde_kms, } sde_vm_unlock(sde_kms); + _sde_crtc_vm_release_notify(crtc); + exit: return rc; }