From 683f6bc6af220bb36b91f194480479314dcd76ef Mon Sep 17 00:00:00 2001 From: Abhijit Kulkarni Date: Tue, 2 Nov 2021 18:19:18 -0700 Subject: [PATCH] disp: msm: sde: send event on trusted vm transition This change sends a notification to user mode after msm_drm driver releases the mmio and irq resources on trusted vm transition request. This is required as user mode has no other way to know when the resources where actually released. User mode driver earlier relied on retire fence signaling but retire fences are send before releasing the hw. Change-Id: Ia218cfcbf398b2de1ad9578fb9baedf348b067df Signed-off-by: Abhijit Kulkarni --- include/uapi/display/drm/sde_drm.h | 1 + msm/sde/sde_crtc.c | 14 ++++++++++++++ msm/sde/sde_crtc.h | 5 +++++ msm/sde/sde_kms.c | 2 ++ 4 files changed, 22 insertions(+) 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; }