drm/msm: Various dpu locking and legacy cleanups
v2 cover drm/msm: Various dpu locking and legacy cleanups
From: Sean Paul <[email protected]>
This was originally 3 patchsets, but none have gotten full review, so I figured I'd package the v2's all up into one set so it's easier to track.
Set 1- https://lists.freedesktop.org/archives/dri-devel/2018-November/196170.html
Set 2- https://lists.freedesktop.org/archives/dri-devel/2018-November/196184.html
Set 3- https://lists.freedesktop.org/archives/dri-devel/2018-November/196276.html
Thanks,
Sean
Sean Paul (24):
drm/msm: dpu: Remove dpu_power_handle_get_dbus_name() drm/msm: dpu: Remove unused trace_dpu_perf_update_bus() drm/msm: dpu: Remove dpu_power_client
drm/msm: dpu: Don't use power_event for vbif_init_memtypes drm/msm: dpu: Handle crtc pm_runtime_resume() directly drm/msm: dpu: Remove power_handle from core_perf drm/msm: dpu: Include dpu_io_util.h directly in dpu_kms.h drm/msm: dpu: Move DPU_POWER_HANDLE_DBUS_ID to core_perf drm/msm: dpu: Remove dpu_power_handle
drm/msm: dpu: Fix typo in dpu_encoder
drm/msm: dpu: Add ->enabled to dpu_encoder_virt drm/msm: dpu: Move crtc runtime resume to encoder drm/msm: dpu: Don't drop locks in crtc_vblank_enable drm/msm: dpu: Grab the modeset locks in frame_event drm/msm: dpu: Stop using encoder->crtc pointer drm/msm: dpu: Add modeset lock checks where applicable drm/msm: dpu: Move pm_runtime_(get|put) from vblank_enable drm/msm: dpu: Remove crtc_lock from setup_mixers drm/msm: dpu: Remove vblank_callback from encoder drm/msm: dpu: Use atomic_disable for dpu_crtc_disable drm/msm: dpu: Don't bother checking ->enabled in dpu_crtc_vblank drm/msm: dpu: Separate crtc assignment from vblank enable drm/msm: dpu: Remove vblank_requested flag from dpu_crtc drm/msm: dpu: Remove crtc_lock
drivers/gpu/drm/msm/Makefile | 1 - drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 37 ++- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h | 22 +- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 216 +++++----------- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 15 +- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 97 ++++--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 24 +- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 76 ++---- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 6 +- .../gpu/drm/msm/disp/dpu1/dpu_power_handle.c | 240 ------------------ .../gpu/drm/msm/disp/dpu1/dpu_power_handle.h | 217 ---------------- drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 43 +--- 12 files changed, 204 insertions(+), 790 deletions(-) delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.c delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.h
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Sean Paul
reviewerPATCH v2 1/24 drm/msm: dpu: Remove dpu_power_handle_get_dbus_name()
From: Sean Paul <[email protected]>
It's only used for debugfs, so just output the enum value instead.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 6 ++---- drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.c | 14 -------------- drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.h | 7 ------- 3 files changed, 2 insertions(+), 25 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2 -4
@@ -1381,11 +1381,9 @@ static int dpu_crtc_debugfs_state_show(struct seq_file *s, void *v) dpu_crtc->cur_perf.core_clk_rate);for (i =DPU_POWER_HANDLE_DBUS_ID_MNOC ; i <DPU_POWER_HANDLE_DBUS_ID_MAX ; i++) { -seq_printf (s,"bw_ctl[%s]: %llu\n" , -dpu_power_handle_get_dbus_name (i), +seq_printf (s,"bw_ctl[%d]: %llu\n" , i, dpu_crtc->cur_perf.bw_ctl[i]); -seq_printf (s,"max_per_pipe_ib[%s]: %llu\n" , -dpu_power_handle_get_dbus_name (i), +seq_printf (s,"max_per_pipe_ib[%d]: %llu\n" , i, dpu_crtc->cur_perf.max_per_pipe_ib[i]); }
drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.c +0 -14
@@ -24,20 +24,6 @@#include "dpu_power_handle.h" #include "dpu_trace.h" -static const char *data_bus_name[DPU_POWER_HANDLE_DBUS_ID_MAX ] = { - [DPU_POWER_HANDLE_DBUS_ID_MNOC ] ="qcom,dpu-data-bus" , - [DPU_POWER_HANDLE_DBUS_ID_LLCC ] ="qcom,dpu-llcc-bus" , - [DPU_POWER_HANDLE_DBUS_ID_EBI ] ="qcom,dpu-ebi-bus" , -}; - -const char *dpu_power_handle_get_dbus_name (u32 bus_id) -{ -if (bus_id <DPU_POWER_HANDLE_DBUS_ID_MAX ) -return data_bus_name[bus_id]; - -return NULL ; -} -static void dpu_power_event_trigger_locked (struct dpu_power_handle *phandle,u32 event_type) {
drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.h +0 -7
@@ -207,11 +207,4 @@ struct dpu_power_event *dpu_power_handle_register_event(void dpu_power_handle_unregister_event (struct dpu_power_handle *phandle,struct dpu_power_event *event); -/** -* dpu_power_handle_get_dbus_name - get name of given data bus identifier -* @bus_id: data bus identifier -* Return: Pointer to name string if success; NULL otherwise -*/ -const char *dpu_power_handle_get_dbus_name (u32 bus_id); -#endif /* _DPU_POWER_HANDLE_H_ */
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-1-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
PATCH v2 2/24 drm/msm: dpu: Remove unused trace_dpu_perf_update_bus()
From: Sean Paul <[email protected]>
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 21 --------------------- 1 file changed, 21 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h +0 -21
@@ -99,27 +99,6 @@ TRACE_EVENT(dpu_perf_set_ot, __entry->vbif_idx) ) -TRACE_EVENT (dpu_perf_update_bus, - TP_PROTO(int client, unsigned long long ab_quota, - unsigned long long ib_quota), -TP_ARGS (client, ab_quota, ib_quota), -TP_STRUCT__entry ( - __field(int, client) - __field(u64, ab_quota) -__field (u64, ib_quota) - ), -TP_fast_assign ( - __entry->client = client; - __entry->ab_quota = ab_quota; - __entry->ib_quota = ib_quota; - ), -TP_printk ("Request client:%d ab=%llu ib=%llu" , - __entry->client, - __entry->ab_quota, - __entry->ib_quota) -) - - TRACE_EVENT(dpu_cmd_release_bw, TP_PROTO(u32 crtc_id), TP_ARGS(crtc_id),
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 5/24 drm/msm: dpu: Handle crtc pm_runtime_resume() directly
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
Instead of registering through dpu_power_handle just to get a call on runtime_resume, call the crtc function directly.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 23 ++++++----------------- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 10 ++++++---- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 4 ++++ drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 8 ++++---- 4 files changed, 20 insertions(+), 25 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +6 -17
@@ -33,7 +33,6 @@#include "dpu_plane.h" #include "dpu_encoder.h" #include "dpu_vbif.h" -#include "dpu_power_handle.h" #include "dpu_core_perf.h" #include "dpu_trace.h"
@@ -69,8 +68,6 @@ static void dpu_crtc_destroy(struct drm_crtc *crtc)if (!crtc)return ; - dpu_crtc->phandle =NULL ; -drm_crtc_cleanup (crtc);mutex_destroy (&dpu_crtc->crtc_lock);kfree (dpu_crtc);
@@ -844,15 +841,17 @@ static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc)return &cstate->base; } -static void dpu_crtc_handle_power_event (u32 event_type,void *arg) +void dpu_crtc_runtime_resume (struct drm_crtc *crtc) { -struct drm_crtc *crtc = arg;struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);struct drm_encoder *encoder;mutex_lock (&dpu_crtc->crtc_lock); -trace_dpu_crtc_handle_power_event (DRMID (crtc), event_type); +if (!dpu_crtc->enabled) + goto end; + +trace_dpu_crtc_runtime_resume (DRMID (crtc));/* restore encoder; crtc will be programmed during commit */ drm_for_each_encoder (encoder, crtc->dev) {
@@ -862,6 +861,7 @@ static void dpu_crtc_handle_power_event(u32 event_type, void *arg)dpu_encoder_virt_restore (encoder); } +end:mutex_unlock (&dpu_crtc->crtc_lock); }
@@ -917,10 +917,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc)dpu_encoder_register_frame_event_callback (encoder,NULL ,NULL ); } -if (dpu_crtc->power_event) -dpu_power_handle_unregister_event (dpu_crtc->phandle, - dpu_crtc->power_event); -memset (cstate->mixers,0 ,sizeof (cstate->mixers)); cstate->num_mixers =0 ;
@@ -972,11 +968,6 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,/* Enable/restore vblank irq handling */ drm_crtc_vblank_on (crtc); - - dpu_crtc->power_event =dpu_power_handle_register_event ( - dpu_crtc->phandle,DPU_POWER_EVENT_ENABLE , - dpu_crtc_handle_power_event, crtc, dpu_crtc->name); - }struct plane_state {
@@ -1522,8 +1513,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,/* initialize event handling */ spin_lock_init (&dpu_crtc->event_lock); - dpu_crtc->phandle = &kms->phandle; -DPU_DEBUG ("%s: successfully initialized crtc\n" , dpu_crtc->name);return crtc; }
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +6 -4
@@ -151,7 +151,6 @@ struct dpu_crtc_frame_event {* @event_worker : Event worker queue * @event_lock : Spinlock around event handling code * @phandle: Pointer to power handler -* @power_event : registered power event handle * @cur_perf : current performance committed to clock/bandwidth driver */ struct dpu_crtc {
@@ -187,9 +186,6 @@ struct dpu_crtc {/* for handling internal event thread */ spinlock_t event_lock; -struct dpu_power_handle *phandle; -struct dpu_power_event *power_event; -struct dpu_core_perf_params cur_perf;struct dpu_crtc_smmu_state_data smmu_state;
@@ -333,4 +329,10 @@ static inline bool dpu_crtc_is_enabled(struct drm_crtc *crtc) return crtc ? crtc->enabled : false; } +/** +* dpu_crtc_runtime_resume - called by the top-level on pm_runtime_resume +* @crtc: CRTC to resume +*/ +void dpu_crtc_runtime_resume (struct drm_crtc *crtc); +#endif /* _DPU_CRTC_H_ */
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +4 -0
@@ -1137,6 +1137,7 @@ static int __maybe_unused dpu_runtime_resume(struct device *dev)int rc =-1 ;struct platform_device *pdev =to_platform_device (dev);struct dpu_kms *dpu_kms =platform_get_drvdata (pdev); +struct drm_crtc *crtc;struct drm_device *ddev;struct dss_module_power *mp = &dpu_kms->mp;
@@ -1154,6 +1155,9 @@ static int __maybe_unused dpu_runtime_resume(struct device *dev)dpu_vbif_init_memtypes (dpu_kms); +drm_for_each_crtc (crtc, ddev) +dpu_crtc_runtime_resume (crtc); + rc =dpu_power_resource_enable (&dpu_kms->phandle, true);if (rc)DPU_ERROR ("resource enable failed: %d\n" , rc);
drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h +4 -4
@@ -298,6 +298,10 @@ DEFINE_EVENT(dpu_drm_obj_template, dpu_kms_wait_for_commit_done, TP_PROTO(uint32_t drm_id), TP_ARGS(drm_id) ); +DEFINE_EVENT (dpu_drm_obj_template, dpu_crtc_runtime_resume, + TP_PROTO(uint32_t drm_id), +TP_ARGS (drm_id) +); TRACE_EVENT(dpu_enc_enable, TP_PROTO(uint32_t drm_id, int hdisplay, int vdisplay),
@@ -518,10 +522,6 @@ DEFINE_EVENT(dpu_id_event_template, dpu_crtc_frame_event_cb, TP_PROTO(uint32_t drm_id, u32 event),TP_ARGS (drm_id, event) ); -DEFINE_EVENT (dpu_id_event_template, dpu_crtc_handle_power_event, - TP_PROTO(uint32_t drm_id, u32 event), -TP_ARGS (drm_id, event) -);DEFINE_EVENT (dpu_id_event_template, dpu_crtc_frame_event_done, TP_PROTO(uint32_t drm_id, u32 event), TP_ARGS(drm_id, event)
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-6-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Jeykumar Sankaran
Reviewed-byRe: [PATCH v2 05/24] drm/msm: dpu: Handle crtc pm_runtime_resume() directly
Quoted 9 lines · Sean Paul
From: Sean Paul <[email protected]>
Instead of registering through
dpu_power_handlejust to get a call onruntime_resume, call the crtc function directly.Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>
Quoted 188 lines
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 23 ++++++----------------- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 10 ++++++---- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 4 ++++ drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 8 ++++---- 4 files changed, 20 insertions(+), 25 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +5
-6@@ -33,7 +33,6 @@#include "dpu_plane.h" #include "dpu_encoder.h" #include "dpu_vbif.h" -#include "dpu_power_handle.h" #include "dpu_core_perf.h" #include "dpu_trace.h" @@ -69,8 +68,6 @@ static void dpu_crtc_destroy(struct drm_crtc *crtc)if (!crtc)return ; - dpu_crtc->phandle =NULL ; -drm_crtc_cleanup (crtc);mutex_destroy (&dpu_crtc->crtc_lock);kfree (dpu_crtc);@@ -844,15 +841,17 @@ static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc) return &cstate->base; } -static void dpu_crtc_handle_power_event (u32 event_type,void *arg) +void dpu_crtc_runtime_resume (struct drm_crtc *crtc) { -struct drm_crtc *crtc = arg;struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);struct drm_encoder *encoder;mutex_lock (&dpu_crtc->crtc_lock); -trace_dpu_crtc_handle_power_event (DRMID (crtc), event_type); +if (!dpu_crtc->enabled) + goto end; + +trace_dpu_crtc_runtime_resume (DRMID (crtc));/* restore encoder; crtc will be programmed during commit */ drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-4drm_for_each_encoder (encoder, crtc->dev) {@@ -862,6 +861,7 @@ static void dpu_crtc_handle_power_event(u32 event_type, void *arg)dpu_encoder_virt_restore (encoder); } +end:mutex_unlock (&dpu_crtc->crtc_lock); }@@ -917,10 +917,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc)dpu_encoder_register_frame_event_callback (encoder,NULL ,NULL ); } -if (dpu_crtc->power_event) -dpu_power_handle_unregister_event (dpu_crtc->phandle, - dpu_crtc->power_event); -memset (cstate->mixers,0 ,sizeof (cstate->mixers));drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-7cstate->num_mixers =0 ;@@ -972,11 +968,6 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,/* Enable/restore vblank irq handling */ drm_crtc_vblank_on (crtc); - - dpu_crtc->power_event =dpu_power_handle_register_event ( - dpu_crtc->phandle,DPU_POWER_EVENT_ENABLE , - dpu_crtc_handle_power_event, crtc, dpu_crtc->name); - }struct plane_state {@@ -1522,8 +1513,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,/* initialize event handling */ spin_lock_init (&dpu_crtc->event_lock); - dpu_crtc->phandle = &kms->phandle; -DPU_DEBUG ("%s: successfully initialized crtc\n" , dpu_crtc->name);return crtc;}
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +0
-1@@ -151,7 +151,6 @@ struct dpu_crtc_frame_event {* @event_worker : Event worker queue * @event_lock : Spinlock around event handling code * @phandle: Pointer to power handler -* @power_event : registered power event handle * @cur_perf : current performance committed to clock/bandwidth driver
*/
structdpu_crtc{drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +2
-3@@ -187,9 +186,6 @@ struct dpu_crtc {/* for handling internal event thread */ spinlock_t event_lock; -struct dpu_power_handle *phandle; -struct dpu_power_event *power_event; -struct dpu_core_perf_params cur_perf;struct dpu_crtc_smmu_state_data smmu_state;@@ -333,4 +329,10 @@ static inline bool dpu_crtc_is_enabled(struct drm_crtc *crtc)return crtc ? crtc->enabled : false; } +/** +* dpu_crtc_runtime_resume - called by the top-level on
pm_runtime_resume
+ * @crtc: CRTC to resume
+ */drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +2
-0+void dpu_crtc_runtime_resume (struct drm_crtc *crtc); +#endif /* _DPU_CRTC_H_ */ drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0@@ -1137,6 +1137,7 @@ static int __maybe_unuseddpu_runtime_resume(struct
device *dev)drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +1
-0int rc =-1 ;struct platform_device *pdev =to_platform_device (dev);struct dpu_kms *dpu_kms =platform_get_drvdata (pdev); +struct drm_crtc *crtc;struct drm_device *ddev;struct dss_module_power *mp = &dpu_kms->mp;@@ -1154,6 +1155,9 @@ static int __maybe_unuseddpu_runtime_resume(struct
device *dev)drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +3
-0dpu_vbif_init_memtypes (dpu_kms); +drm_for_each_crtc (crtc, ddev) +dpu_crtc_runtime_resume (crtc); + rc =dpu_power_resource_enable (&dpu_kms->phandle, true);if (rc)DPU_ERROR ("resource enable failed: %d\n" , rc);drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h +4
-0@@ -298,6 +298,10 @@ DEFINE_EVENT(dpu_drm_obj_template, dpu_kms_wait_for_commit_done, TP_PROTO(uint32_t drm_id),TP_ARGS (drm_id) ); +DEFINE_EVENT (dpu_drm_obj_template, dpu_crtc_runtime_resume, + TP_PROTO(uint32_t drm_id), +TP_ARGS (drm_id) +); TRACE_EVENT(dpu_enc_enable,drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h +0
-4TP_PROTO(uint32_t drm_id, int hdisplay, int vdisplay),@@ -518,10 +522,6 @@ DEFINE_EVENT(dpu_id_event_template, dpu_crtc_frame_event_cb, TP_PROTO(uint32_t drm_id, u32 event),TP_ARGS (drm_id, event) ); -DEFINE_EVENT (dpu_id_event_template, dpu_crtc_handle_power_event, - TP_PROTO(uint32_t drm_id, u32 event), -TP_ARGS (drm_id, event) -); DEFINE_EVENT(dpu_id_event_template, dpu_crtc_frame_event_done, TP_PROTO(uint32_t drm_id, u32 event),
TP_ARGS(drm_id, event)
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 6/24 drm/msm: dpu: Remove power_handle from core_perf
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
It's unused
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 3 --- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h | 5 ----- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 - 3 files changed, 9 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c +0 -3
@@ -605,7 +605,6 @@ void dpu_core_perf_destroy(struct dpu_core_perf *perf)dpu_core_perf_debugfs_destroy (perf); perf->max_core_clk_rate =0 ; perf->core_clk =NULL ; - perf->phandle =NULL ; perf->catalog =NULL ; perf->dev =NULL ; }
@@ -613,12 +612,10 @@ void dpu_core_perf_destroy(struct dpu_core_perf *perf)int dpu_core_perf_init (struct dpu_core_perf *perf,struct drm_device *dev,struct dpu_mdss_cfg *catalog, -struct dpu_power_handle *phandle,struct dss_clk *core_clk) { perf->dev = dev; perf->catalog = catalog; - perf->phandle = phandle; perf->core_clk = core_clk; perf->max_core_clk_rate = core_clk->max_rate;
drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h +0 -5
@@ -19,7 +19,6 @@#include <drm/drm_crtc.h> #include "dpu_hw_catalog.h" -#include "dpu_power_handle.h" #define DPU_PERF_DEFAULT_MAX_CORE_CLK_RATE 412500000
@@ -52,7 +51,6 @@ struct dpu_core_perf_tune {* @dev: Pointer to drm device * @debugfs_root: top level debug folder * @catalog: Pointer to catalog configuration -* @phandle: Pointer to power handler * @core_clk: Pointer to core clock structure * @core_clk_rate: current core clock rate * @max_core_clk_rate: maximum allowable core clock rate
@@ -66,7 +64,6 @@ struct dpu_core_perf {struct drm_device *dev;struct dentry *debugfs_root;struct dpu_mdss_cfg *catalog; -struct dpu_power_handle *phandle;struct dss_clk *core_clk;u64 core_clk_rate;u64 max_core_clk_rate;
@@ -113,13 +110,11 @@ void dpu_core_perf_destroy(struct dpu_core_perf *perf);* @perf: Pointer to core performance context * @dev: Pointer to drm device * @catalog: Pointer to catalog -* @phandle: Pointer to power handle * @core_clk: pointer to core clock */ int dpu_core_perf_init (struct dpu_core_perf *perf,struct drm_device *dev,struct dpu_mdss_cfg *catalog, -struct dpu_power_handle *phandle,struct dss_clk *core_clk);/**
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0 -1
@@ -957,7 +957,6 @@ static int dpu_kms_hw_init(struct msm_kms *kms) } rc =dpu_core_perf_init (&dpu_kms->perf, dev, dpu_kms->catalog, - &dpu_kms->phandle,_dpu_kms_get_clk (dpu_kms,"core" ));if (rc) {DPU_ERROR ("failed to init perf %d\n" , rc);
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 7/24 drm/msm: dpu: Include dpu_io_util.h directly in dpu_kms.h
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
It's needed for struct dss_module_power, and is currently being pulled in by dpu_power_handle.h
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +1 -0
@@ -29,6 +29,7 @@#include "dpu_hw_lm.h" #include "dpu_hw_interrupts.h" #include "dpu_hw_top.h" +#include "dpu_io_util.h" #include "dpu_rm.h" #include "dpu_power_handle.h" #include "dpu_irq.h"
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 8/24 drm/msm: dpu: Move DPU_POWER_HANDLE_DBUS_ID to core_perf
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
It's only used in core_perf, so stick it there (and change the name to reflect that).
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 34 +++++++++---------- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h | 17 ++++++++-- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 4 +-- .../gpu/drm/msm/disp/dpu1/dpu_power_handle.h | 13 ------- 4 files changed, 34 insertions(+), 34 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c +17 -17
@@ -95,20 +95,20 @@ static void _dpu_core_perf_calc_crtc(struct dpu_kms *kms,memset (perf,0 ,sizeof (struct dpu_core_perf_params ));if (!dpu_cstate->bw_control) { -for (i =0 ; i <DPU_POWER_HANDLE_DBUS_ID_MAX ; i++) { +for (i =0 ; i <DPU_CORE_PERF_DATA_BUS_ID_MAX ; i++) { perf->bw_ctl[i] = kms->catalog->perf.max_bw_high *1000ULL ; perf->max_per_pipe_ib[i] = perf->bw_ctl[i]; } perf->core_clk_rate = kms->perf.max_core_clk_rate; }else if (kms->perf.perf_tune.mode ==DPU_PERF_MODE_MINIMUM ) { -for (i =0 ; i <DPU_POWER_HANDLE_DBUS_ID_MAX ; i++) { +for (i =0 ; i <DPU_CORE_PERF_DATA_BUS_ID_MAX ; i++) { perf->bw_ctl[i] =0 ; perf->max_per_pipe_ib[i] =0 ; } perf->core_clk_rate =0 ; }else if (kms->perf.perf_tune.mode ==DPU_PERF_MODE_FIXED ) { -for (i =0 ; i <DPU_POWER_HANDLE_DBUS_ID_MAX ; i++) { +for (i =0 ; i <DPU_CORE_PERF_DATA_BUS_ID_MAX ; i++) { perf->bw_ctl[i] = kms->perf.fix_core_ab_vote; perf->max_per_pipe_ib[i] = kms->perf.fix_core_ib_vote; }
@@ -118,12 +118,12 @@ static void _dpu_core_perf_calc_crtc(struct dpu_kms *kms,DPU_DEBUG ("crtc=%d clk_rate=%llu core_ib=%llu core_ab=%llu llcc_ib=%llu llcc_ab=%llu mem_ib=%llu mem_ab=%llu\n" , crtc->base.id, perf->core_clk_rate, - perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_MNOC ], - perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_MNOC ], - perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_LLCC ], - perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_LLCC ], - perf->max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_EBI ], - perf->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_EBI ]); + perf->max_per_pipe_ib[DPU_CORE_PERF_DATA_BUS_ID_MNOC ], + perf->bw_ctl[DPU_CORE_PERF_DATA_BUS_ID_MNOC ], + perf->max_per_pipe_ib[DPU_CORE_PERF_DATA_BUS_ID_LLCC ], + perf->bw_ctl[DPU_CORE_PERF_DATA_BUS_ID_LLCC ], + perf->max_per_pipe_ib[DPU_CORE_PERF_DATA_BUS_ID_EBI ], + perf->bw_ctl[DPU_CORE_PERF_DATA_BUS_ID_EBI ]); } int dpu_core_perf_crtc_check(struct drm_crtc *crtc,
@@ -158,8 +158,8 @@ int dpu_core_perf_crtc_check(struct drm_crtc *crtc,/* obtain new values */ _dpu_core_perf_calc_crtc (kms, crtc, state, &dpu_cstate->new_perf); -for (i =DPU_POWER_HANDLE_DBUS_ID_MNOC ; - i <DPU_POWER_HANDLE_DBUS_ID_MAX ; i++) { +for (i =DPU_CORE_PERF_DATA_BUS_ID_MNOC ; + i <DPU_CORE_PERF_DATA_BUS_ID_MAX ; i++) { bw_sum_of_intfs = dpu_cstate->new_perf.bw_ctl[i]; curr_client_type =dpu_crtc_get_client_type (crtc);
@@ -290,7 +290,7 @@ void dpu_core_perf_crtc_release_bw(struct drm_crtc *crtc)if (kms->perf.enable_bw_release) {trace_dpu_cmd_release_bw (crtc->base.id);DPU_DEBUG ("Release BW crtc=%d\n" , crtc->base.id); -for (i =0 ; i <DPU_POWER_HANDLE_DBUS_ID_MAX ; i++) { +for (i =0 ; i <DPU_CORE_PERF_DATA_BUS_ID_MAX ; i++) { dpu_crtc->cur_perf.bw_ctl[i] =0 ;_dpu_core_perf_crtc_update_bus (kms, crtc, i); }
@@ -367,7 +367,7 @@ int dpu_core_perf_crtc_update(struct drm_crtc *crtc, new = &dpu_cstate->new_perf;if (_dpu_core_perf_crtc_is_power_on (crtc) && !stop_req) { -for (i =0 ; i <DPU_POWER_HANDLE_DBUS_ID_MAX ; i++) { +for (i =0 ; i <DPU_CORE_PERF_DATA_BUS_ID_MAX ; i++) {/* * cases for bus bandwidth update. * 1. new bandwidth vote - "ab or ib vote" is higher
@@ -409,13 +409,13 @@ int dpu_core_perf_crtc_update(struct drm_crtc *crtc, update_clk =1 ; }trace_dpu_perf_crtc_update (crtc->base.id, - new->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_MNOC ], - new->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_LLCC ], - new->bw_ctl[DPU_POWER_HANDLE_DBUS_ID_EBI ], + new->bw_ctl[DPU_CORE_PERF_DATA_BUS_ID_MNOC ], + new->bw_ctl[DPU_CORE_PERF_DATA_BUS_ID_LLCC ], + new->bw_ctl[DPU_CORE_PERF_DATA_BUS_ID_EBI ], new->core_clk_rate, stop_req, update_bus, update_clk); -for (i =0 ; i <DPU_POWER_HANDLE_DBUS_ID_MAX ; i++) { +for (i =0 ; i <DPU_CORE_PERF_DATA_BUS_ID_MAX ; i++) {if (update_bus &BIT (i)) { ret =_dpu_core_perf_crtc_update_bus (kms, crtc, i);if (ret) {
drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h +15 -2
@@ -22,6 +22,19 @@#define DPU_PERF_DEFAULT_MAX_CORE_CLK_RATE 412500000 +/** +* enum dpu_core_perf_data_bus_id - data bus identifier +* @DPU_CORE_PERF_DATA_BUS_ID_MNOC: DPU/MNOC data bus +* @DPU_CORE_PERF_DATA_BUS_ID_LLCC: MNOC/LLCC data bus +* @DPU_CORE_PERF_DATA_BUS_ID_EBI: LLCC/EBI data bus +*/ +enum dpu_core_perf_data_bus_id { +DPU_CORE_PERF_DATA_BUS_ID_MNOC , +DPU_CORE_PERF_DATA_BUS_ID_LLCC , +DPU_CORE_PERF_DATA_BUS_ID_EBI , +DPU_CORE_PERF_DATA_BUS_ID_MAX , +}; +/** * struct dpu_core_perf_params - definition of performance parameters * @max_per_pipe_ib: maximum instantaneous bandwidth request
@@ -29,8 +42,8 @@* @core_clk_rate: core clock rate request */ struct dpu_core_perf_params { -u64 max_per_pipe_ib[DPU_POWER_HANDLE_DBUS_ID_MAX ]; -u64 bw_ctl[DPU_POWER_HANDLE_DBUS_ID_MAX ]; +u64 max_per_pipe_ib[DPU_CORE_PERF_DATA_BUS_ID_MAX ]; +u64 bw_ctl[DPU_CORE_PERF_DATA_BUS_ID_MAX ];u64 core_clk_rate; };
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2 -2
@@ -1370,8 +1370,8 @@ static int dpu_crtc_debugfs_state_show(struct seq_file *s, void *v)seq_printf (s,"intf_mode: %d\n" ,dpu_crtc_get_intf_mode (crtc));seq_printf (s,"core_clk_rate: %llu\n" , dpu_crtc->cur_perf.core_clk_rate); -for (i =DPU_POWER_HANDLE_DBUS_ID_MNOC ; - i <DPU_POWER_HANDLE_DBUS_ID_MAX ; i++) { +for (i =DPU_CORE_PERF_DATA_BUS_ID_MNOC ; + i <DPU_CORE_PERF_DATA_BUS_ID_MAX ; i++) {seq_printf (s,"bw_ctl[%d]: %llu\n" , i, dpu_crtc->cur_perf.bw_ctl[i]); seq_printf(s, "max_per_pipe_ib[%d]: %llu\n", i,
drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.h +0 -13
@@ -27,19 +27,6 @@#define DPU_POWER_EVENT_DISABLE BIT(0)#define DPU_POWER_EVENT_ENABLE BIT(1) -/** -* enum DPU_POWER_HANDLE_DBUS_ID - data bus identifier -* @DPU_POWER_HANDLE_DBUS_ID_MNOC: DPU/MNOC data bus -* @DPU_POWER_HANDLE_DBUS_ID_LLCC: MNOC/LLCC data bus -* @DPU_POWER_HANDLE_DBUS_ID_EBI: LLCC/EBI data bus -*/ -enum DPU_POWER_HANDLE_DBUS_ID { -DPU_POWER_HANDLE_DBUS_ID_MNOC , -DPU_POWER_HANDLE_DBUS_ID_LLCC , -DPU_POWER_HANDLE_DBUS_ID_EBI , -DPU_POWER_HANDLE_DBUS_ID_MAX , -}; -/* * struct dpu_power_event - local event registration structure * @client_name: name of the client registering
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 10/24 drm/msm: dpu: Fix typo in dpu_encoder
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
enc_spinlock instead of enc_spin_lock.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +1 -1
@@ -130,7 +130,7 @@ enum dpu_enc_rc_states {* Virtual encoder defers as much as possible to the physical encoders. * Virtual encoder registers itself with the DRM Framework as the encoder. * @base: drm_encoder base class for registration with DRM -* @enc_spin_lock: Virtual-Encoder-Wide Spin Lock for IRQ purposes +* @enc_spinlock: Virtual-Encoder-Wide Spin Lock for IRQ purposes * @bus_scaling_client: Client handle to the bus scaling interface * @num_phys_encs: Actual number of physical encoders contained. * @phys_encs: Container of physical encoders managed.
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 12/24 drm/msm: dpu: Move crtc runtime resume to encoder
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
The crtc runtime resume doesn't actually operate on the crtc, but rather its encoders. The problem with this is that we need to inspect the crtc state to get the currently connected encoders. Since runtime resume isn't guaranteed to be called while holding the modeset locks (although it sometimes is), this presents a race condition.
Now that we have ->enabled on the virtual encoders, and a lock to protect it, just call resume on each encoder and only restore the ones that are enabled.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 24 --------------------- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 6 ------ drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 24 +++++++++------------ drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 4 ++-- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 6 +++--- 5 files changed, 15 insertions(+), 49 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0 -24
@@ -841,30 +841,6 @@ static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc)return &cstate->base; } -void dpu_crtc_runtime_resume (struct drm_crtc *crtc) -{ -struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc); -struct drm_encoder *encoder; - -mutex_lock (&dpu_crtc->crtc_lock); - -if (!dpu_crtc->enabled) - goto end; - -trace_dpu_crtc_runtime_resume (DRMID (crtc)); - -/* restore encoder; crtc will be programmed during commit */ -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; - -dpu_encoder_virt_restore (encoder); - } - -end: -mutex_unlock (&dpu_crtc->crtc_lock); -} -static void dpu_crtc_disable (struct drm_crtc *crtc) {struct dpu_crtc *dpu_crtc;
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +0 -6
@@ -329,10 +329,4 @@ static inline bool dpu_crtc_is_enabled(struct drm_crtc *crtc) return crtc ? crtc->enabled : false; } -/** -* dpu_crtc_runtime_resume - called by the top-level on pm_runtime_resume -* @crtc: CRTC to resume -*/ -void dpu_crtc_runtime_resume (struct drm_crtc *crtc); -#endif /* _DPU_CRTC_H_ */
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +10 -14
@@ -1089,28 +1089,24 @@ static void _dpu_encoder_virt_enable_helper(struct drm_encoder *drm_enc)_dpu_encoder_update_vsync_source (dpu_enc, &dpu_enc->disp_info); } -void dpu_encoder_virt_restore (struct drm_encoder *drm_enc) +void dpu_encoder_virt_runtime_resume (struct drm_encoder *drm_enc) { -struct dpu_encoder_virt *dpu_enc =NULL ; -int i; - -if (!drm_enc) { -DPU_ERROR ("invalid encoder\n" ); -return ; - } - dpu_enc =to_dpu_encoder_virt (drm_enc); +struct dpu_encoder_virt *dpu_enc =to_dpu_encoder_virt (drm_enc); -for (i =0 ; i < dpu_enc->num_phys_encs; i++) { -struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i]; +mutex_lock (&dpu_enc->enc_lock); -if (phys && (phys != dpu_enc->cur_master) && phys->ops.restore) - phys->ops.restore (phys); - } +if (!dpu_enc->enabled) + goto out; +if (dpu_enc->cur_slave && dpu_enc->cur_slave->ops.restore) + dpu_enc->cur_slave->ops.restore (dpu_enc->cur_slave);if (dpu_enc->cur_master && dpu_enc->cur_master->ops.restore) dpu_enc->cur_master->ops.restore (dpu_enc->cur_master);_dpu_encoder_virt_enable_helper (drm_enc); + +out: +mutex_unlock (&dpu_enc->enc_lock); }static void dpu_encoder_virt_enable (struct drm_encoder *drm_enc)
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h +2 -2
@@ -126,10 +126,10 @@ int dpu_encoder_wait_for_event(struct drm_encoder *drm_encoder,enum dpu_intf_mode dpu_encoder_get_intf_mode (struct drm_encoder *encoder);/** -* dpu_encoder_virt_restore - restore the encoder configs +* dpu_encoder_virt_runtime_resume - pm runtime resume the encoder configs * @encoder: encoder pointer */ -void dpu_encoder_virt_restore (struct drm_encoder *encoder); +void dpu_encoder_virt_runtime_resume (struct drm_encoder *encoder);/** * dpu_encoder_init - initialize virtual encoder object
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +3 -3
@@ -1129,7 +1129,7 @@ static int __maybe_unused dpu_runtime_resume(struct device *dev)int rc =-1 ;struct platform_device *pdev =to_platform_device (dev);struct dpu_kms *dpu_kms =platform_get_drvdata (pdev); -struct drm_crtc *crtc; +struct drm_encoder *encoder;struct drm_device *ddev;struct dss_module_power *mp = &dpu_kms->mp;
@@ -1147,8 +1147,8 @@ static int __maybe_unused dpu_runtime_resume(struct device *dev)dpu_vbif_init_memtypes (dpu_kms); -drm_for_each_crtc (crtc, ddev) -dpu_crtc_runtime_resume (crtc); +drm_for_each_encoder (encoder, ddev) +dpu_encoder_virt_runtime_resume (encoder);return rc; }
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-13-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Jeykumar Sankaran
Reviewed-byRe: [PATCH v2 12/24] drm/msm: dpu: Move crtc runtime resume to encoder
Quoted 12 lines · Sean Paul
From: Sean Paul <[email protected]>
The crtc runtime resume doesn't actually operate on the crtc, but rather its encoders. The problem with this is that we need to inspect the crtc state to get the currently connected encoders. Since runtime resume isn't guaranteed to be called while holding the modeset locks (although it sometimes is), this presents a race condition.
Now that we have ->enabled on the virtual encoders, and a lock to protect it, just call resume on each encoder and only restore the ones that are enabled.
Quoted 6 lines
Changes in v2:
- NoneCc Jeykumar Sankaran <[email protected]>Signed-off-by Sean Paul <[email protected]>---
Quoted 159 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 24 --------------------- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 6 ------ drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 24 +++++++++------------ drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 4 ++-- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 6 +++--- 5 files changed, 15 insertions(+), 49 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-24@@ -841,30 +841,6 @@ static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc) return &cstate->base; } -void dpu_crtc_runtime_resume (struct drm_crtc *crtc) -{ -struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc); -struct drm_encoder *encoder; - -mutex_lock (&dpu_crtc->crtc_lock); - -if (!dpu_crtc->enabled) - goto end; - -trace_dpu_crtc_runtime_resume (DRMID (crtc)); - -/* restore encoder; crtc will be programmed during commit */ -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; - -dpu_encoder_virt_restore (encoder); - } - -end: -mutex_unlock (&dpu_crtc->crtc_lock); -} -static void dpu_crtc_disable (struct drm_crtc *crtc) {drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0struct dpu_crtc *dpu_crtc;drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +0
-2@@ -329,10 +329,4 @@ static inline bool dpu_crtc_is_enabled(struct drm_crtc *crtc)return crtc ? crtc->enabled : false; } -/** -* dpu_crtc_runtime_resume - called by the top-level on
pm_runtime_resume
- * @crtc: CRTC to resume
- */drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +0
-2-void dpu_crtc_runtime_resume (struct drm_crtc *crtc); -#endif /* _DPU_CRTC_H_ */ drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +0
-0@@ -1089,28 +1089,24 @@ static void_dpu_encoder_virt_enable_helper(struct
drm_encoder*drm_enc)drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +3
-12_dpu_encoder_update_vsync_source (dpu_enc, &dpu_enc->disp_info); } -void dpu_encoder_virt_restore (struct drm_encoder *drm_enc) +void dpu_encoder_virt_runtime_resume (struct drm_encoder *drm_enc) { -struct dpu_encoder_virt *dpu_enc =NULL ; -int i; - -if (!drm_enc) { -DPU_ERROR ("invalid encoder\n" ); -return ; - } - dpu_enc =to_dpu_encoder_virt (drm_enc); +struct dpu_encoder_virt *dpu_enc =to_dpu_encoder_virt (drm_enc); -for (i =0 ; i < dpu_enc->num_phys_encs; i++) { -struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i]; +mutex_lock (&dpu_enc->enc_lock); - if (phys && (phys != dpu_enc->cur_master) &&
phys->ops.restore)drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +7
-2- phys->ops.restore (phys); - } +if (!dpu_enc->enabled) + goto out; +if (dpu_enc->cur_slave && dpu_enc->cur_slave->ops.restore) + dpu_enc->cur_slave->ops.restore (dpu_enc->cur_slave);if (dpu_enc->cur_master && dpu_enc->cur_master->ops.restore) dpu_enc->cur_master->ops.restore (dpu_enc->cur_master);_dpu_encoder_virt_enable_helper (drm_enc); + +out: +mutex_unlock (&dpu_enc->enc_lock); }static void dpu_encoder_virt_enable (struct drm_encoder *drm_enc)drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h +1
-1@@ -126,10 +126,10 @@ int dpu_encoder_wait_for_event(struct drm_encoder *drm_encoder, enum dpu_intf_mode dpu_encoder_get_intf_mode(struct drm_encoder *encoder);/** -* dpu_encoder_virt_restore - restore the encoder configs +* dpu_encoder_virt_runtime_resume - pm runtime resume the encoder configs
* @encoder: encoder pointer
*/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h +1
-1-void dpu_encoder_virt_restore (struct drm_encoder *encoder); +void dpu_encoder_virt_runtime_resume (struct drm_encoder *encoder);/** * dpu_encoder_init - initialize virtual encoder object drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0@@ -1129,7 +1129,7 @@ static int __maybe_unuseddpu_runtime_resume(struct
device *dev)drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +1
-1int rc =-1 ;struct platform_device *pdev =to_platform_device (dev);struct dpu_kms *dpu_kms =platform_get_drvdata (pdev); -struct drm_crtc *crtc; +struct drm_encoder *encoder;struct drm_device *ddev;struct dss_module_power *mp = &dpu_kms->mp;@@ -1147,8 +1147,8 @@ static int __maybe_unuseddpu_runtime_resume(struct
device *dev)drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +2
-2dpu_vbif_init_memtypes (dpu_kms); -drm_for_each_crtc (crtc, ddev) -dpu_crtc_runtime_resume (crtc); +drm_for_each_encoder (encoder, ddev) +dpu_encoder_virt_runtime_resume (encoder);return rc; }
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 13/24 drm/msm: dpu: Don't drop locks in crtc_vblank_enable
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
Now that runtime resume is handled in encoder, we don't need to worry about crtc_lock recursion when calling pm_runtime_(get|put). So drop the lock drops in _dpu_crtc_vblank_enable_no_lock().
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0 -6
@@ -777,10 +777,7 @@ static void _dpu_crtc_vblank_enable_no_lock(struct drm_encoder *enc;if (enable) { -/* drop lock since power crtc cb may try to re-acquire lock */ -mutex_unlock (&dpu_crtc->crtc_lock);pm_runtime_get_sync (dev->dev); -mutex_lock (&dpu_crtc->crtc_lock);list_for_each_entry (enc, &dev->mode_config.encoder_list, head) {if (enc->crtc != crtc)
@@ -805,10 +802,7 @@ static void _dpu_crtc_vblank_enable_no_lock(dpu_encoder_register_vblank_callback (enc,NULL ,NULL ); } -/* drop lock since power crtc cb may try to re-acquire lock */ -mutex_unlock (&dpu_crtc->crtc_lock);pm_runtime_put_sync (dev->dev); -mutex_lock (&dpu_crtc->crtc_lock); } }
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Re: [PATCH v2 13/24] drm/msm: dpu: Don't drop locks in crtc_vblank_enable
Quoted 10 lines · Sean Paul
From: Sean Paul <[email protected]>
Now that runtime resume is handled in encoder, we don't need to worry about
crtc_lockrecursion when callingpm_runtime_(get|put). So drop the lock drops in_dpu_crtc_vblank_enable_no_lock().Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>
Quoted 34 lines
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 6 ------ 1 file changed, 6 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1@@ -777,10 +777,7 @@ static void _dpu_crtc_vblank_enable_no_lock(struct drm_encoder *enc;if (enable) { -/* drop lock since power crtc cb may try to re-acquire lock */
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-2-mutex_unlock (&dpu_crtc->crtc_lock);pm_runtime_get_sync (dev->dev); -mutex_lock (&dpu_crtc->crtc_lock); list_for_each_entry(enc, &dev->mode_config.encoder_list,head) {
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1if (enc->crtc != crtc)@@ -805,10 +802,7 @@ static void _dpu_crtc_vblank_enable_no_lock(dpu_encoder_register_vblank_callback (enc,NULL ,NULL ); } -/* drop lock since power crtc cb may try to re-acquire lock */
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-2-mutex_unlock (&dpu_crtc->crtc_lock);pm_runtime_put_sync (dev->dev); -mutex_lock (&dpu_crtc->crtc_lock); } }
Signature · 5 lines
Jeykumar S _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH v2 14/24 drm/msm: dpu: Grab the modeset locks in frame_event
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
This patch wraps dpu_core_perf_crtc_release_bw() with modeset locks since it digs into the state objects.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2 -0
@@ -335,7 +335,9 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work)/* release bandwidth and other resources */ trace_dpu_crtc_frame_event_done (DRMID (crtc), fevent->event); +drm_modeset_lock_all (crtc->dev);dpu_core_perf_crtc_release_bw (crtc); +drm_modeset_unlock_all (crtc->dev); }else {trace_dpu_crtc_frame_event_more_pending (DRMID (crtc), fevent->event);
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Re: [PATCH v2 14/24] drm/msm: dpu: Grab the modeset locks in frame_event
Quoted 10 lines · Sean Paul
From: Sean Paul <[email protected]>
This patch wraps
dpu_core_perf_crtc_release_bw()with modeset locks since it digs into the state objects.Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>---
Quoted 9 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 2 ++ 1 file changed, 2 insertions(+)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_frame_event_work(struct · line 341
Quoted 7 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-0@@ -335,7 +335,9 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work)/* release bandwidth and other resources */ trace_dpu_crtc_frame_event_done (DRMID (crtc ), fevent->event); +drm_modeset_lock_all (crtc->dev);dpu_core_perf_crtc_release_bw (crtc); +drm_modeset_unlock_all (crtc->dev);
We might need to revisit this locking when we measure for performance as it could block the incoming frame locking.
Quoted 5 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0}else {trace_dpu_crtc_frame_event_more_pending(DRMID(crtc),
fevent->event);
Signature · 5 lines
Jeykumar S _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
A message that is not in the archive (sent off-list or not yet received): 0405e429330ba1de19d96a6918a6daae-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org
Re: [PATCH v2 14/24] drm/msm: dpu: Grab the modeset locks in frame_event
Quoted 16 lines · Jeykumar Sankaran
Quoted 10 lines · Sean Paul
From: Sean Paul <[email protected]>
This patch wraps
dpu_core_perf_crtc_release_bw()with modeset locks since it digs into the state objects.Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>---
Reviewed-by Jeykumar Sankaran <[email protected]>Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 2 ++ 1 file changed, 2 insertions(+)
Quoted 16 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_frame_event_work(struct · line 341
Quoted 13 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-0@@ -335,7 +335,9 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work)/* release bandwidth and other resources */ trace_dpu_crtc_frame_event_done (DRMID (crtc ), fevent->event); +drm_modeset_lock_all (crtc->dev);dpu_core_perf_crtc_release_bw (crtc); +drm_modeset_unlock_all (crtc->dev);We might need to revisit this locking when we measure for performance as it could block the incoming frame locking.
Definitely something to keep an eye on.
That said, we really do want it to block the incoming frame since we're reducing bw. It would be really unfortunate if this happened concurrently with a commit. If this _does_ cause a performance problem, we should really investigate the criteria for reducing bw.
Sean
Quoted 8 lines
Quoted 5 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0}else {trace_dpu_crtc_frame_event_more_pending(DRMID(crtc),
fevent->event);Signature · 1 line
Jeykumar S
Signature · 5 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-15-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
PATCH v3 14/24 drm/msm: dpu: Grab the modeset locks in frame_event
From: Sean Paul <[email protected]>
This patch wraps dpu_core_perf_crtc_release_bw() with modeset locks since it digs into the state objects.
Changes in v2:
- None
Changes in v3:
- Use those nifty new DRM_MODESET_LOCK_ALL_* helpers (Daniel)
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +14 -1
@@ -306,6 +306,19 @@ static void dpu_crtc_vblank_cb(void *data)trace_dpu_crtc_vblank_cb (DRMID (crtc)); } +static void dpu_crtc_release_bw_unlocked (struct drm_crtc *crtc) +{ +int ret =0 ; +struct drm_modeset_acquire_ctx ctx; + +DRM_MODESET_LOCK_ALL_BEGIN (crtc->dev, ctx,0 , ret); +dpu_core_perf_crtc_release_bw (crtc); +DRM_MODESET_LOCK_ALL_END (ctx, ret); +if (ret) +DRM_ERROR ("Failed to acquire modeset locks to release bw, %d\n" , + ret); +} +static void dpu_crtc_frame_event_work (struct kthread_work *work) { struct dpu_crtc_frame_event *fevent = container_of(work,
@@ -335,7 +348,7 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work)/* release bandwidth and other resources */ trace_dpu_crtc_frame_event_done (DRMID (crtc), fevent->event); -dpu_core_perf_crtc_release_bw (crtc); +dpu_crtc_release_bw_unlocked (crtc); }else {trace_dpu_crtc_frame_event_more_pending (DRMID (crtc), fevent->event);
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Re: [PATCH v3 14/24] drm/msm: dpu: Grab the modeset locks in frame_event
Quoted 10 lines · Sean Paul
From: Sean Paul <[email protected]>
This patch wraps
dpu_core_perf_crtc_release_bw()with modeset locks since it digs into the state objects.Changes in v2:
- None
Changes in v3:
- Use those nifty new DRM_MODESET_LOCK_ALL_* helpers (Daniel)
Quoted 4 lines
Cc Daniel Vetter <[email protected]>Cc Jeykumar Sankaran <[email protected]>Signed-off-by Sean Paul <[email protected]>---
I see Daniel's comments are addressed. So ..
Quoted 41 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +13
-0@@ -306,6 +306,19 @@ static void dpu_crtc_vblank_cb(void *data)trace_dpu_crtc_vblank_cb (DRMID (crtc)); } +static void dpu_crtc_release_bw_unlocked (struct drm_crtc *crtc) +{ +int ret =0 ; +struct drm_modeset_acquire_ctx ctx; + +DRM_MODESET_LOCK_ALL_BEGIN (crtc->dev, ctx,0 , ret); +dpu_core_perf_crtc_release_bw (crtc); +DRM_MODESET_LOCK_ALL_END (ctx, ret); +if (ret) + DRM_ERROR("Failed to acquire modeset locks to release bw, %d\n", + ret); +} +static void dpu_crtc_frame_event_work (struct kthread_work *work) {drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-1struct dpu_crtc_frame_event *fevent = container_of(work,@@ -335,7 +348,7 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work)/* release bandwidth and other resources */ trace_dpu_crtc_frame_event_done (DRMID (crtc ), fevent->event); -dpu_core_perf_crtc_release_bw (crtc); +dpu_crtc_release_bw_unlocked (crtc); }else {trace_dpu_crtc_frame_event_more_pending(DRMID(crtc),
fevent->event);
Signature · 5 lines
Jeykumar S _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
A message that is not in the archive (sent off-list or not yet received): 20181130220011.39644-1-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Daniel Vetter
Acked-byRe: [PATCH v3 14/24] drm/msm: dpu: Grab the modeset locks in frame_event
Quoted 23 lines · Sean Paul
From: Sean Paul <[email protected]>
This patch wraps
dpu_core_perf_crtc_release_bw()with modeset locks since it digs into the state objects.Changes in v2:
- None
Changes in v3:
- Use those nifty new DRM_MODESET_LOCK_ALL_* helpers (Daniel)Cc Daniel Vetter <[email protected]>Cc Jeykumar Sankaran <[email protected]>Signed-off-by Sean Paul <[email protected]>--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0@@ -306,6 +306,19 @@ static void dpu_crtc_vblank_cb(void *data)trace_dpu_crtc_vblank_cb (DRMID (crtc));
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_vblank_cb(void *data) · line 316
Quoted 10 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +8
-0} +static void dpu_crtc_release_bw_unlocked (struct drm_crtc *crtc) +{ +int ret =0 ; +struct drm_modeset_acquire_ctx ctx; + +DRM_MODESET_LOCK_ALL_BEGIN (crtc->dev, ctx,0 , ret); +dpu_core_perf_crtc_release_bw (crtc); +DRM_MODESET_LOCK_ALL_END (ctx, ret);
Sooooo pretty, and correct even :-)
Quoted 20 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +6
-1+if (ret) +DRM_ERROR ("Failed to acquire modeset locks to release bw, %d\n" , + ret); +} +static void dpu_crtc_frame_event_work (struct kthread_work *work) { struct dpu_crtc_frame_event *fevent = container_of(work,@@ -335,7 +348,7 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work)/* release bandwidth and other resources */ trace_dpu_crtc_frame_event_done (DRMID (crtc), fevent->event); -dpu_core_perf_crtc_release_bw (crtc); +dpu_crtc_release_bw_unlocked (crtc); }else {trace_dpu_crtc_frame_event_more_pending (DRMID (crtc), fevent->event);Signature · 1 line
Sean Paul, Software Engineer, Google / Chromium OS
Signature · 7 lines
Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 15/24 drm/msm: dpu: Stop using encoder->crtc pointer
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
It's for legacy drivers, for atomic drivers crtc->state->encoder_mask should be used to map encoder to crtc.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 46 ++++++++---------------- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 19 +++++++--- 2 files changed, 29 insertions(+), 36 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +14 -32
@@ -284,9 +284,9 @@ enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)return INTF_MODE_NONE ; } -drm_for_each_encoder (encoder, crtc->dev) -if (encoder->crtc == crtc) -return dpu_encoder_get_intf_mode (encoder); +/* TODO: Returns the first INTF_MODE, could there be multiple values? */ +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask) +return dpu_encoder_get_intf_mode (encoder);return INTF_MODE_NONE ; }
@@ -551,13 +551,9 @@ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,spin_unlock_irqrestore (&dev->event_lock, flags); } -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { -if (encoder->crtc != crtc) -continue ; - -/* encoder will trigger pending mask now */ +/* encoder will trigger pending mask now */ +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_trigger_kickoff_pending (encoder); - }/* * If no mixers have been allocated in dpu_crtc_atomic_check(),
@@ -704,7 +700,6 @@ static int _dpu_crtc_wait_for_frame_done(struct drm_crtc *crtc)void dpu_crtc_commit_kickoff (struct drm_crtc *crtc) {struct drm_encoder *encoder; -struct drm_device *dev = crtc->dev;struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);struct dpu_kms *dpu_kms =_dpu_crtc_get_kms (crtc);struct dpu_crtc_state *cstate =to_dpu_crtc_state (crtc->state);
@@ -720,16 +715,13 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)DPU_ATRACE_BEGIN ("crtc_commit" ); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { +/* +* Encoder will flush/start now, unless it has a tx pending. If so, it +* may delay and flush at an irq event (e.g. ppdone) +*/ +drm_for_each_encoder_mask (encoder, crtc->dev, + crtc->state->encoder_mask) {struct dpu_encoder_kickoff_params params = {0 }; - -if (encoder->crtc != crtc) -continue ; - -/* -* Encoder will flush/start now, unless it has a tx pending. -* If so, it may delay and flush at an irq event (e.g. ppdone) -*/ dpu_encoder_prepare_for_kickoff (encoder, ¶ms); }
@@ -754,12 +746,8 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)dpu_vbif_clear_errors (dpu_kms); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { -if (encoder->crtc != crtc) -continue ; - +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_kickoff (encoder); - } end:reinit_completion (&dpu_crtc->frame_done_comp);
@@ -883,11 +871,8 @@ static void dpu_crtc_disable(struct drm_crtc *crtc)dpu_core_perf_crtc_update (crtc,0 , true); -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_register_frame_event_callback (encoder,NULL ,NULL ); - }memset (cstate->mixers,0 ,sizeof (cstate->mixers)); cstate->num_mixers =0 ;
@@ -922,12 +907,9 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,DRM_DEBUG_KMS ("crtc%d\n" , crtc->base.id); dpu_crtc =to_dpu_crtc (crtc); -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_register_frame_event_callback (encoder, dpu_crtc_frame_event_cb, (void *)crtc); - }mutex_lock (&dpu_crtc->crtc_lock);trace_dpu_crtc_enable (DRMID (crtc), true, dpu_crtc);
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +15 -4
@@ -320,7 +320,10 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms,struct dpu_kms *dpu_kms;struct msm_drm_private *priv;struct drm_device *dev; +struct drm_crtc *crtc; +struct drm_crtc_state *crtc_state;struct drm_encoder *encoder; +int i;if (!kms)return ;
@@ -332,9 +335,13 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms, priv = dev->dev_private;pm_runtime_get_sync (&dpu_kms->pdev->dev); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) -if (encoder->crtc !=NULL ) +/* Call prepare_commit for all affected encoders */ +for_each_new_crtc_in_state (state, crtc, crtc_state, i) { +drm_for_each_encoder_mask (encoder, crtc->dev, + crtc_state->encoder_mask) {dpu_encoder_prepare_commit (encoder); + } + } }/*
@@ -344,13 +351,17 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms,void dpu_kms_encoder_enable (struct drm_encoder *encoder) {const struct drm_encoder_helper_funcs *funcs = encoder->helper_private; -struct drm_crtc *crtc = encoder->crtc; +struct drm_device *dev = encoder->dev; +struct drm_crtc *crtc;/* Forward this enable call to the commit hook */ if (funcs && funcs->commit) funcs->commit (encoder); -if (crtc && crtc->state->active) { +drm_for_each_crtc (crtc, dev) { +if (!(crtc->state->encoder_mask &drm_encoder_mask (encoder))) +continue ; +trace_dpu_kms_enc_enable (DRMID (crtc));dpu_crtc_commit_kickoff (crtc); }
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-16-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Re: [PATCH v2 15/24] drm/msm: dpu: Stop using encoder->crtc pointer
Quoted 95 lines · Sean Paul
From: Sean Paul <[email protected]>
It's for legacy drivers, for atomic drivers
crtc->state->encoder_maskshould be used to map encoder to crtc.Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 46 ++++++++---------------- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 19 +++++++--- 2 files changed, 29 insertions(+), 36 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-3@@ -284,9 +284,9 @@ enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)return INTF_MODE_NONE ; } -drm_for_each_encoder (encoder, crtc->dev) -if (encoder->crtc == crtc) -return dpu_encoder_get_intf_mode (encoder); +/* TODO: Returns the first INTF_MODE, could there be multiple values? */
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-0+ drm_for_each_encoder_mask(encoder, crtc->dev,
crtc->state->encoder_mask)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3
-6+return dpu_encoder_get_intf_mode (encoder);return INTF_MODE_NONE ; }@@ -551,13 +551,9 @@ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,spin_unlock_irqrestore (&dev->event_lock, flags); } -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { -if (encoder->crtc != crtc) -continue ; - -/* encoder will trigger pending mask now */ +/* encoder will trigger pending mask now */ +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_trigger_kickoff_pending (encoder); - }drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1/* * If no mixers have been allocated in dpu_crtc_atomic_check(), @@ -704,7 +700,6 @@ static int _dpu_crtc_wait_for_frame_done(struct drm_crtc *crtc)void dpu_crtc_commit_kickoff (struct drm_crtc *crtc) {struct drm_encoder *encoder; -struct drm_device *dev = crtc->dev;struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);struct dpu_kms *dpu_kms =_dpu_crtc_get_kms (crtc);drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-1struct dpu_crtc_state *cstate =to_dpu_crtc_state (crtc->state);@@ -720,16 +715,13 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)DPU_ATRACE_BEGIN ("crtc_commit" ); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { +/* +* Encoder will flush/start now, unless it has a tx pending. If so, it
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +4
-6+* may delay and flush at an irq event (e.g. ppdone) +*/ +drm_for_each_encoder_mask (encoder, crtc->dev, + crtc->state->encoder_mask) {struct dpu_encoder_kickoff_params params = {0 }; - -if (encoder->crtc != crtc) -continue ; - -/* -* Encoder will flush/start now, unless it has a tx pending.
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1-* If so, it may delay and flush at an irq event (e.g. ppdone)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1-*/ dpu_encoder_prepare_for_kickoff (encoder, ¶ms); }@@ -754,12 +746,8 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)dpu_vbif_clear_errors (dpu_kms);
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c void dpu_crtc_commit_kickoff(struct drm_crtc · line 765
Quoted 10 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-5-list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { -if (encoder->crtc != crtc) -continue ; - +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_kickoff (encoder); - }
We wont be holding the modeset locks here (and in crtc_atomic_begin) in the display thread. Is it safe to iterate over encoder_mask?
Quoted 91 lines
end:
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-4reinit_completion (&dpu_crtc->frame_done_comp);@@ -883,11 +871,8 @@ static void dpu_crtc_disable(struct drm_crtc *crtc)dpu_core_perf_crtc_update (crtc,0 , true); -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_register_frame_event_callback (encoder,NULL ,NULL ); - }drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-4memset (cstate->mixers,0 ,sizeof (cstate->mixers)); cstate->num_mixers =0 ;@@ -922,12 +907,9 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,DRM_DEBUG_KMS ("crtc%d\n" , crtc->base.id); dpu_crtc =to_dpu_crtc (crtc); -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_register_frame_event_callback (encoder, dpu_crtc_frame_event_cb, (void *)crtc); - }mutex_lock (&dpu_crtc->crtc_lock);drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0trace_dpu_crtc_enable (DRMID (crtc), true, dpu_crtc);drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +3
-0@@ -320,7 +320,10 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms, struct dpu_kms *dpu_kms;struct msm_drm_private *priv;struct drm_device *dev; +struct drm_crtc *crtc; +struct drm_crtc_state *crtc_state;struct drm_encoder *encoder; +int i;if (!kms)drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +6
-2return ;@@ -332,9 +335,13 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms, priv = dev->dev_private;pm_runtime_get_sync (&dpu_kms->pdev->dev); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) -if (encoder->crtc !=NULL ) +/* Call prepare_commit for all affected encoders */ +for_each_new_crtc_in_state (state, crtc, crtc_state, i) { +drm_for_each_encoder_mask (encoder, crtc->dev, + crtc_state->encoder_mask) {dpu_encoder_prepare_commit (encoder); + } + } }/*
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +6
-2@@ -344,13 +351,17 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms, void dpu_kms_encoder_enable(struct drm_encoder *encoder) {const struct drm_encoder_helper_funcs *funcs = encoder->helper_private; -struct drm_crtc *crtc = encoder->crtc; +struct drm_device *dev = encoder->dev; +struct drm_crtc *crtc;/* Forward this enable call to the commit hook */ if (funcs && funcs->commit) funcs->commit (encoder); -if (crtc && crtc->state->active) { +drm_for_each_crtc (crtc, dev) { +if (!(crtc->state->encoder_mask &drm_encoder_mask (encoder))) +continue ; +drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0trace_dpu_kms_enc_enable (DRMID (crtc));dpu_crtc_commit_kickoff (crtc); }
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
A message that is not in the archive (sent off-list or not yet received): 580ced340265a3c45b31836291bfbb4c-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org
Re: [PATCH v2 15/24] drm/msm: dpu: Stop using encoder->crtc pointer
Quoted 96 lines · Jeykumar Sankaran
Quoted 95 lines · Sean Paul
From: Sean Paul <[email protected]>
It's for legacy drivers, for atomic drivers
crtc->state->encoder_maskshould be used to map encoder to crtc.Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 46 ++++++++---------------- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 19 +++++++--- 2 files changed, 29 insertions(+), 36 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-3@@ -284,9 +284,9 @@ enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)return INTF_MODE_NONE ; } -drm_for_each_encoder (encoder, crtc->dev) -if (encoder->crtc == crtc) -return dpu_encoder_get_intf_mode (encoder); +/* TODO: Returns the first INTF_MODE, could there be multiple values? */
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-0+ drm_for_each_encoder_mask(encoder, crtc->dev,
crtc->state->encoder_mask)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3
-6+return dpu_encoder_get_intf_mode (encoder);return INTF_MODE_NONE ; }@@ -551,13 +551,9 @@ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,spin_unlock_irqrestore (&dev->event_lock, flags); } -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { -if (encoder->crtc != crtc) -continue ; - -/* encoder will trigger pending mask now */ +/* encoder will trigger pending mask now */ +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_trigger_kickoff_pending (encoder); - }drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1/* * If no mixers have been allocated in dpu_crtc_atomic_check(), @@ -704,7 +700,6 @@ static int _dpu_crtc_wait_for_frame_done(struct drm_crtc *crtc)void dpu_crtc_commit_kickoff (struct drm_crtc *crtc) {struct drm_encoder *encoder; -struct drm_device *dev = crtc->dev;struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);struct dpu_kms *dpu_kms =_dpu_crtc_get_kms (crtc);drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-1struct dpu_crtc_state *cstate =to_dpu_crtc_state (crtc->state);@@ -720,16 +715,13 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)DPU_ATRACE_BEGIN ("crtc_commit" ); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { +/* +* Encoder will flush/start now, unless it has a tx pending. If so, it
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +4
-6+* may delay and flush at an irq event (e.g. ppdone) +*/ +drm_for_each_encoder_mask (encoder, crtc->dev, + crtc->state->encoder_mask) {struct dpu_encoder_kickoff_params params = {0 }; - -if (encoder->crtc != crtc) -continue ; - -/* -* Encoder will flush/start now, unless it has a tx pending.
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1-* If so, it may delay and flush at an irq event (e.g. ppdone)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1-*/ dpu_encoder_prepare_for_kickoff (encoder, ¶ms); }@@ -754,12 +746,8 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)dpu_vbif_clear_errors (dpu_kms);
Quoted 12 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c void dpu_crtc_commit_kickoff(struct drm_crtc *crtc) · line 762
Quoted 9 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-5-list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { -if (encoder->crtc != crtc) -continue ; - +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_kickoff (encoder); - }We wont be holding the modeset locks here (and in
crtc_atomic_begin) in the display thread. Is
it safe to iterate overencoder_mask?
Hmm, I'm not sure I follow. AFAICT, there are 2 callsites for dpu_crtc_commit_kickoff():
1- dpu_kms_encoder_enable() which is called via the encoder->funcs->enable hook 2- dpu_kms_commit() which is called in the mode_config->funcs->atomic_commit_tail
Both of these callsites will hold the modeset locks.
Am I missing something?
Thanks for your review,
Sean
Quoted 93 lines
Quoted 90 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0end:drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-4reinit_completion (&dpu_crtc->frame_done_comp);@@ -883,11 +871,8 @@ static void dpu_crtc_disable(struct drm_crtc *crtc)dpu_core_perf_crtc_update (crtc,0 , true); -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_register_frame_event_callback (encoder,NULL ,NULL ); - }drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-4memset (cstate->mixers,0 ,sizeof (cstate->mixers)); cstate->num_mixers =0 ;@@ -922,12 +907,9 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,DRM_DEBUG_KMS ("crtc%d\n" , crtc->base.id); dpu_crtc =to_dpu_crtc (crtc); -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_register_frame_event_callback (encoder, dpu_crtc_frame_event_cb, (void *)crtc); - }mutex_lock (&dpu_crtc->crtc_lock);drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0trace_dpu_crtc_enable (DRMID (crtc), true, dpu_crtc);drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +3
-0@@ -320,7 +320,10 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms, struct dpu_kms *dpu_kms;struct msm_drm_private *priv;struct drm_device *dev; +struct drm_crtc *crtc; +struct drm_crtc_state *crtc_state;struct drm_encoder *encoder; +int i;if (!kms)drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +6
-2return ;@@ -332,9 +335,13 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms, priv = dev->dev_private;pm_runtime_get_sync (&dpu_kms->pdev->dev); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) -if (encoder->crtc !=NULL ) +/* Call prepare_commit for all affected encoders */ +for_each_new_crtc_in_state (state, crtc, crtc_state, i) { +drm_for_each_encoder_mask (encoder, crtc->dev, + crtc_state->encoder_mask) {dpu_encoder_prepare_commit (encoder); + } + } }/*
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +6
-2@@ -344,13 +351,17 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms, void dpu_kms_encoder_enable(struct drm_encoder *encoder) {const struct drm_encoder_helper_funcs *funcs = encoder->helper_private; -struct drm_crtc *crtc = encoder->crtc; +struct drm_device *dev = encoder->dev; +struct drm_crtc *crtc;/* Forward this enable call to the commit hook */ if (funcs && funcs->commit) funcs->commit (encoder); -if (crtc && crtc->state->active) { +drm_for_each_crtc (crtc, dev) { +if (!(crtc->state->encoder_mask &drm_encoder_mask (encoder))) +continue ; +drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0trace_dpu_kms_enc_enable (DRMID (crtc));dpu_crtc_commit_kickoff (crtc); }Signature · 1 line
Jeykumar S
Signature · 5 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Re: [PATCH v2 15/24] drm/msm: dpu: Stop using encoder->crtc pointer
Quoted 113 lines · Sean Paul
Quoted 6 lines · Jeykumar Sankaran
Quoted 5 lines · Sean Paul
From: Sean Paul <[email protected]>
It's for legacy drivers, for atomic drivers
crtc->state->encoder_maskshould be used to map encoder to crtc.Quoted 6 lines
Quoted 6 lines
Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 46++++++++----------------
Quoted 80 lines
Quoted 80 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 19 +++++++--- 2 files changed, 29 insertions(+), 36 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-3@@ -284,9 +284,9 @@ enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)return INTF_MODE_NONE ; } -drm_for_each_encoder (encoder, crtc->dev) -if (encoder->crtc == crtc) -return dpu_encoder_get_intf_mode (encoder); +/* TODO: Returns the first INTF_MODE, could there be multiple values? */
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-0+ drm_for_each_encoder_mask(encoder, crtc->dev,
crtc->state->encoder_mask)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3
-6+return dpu_encoder_get_intf_mode (encoder);return INTF_MODE_NONE ; }@@ -551,13 +551,9 @@ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,spin_unlock_irqrestore (&dev->event_lock, flags); } -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { -if (encoder->crtc != crtc) -continue ; - -/* encoder will trigger pending mask now */ +/* encoder will trigger pending mask now */ +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_trigger_kickoff_pending (encoder); - }drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1/* * If no mixers have been allocated in dpu_crtc_atomic_check(), @@ -704,7 +700,6 @@ static int _dpu_crtc_wait_for_frame_done(struct drm_crtc *crtc)void dpu_crtc_commit_kickoff (struct drm_crtc *crtc) {struct drm_encoder *encoder; -struct drm_device *dev = crtc->dev;struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);struct dpu_kms *dpu_kms =_dpu_crtc_get_kms (crtc);drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-1struct dpu_crtc_state *cstate =to_dpu_crtc_state (crtc->state);@@ -720,16 +715,13 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)DPU_ATRACE_BEGIN ("crtc_commit" ); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { +/* +* Encoder will flush/start now, unless it has a tx pending. If so, it
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +4
-6+* may delay and flush at an irq event (e.g. ppdone) +*/ +drm_for_each_encoder_mask (encoder, crtc->dev, + crtc->state->encoder_mask) {struct dpu_encoder_kickoff_params params = {0 }; - -if (encoder->crtc != crtc) -continue ; - -/* -* Encoder will flush/start now, unless it has a tx pending.
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1-* If so, it may delay and flush at an irq event (e.g. ppdone)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1-*/ dpu_encoder_prepare_for_kickoff (encoder, ¶ms); }Quoted 1 line
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c void dpu_crtc_commit_kickoff(struct drm_crtc
Quoted 1 line
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0@@ -754,12 +746,8 @@ void dpu_crtc_commit_kickoff(struct drm_crtc*crtc)
Quoted 13 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c void dpu_crtc_commit_kickoff(struct drm_crtc *crtc) · line 762
Quoted 12 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-5dpu_vbif_clear_errors (dpu_kms); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { -if (encoder->crtc != crtc) -continue ; - +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_kickoff (encoder); - }We wont be holding the modeset locks here (and in
crtc_atomic_begin) inthe
Quoted 2 lines
display thread. Is
it safe to iterate overencoder_mask?
Quoted 7 lines
Hmm, I'm not sure I follow. AFAICT, there are 2 callsites for
dpu_crtc_commit_kickoff():1-
dpu_kms_encoder_enable()which is called via theencoder->funcs->enablehook
2-dpu_kms_commit()which is called in themode_config->funcs->atomic_commit_tail
atomic_commit_tail will be called from the WQ. Do we hold the modeset locks in the WQ? I believe userspace thread will drop the locks at the end of drm_mode_atomic_ioctl.
Thanks
Quoted 105 lines
Both of these callsites will hold the modeset locks.
Am I missing something?
Thanks for your review,
Sean
Quoted 4 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_disable(struct drm_crtc
Quoted 4 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0end:reinit_completion (&dpu_crtc->frame_done_comp);@@ -883,11 +871,8 @@ static void dpu_crtc_disable(struct drm_crtc*crtc)
Quoted 12 lines
Quoted 12 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-4dpu_core_perf_crtc_update (crtc,0 , true); -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_register_frame_event_callback (encoder,NULL ,NULL ); - }Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_enable(struct drm_crtc
Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0memset (cstate->mixers,0 ,sizeof (cstate->mixers));drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0cstate->num_mixers =0 ;@@ -922,12 +907,9 @@ static void dpu_crtc_enable(struct drm_crtc*crtc,
Quoted 47 lines
Quoted 47 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-4DRM_DEBUG_KMS ("crtc%d\n" , crtc->base.id); dpu_crtc =to_dpu_crtc (crtc); -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_register_frame_event_callback (encoder, dpu_crtc_frame_event_cb, (void *)crtc); - }mutex_lock (&dpu_crtc->crtc_lock);drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0trace_dpu_crtc_enable (DRMID (crtc), true, dpu_crtc);drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +3
-0@@ -320,7 +320,10 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms, struct dpu_kms *dpu_kms;struct msm_drm_private *priv;struct drm_device *dev; +struct drm_crtc *crtc; +struct drm_crtc_state *crtc_state;struct drm_encoder *encoder; +int i;if (!kms)drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +6
-2return ;@@ -332,9 +335,13 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms, priv = dev->dev_private;pm_runtime_get_sync (&dpu_kms->pdev->dev); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) -if (encoder->crtc !=NULL ) +/* Call prepare_commit for all affected encoders */ +for_each_new_crtc_in_state (state, crtc, crtc_state, i) { +drm_for_each_encoder_mask (encoder, crtc->dev, + crtc_state->encoder_mask) {dpu_encoder_prepare_commit (encoder); + } + } }Quoted 2 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c static void dpu_kms_prepare_commit(struct
Quoted 2 lines
/*
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0@@ -344,13 +351,17 @@ static void dpu_kms_prepare_commit(struct
msm_kmsQuoted 25 lines
Quoted 19 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +6
-2*kms, void dpu_kms_encoder_enable(struct drm_encoder *encoder) {const struct drm_encoder_helper_funcs *funcs = encoder->helper_private; -struct drm_crtc *crtc = encoder->crtc; +struct drm_device *dev = encoder->dev; +struct drm_crtc *crtc;/* Forward this enable call to the commit hook */ if (funcs && funcs->commit) funcs->commit (encoder); -if (crtc && crtc->state->active) { +drm_for_each_crtc (crtc, dev) { +if (!(crtc->state->encoder_mask &drm_encoder_mask (encoder))) +continue ; +drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c static void dpu_kms_prepare_commit(struct msm_kms *kms, · line 367
Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0trace_dpu_kms_enc_enable (DRMID (crtc));dpu_crtc_commit_kickoff (crtc); }--
Jeykumar S
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Sean Paul
reviewerRe: [PATCH v2 15/24] drm/msm: dpu: Stop using encoder->crtc pointer
Quoted 124 lines · Jeykumar Sankaran
Quoted 114 lines · Sean Paul
Quoted 6 lines · Jeykumar Sankaran
Quoted 5 lines · Sean Paul
From: Sean Paul <[email protected]>
It's for legacy drivers, for atomic drivers
crtc->state->encoder_maskshould be used to map encoder to crtc.Quoted 6 lines
Quoted 6 lines
Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 46++++++++----------------
Quoted 80 lines
Quoted 80 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 19 +++++++--- 2 files changed, 29 insertions(+), 36 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-3@@ -284,9 +284,9 @@ enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)return INTF_MODE_NONE ; } -drm_for_each_encoder (encoder, crtc->dev) -if (encoder->crtc == crtc) -return dpu_encoder_get_intf_mode (encoder); +/* TODO: Returns the first INTF_MODE, could there be multiple values? */
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-0+ drm_for_each_encoder_mask(encoder, crtc->dev,
crtc->state->encoder_mask)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3
-6+return dpu_encoder_get_intf_mode (encoder);return INTF_MODE_NONE ; }@@ -551,13 +551,9 @@ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,spin_unlock_irqrestore (&dev->event_lock, flags); } -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { -if (encoder->crtc != crtc) -continue ; - -/* encoder will trigger pending mask now */ +/* encoder will trigger pending mask now */ +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_trigger_kickoff_pending (encoder); - }drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1/* * If no mixers have been allocated in dpu_crtc_atomic_check(), @@ -704,7 +700,6 @@ static int _dpu_crtc_wait_for_frame_done(struct drm_crtc *crtc)void dpu_crtc_commit_kickoff (struct drm_crtc *crtc) {struct drm_encoder *encoder; -struct drm_device *dev = crtc->dev;struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);struct dpu_kms *dpu_kms =_dpu_crtc_get_kms (crtc);drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-1struct dpu_crtc_state *cstate =to_dpu_crtc_state (crtc->state);@@ -720,16 +715,13 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)DPU_ATRACE_BEGIN ("crtc_commit" ); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { +/* +* Encoder will flush/start now, unless it has a tx pending. If so, it
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +4
-6+* may delay and flush at an irq event (e.g. ppdone) +*/ +drm_for_each_encoder_mask (encoder, crtc->dev, + crtc->state->encoder_mask) {struct dpu_encoder_kickoff_params params = {0 }; - -if (encoder->crtc != crtc) -continue ; - -/* -* Encoder will flush/start now, unless it has a tx pending.
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1-* If so, it may delay and flush at an irq event (e.g. ppdone)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1-*/ dpu_encoder_prepare_for_kickoff (encoder, ¶ms); }Quoted 1 line
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c void dpu_crtc_commit_kickoff(struct drm_crtc
Quoted 1 line
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0@@ -754,12 +746,8 @@ void dpu_crtc_commit_kickoff(struct drm_crtc*crtc)
Quoted 14 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c void dpu_crtc_commit_kickoff(struct drm_crtc *crtc) · line 762
Quoted 12 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-5dpu_vbif_clear_errors (dpu_kms); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) { -if (encoder->crtc != crtc) -continue ; - +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_kickoff (encoder); - }We wont be holding the modeset locks here (and in
crtc_atomic_begin) inthe
Quoted 2 lines
display thread. Is
it safe to iterate overencoder_mask?Quoted 8 lines
Hmm, I'm not sure I follow. AFAICT, there are 2 callsites for
dpu_crtc_commit_kickoff():1-
dpu_kms_encoder_enable()which is called via theencoder->funcs->enable
hook
2-dpu_kms_commit()which is called in themode_config->funcs->atomic_commit_tail
Quoted 3 lines
atomic_commit_tailwill be called from the WQ. Do we hold the modeset locks in the WQ? I believe userspace thread will drop the locks at the end ofdrm_mode_atomic_ioctl.
Accessing state is safe in non-blocking commits due to stalling any subsequent commits until the previous one has completed. Check out the comment at:
https://cgit.freedesktop.org/drm-tip/tree/drivers/gpu/drm/drm_atomic_helper.c#n1754
Sean
Quoted 110 lines
Thanks
Quoted 105 lines
Both of these callsites will hold the modeset locks.
Am I missing something?
Thanks for your review,
Sean
Quoted 4 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_disable(struct drm_crtc
Quoted 4 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0end:reinit_completion (&dpu_crtc->frame_done_comp);@@ -883,11 +871,8 @@ static void dpu_crtc_disable(struct drm_crtc*crtc)
Quoted 12 lines
Quoted 12 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-4dpu_core_perf_crtc_update (crtc,0 , true); -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_register_frame_event_callback (encoder,NULL ,NULL ); - }Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_enable(struct drm_crtc
Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0memset (cstate->mixers,0 ,sizeof (cstate->mixers));drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0cstate->num_mixers =0 ;@@ -922,12 +907,9 @@ static void dpu_crtc_enable(struct drm_crtc*crtc,
Quoted 47 lines
Quoted 47 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-4DRM_DEBUG_KMS ("crtc%d\n" , crtc->base.id); dpu_crtc =to_dpu_crtc (crtc); -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_register_frame_event_callback (encoder, dpu_crtc_frame_event_cb, (void *)crtc); - }mutex_lock (&dpu_crtc->crtc_lock);drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0trace_dpu_crtc_enable (DRMID (crtc), true, dpu_crtc);drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +3
-0@@ -320,7 +320,10 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms, struct dpu_kms *dpu_kms;struct msm_drm_private *priv;struct drm_device *dev; +struct drm_crtc *crtc; +struct drm_crtc_state *crtc_state;struct drm_encoder *encoder; +int i;if (!kms)drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +6
-2return ;@@ -332,9 +335,13 @@ static void dpu_kms_prepare_commit(struct msm_kms *kms, priv = dev->dev_private;pm_runtime_get_sync (&dpu_kms->pdev->dev); -list_for_each_entry (encoder, &dev->mode_config.encoder_list, head) -if (encoder->crtc !=NULL ) +/* Call prepare_commit for all affected encoders */ +for_each_new_crtc_in_state (state, crtc, crtc_state, i) { +drm_for_each_encoder_mask (encoder, crtc->dev, + crtc_state->encoder_mask) {dpu_encoder_prepare_commit (encoder); + } + } }Quoted 2 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c static void dpu_kms_prepare_commit(struct
Quoted 2 lines
/*
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0@@ -344,13 +351,17 @@ static void dpu_kms_prepare_commit(struct
msm_kmsQuoted 25 lines
Quoted 19 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +6
-2*kms, void dpu_kms_encoder_enable(struct drm_encoder *encoder) {const struct drm_encoder_helper_funcs *funcs = encoder->helper_private; -struct drm_crtc *crtc = encoder->crtc; +struct drm_device *dev = encoder->dev; +struct drm_crtc *crtc;/* Forward this enable call to the commit hook */ if (funcs && funcs->commit) funcs->commit (encoder); -if (crtc && crtc->state->active) { +drm_for_each_crtc (crtc, dev) { +if (!(crtc->state->encoder_mask &drm_encoder_mask (encoder))) +continue ; +drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c static void dpu_kms_prepare_commit(struct msm_kms *kms, · line 367
Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0trace_dpu_kms_enc_enable (DRMID (crtc));dpu_crtc_commit_kickoff (crtc); }--
Jeykumar SSignature · 1 line
Jeykumar S
Signature · 5 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Jeykumar Sankaran
Reviewed-byRe: [PATCH v2 15/24] drm/msm: dpu: Stop using encoder->crtc pointer
Quoted 142 lines · Sean Paul
Quoted 6 lines · Jeykumar Sankaran
Quoted 5 lines · Sean Paul
Quoted 4 lines · Jeykumar Sankaran
Quoted 3 lines · Sean Paul
From: Sean Paul <[email protected]>
It's for legacy drivers, for atomic drivers
crtc->state->encoder_maskQuoted 12 lines
Quoted 12 lines
Quoted 8 lines
Quoted 8 lines
should be used to map encoder to crtc.
Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 46++++++++----------------
Quoted 3 lines
Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 19 +++++++--- 2 files changed, 29 insertions(+), 36 deletions(-)Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c enum dpu_intf_mode
Quoted 6 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0@@ -284,9 +284,9 @@ enum dpu_intf_modedpu_crtc_get_intf_mode(struct
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c enum dpu_intf_mode · line 288
Quoted 8 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-3drm_crtc *crtc)return INTF_MODE_NONE ; } -drm_for_each_encoder (encoder, crtc->dev) -if (encoder->crtc == crtc) -return dpu_encoder_get_intf_mode (encoder); +/* TODO: Returns the first INTF_MODE, could there be multiple
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_atomic_begin(struct
Quoted 8 lines
values? */
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-0+ drm_for_each_encoder_mask(encoder, crtc->dev,
crtc->state->encoder_mask)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-0+return dpu_encoder_get_intf_mode (encoder);return INTF_MODE_NONE ; }@@ -551,13 +551,9 @@ static void dpu_crtc_atomic_begin(struct
drm_crtcQuoted 5 lines
Quoted 5 lines
Quoted 5 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_atomic_begin(struct · line 555
Quoted 5 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1*crtc,spin_unlock_irqrestore (&dev->event_lock, flags); } - list_for_each_entry(encoder,
&dev->mode_config.encoder_list, head)Quoted 11 lines
Quoted 11 lines
Quoted 11 lines
Quoted 11 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-5{ -if (encoder->crtc != crtc) -continue ; - -/* encoder will trigger pending mask now */ +/* encoder will trigger pending mask now */ +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_trigger_kickoff_pending (encoder); - }Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
Quoted 2 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0/* * If no mixers have been allocated in
dpu_crtc_atomic_check(),Quoted 1 line
Quoted 1 line
Quoted 1 line
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static int
Quoted 1 line
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0@@ -704,7 +700,6 @@ static int_dpu_crtc_wait_for_frame_done(struct
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1drm_crtc *crtc)void dpu_crtc_commit_kickoff (struct drm_crtc *crtc) {struct drm_encoder *encoder; -struct drm_device *dev = crtc->dev;struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);struct dpu_kms *dpu_kms =_dpu_crtc_get_kms (crtc);struct
dpu_crtc_state*cstate =
to_dpu_crtc_state(crtc->state);Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c void dpu_crtc_commit_kickoff(struct drm_crtc · line 724
Quoted 6 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1@@ -720,16 +715,13 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)DPU_ATRACE_BEGIN ("crtc_commit" ); - list_for_each_entry(encoder,
&dev->mode_config.encoder_list, head)Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c void dpu_crtc_commit_kickoff(struct drm_crtc · line 721
Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-0{ +/* +* Encoder will flush/start now, unless it has a tx pending. If
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
so, it
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3
-0+* may delay and flush at an irq event (e.g. ppdone) +*/ + drm_for_each_encoder_mask(encoder, crtc->dev,Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
Quoted 8 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-6+ crtc->state->encoder_mask) {struct dpu_encoder_kickoff_params params = {0 }; - -if (encoder->crtc != crtc) -continue ; - -/* -* Encoder will flush/start now, unless it has a tx
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
Quoted 2 lines
pending.
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1-* If so, it may delay and flush at an irq event (e.g.
Quoted 11 lines
Quoted 11 lines
Quoted 6 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c void dpu_crtc_commit_kickoff(struct drm_crtc
Quoted 6 lines
ppdone)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1-*/ dpu_encoder_prepare_for_kickoff (encoder, ¶ms); }@@ -754,12 +746,8 @@ void dpu_crtc_commit_kickoff(struct drm_crtc*crtc)
Quoted 4 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c void dpu_crtc_commit_kickoff(struct drm_crtc · line 756
Quoted 4 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1dpu_vbif_clear_errors (dpu_kms); - list_for_each_entry(encoder,
&dev->mode_config.encoder_list, head)Quoted 23 lines
Quoted 14 lines
Quoted 10 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c void dpu_crtc_commit_kickoff(struct drm_crtc · line 763
Quoted 8 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-4{ -if (encoder->crtc != crtc) -continue ; - +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_kickoff (encoder); - }We wont be holding the modeset locks here (and in
crtc_atomic_begin) inthe
Quoted 2 lines
display thread. Is
it safe to iterate overencoder_mask?Quoted 8 lines
Hmm, I'm not sure I follow. AFAICT, there are 2 callsites for
dpu_crtc_commit_kickoff():1-
dpu_kms_encoder_enable()which is called via theencoder->funcs->enable
hook
2-dpu_kms_commit()which is called in themode_config->funcs->atomic_commit_tailQuoted 3 lines
atomic_commit_tailwill be called from the WQ. Do we hold the modeset locks in the WQ? I believe userspace thread will drop the locks at the end ofdrm_mode_atomic_ioctl.
Quoted 9 lines
Accessing state is safe in non-blocking commits due to stalling any subsequent
commits until the previous one has completed. Check out the comment at:https://cgit.freedesktop.org/drm-tip/tree/drivers/gpu/drm/drm_atomic_helpe
r.c#n1754Sean
Thanks for the link Sean!
Quoted 116 lines
Quoted 17 lines
Thanks
Quoted 15 lines
Both of these callsites will hold the modeset locks.
Am I missing something?
Thanks for your review,
Sean
Quoted 4 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_disable(struct drm_crtc
Quoted 4 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0end:reinit_completion (&dpu_crtc->frame_done_comp);@@ -883,11 +871,8 @@ static void dpu_crtc_disable(struct drm_crtc*crtc)
Quoted 1 line
Quoted 1 line
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-3dpu_core_perf_crtc_update (crtc,0 , true); -drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; + drm_for_each_encoder_mask(encoder, crtc->dev,
crtc->state->encoder_mask)
dpu_encoder_register_frame_event_callback(encoder,NULL,
Quoted 10 lines
Quoted 10 lines
Quoted 6 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_enable(struct drm_crtc
Quoted 6 lines
NULL);
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1- }memset (cstate->mixers,0 ,sizeof (cstate->mixers)); cstate->num_mixers =0 ;@@ -922,12 +907,9 @@ static void dpu_crtc_enable(struct drm_crtc*crtc,
Quoted 3 lines
Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0DRM_DEBUG_KMS ("crtc%d\n" , crtc->base.id); dpu_crtc =to_dpu_crtc (crtc);Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c static void dpu_crtc_enable(struct drm_crtc · line 913
Quoted 7 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-3-drm_for_each_encoder (encoder, crtc->dev) { -if (encoder->crtc != crtc) -continue ; +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask) dpu_encoder_register_frame_event_callback(encoder, dpu_crtc_frame_event_cb, (void*)crtc);
Quoted 10 lines
Quoted 10 lines
Quoted 10 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c static void dpu_kms_prepare_commit(struct
Quoted 10 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1- }mutex_lock (&dpu_crtc->crtc_lock);drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0trace_dpu_crtc_enable (DRMID (crtc), true, dpu_crtc);drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0@@ -320,7 +320,10 @@ static void dpu_kms_prepare_commit(struct
msm_kmsQuoted 9 lines
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +3
-0*kms, struct dpu_kms *dpu_kms;struct msm_drm_private *priv;struct drm_device *dev; +struct drm_crtc *crtc; +struct drm_crtc_state *crtc_state;struct drm_encoder *encoder; +int i;Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c static void dpu_kms_prepare_commit(struct
Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0if (!kms)drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0return ;@@ -332,9 +335,13 @@ static void dpu_kms_prepare_commit(struct
msm_kmsQuoted 5 lines
Quoted 5 lines
Quoted 5 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c static void dpu_kms_prepare_commit(struct · line 336
Quoted 5 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-1*kms, priv = dev->dev_private;pm_runtime_get_sync (&dpu_kms->pdev->dev); - list_for_each_entry(encoder,
&dev->mode_config.encoder_list, head)Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c static void dpu_kms_prepare_commit(struct · line 342
Quoted 5 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +4
-1-if (encoder->crtc !=NULL ) +/* Call prepare_commit for all affected encoders */ +for_each_new_crtc_in_state (state, crtc, crtc_state, i) { + drm_for_each_encoder_mask(encoder, crtc->dev, +
crtc_state->encoder_mask) {Quoted 36 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +2
-0dpu_encoder_prepare_commit (encoder); + } + } }Quoted 28 lines
Quoted 2 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c static void dpu_kms_prepare_commit(struct
Quoted 2 lines
/*
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0@@ -344,13 +351,17 @@ static void dpu_kms_prepare_commit(struct
msm_kmsQuoted 25 lines
Quoted 19 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +6
-2*kms, void dpu_kms_encoder_enable(struct drm_encoder *encoder) {const struct drm_encoder_helper_funcs *funcs = encoder->helper_private; -struct drm_crtc *crtc = encoder->crtc; +struct drm_device *dev = encoder->dev; +struct drm_crtc *crtc;/* Forward this enable call to the commit hook */ if (funcs && funcs->commit) funcs->commit (encoder); -if (crtc && crtc->state->active) { +drm_for_each_crtc (crtc, dev) { +if (!(crtc->state->encoder_mask &drm_encoder_mask (encoder))) +continue ; +drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
Quoted 3 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0trace_dpu_kms_enc_enable (DRMID (crtc));dpu_crtc_commit_kickoff (crtc); }--
Jeykumar S--
Jeykumar S
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 16/24 drm/msm: dpu: Add modeset lock checks where applicable
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
Add modeset lock checks to functions that could be called outside the core atomic stack.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 2 ++ drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 + 2 files changed, 3 insertions(+)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2 -0
@@ -284,6 +284,8 @@ enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)return INTF_MODE_NONE ; } +WARN_ON (!drm_modeset_is_locked (&crtc->mutex)); +/* TODO: Returns the first INTF_MODE, could there be multiple values? */ drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)return dpu_encoder_get_intf_mode (encoder);
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +1 -0
@@ -358,6 +358,7 @@ void dpu_kms_encoder_enable(struct drm_encoder *encoder)if (funcs && funcs->commit) funcs->commit (encoder); +WARN_ON (!drm_modeset_is_locked (&dev->mode_config.connection_mutex));drm_for_each_crtc (crtc, dev) {if (!(crtc->state->encoder_mask &drm_encoder_mask (encoder)))continue ;
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Re: [PATCH v2 16/24] drm/msm: dpu: Add modeset lock checks where applicable
Quoted 10 lines · Sean Paul
From: Sean Paul <[email protected]>
Add modeset lock checks to functions that could be called outside the core atomic stack.
Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>---
Quoted 37 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 2 ++ drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 + 2 files changed, 3 insertions(+)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-0@@ -284,6 +284,8 @@ enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)return INTF_MODE_NONE ; } +WARN_ON (!drm_modeset_is_locked (&crtc->mutex)); +/* TODO: Returns the first INTF_MODE, could there be multiple values? */
drm_for_each_encoder_mask(encoder,crtc->dev,crtc->state->encoder_mask)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0return dpu_encoder_get_intf_mode (encoder);drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +1
-0@@ -358,6 +358,7 @@ void dpu_kms_encoder_enable(struct drm_encoder *encoder)if (funcs && funcs->commit) funcs->commit (encoder); +WARN_ON (!drm_modeset_is_locked (&dev->mode_config.connection_mutex));drm_for_each_crtc (crtc, dev) {if (!(crtc->state->encoder_mask &
drm_encoder_mask(encoder)))
continue;
Signature · 5 lines
Jeykumar S _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-17-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Re: [PATCH v2 16/24] drm/msm: dpu: Add modeset lock checks where applicable
Quoted 33 lines · Sean Paul
From: Sean Paul <[email protected]>
Add modeset lock checks to functions that could be called outside the core atomic stack.
Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 2 ++ drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 + 2 files changed, 3 insertions(+)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-0@@ -284,6 +284,8 @@ enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)return INTF_MODE_NONE ; } +WARN_ON (!drm_modeset_is_locked (&crtc->mutex)); +/* TODO: Returns the first INTF_MODE, could there be multiple values? */ drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)return dpu_encoder_get_intf_mode (encoder);drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c void dpu_kms_encoder_enable(struct drm_encoder *encoder) · line 364
Quoted 7 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +1
-0@@ -358,6 +358,7 @@ void dpu_kms_encoder_enable(struct drm_encoder *encoder)if (funcs && funcs->commit) funcs->commit (encoder); +WARN_ON (!drm_modeset_is_locked (&dev->mode_config.connection_mutex));drm_for_each_crtc (crtc, dev) {if (!(crtc->state->encoder_mask &drm_encoder_mask (encoder)))continue ;
I'm fairly sure this is called in the atomic_commit path, and in there you might not actually hold these locks (if you do a nonblocking modeset).
The locking rules for ->state are pretty fun: Either hold the lock, or be in atomic commit. In the later case atomic helpers' commit ordering guarantees that you can safely access ->state (but read-only only) without hodling any locks. You might want to revert.
Don't ask why I stumbled over this.
-Daniel
Signature · 7 lines
Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Sean Paul
reviewerRe: [PATCH v2 16/24] drm/msm: dpu: Add modeset lock checks where applicable
Quoted 37 lines · Daniel Vetter
Quoted 36 lines · Sean Paul
From: Sean Paul <[email protected]>
Add modeset lock checks to functions that could be called outside the core atomic stack.
Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 2 ++ drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 + 2 files changed, 3 insertions(+)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-0@@ -284,6 +284,8 @@ enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)return INTF_MODE_NONE ; } +WARN_ON (!drm_modeset_is_locked (&crtc->mutex)); +/* TODO: Returns the first INTF_MODE, could there be multiple values? */ drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)return dpu_encoder_get_intf_mode (encoder);drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-0@@ -358,6 +358,7 @@ void dpu_kms_encoder_enable(struct drm_encoder *encoder)if (funcs && funcs->commit) funcs->commit (encoder);
Quoted 8 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c void dpu_kms_encoder_enable(struct drm_encoder *encoder) · line 364
Quoted 4 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +1
-0+WARN_ON (!drm_modeset_is_locked (&dev->mode_config.connection_mutex));drm_for_each_crtc (crtc, dev) {if (!(crtc->state->encoder_mask &drm_encoder_mask (encoder)))continue ;I'm fairly sure this is called in the
atomic_commitpath, and in there you might not actually hold these locks (if you do a nonblocking modeset).
Indeed. I'm not sure what my thinking was when submitting this, I think some of the callsites may have changed since this was posted (with the enable/probe refactors from a few months ago). At any rate, doesn't matter now, I'll post the revert :-)
Quoted 7 lines
The locking rules for ->state are pretty fun: Either hold the lock, or be in atomic commit. In the later case atomic helpers' commit ordering guarantees that you can safely access ->state (but read-only only) without hodling any locks. You might want to revert.
Don't ask why I stumbled over this.
Ok, I'll just assume that you read seanpaul's 11-month old reviews before bed to relax ;-)
Sean
Quoted 5 lines
-Daniel
Signature · 3 lines
Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch
Signature · 5 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH v2 17/24 drm/msm: dpu: Move pm_runtime_(get|put) from vblank_enable
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
There are 4 times that _dpu_crtc_vblank_enable_no_lock() is called:
1- crtc enable
2- crtc disable
3- crtc vblank enable
4- crtc vblank disable
When we enable or disable the crtc, we call drm_crtc_vblank_on and drm_crtc_vblank_off respectively. That will gate vblank enables and disables to only being called when the crtc is active. That means that we can just enable/disable pm runtime in crtc enable/disable. This will be beneficial in trying to eliminate blocking calls from the vblank call chain.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +4 -4
@@ -769,8 +769,6 @@ static void _dpu_crtc_vblank_enable_no_lock(struct drm_encoder *enc;if (enable) { -pm_runtime_get_sync (dev->dev); -list_for_each_entry (enc, &dev->mode_config.encoder_list, head) {if (enc->crtc != crtc)continue ;
@@ -793,8 +791,6 @@ static void _dpu_crtc_vblank_enable_no_lock(dpu_encoder_register_vblank_callback (enc,NULL ,NULL ); } - -pm_runtime_put_sync (dev->dev); } }
@@ -891,6 +887,8 @@ static void dpu_crtc_disable(struct drm_crtc *crtc) crtc->state->event =NULL ;spin_unlock_irqrestore (&crtc->dev->event_lock, flags); } + +pm_runtime_put_sync (crtc->dev->dev); } static void dpu_crtc_enable(struct drm_crtc *crtc,
@@ -906,6 +904,8 @@ static void dpu_crtc_enable(struct drm_crtc *crtc, } priv = crtc->dev->dev_private; +pm_runtime_get_sync (crtc->dev->dev); +DRM_DEBUG_KMS ("crtc%d\n" , crtc->base.id); dpu_crtc =to_dpu_crtc (crtc);
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Re: [PATCH v2 17/24] drm/msm: dpu: Move pm_runtime_(get|put) from vblank_enable
Quoted 16 lines · Sean Paul
From: Sean Paul <[email protected]>
There are 4 times that
_dpu_crtc_vblank_enable_no_lock()is called:1- crtc enable
2- crtc disable
3- crtc vblank enable
4- crtc vblank disableWhen we enable or disable the crtc, we call
drm_crtc_vblank_onanddrm_crtc_vblank_offrespectively. That will gate vblank enables and disables to only being called when the crtc is active. That means that we can just enable/disable pm runtime in crtc enable/disable. This will be beneficial in trying to eliminate blocking calls from the vblank call chain.
Quoted 4 lines
Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>
Quoted 46 lines
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-2@@ -769,8 +769,6 @@ static void _dpu_crtc_vblank_enable_no_lock(struct drm_encoder *enc;if (enable) { -pm_runtime_get_sync (dev->dev); -list_for_each_entry (enc, &dev->mode_config.encoder_list, head) {if (enc->crtc != crtc)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +4
-2continue ;@@ -793,8 +791,6 @@ static void _dpu_crtc_vblank_enable_no_lock(dpu_encoder_register_vblank_callback (enc,NULL ,NULL ); } - -pm_runtime_put_sync (dev->dev); } }@@ -891,6 +887,8 @@ static void dpu_crtc_disable(struct drm_crtc *crtc) crtc->state->event =NULL ;spin_unlock_irqrestore (&crtc->dev->event_lock, flags); } + +pm_runtime_put_sync (crtc->dev->dev); } static void dpu_crtc_enable(struct drm_crtc *crtc,@@ -906,6 +904,8 @@ static void dpu_crtc_enable(struct drm_crtc *crtc, } priv = crtc->dev->dev_private; +pm_runtime_get_sync (crtc->dev->dev); +DRM_DEBUG_KMS ("crtc%d\n" , crtc->base.id); dpu_crtc =to_dpu_crtc (crtc);
Signature · 5 lines
Jeykumar S _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH v2 18/24 drm/msm: dpu: Remove crtc_lock from setup_mixers
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
I think the intention here was to protect the enc->crtc access, but that's insufficient to avoid enc->crtc changing. Fortunately we're already holding the modeset lock when this is called (from atomic_check), so remove the crtc_lock and add a modeset lock check.
While we're at it, use the encoder mask from crtc state instead of legacy pointer.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3 -9
@@ -474,19 +474,13 @@ static void _dpu_crtc_setup_mixer_for_encoder(static void _dpu_crtc_setup_mixers (struct drm_crtc *crtc) { -struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);struct drm_encoder *enc; -mutex_lock (&dpu_crtc->crtc_lock); -/* Check for mixers on all encoders attached to this crtc */ -list_for_each_entry (enc, &crtc->dev->mode_config.encoder_list, head) { -if (enc->crtc != crtc) -continue ; +WARN_ON (!drm_modeset_is_locked (&crtc->mutex)); +/* Check for mixers on all encoders attached to this crtc */ +drm_for_each_encoder_mask (enc, crtc->dev, crtc->state->encoder_mask)_dpu_crtc_setup_mixer_for_encoder (crtc, enc); - } - -mutex_unlock (&dpu_crtc->crtc_lock); } static void _dpu_crtc_setup_lm_bounds(struct drm_crtc *crtc,
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-19-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Jeykumar Sankaran
Reviewed-byRe: [PATCH v2 18/24] drm/msm: dpu: Remove crtc_lock from setup_mixers
Quoted 7 lines · Sean Paul
From: Sean Paul <[email protected]>
I think the intention here was to protect the
enc->crtcaccess, but that's insufficient to avoidenc->crtcchanging. Fortunately we're already holding the modeset lock when this is called (fromatomic_check), so remove thecrtc_lockand add a modeset lock check.
Quoted 7 lines
While we're at it, use the encoder mask from crtc state instead of legacy pointer.
Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>
Quoted 34 lines
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3
-9@@ -474,19 +474,13 @@ static void _dpu_crtc_setup_mixer_for_encoder(static void _dpu_crtc_setup_mixers (struct drm_crtc *crtc) { -struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);struct drm_encoder *enc; -mutex_lock (&dpu_crtc->crtc_lock); -/* Check for mixers on all encoders attached to this crtc */ -list_for_each_entry (enc, &crtc->dev->mode_config.encoder_list, head) { -if (enc->crtc != crtc) -continue ; +WARN_ON (!drm_modeset_is_locked (&crtc->mutex)); +/* Check for mixers on all encoders attached to this crtc */ +drm_for_each_encoder_mask (enc, crtc->dev, crtc->state->encoder_mask)_dpu_crtc_setup_mixer_for_encoder (crtc, enc); - } - -mutex_unlock (&dpu_crtc->crtc_lock); }static void _dpu_crtc_setup_lm_bounds(struct
drm_crtc*crtc,
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 20/24 drm/msm: dpu: Use atomic_disable for dpu_crtc_disable
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
Matches dpu_crtc_enable and we'll need the old state in a future patch
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3 -2
@@ -815,7 +815,8 @@ static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc)return &cstate->base; } -static void dpu_crtc_disable (struct drm_crtc *crtc) +static void dpu_crtc_disable (struct drm_crtc *crtc, +struct drm_crtc_state *old_crtc_state) {struct dpu_crtc *dpu_crtc;struct dpu_crtc_state *cstate;
@@ -1407,7 +1408,7 @@ static const struct drm_crtc_funcs dpu_crtc_funcs = { };static const struct drm_crtc_helper_funcs dpu_crtc_helper_funcs = { - .disable = dpu_crtc_disable, + .atomic_disable = dpu_crtc_disable, .atomic_enable = dpu_crtc_enable, .atomic_check = dpu_crtc_atomic_check, .atomic_begin = dpu_crtc_atomic_begin,
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-21-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Jeykumar Sankaran
Reviewed-byRe: [PATCH v2 20/24] drm/msm: dpu: Use atomic_disable for dpu_crtc_disable
Quoted 8 lines · Sean Paul
From: Sean Paul <[email protected]>
Matches
dpu_crtc_enableand we'll need the old state in a future patchChanges in v2:
- NoneSigned-off-by Sean Paul <[email protected]>
Quoted 31 lines
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-1@@ -815,7 +815,8 @@ static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc) return &cstate->base; } -static void dpu_crtc_disable (struct drm_crtc *crtc) +static void dpu_crtc_disable (struct drm_crtc *crtc, +struct drm_crtc_state *old_crtc_state) {struct dpu_crtc *dpu_crtc;drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0struct dpu_crtc_state *cstate;@@ -1407,7 +1408,7 @@ static const struct drm_crtc_funcs dpu_crtc_funcs=
{
};static const struct
drm_crtc_helper_funcsdpu_crtc_helper_funcs= {drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-1- .disable = dpu_crtc_disable, + .atomic_disable = dpu_crtc_disable, .atomic_enable = dpu_crtc_enable, .atomic_check = dpu_crtc_atomic_check, .atomic_begin = dpu_crtc_atomic_begin,
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 21/24 drm/msm: dpu: Don't bother checking ->enabled in dpu_crtc_vblank
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
The drm_crtc_vblank_on/off calls in enable/disable guarantee that we won't call this function when crtc is not enabled.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1 -3
@@ -1162,9 +1162,7 @@ int dpu_crtc_vblank(struct drm_crtc *crtc, bool en)mutex_lock (&dpu_crtc->crtc_lock);trace_dpu_crtc_vblank (DRMID (&dpu_crtc->base), en, dpu_crtc); -if (dpu_crtc->enabled) { -_dpu_crtc_vblank_enable_no_lock (dpu_crtc, en); - } +_dpu_crtc_vblank_enable_no_lock (dpu_crtc, en); dpu_crtc->vblank_requested = en;mutex_unlock (&dpu_crtc->crtc_lock);
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-22-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Jeykumar Sankaran
Reviewed-byRe: [PATCH v2 21/24] drm/msm: dpu: Don't bother checking ->enabled in dpu_crtc_vblank
Quoted 9 lines · Sean Paul
From: Sean Paul <[email protected]>
The drm_crtc_vblank_on/off calls in enable/disable guarantee that we won't call this function when crtc is not enabled.
Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>
Quoted 20 lines
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-3@@ -1162,9 +1162,7 @@ int dpu_crtc_vblank(struct drm_crtc *crtc, bool en) mutex_lock(&dpu_crtc->crtc_lock);trace_dpu_crtc_vblank (DRMID (&dpu_crtc->base), en, dpu_crtc); -if (dpu_crtc->enabled) { -_dpu_crtc_vblank_enable_no_lock (dpu_crtc, en); - } +_dpu_crtc_vblank_enable_no_lock (dpu_crtc, en); dpu_crtc->vblank_requested = en;mutex_unlock (&dpu_crtc->crtc_lock);
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 23/24 drm/msm: dpu: Remove vblank_requested flag from dpu_crtc
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
It's just for debugfs output, we don't need it
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 6 ------ drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 2 -- drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 14 ++++---------- 3 files changed, 4 insertions(+), 18 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0 -6
@@ -1149,10 +1149,6 @@ int dpu_crtc_vblank(struct drm_crtc *crtc, bool en)dpu_encoder_toggle_vblank_for_crtc (enc, crtc, en); } -mutex_lock (&dpu_crtc->crtc_lock); - dpu_crtc->vblank_requested = en; -mutex_unlock (&dpu_crtc->crtc_lock); -return 0 ; }
@@ -1268,8 +1264,6 @@ static int _dpu_debugfs_status_show(struct seq_file *s, void *data) dpu_crtc->vblank_cb_time =ktime_set (0 ,0 ); } -seq_printf (s,"vblank_enable:%d\n" , dpu_crtc->vblank_requested); -mutex_unlock (&dpu_crtc->crtc_lock);drm_modeset_unlock_all (crtc->dev);
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +0 -2
@@ -132,7 +132,6 @@ struct dpu_crtc_frame_event {* @vblank_cb_count : count of vblank callback since last reset * @play_count : frame count between crtc enable and disable * @vblank_cb_time : ktime at vblank count reset -* @vblank_requested : whether the user has requested vblank events * @enabled : whether the DPU CRTC is currently enabled. updated in the * commit-thread, not state-swap time which is earlier, so * safe to make decisions on during VBLANK on/off work
@@ -166,7 +165,6 @@ struct dpu_crtc {u32 vblank_cb_count;u64 play_count;ktime_t vblank_cb_time; -bool vblank_requested;bool enabled;struct list_head feature_list;
drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h +4 -10
@@ -728,20 +728,17 @@ TRACE_EVENT(dpu_crtc_vblank_enable, __field( uint32_t, enc_id ) __field( bool, enable )__field ( bool, enabled ) -__field ( bool, vblank_requested ) ),TP_fast_assign ( __entry->drm_id = drm_id; __entry->enc_id = enc_id; __entry->enable = enable; __entry->enabled = crtc->enabled; - __entry->vblank_requested = crtc->vblank_requested; ), -TP_printk ("id:%u encoder:%u enable:%s state{enabled:%s vblank_req:%s}" , +TP_printk ("id:%u encoder:%u enable:%s state{enabled:%s}" , __entry->drm_id, __entry->enc_id, __entry->enable ?"true" :"false" , - __entry->enabled ?"true" :"false" , - __entry->vblank_requested ?"true" :"false" ) + __entry->enabled ?"true" :"false" ) ); DECLARE_EVENT_CLASS(dpu_crtc_enable_template,
@@ -751,18 +748,15 @@ DECLARE_EVENT_CLASS(dpu_crtc_enable_template, __field( uint32_t, drm_id ) __field( bool, enable )__field ( bool, enabled ) -__field ( bool, vblank_requested ) ),TP_fast_assign ( __entry->drm_id = drm_id; __entry->enable = enable; __entry->enabled = crtc->enabled; - __entry->vblank_requested = crtc->vblank_requested; ), -TP_printk ("id:%u enable:%s state{enabled:%s vblank_req:%s}" , +TP_printk ("id:%u enable:%s state{enabled:%s}" , __entry->drm_id, __entry->enable ?"true" :"false" , - __entry->enabled ?"true" :"false" , - __entry->vblank_requested ?"true" :"false" ) + __entry->enabled ?"true" :"false" ) ); DEFINE_EVENT(dpu_crtc_enable_template, dpu_crtc_enable, TP_PROTO(uint32_t drm_id, bool enable, struct dpu_crtc *crtc),
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-24-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Jeykumar Sankaran
Reviewed-byRe: [PATCH v2 23/24] drm/msm: dpu: Remove vblank_requested flag from dpu_crtc
Quoted 9 lines · Sean Paul
From: Sean Paul <[email protected]>
It's just for debugfs output, we don't need it
Changes in v2:
- NoneCc Jeykumar Sankaran <[email protected]>Signed-off-by Sean Paul <[email protected]>
Quoted 110 lines
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 6 ------ drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 2 -- drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 14 ++++---------- 3 files changed, 4 insertions(+), 18 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-4@@ -1149,10 +1149,6 @@ int dpu_crtc_vblank(struct drm_crtc *crtc, bool en)dpu_encoder_toggle_vblank_for_crtc (enc ,crtc ,en ); } -mutex_lock (&dpu_crtc->crtc_lock); - dpu_crtc->vblank_requested = en; -mutex_unlock (&dpu_crtc->crtc_lock); -return 0 ; }@@ -1268,8 +1264,6 @@ static int _dpu_debugfs_status_show(struct
seq_file
*s, void *data)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-2dpu_crtc->vblank_cb_time =ktime_set (0 ,0 ); } -seq_printf (s,"vblank_enable:%d\n" , dpu_crtc->vblank_requested); -mutex_unlock (&dpu_crtc->crtc_lock);drm_modeset_unlock_all (crtc->dev);drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +0
-1@@ -132,7 +132,6 @@ struct dpu_crtc_frame_event {* @vblank_cb_count : count of vblank callback since last reset * @play_count : frame count between crtc enable and disable * @vblank_cb_time : ktime at vblank count reset -* @vblank_requested : whether the user has requested vblank events * @enabled : whether the DPU CRTC is currently enabled. updated in
the
* commit-thread, not state-swap time which is
earlier,
so
* safe to make decisions on during VBLANK on/off
workdrivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +0
-1@@ -166,7 +165,6 @@ struct dpu_crtc {u32 vblank_cb_count;u64 play_count;ktime_t vblank_cb_time; -bool vblank_requested;bool enabled;struct list_head feature_list;drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h +2
-5@@ -728,20 +728,17 @@ TRACE_EVENT(dpu_crtc_vblank_enable, __field( uint32_t, enc_id ) __field( bool, enable )__field ( bool, enabled ) -__field ( bool, vblank_requested ) ),TP_fast_assign ( __entry->drm_id = drm_id; __entry->enc_id = enc_id; __entry->enable = enable; __entry->enabled = crtc->enabled; - __entry->vblank_requested = crtc->vblank_requested; ), -TP_printk ("id:%u encoder:%u enable:%s state{enabled:%s vblank_req:%s}", +TP_printk ("id:%u encoder:%u enable:%s state{enabled:%s}" , __entry->drm_id, __entry->enc_id, __entry->enable ?"true" :"false" , - __entry->enabled ?"true" :"false" , - __entry->vblank_requested ?"true" :"false" ) + __entry->enabled ?"true" :"false" ) );DECLARE_EVENT_CLASS(dpu_crtc_enable_template,
drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h +2
-5@@ -751,18 +748,15 @@ DECLARE_EVENT_CLASS(dpu_crtc_enable_template, __field( uint32_t, drm_id ) __field( bool, enable )__field ( bool, enabled ) -__field ( bool, vblank_requested ) ),TP_fast_assign ( __entry->drm_id = drm_id; __entry->enable = enable; __entry->enabled = crtc->enabled; - __entry->vblank_requested = crtc->vblank_requested; ), -TP_printk ("id:%u enable:%s state{enabled:%s vblank_req:%s}" , +TP_printk ("id:%u enable:%s state{enabled:%s}" , __entry->drm_id, __entry->enable ?"true" :"false" , - __entry->enabled ?"true" :"false" , - __entry->vblank_requested ?"true" :"false" ) + __entry->enabled ?"true" :"false" ) ); DEFINE_EVENT(dpu_crtc_enable_template, dpu_crtc_enable, TP_PROTO(uint32_t drm_id, bool enable, struct dpu_crtc *crtc),
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
PATCH v2 24/24 drm/msm: dpu: Remove crtc_lock
In reply to a message not in the archiveFrom: Sean Paul <[email protected]>
Each time it's called we're holding the crtc modeset lock, so it's redundant.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 11 ----------- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 3 --- 2 files changed, 14 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0 -11
@@ -69,7 +69,6 @@ static void dpu_crtc_destroy(struct drm_crtc *crtc)return ;drm_crtc_cleanup (crtc); -mutex_destroy (&dpu_crtc->crtc_lock);kfree (dpu_crtc); }
@@ -806,8 +805,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, old_crtc_state->encoder_mask)dpu_encoder_assign_crtc (encoder,NULL ); -mutex_lock (&dpu_crtc->crtc_lock); -/* wait for frame_event_done completion */ if (_dpu_crtc_wait_for_frame_done (crtc)) DPU_ERROR("crtc%d wait for frame done failed;frame_pending%d\n",
@@ -836,8 +833,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, cstate->bw_control = false; cstate->bw_split_vote = false; -mutex_unlock (&dpu_crtc->crtc_lock); -if (crtc->state->event && !crtc->state->active) {spin_lock_irqsave (&crtc->dev->event_lock, flags);drm_crtc_send_vblank_event (crtc, crtc->state->event);
@@ -870,12 +865,9 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,dpu_encoder_register_frame_event_callback (encoder, dpu_crtc_frame_event_cb, (void *)crtc); -mutex_lock (&dpu_crtc->crtc_lock);trace_dpu_crtc_enable (DRMID (crtc), true, dpu_crtc); dpu_crtc->enabled = true; -mutex_unlock (&dpu_crtc->crtc_lock); -drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_assign_crtc (encoder, crtc);
@@ -1177,7 +1169,6 @@ static int _dpu_debugfs_status_show(struct seq_file *s, void *data)drm_modeset_lock_all (crtc->dev); cstate =to_dpu_crtc_state (crtc->state); -mutex_lock (&dpu_crtc->crtc_lock); mode = &crtc->state->adjusted_mode; out_width =_dpu_crtc_get_mixer_width (cstate, mode);
@@ -1264,7 +1255,6 @@ static int _dpu_debugfs_status_show(struct seq_file *s, void *data) dpu_crtc->vblank_cb_time =ktime_set (0 ,0 ); } -mutex_unlock (&dpu_crtc->crtc_lock);drm_modeset_unlock_all (crtc->dev);return 0 ;
@@ -1414,7 +1404,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane, crtc = &dpu_crtc->base; crtc->dev = dev; -mutex_init (&dpu_crtc->crtc_lock);spin_lock_init (&dpu_crtc->spin_lock);atomic_set (&dpu_crtc->frame_pending,0 );
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +0 -3
@@ -140,7 +140,6 @@ struct dpu_crtc_frame_event {* @dirty_list : list of color processing features are dirty * @ad_dirty: list containing ad properties that are dirty * @ad_active: list containing ad properties that are active -* @crtc_lock : crtc lock around create, destroy and access. * @frame_pending : Whether or not an update is pending * @frame_events : static allocation of in-flight frame events * @frame_event_list : available frame event list
@@ -173,8 +172,6 @@ struct dpu_crtc {struct list_head ad_dirty;struct list_head ad_active; -struct mutex crtc_lock; -atomic_t frame_pending;struct dpu_crtc_frame_event frame_events[DPU_CRTC_FRAME_EVENT_SIZE ];struct list_head frame_event_list;
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-25-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Jeykumar Sankaran
Reviewed-byRe: [PATCH v2 24/24] drm/msm: dpu: Remove crtc_lock
Quoted 9 lines · Sean Paul
From: Sean Paul <[email protected]>
Each time it's called we're holding the crtc modeset lock, so it's redundant.
Changes in v2:
- NoneSigned-off-by Sean Paul <[email protected]>
Quoted 103 lines
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 11 ----------- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 3 --- 2 files changed, 14 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-3@@ -69,7 +69,6 @@ static void dpu_crtc_destroy(struct drm_crtc *crtc)return ;drm_crtc_cleanup (crtc); -mutex_destroy (&dpu_crtc->crtc_lock);kfree (dpu_crtc); }@@ -806,8 +805,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, old_crtc_state->encoder_mask)dpu_encoder_assign_crtc (encoder,NULL ); -mutex_lock (&dpu_crtc->crtc_lock); -/* wait for frame_event_done completion */ if (_dpu_crtc_wait_for_frame_done (crtc)) DPU_ERROR("crtc%d wait for frame donefailed;frame_pending%d\n",
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-5@@ -836,8 +833,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, cstate->bw_control = false; cstate->bw_split_vote = false; -mutex_unlock (&dpu_crtc->crtc_lock); -if (crtc->state->event && !crtc->state->active) {spin_lock_irqsave (&crtc->dev->event_lock, flags);drm_crtc_send_vblank_event (crtc, crtc->state->event);@@ -870,12 +865,9 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,dpu_encoder_register_frame_event_callback (encoder, dpu_crtc_frame_event_cb, (void *)crtc); -mutex_lock (&dpu_crtc->crtc_lock);trace_dpu_crtc_enable (DRMID (crtc), true, dpu_crtc); dpu_crtc->enabled = true; -mutex_unlock (&dpu_crtc->crtc_lock); -drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask)dpu_encoder_assign_crtc (encoder, crtc);@@ -1177,7 +1169,6 @@ static int _dpu_debugfs_status_show(struct
seq_file
*s, void *data)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-1drm_modeset_lock_all (crtc->dev); cstate =to_dpu_crtc_state (crtc->state); -mutex_lock (&dpu_crtc->crtc_lock); mode = &crtc->state->adjusted_mode; out_width =_dpu_crtc_get_mixer_width (cstate, mode);@@ -1264,7 +1255,6 @@ static int _dpu_debugfs_status_show(struct
seq_file
*s, void *data)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-2dpu_crtc->vblank_cb_time =ktime_set (0 ,0 ); } -mutex_unlock (&dpu_crtc->crtc_lock);drm_modeset_unlock_all (crtc->dev);return 0 ;@@ -1414,7 +1404,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane, crtc = &dpu_crtc->base; crtc->dev = dev; -mutex_init (&dpu_crtc->crtc_lock);spin_lock_init (&dpu_crtc->spin_lock);atomic_set (&dpu_crtc->frame_pending,0 );drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +0
-3@@ -140,7 +140,6 @@ struct dpu_crtc_frame_event {* @dirty_list : list of color processing features are dirty * @ad_dirty: list containing ad properties that are dirty * @ad_active: list containing ad properties that are active -* @crtc_lock : crtc lock around create, destroy and access. * @frame_pending : Whether or not an update is pending * @frame_events : static allocation of in-flight frame events * @frame_event_list : available frame event list @@ -173,8 +172,6 @@ struct dpu_crtc {struct list_head ad_dirty;struct list_head ad_active; -struct mutex crtc_lock; -atomic_t frame_pending;struct dpu_crtc_frame_event frame_events[DPU_CRTC_FRAME_EVENT_SIZE ];struct
list_headframe_event_list;
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Sean Paul
reviewerPATCH v2 3/24 drm/msm: dpu: Remove dpu_power_client
In reply to Sean PaulFrom: Sean Paul <[email protected]>
There's only one client -- core, and it's only used for runtime pm which is already refcounted.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 22 +---- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 1 - .../gpu/drm/msm/disp/dpu1/dpu_power_handle.c | 96 +------------------ .../gpu/drm/msm/disp/dpu1/dpu_power_handle.h | 86 +---------------- 4 files changed, 6 insertions(+), 199 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +2 -20
@@ -676,11 +676,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)dpu_hw_catalog_deinit (dpu_kms->catalog); dpu_kms->catalog =NULL ; -if (dpu_kms->core_client) -dpu_power_client_destroy (&dpu_kms->phandle, - dpu_kms->core_client); - dpu_kms->core_client =NULL ; -if (dpu_kms->vbif[VBIF_NRT ])devm_iounmap (&dpu_kms->pdev->dev, dpu_kms->vbif[VBIF_NRT ]); dpu_kms->vbif[VBIF_NRT ] =NULL ;
@@ -913,17 +908,6 @@ static int dpu_kms_hw_init(struct msm_kms *kms) dpu_kms->reg_dma_len =dpu_iomap_size (dpu_kms->pdev,"regdma" ); } - dpu_kms->core_client =dpu_power_client_create (&dpu_kms->phandle, -"core" ); -if (IS_ERR_OR_NULL (dpu_kms->core_client)) { - rc =PTR_ERR (dpu_kms->core_client); -if (!dpu_kms->core_client) - rc = -EINVAL ; -DPU_ERROR ("dpu power client create failed: %d\n" , rc); - dpu_kms->core_client =NULL ; - goto error; - } -pm_runtime_get_sync (&dpu_kms->pdev->dev);_dpu_kms_core_hw_rev_init (dpu_kms);
@@ -1157,8 +1141,7 @@ static int __maybe_unused dpu_runtime_suspend(struct device *dev)return rc; } - rc =dpu_power_resource_enable (&dpu_kms->phandle, - dpu_kms->core_client, false); + rc =dpu_power_resource_enable (&dpu_kms->phandle, false);if (rc)DPU_ERROR ("resource disable failed: %d\n" , rc);
@@ -1189,8 +1172,7 @@ static int __maybe_unused dpu_runtime_resume(struct device *dev)return rc; } - rc =dpu_power_resource_enable (&dpu_kms->phandle, - dpu_kms->core_client, true); + rc =dpu_power_resource_enable (&dpu_kms->phandle, true);if (rc)DPU_ERROR ("resource enable failed: %d\n" , rc);
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +0 -1
@@ -114,7 +114,6 @@ struct dpu_kms {struct dpu_mdss_cfg *catalog;struct dpu_power_handle phandle; -struct dpu_power_client *core_client;struct dpu_power_event *power_event;/* directory entry for debugfs */
drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.c +3 -93
137 lines not on this page · raw message
drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.h +1 -85
123 lines not on this page · raw message
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Sean Paul
reviewerPATCH v2 4/24 drm/msm: dpu: Don't use power_event for vbif_init_memtypes
In reply to Sean PaulFrom: Sean Paul <[email protected]>
power_events are only used for pm_runtime, and that's all handled in dpu_kms. So just call vbif_init_memtypes at the correct times.
Changes in v2:
- Removed obsolete comment (Jeykumar)
--- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 24 +++--------------------- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 1 - 2 files changed, 3 insertions(+), 22 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +3 -21
@@ -651,10 +651,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)dpu_hw_intr_destroy (dpu_kms->hw_intr); dpu_kms->hw_intr =NULL ; -if (dpu_kms->power_event) -dpu_power_handle_unregister_event ( - &dpu_kms->phandle, dpu_kms->power_event); -/* safe to call these more than once during shutdown */ _dpu_debugfs_destroy (dpu_kms);_dpu_kms_mmu_destroy (dpu_kms);
@@ -832,16 +828,6 @@ u64 dpu_kms_get_clk_rate(struct dpu_kms *dpu_kms, char *clock_name)return clk_get_rate (clk->clk); } -static void dpu_kms_handle_power_event (u32 event_type,void *usr) -{ -struct dpu_kms *dpu_kms = usr; - -if (!dpu_kms) -return ; - -dpu_vbif_init_memtypes (dpu_kms); -} -static int dpu_kms_hw_init (struct msm_kms *kms) {struct dpu_kms *dpu_kms;
@@ -1012,13 +998,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)*/ dev->mode_config.allow_fb_modifiers = true; -/* -* Handle (re)initializations during power enable -*/ -dpu_kms_handle_power_event (DPU_POWER_EVENT_ENABLE , dpu_kms); - dpu_kms->power_event =dpu_power_handle_register_event ( - &dpu_kms->phandle,DPU_POWER_EVENT_ENABLE , - dpu_kms_handle_power_event, dpu_kms,"kms" ); +dpu_vbif_init_memtypes (dpu_kms);pm_runtime_put_sync (&dpu_kms->pdev->dev);
@@ -1172,6 +1152,8 @@ static int __maybe_unused dpu_runtime_resume(struct device *dev)return rc; } +dpu_vbif_init_memtypes (dpu_kms); + rc =dpu_power_resource_enable (&dpu_kms->phandle, true);if (rc)DPU_ERROR ("resource enable failed: %d\n" , rc);
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +0 -1
@@ -114,7 +114,6 @@ struct dpu_kms {struct dpu_mdss_cfg *catalog;struct dpu_power_handle phandle; -struct dpu_power_event *power_event;/* directory entry for debugfs */ struct dentry *debugfs_root;
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-5-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Jeykumar Sankaran
Reviewed-byRe: [PATCH v2 04/24] drm/msm: dpu: Don't use power_event for vbif_init_memtypes
Quoted 11 lines · Sean Paul
From: Sean Paul <[email protected]>
power_eventsare only used forpm_runtime, and that's all handled indpu_kms. So just callvbif_init_memtypesat the correct times.Changes in v2:
- Removed obsolete comment (Jeykumar)Cc Jeykumar Sankaran <[email protected]>Signed-off-by Sean Paul <[email protected]>---
Quoted 78 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 24 +++--------------------- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 1 - 2 files changed, 3 insertions(+), 22 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-4@@ -651,10 +651,6 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms)dpu_hw_intr_destroy (dpu_kms->hw_intr); dpu_kms->hw_intr =NULL ; -if (dpu_kms->power_event) -dpu_power_handle_unregister_event ( - &dpu_kms->phandle, dpu_kms->power_event); -/* safe to call these more than once during shutdown */ _dpu_debugfs_destroy (dpu_kms);drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0
-10_dpu_kms_mmu_destroy (dpu_kms);@@ -832,16 +828,6 @@ u64 dpu_kms_get_clk_rate(struct dpu_kms *dpu_kms, char *clock_name)return clk_get_rate (clk->clk); } -static void dpu_kms_handle_power_event (u32 event_type,void *usr) -{ -struct dpu_kms *dpu_kms = usr; - -if (!dpu_kms) -return ; - -dpu_vbif_init_memtypes (dpu_kms); -} -static int dpu_kms_hw_init (struct msm_kms *kms) {drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +1
-7struct dpu_kms *dpu_kms;@@ -1012,13 +998,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)*/ dev->mode_config.allow_fb_modifiers = true; -/* -* Handle (re)initializations during power enable -*/ -dpu_kms_handle_power_event (DPU_POWER_EVENT_ENABLE , dpu_kms); - dpu_kms->power_event =dpu_power_handle_register_event ( - &dpu_kms->phandle,DPU_POWER_EVENT_ENABLE , - dpu_kms_handle_power_event, dpu_kms,"kms" ); +dpu_vbif_init_memtypes (dpu_kms);pm_runtime_put_sync (&dpu_kms->pdev->dev);@@ -1172,6 +1152,8 @@ static int __maybe_unuseddpu_runtime_resume(struct
device *dev)drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +2
-0return rc; } +dpu_vbif_init_memtypes (dpu_kms); + rc =dpu_power_resource_enable (&dpu_kms->phandle, true);if (rc)DPU_ERROR ("resource enable failed: %d\n" , rc);drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +0
-1@@ -114,7 +114,6 @@ struct dpu_kms {struct dpu_mdss_cfg *catalog;struct dpu_power_handle phandle; -struct dpu_power_event *power_event;/* directory entry for debugfs */ struct dentry *debugfs_root;
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Sean Paul
reviewerPATCH v2 9/24 drm/msm: dpu: Remove dpu_power_handle
In reply to Sean PaulFrom: Sean Paul <[email protected]>
Now that we don't have any event handlers, remove dpu_power_handle!
Changes in v2:
- None
--- drivers/gpu/drm/msm/Makefile | 1 - drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 11 -- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 3 - .../gpu/drm/msm/disp/dpu1/dpu_power_handle.c | 136 ------------------ .../gpu/drm/msm/disp/dpu1/dpu_power_handle.h | 113 --------------- 5 files changed, 264 deletions(-) delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.c delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.h
drivers/gpu/drm/msm/Makefile +0 -1
@@ -72,7 +72,6 @@ msm-y := \ disp/dpu1/dpu_kms.o \ disp/dpu1/dpu_mdss.o \ disp/dpu1/dpu_plane.o \ - disp/dpu1/dpu_power_handle.o \ disp/dpu1/dpu_rm.o \ disp/dpu1/dpu_vbif.o \ msm_atomic.o \
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +0 -11
@@ -1060,8 +1060,6 @@ static int dpu_bind(struct device *dev, struct device *master, void *data)return ret; } -dpu_power_resource_init (pdev, &dpu_kms->phandle); -platform_set_drvdata (pdev, dpu_kms);msm_kms_init (&dpu_kms->base, &kms_funcs);
@@ -1081,7 +1079,6 @@ static void dpu_unbind(struct device *dev, struct device *master, void *data)struct dpu_kms *dpu_kms =platform_get_drvdata (pdev);struct dss_module_power *mp = &dpu_kms->mp; -dpu_power_resource_deinit (pdev, &dpu_kms->phandle);msm_dss_put_clk (mp->clk_config, mp->num_clk);devm_kfree (&pdev->dev, mp->clk_config); mp->num_clk =0 ;
@@ -1120,10 +1117,6 @@ static int __maybe_unused dpu_runtime_suspend(struct device *dev)return rc; } - rc =dpu_power_resource_enable (&dpu_kms->phandle, false); -if (rc) -DPU_ERROR ("resource disable failed: %d\n" , rc); - rc =msm_dss_enable_clk (mp->clk_config, mp->num_clk, false);if (rc)DPU_ERROR ("clock disable failed rc:%d\n" , rc);
@@ -1157,10 +1150,6 @@ static int __maybe_unused dpu_runtime_resume(struct device *dev)drm_for_each_crtc (crtc, ddev)dpu_crtc_runtime_resume (crtc); - rc =dpu_power_resource_enable (&dpu_kms->phandle, true); -if (rc) -DPU_ERROR ("resource enable failed: %d\n" , rc); -return rc; }
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +0 -3
@@ -31,7 +31,6 @@#include "dpu_hw_top.h" #include "dpu_io_util.h" #include "dpu_rm.h" -#include "dpu_power_handle.h" #include "dpu_irq.h" #include "dpu_core_perf.h"
@@ -114,8 +113,6 @@ struct dpu_kms {int core_rev;struct dpu_mdss_cfg *catalog; -struct dpu_power_handle phandle; -/* directory entry for debugfs */ struct dentry *debugfs_root;struct dentry *debugfs_danger;
drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.c deleted +0 -136
136 lines not on this page · raw message
drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.h deleted +0 -113
113 lines not on this page · raw message
Signature · 1 line
Sean Paul, Software Engineer, Google / Chromium OS
Sean Paul
reviewerPATCH v2 11/24 drm/msm: dpu: Add ->enabled to dpu_encoder_virt
In reply to Sean PaulFrom: Sean Paul <[email protected]>
Add a bool to dpu_encoder_virt to track whether the encoder is enabled or not. Repurpose the enc_lock mutex to ensure that it is consistent with the hw state.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 27 +++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +22 -5
@@ -132,6 +132,7 @@ enum dpu_enc_rc_states {* @base: drm_encoder base class for registration with DRM * @enc_spinlock: Virtual-Encoder-Wide Spin Lock for IRQ purposes * @bus_scaling_client: Client handle to the bus scaling interface +* @enabled: True if the encoder is active, protected by enc_lock * @num_phys_encs: Actual number of physical encoders contained. * @phys_encs: Container of physical encoders managed. * @cur_master: Pointer to the current master in this mode. Optimization
@@ -148,8 +149,8 @@ enum dpu_enc_rc_states {* all CTL paths * @crtc_kickoff_cb_data: Opaque user data given to crtc_kickoff_cb * @debugfs_root: Debug file system root file node -* @enc_lock: Lock around physical encoder create/destroy and -access. +* @enc_lock: Lock around physical encoder +* create/destroy/enable/disable * @frame_busy_mask: Bitmask tracking which phys_enc we are still * busy processing current command. * Bit0 = phys_encs[0] etc.
@@ -175,6 +176,8 @@ struct dpu_encoder_virt {spinlock_t enc_spinlock;uint32_t bus_scaling_client; +bool enabled; +unsigned int num_phys_encs;struct dpu_encoder_phys *phys_encs[MAX_PHYS_ENCODERS_PER_VIRTUAL ];struct dpu_encoder_phys *cur_master;
@@ -1121,6 +1124,8 @@ static void dpu_encoder_virt_enable(struct drm_encoder *drm_enc)return ; } dpu_enc =to_dpu_encoder_virt (drm_enc); + +mutex_lock (&dpu_enc->enc_lock); cur_mode = &dpu_enc->base.crtc->state->adjusted_mode; trace_dpu_enc_enable(DRMID(drm_enc), cur_mode->hdisplay,
@@ -1137,10 +1142,15 @@ static void dpu_encoder_virt_enable(struct drm_encoder *drm_enc)if (ret) {DPU_ERROR_ENC (dpu_enc,"dpu resource control failed: %d\n" , ret); -return ; + goto out; }_dpu_encoder_virt_enable_helper (drm_enc); + + dpu_enc->enabled = true; + +out: +mutex_unlock (&dpu_enc->enc_lock); }static void dpu_encoder_virt_disable (struct drm_encoder *drm_enc)
@@ -1162,11 +1172,14 @@ static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc)return ; } - mode = &drm_enc->crtc->state->adjusted_mode; - dpu_enc =to_dpu_encoder_virt (drm_enc);DPU_DEBUG_ENC (dpu_enc,"\n" ); +mutex_lock (&dpu_enc->enc_lock); + dpu_enc->enabled = false; + + mode = &drm_enc->crtc->state->adjusted_mode; + priv = drm_enc->dev->dev_private; dpu_kms =to_dpu_kms (priv->kms);
@@ -1200,6 +1213,8 @@ static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc)DPU_DEBUG_ENC (dpu_enc,"encoder disabled\n" );dpu_rm_release (&dpu_kms->rm, drm_enc); + +mutex_unlock (&dpu_enc->enc_lock); } static enum dpu_intf dpu_encoder_get_intf(struct dpu_mdss_cfg *catalog,
@@ -2233,6 +2248,8 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,drm_encoder_helper_add (&dpu_enc->base, &dpu_encoder_helper_funcs); + dpu_enc->enabled = false; +return &dpu_enc->base; }
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v2 11/24] drm/msm: dpu: Add ->enabled to dpu_encoder_virt
Quoted 6 lines · Sean Paul
From: Sean Paul <[email protected]>
Add a bool to
dpu_encoder_virtto track whether the encoder is enabled or not. Repurpose theenc_lockmutex to ensure that it is consistent with the hw state.
Quoted 6 lines
Changes in v2:
- NoneCc Jeykumar Sankaran <[email protected]>Signed-off-by Sean Paul <[email protected]>---
Quoted 107 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 27 +++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +1
-0@@ -132,6 +132,7 @@ enum dpu_enc_rc_states {* @base: drm_encoder base class for registration with DRM * @enc_spinlock: Virtual-Encoder-Wide Spin Lock for IRQ purposes * @bus_scaling_client: Client handle to the bus scaling interface +* @enabled: True if the encoder is active, protected by
enc_lock
* @num_phys_encs: Actual number of physical encoders contained.
* @phys_encs: Container of physical encoders managed.
* @cur_master: Pointer to the current master in this
mode. Optimizationdrivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +0
-1@@ -148,8 +149,8 @@ enum dpu_enc_rc_states {* all CTL paths * @crtc_kickoff_cb_data: Opaque user data given to crtc_kickoff_cb * @debugfs_root: Debug file system root file node -* @enc_lock: Lock around physical encoder create/destroy and
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +2
-1- access. +* @enc_lock: Lock around physical encoder +* create/destroy/enable/disable * @frame_busy_mask: Bitmask tracking which phys_enc we are still
* busy processing current command.
* Bit0 = phys_encs[0] etc.drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +4
-0@@ -175,6 +176,8 @@ struct dpu_encoder_virt {spinlock_t enc_spinlock;uint32_t bus_scaling_client; +bool enabled; +unsigned int num_phys_encs;struct dpu_encoder_phys *phys_encs[MAX_PHYS_ENCODERS_PER_VIRTUAL ];struct dpu_encoder_phys *cur_master;@@ -1121,6 +1124,8 @@ static void dpu_encoder_virt_enable(struct drm_encoder *drm_enc) return; } dpu_enc =to_dpu_encoder_virt (drm_enc); + +mutex_lock (&dpu_enc->enc_lock); cur_mode = &dpu_enc->base.crtc->state->adjusted_mode;drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +6
-1trace_dpu_enc_enable(DRMID(drm_enc), cur_mode->hdisplay,@@ -1137,10 +1142,15 @@ static void dpu_encoder_virt_enable(struct drm_encoder *drm_enc) if (ret) { DPU_ERROR_ENC(dpu_enc, "dpu resource control failed: %d\n", ret); -return ; + goto out; }_dpu_encoder_virt_enable_helper (drm_enc); + + dpu_enc->enabled = true; + +out: +mutex_unlock (&dpu_enc->enc_lock); }static void
dpu_encoder_virt_disable(struct drm_encoder *drm_enc)drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +7
-2@@ -1162,11 +1172,14 @@ static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc) return; } - mode = &drm_enc->crtc->state->adjusted_mode; - dpu_enc =to_dpu_encoder_virt (drm_enc);DPU_DEBUG_ENC (dpu_enc,"\n" ); +mutex_lock (&dpu_enc->enc_lock); + dpu_enc->enabled = false; + + mode = &drm_enc->crtc->state->adjusted_mode; + priv = drm_enc->dev->dev_private; dpu_kms =to_dpu_kms (priv->kms);@@ -1200,6 +1213,8 @@ static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc) DPU_DEBUG_ENC(dpu_enc, "encoder disabled\n");dpu_rm_release (&dpu_kms->rm, drm_enc); + +mutex_unlock (&dpu_enc->enc_lock); }static enum
dpu_intfdpu_encoder_get_intf(structdpu_mdss_cfg
*catalog,drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +2
-0@@ -2233,6 +2248,8 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,drm_encoder_helper_add (&dpu_enc->base, &dpu_encoder_helper_funcs); + dpu_enc->enabled = false; +return &dpu_enc->base; }
Signature · 5 lines
Jeykumar S _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Sean Paul
reviewerPATCH v2 19/24 drm/msm: dpu: Remove vblank_callback from encoder
In reply to Sean PaulFrom: Sean Paul <[email protected]>
The indirection of registering a callback and opaque pointer isn't reall useful when there's only one callsite. So instead of having the vblank_cb registration, just give encoder a crtc and let it directly call the vblank handler.
In a later patch, we'll make use of this further.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 8 +++---- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 6 +++++ drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 25 +++++++++++---------- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 10 ++++----- 4 files changed, 26 insertions(+), 23 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3 -5
@@ -293,9 +293,8 @@ enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)return INTF_MODE_NONE ; } -static void dpu_crtc_vblank_cb (void *data) +void dpu_crtc_vblank_callback (struct drm_crtc *crtc) { -struct drm_crtc *crtc = (struct drm_crtc *)data;struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);/* keep statistics on vblank callback - with auto reset via debugfs */
@@ -771,8 +770,7 @@ static void _dpu_crtc_vblank_enable_no_lock(DRMID (enc), enable, dpu_crtc); -dpu_encoder_register_vblank_callback (enc, - dpu_crtc_vblank_cb, (void *)crtc); +dpu_encoder_assign_crtc (enc, crtc); } }else {list_for_each_entry (enc, &dev->mode_config.encoder_list, head) {
@@ -783,7 +781,7 @@ static void _dpu_crtc_vblank_enable_no_lock(DRMID (enc), enable, dpu_crtc); -dpu_encoder_register_vblank_callback (enc,NULL ,NULL ); +dpu_encoder_assign_crtc (enc,NULL ); } } }
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +6 -0
@@ -270,6 +270,12 @@ static inline int dpu_crtc_frame_pending(struct drm_crtc *crtc)*/ int dpu_crtc_vblank (struct drm_crtc *crtc,bool en); +/** +* dpu_crtc_vblank_callback - called on vblank irq, issues completion events +* @crtc: Pointer to drm crtc object +*/ +void dpu_crtc_vblank_callback (struct drm_crtc *crtc); +/** * dpu_crtc_commit_kickoff - trigger kickoff of the commit for this crtc * @crtc: Pointer to drm crtc object
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +13 -12
@@ -142,9 +142,11 @@ enum dpu_enc_rc_states {* @intfs_swapped Whether or not the phys_enc interfaces have been swapped * for partial update right-only cases, such as pingpong * split where virtual pingpong does not generate IRQs -* @crtc_vblank_cb: Callback into the upper layer / CRTC for -* notification of the VBLANK -* @crtc_vblank_cb_data: Data from upper layer for VBLANK notification +* @crtc: Pointer to the currently assigned crtc. Normally you +* would use crtc->state->encoder_mask to determine the +* link between encoder/crtc. However in this case we need +* to track crtc in the disable() hook which is called +* _after_ encoder_mask is cleared. * @crtc_kickoff_cb: Callback into CRTC that will flush & start * all CTL paths * @crtc_kickoff_cb_data: Opaque user data given to crtc_kickoff_cb
@@ -186,8 +188,7 @@ struct dpu_encoder_virt {bool intfs_swapped; -void (*crtc_vblank_cb)(void *); -void *crtc_vblank_cb_data; +struct drm_crtc *crtc;struct dentry *debugfs_root;struct mutex enc_lock;
@@ -1241,8 +1242,8 @@ static void dpu_encoder_vblank_callback(struct drm_encoder *drm_enc, dpu_enc =to_dpu_encoder_virt (drm_enc);spin_lock_irqsave (&dpu_enc->enc_spinlock, lock_flags); -if (dpu_enc->crtc_vblank_cb) - dpu_enc->crtc_vblank_cb (dpu_enc->crtc_vblank_cb_data); +if (dpu_enc->crtc) +dpu_crtc_vblank_callback (dpu_enc->crtc);spin_unlock_irqrestore (&dpu_enc->enc_spinlock, lock_flags);atomic_inc (&phy_enc->vsync_cnt);
@@ -1262,15 +1263,14 @@ static void dpu_encoder_underrun_callback(struct drm_encoder *drm_enc,DPU_ATRACE_END ("encoder_underrun_callback" ); } -void dpu_encoder_register_vblank_callback (struct drm_encoder *drm_enc, -void (*vbl_cb)(void *),void *vbl_data) +void dpu_encoder_assign_crtc (struct drm_encoder *drm_enc,struct drm_crtc *crtc) {struct dpu_encoder_virt *dpu_enc =to_dpu_encoder_virt (drm_enc);unsigned long lock_flags;bool enable;int i; - enable = vbl_cb ? true : false; + enable = crtc ? true : false;if (!drm_enc) {DPU_ERROR ("invalid encoder\n" );
@@ -1279,8 +1279,9 @@ void dpu_encoder_register_vblank_callback(struct drm_encoder *drm_enc,trace_dpu_enc_vblank_cb (DRMID (drm_enc), enable);spin_lock_irqsave (&dpu_enc->enc_spinlock, lock_flags); - dpu_enc->crtc_vblank_cb = vbl_cb; - dpu_enc->crtc_vblank_cb_data = vbl_data; +/* crtc should always be cleared before re-assigning */ +WARN_ON (crtc && dpu_enc->crtc); + dpu_enc->crtc = crtc;spin_unlock_irqrestore (&dpu_enc->enc_spinlock, lock_flags);for (i =0 ; i < dpu_enc->num_phys_encs; i++) {
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h +4 -6
@@ -55,14 +55,12 @@ void dpu_encoder_get_hw_resources(struct drm_encoder *encoder, struct dpu_encoder_hw_resources *hw_res);/** -* dpu_encoder_register_vblank_callback - provide callback to encoder that -* will be called on the next vblank. +* dpu_encoder_assign_crtc - Link the encoder to the crtc it's assigned to * @encoder: encoder pointer -* @cb: callback pointer, provide NULL to deregister and disable IRQs -* @data: user data provided to callback +* @crtc: crtc pointer */ -void dpu_encoder_register_vblank_callback (struct drm_encoder *encoder, -void (*cb)(void *),void *data); +void dpu_encoder_assign_crtc (struct drm_encoder *encoder, +struct drm_crtc *crtc);/** * dpu_encoder_register_frame_event_callback - provide callback to encoder that
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-20-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Jeykumar Sankaran
Reviewed-byRe: [PATCH v2 19/24] drm/msm: dpu: Remove vblank_callback from encoder
Quoted 7 lines · Sean Paul
From: Sean Paul <[email protected]>
The indirection of registering a callback and opaque pointer isn't reall useful when there's only one callsite. So instead of having the
vblank_cbregistration, just give encoder a crtc and let it directly call the vblank handler.
Quoted 7 lines
In a later patch, we'll make use of this further.
Changes in v2:
- NoneCc Jeykumar Sankaran <[email protected]>Signed-off-by Sean Paul <[email protected]>
Quoted 184 lines
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 8 +++---- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 6 +++++ drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 25 +++++++++++---------- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 10 ++++----- 4 files changed, 26 insertions(+), 23 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-2@@ -293,9 +293,8 @@ enum dpu_intf_mode dpu_crtc_get_intf_mode(struct drm_crtc *crtc)return INTF_MODE_NONE ; } -static void dpu_crtc_vblank_cb (void *data) +void dpu_crtc_vblank_callback (struct drm_crtc *crtc) { -struct drm_crtc *crtc = (struct drm_crtc *)data;struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc);/* keep statistics on vblank callback - with auto reset via
debugfs */drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-2@@ -771,8 +770,7 @@ static void _dpu_crtc_vblank_enable_no_lock(DRMID (enc), enable, dpu_crtc); -dpu_encoder_register_vblank_callback (enc, - dpu_crtc_vblank_cb, (void *)crtc); +dpu_encoder_assign_crtc (enc, crtc); } }else { list_for_each_entry(enc, &dev->mode_config.encoder_list,head) {
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-1@@ -783,7 +781,7 @@ static void _dpu_crtc_vblank_enable_no_lock(DRMID (enc), enable, dpu_crtc); -dpu_encoder_register_vblank_callback (enc,NULL , NULL); +dpu_encoder_assign_crtc (enc,NULL ); } }}
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +2
-0@@ -270,6 +270,12 @@ static inline int dpu_crtc_frame_pending(structdrm_crtc *crtc) */ int dpu_crtc_vblank (struct drm_crtc *crtc,bool en); +/** +* dpu_crtc_vblank_callback - called on vblank irq, issues completion events
+ * @crtc: Pointer to drm crtc object
+ */drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +2
-0+void dpu_crtc_vblank_callback (struct drm_crtc *crtc); +/** * dpu_crtc_commit_kickoff - trigger kickoff of the commit for this crtc
* @crtc: Pointer to drm crtc objectdrivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +0
-0@@ -142,9 +142,11 @@ enum dpu_enc_rc_states {* @intfs_swapped Whether or not the phys_enc interfaces have been swapped
* for partial update right-only cases, such as
pingpong
* split where virtual pingpong does not generate
IRQs
- * @crtc_vblank_cb: Callback into the upper layer / CRTC for
- * notification of the VBLANK
- * @crtc_vblank_cb_data: Data from upper layer for VBLANK
notification
+ * @crtc: Pointer to the currently assigned crtc. Normally
you
+ * would usecrtc->state->encoder_maskto determine
the
+ * link between encoder/crtc. However in this case we
need
+ * to track crtc in thedisable()hook which is
called
+ * _after_encoder_maskis cleared.
* @crtc_kickoff_cb: Callback into CRTC that will flush & start
* all CTL paths
* @crtc_kickoff_cb_data: Opaque user data given tocrtc_kickoff_cbdrivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +3
-4@@ -186,8 +188,7 @@ struct dpu_encoder_virt {bool intfs_swapped; -void (*crtc_vblank_cb)(void *); -void *crtc_vblank_cb_data; +struct drm_crtc *crtc;struct dentry *debugfs_root;struct mutex enc_lock;@@ -1241,8 +1242,8 @@ static void dpu_encoder_vblank_callback(structdrm_encoder *drm_enc, dpu_enc =to_dpu_encoder_virt (drm_enc);spin_lock_irqsave (&dpu_enc->enc_spinlock, lock_flags); -if (dpu_enc->crtc_vblank_cb) - dpu_enc->crtc_vblank_cb (dpu_enc->crtc_vblank_cb_data); +if (dpu_enc->crtc) +dpu_crtc_vblank_callback (dpu_enc->crtc);spin_unlock_irqrestore (&dpu_enc->enc_spinlock, lock_flags);drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +0
-0atomic_inc (&phy_enc->vsync_cnt);@@ -1262,15 +1263,14 @@ static voiddpu_encoder_underrun_callback(struct
drm_encoder*drm_enc,drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +1
-2DPU_ATRACE_END ("encoder_underrun_callback" ); } -void dpu_encoder_register_vblank_callback (struct drm_encoder *drm_enc, -void (*vbl_cb)(void *),void *vbl_data) +void dpu_encoder_assign_crtc(struct drm_encoder *drm_enc, struct
drm_crtc
*crtc)
{drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +4
-3struct dpu_encoder_virt *dpu_enc =to_dpu_encoder_virt (drm_enc);unsigned long lock_flags;bool enable;int i; - enable = vbl_cb ? true : false; + enable = crtc ? true : false;if (!drm_enc) {DPU_ERROR ("invalid encoder\n" );@@ -1279,8 +1279,9 @@ void dpu_encoder_register_vblank_callback(structdrm_encoder *drm_enc,trace_dpu_enc_vblank_cb (DRMID (drm_enc ),enable );spin_lock_irqsave (&dpu_enc->enc_spinlock, lock_flags); - dpu_enc->crtc_vblank_cb = vbl_cb; - dpu_enc->crtc_vblank_cb_data = vbl_data; +/* crtc should always be cleared before re-assigning */ +WARN_ON (crtc && dpu_enc->crtc); + dpu_enc->crtc = crtc;spin_unlock_irqrestore (&dpu_enc->enc_spinlock, lock_flags);drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +0
-0for (i =0 ; i < dpu_enc->num_phys_encs; i++) {drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h +0
-0@@ -55,14 +55,12 @@ void dpu_encoder_get_hw_resources(struct
drm_encoder
*encoder,
structdpu_encoder_hw_resources*hw_res);/**
- *dpu_encoder_register_vblank_callback- provide callback to encoder that
- * will be called on the next vblank.
+ *dpu_encoder_assign_crtc- Link the encoder to the crtc it's assigned
to
* @encoder: encoder pointer
- * @cb: callback pointer, provide NULL to deregister and
disable IRQs
- * @data: user data provided to callback
+ * @crtc: crtc pointer
*/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h +2
-2-void dpu_encoder_register_vblank_callback (struct drm_encoder *encoder, -void (*cb)(void *),void *data); +void dpu_encoder_assign_crtc (struct drm_encoder *encoder, +struct drm_crtc *crtc);/** * dpu_encoder_register_frame_event_callback - provide callback to encoder that
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Sean Paul
reviewerPATCH v2 22/24 drm/msm: dpu: Separate crtc assignment from vblank enable
In reply to Sean PaulFrom: Sean Paul <[email protected]>
Instead of assigning/clearing the crtc on vblank enable/disable, we can just assign and clear the crtc on modeset. That allows us to just toggle the encoder's vblank interrupts on vblank_enable.
So why is this important? Previously the driver was using the legacy pointers to assign/clear the crtc. Legacy pointers are cleared _after_ disabling the hardware, so the legacy pointer was valid during vblank_disable, but that's not something we should rely on.
Instead of relying on the core ordering the legacy pointer assignments just so, we'll assign the crtc in dpu_crtc enable/disable. This is the only place that mapping can change, so we're covered there.
We're also taking advantage of drm_crtc_vblank_on/off. By using this, we ensure that vblank_enable/disable can never be called while the crtc is off (which means the assigned crtc will always be valid). As such, we don't need to use modeset locks or the crtc_lock in the vblank_enable/disable routine to be sure state is consistent.
...I think.
Changes in v2:
- Changed crtc check in toggle_vblank to != (Jeykumar)
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 77 +++++++++------------ drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 27 +++++--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 10 +++ 3 files changed, 59 insertions(+), 55 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +32 -45
@@ -749,43 +749,6 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)DPU_ATRACE_END ("crtc_commit" ); } -/** -* _dpu_crtc_vblank_enable_no_lock - update power resource and vblank request -* @dpu_crtc: Pointer to dpu crtc structure -* @enable: Whether to enable/disable vblanks -*/ -static void _dpu_crtc_vblank_enable_no_lock ( -struct dpu_crtc *dpu_crtc,bool enable) -{ -struct drm_crtc *crtc = &dpu_crtc->base; -struct drm_device *dev = crtc->dev; -struct drm_encoder *enc; - -if (enable) { -list_for_each_entry (enc, &dev->mode_config.encoder_list, head) { -if (enc->crtc != crtc) -continue ; - -trace_dpu_crtc_vblank_enable (DRMID (&dpu_crtc->base), -DRMID (enc), enable, - dpu_crtc); - -dpu_encoder_assign_crtc (enc, crtc); - } - }else { -list_for_each_entry (enc, &dev->mode_config.encoder_list, head) { -if (enc->crtc != crtc) -continue ; - -trace_dpu_crtc_vblank_enable (DRMID (&dpu_crtc->base), -DRMID (enc), enable, - dpu_crtc); - -dpu_encoder_assign_crtc (enc,NULL ); - } - } -} -/** * dpu_crtc_duplicate_state - state duplicate hook * @crtc: Pointer to drm crtc structure
@@ -839,6 +802,10 @@ static void dpu_crtc_disable(struct drm_crtc *crtc,/* Disable/save vblank irq handling */ drm_crtc_vblank_off (crtc); +drm_for_each_encoder_mask (encoder, crtc->dev, + old_crtc_state->encoder_mask) +dpu_encoder_assign_crtc (encoder,NULL ); +mutex_lock (&dpu_crtc->crtc_lock);/* wait for frame_event_done completion */
@@ -848,9 +815,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, atomic_read(&dpu_crtc->frame_pending));trace_dpu_crtc_disable (DRMID (crtc), false, dpu_crtc); -if (dpu_crtc->enabled && dpu_crtc->vblank_requested) { -_dpu_crtc_vblank_enable_no_lock (dpu_crtc, false); - } dpu_crtc->enabled = false;if (atomic_read (&dpu_crtc->frame_pending)) {
@@ -908,13 +872,13 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,mutex_lock (&dpu_crtc->crtc_lock);trace_dpu_crtc_enable (DRMID (crtc), true, dpu_crtc); -if (!dpu_crtc->enabled && dpu_crtc->vblank_requested) { -_dpu_crtc_vblank_enable_no_lock (dpu_crtc, true); - } dpu_crtc->enabled = true;mutex_unlock (&dpu_crtc->crtc_lock); +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask) +dpu_encoder_assign_crtc (encoder, crtc); +/* Enable/restore vblank irq handling */ drm_crtc_vblank_on (crtc); }
@@ -1159,10 +1123,33 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,int dpu_crtc_vblank (struct drm_crtc *crtc,bool en) {struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc); +struct drm_encoder *enc; -mutex_lock (&dpu_crtc->crtc_lock);trace_dpu_crtc_vblank (DRMID (&dpu_crtc->base), en, dpu_crtc); -_dpu_crtc_vblank_enable_no_lock (dpu_crtc, en); + +/* +* Normally we would iterate through encoder_mask in crtc state to find +* attached encoders. In this case, we might be disabling vblank _after_ +* encoder_mask has been cleared. +* +* Instead, we "assign" a crtc to the encoder in enable and clear it in +* disable (which is also after encoder_mask is cleared). So instead of +* using encoder mask, we'll ask the encoder to toggle itself iff it's +* currently assigned to our crtc. +* +* Note also that this function cannot be called while crtc is disabled +* since we use drm_crtc_vblank_on/off. So we don't need to worry +* about the assigned crtcs being inconsistent with the current state +* (which means no need to worry about modeset locks). +*/ +list_for_each_entry (enc, &crtc->dev->mode_config.encoder_list, head) { +trace_dpu_crtc_vblank_enable (DRMID (crtc),DRMID (enc), en, + dpu_crtc); + +dpu_encoder_toggle_vblank_for_crtc (enc, crtc, en); + } + +mutex_lock (&dpu_crtc->crtc_lock); dpu_crtc->vblank_requested = en;mutex_unlock (&dpu_crtc->crtc_lock);
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +17 -10
@@ -1267,22 +1267,29 @@ void dpu_encoder_assign_crtc(struct drm_encoder *drm_enc, struct drm_crtc *crtc) {struct dpu_encoder_virt *dpu_enc =to_dpu_encoder_virt (drm_enc);unsigned long lock_flags; -bool enable; -int i; - - enable = crtc ? true : false; - -if (!drm_enc) { -DPU_ERROR ("invalid encoder\n" ); -return ; - } -trace_dpu_enc_vblank_cb (DRMID (drm_enc), enable);spin_lock_irqsave (&dpu_enc->enc_spinlock, lock_flags);/* crtc should always be cleared before re-assigning */ WARN_ON (crtc && dpu_enc->crtc); dpu_enc->crtc = crtc;spin_unlock_irqrestore (&dpu_enc->enc_spinlock, lock_flags); +} + +void dpu_encoder_toggle_vblank_for_crtc (struct drm_encoder *drm_enc, +struct drm_crtc *crtc,bool enable) +{ +struct dpu_encoder_virt *dpu_enc =to_dpu_encoder_virt (drm_enc); +unsigned long lock_flags; +int i; + +trace_dpu_enc_vblank_cb (DRMID (drm_enc), enable); + +spin_lock_irqsave (&dpu_enc->enc_spinlock, lock_flags); +if (dpu_enc->crtc != crtc) { +spin_unlock_irqrestore (&dpu_enc->enc_spinlock, lock_flags); +return ; + } +spin_unlock_irqrestore (&dpu_enc->enc_spinlock, lock_flags);for (i =0 ; i < dpu_enc->num_phys_encs; i++) {struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h +10 -0
@@ -62,6 +62,16 @@ void dpu_encoder_get_hw_resources(struct drm_encoder *encoder,void dpu_encoder_assign_crtc (struct drm_encoder *encoder,struct drm_crtc *crtc); +/** +* dpu_encoder_toggle_vblank_for_crtc - Toggles vblank interrupts on or off if +* the encoder is assigned to the given crtc +* @encoder: encoder pointer +* @crtc: crtc pointer +* @enable: true if vblank should be enabled +*/ +void dpu_encoder_toggle_vblank_for_crtc (struct drm_encoder *encoder, +struct drm_crtc *crtc,bool enable); +/** * dpu_encoder_register_frame_event_callback - provide callback to encoder that * will be called after the request is complete, or other events.
Signature · 6 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
A message that is not in the archive (sent off-list or not yet received): 20181116184238.170034-23-sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org
Jeykumar Sankaran
Reviewed-byRe: [PATCH v2 22/24] drm/msm: dpu: Separate crtc assignment from vblank enable
Quoted 21 lines · Sean Paul
From: Sean Paul <[email protected]>
Instead of assigning/clearing the crtc on vblank enable/disable, we can just assign and clear the crtc on modeset. That allows us to just toggle the encoder's vblank interrupts on
vblank_enable.So why is this important? Previously the driver was using the legacy pointers to assign/clear the crtc. Legacy pointers are cleared _after_ disabling the hardware, so the legacy pointer was valid during
vblank_disable, but that's not something we should rely on.Instead of relying on the core ordering the legacy pointer assignments just so, we'll assign the crtc in
dpu_crtcenable/disable. This is the only place that mapping can change, so we're covered there.We're also taking advantage of drm_crtc_vblank_on/off. By using this, we ensure that vblank_enable/disable can never be called while the crtc is off (which means the assigned crtc will always be valid). As such, we don't need to use modeset locks or the
crtc_lockin the vblank_enable/disable routine to be sure state is consistent.
Quoted 7 lines
...I think.
Changes in v2:
- Changed crtc check intoggle_vblankto != (Jeykumar)Cc Jeykumar Sankaran <[email protected]>Signed-off-by Sean Paul <[email protected]>
Quoted 223 lines
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 77 +++++++++------------ drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 27 +++++--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 10 +++ 3 files changed, 59 insertions(+), 55 deletions(-)drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-2@@ -749,43 +749,6 @@ void dpu_crtc_commit_kickoff(struct drm_crtc *crtc)DPU_ATRACE_END ("crtc_commit" ); } -/** -* _dpu_crtc_vblank_enable_no_lock - update power resource and vblank request
- * @dpu_crtc: Pointer to dpu crtc structure
- * @enable: Whether to enable/disable vblanks
- */drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-9-static void _dpu_crtc_vblank_enable_no_lock ( -struct dpu_crtc *dpu_crtc,bool enable) -{ -struct drm_crtc *crtc = &dpu_crtc->base; -struct drm_device *dev = crtc->dev; -struct drm_encoder *enc; - -if (enable) { - list_for_each_entry(enc, &dev->mode_config.encoder_list,head) {
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-4-if (enc->crtc != crtc) -continue ; - -trace_dpu_crtc_vblank_enable(DRMID(&dpu_crtc->base),
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-7-DRMID (enc), enable, - dpu_crtc); - -dpu_encoder_assign_crtc (enc, crtc); - } - }else { - list_for_each_entry(enc, &dev->mode_config.encoder_list,head) {
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-4-if (enc->crtc != crtc) -continue ; - -trace_dpu_crtc_vblank_enable(DRMID(&dpu_crtc->base),
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +4
-8-DRMID (enc), enable, - dpu_crtc); - -dpu_encoder_assign_crtc (enc,NULL ); - } - } -} -/** * dpu_crtc_duplicate_state - state duplicate hook * @crtc: Pointer to drm crtc structure @@ -839,6 +802,10 @@ static void dpu_crtc_disable(struct drm_crtc *crtc,/* Disable/save vblank irq handling */ drm_crtc_vblank_off (crtc); +drm_for_each_encoder_mask (encoder, crtc->dev, + old_crtc_state->encoder_mask) +dpu_encoder_assign_crtc (encoder,NULL ); +mutex_lock (&dpu_crtc->crtc_lock);drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3
-6/* wait for frame_event_done completion */ @@ -848,9 +815,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc, atomic_read(&dpu_crtc->frame_pending));trace_dpu_crtc_disable (DRMID (crtc), false, dpu_crtc); -if (dpu_crtc->enabled && dpu_crtc->vblank_requested) { -_dpu_crtc_vblank_enable_no_lock (dpu_crtc, false); - } dpu_crtc->enabled = false;if (atomic_read (&dpu_crtc->frame_pending)) {@@ -908,13 +872,13 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,mutex_lock (&dpu_crtc->crtc_lock);trace_dpu_crtc_enable (DRMID (crtc), true, dpu_crtc); -if (!dpu_crtc->enabled && dpu_crtc->vblank_requested) { -_dpu_crtc_vblank_enable_no_lock (dpu_crtc, true); - } dpu_crtc->enabled = true;mutex_unlock (&dpu_crtc->crtc_lock); +drm_for_each_encoder_mask (encoder, crtc->dev, crtc->state->encoder_mask) +dpu_encoder_assign_crtc (encoder, crtc); +/* Enable/restore vblank irq handling */ drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +0
-0drm_crtc_vblank_on (crtc); }@@ -1159,10 +1123,33 @@ static int dpu_crtc_atomic_check(struct
drm_crtc
*crtc,
intdpu_crtc_vblank(struct drm_crtc *crtc, bool en){drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +4
-2struct dpu_crtc *dpu_crtc =to_dpu_crtc (crtc); +struct drm_encoder *enc; -mutex_lock (&dpu_crtc->crtc_lock);trace_dpu_crtc_vblank (DRMID (&dpu_crtc->base), en, dpu_crtc); -_dpu_crtc_vblank_enable_no_lock (dpu_crtc, en); + +/* +* Normally we would iterate through encoder_mask in crtc state to find
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-0+* attached encoders. In this case, we might be disabling vblank _after_
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3
-0+* encoder_mask has been cleared. +* +* Instead, we "assign" a crtc to the encoder in enable and clear it in
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-0+* disable (which is also after encoder_mask is cleared). So instead of
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +1
-0+* using encoder mask, we'll ask the encoder to toggle itself iff it's
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3
-0+* currently assigned to our crtc. +* +* Note also that this function cannot be called while crtc is disabled
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +2
-0+* since we use drm_crtc_vblank_on/off. So we don't need to worry +* about the assigned crtcs being inconsistent with the current state
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3
-0+* (which means no need to worry about modeset locks). +*/ + list_for_each_entry(enc, &crtc->dev->mode_config.encoder_list,head) {
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +7
-0+trace_dpu_crtc_vblank_enable (DRMID (crtc),DRMID (enc), en, + dpu_crtc); + +dpu_encoder_toggle_vblank_for_crtc (enc, crtc, en); + } + +mutex_lock (&dpu_crtc->crtc_lock); dpu_crtc->vblank_requested = en;mutex_unlock (&dpu_crtc->crtc_lock);drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +17
-10@@ -1267,22 +1267,29 @@ void dpu_encoder_assign_crtc(struct drm_encoder *drm_enc, struct drm_crtc *crtc) {struct dpu_encoder_virt *dpu_enc =to_dpu_encoder_virt (drm_enc);unsigned long lock_flags; -bool enable; -int i; - - enable = crtc ? true : false; - -if (!drm_enc) { -DPU_ERROR ("invalid encoder\n" ); -return ; - } -trace_dpu_enc_vblank_cb (DRMID (drm_enc), enable);spin_lock_irqsave (&dpu_enc->enc_spinlock, lock_flags);/* crtc should always be cleared before re-assigning */ WARN_ON (crtc && dpu_enc->crtc); dpu_enc->crtc = crtc;spin_unlock_irqrestore (&dpu_enc->enc_spinlock, lock_flags); +} + +void dpu_encoder_toggle_vblank_for_crtc (struct drm_encoder *drm_enc, +struct drm_crtc *crtc,bool enable) +{ +struct dpu_encoder_virt *dpu_enc =to_dpu_encoder_virt (drm_enc); +unsigned long lock_flags; +int i; + +trace_dpu_enc_vblank_cb (DRMID (drm_enc), enable); + +spin_lock_irqsave (&dpu_enc->enc_spinlock, lock_flags); +if (dpu_enc->crtc != crtc) { +spin_unlock_irqrestore (&dpu_enc->enc_spinlock, lock_flags); +return ; + } +spin_unlock_irqrestore (&dpu_enc->enc_spinlock, lock_flags);drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +0
-0for (i =0 ; i < dpu_enc->num_phys_encs; i++) {struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h +2
-0@@ -62,6 +62,16 @@ void dpu_encoder_get_hw_resources(struct drm_encoder *encoder,void dpu_encoder_assign_crtc (struct drm_encoder *encoder,struct drm_crtc *crtc); +/** +* dpu_encoder_toggle_vblank_for_crtc - Toggles vblank interrupts on or
off if
+ * the encoder is assigned to the given crtc
+ * @encoder: encoder pointer
+ * @crtc: crtc pointer
+ * @enable: true if vblank should be enabled
+ */drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h +2
-0+void dpu_encoder_toggle_vblank_for_crtc (struct drm_encoder *encoder, + struct drm_crtc *crtc, boolenable);
+
/**
*dpu_encoder_register_frame_event_callback- provide callback to
encoder that
* will be called after the request is complete, or other events.
Signature · 5 lines
Jeykumar S _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Sean Paul
reviewerQuoted 9 lines · Sean Paul
From: Sean Paul <[email protected]>
This was originally 3 patchsets, but none have gotten full review, so I figured I'd package the v2's all up into one set so it's easier to track.
Set 1- https://lists.freedesktop.org/archives/dri-devel/2018-November/196170.html
Set 2- https://lists.freedesktop.org/archives/dri-devel/2018-November/196184.html
Set 3- https://lists.freedesktop.org/archives/dri-devel/2018-November/196276.html
Thanks for the reviews, I've pushed it to dpu-staging/for-next
Sean
Quoted 49 lines
Thanks,
SeanSean Paul (24):
drm/msm: dpu: Removedpu_power_handle_get_dbus_name()drm/msm: dpu: Remove unusedtrace_dpu_perf_update_bus()drm/msm: dpu: Removedpu_power_client
drm/msm: dpu: Don't usepower_eventforvbif_init_memtypesdrm/msm: dpu: Handle crtcpm_runtime_resume()directly drm/msm: dpu: Removepower_handlefromcore_perfdrm/msm: dpu: Includedpu_io_util.hdirectly indpu_kms.hdrm/msm: dpu: MoveDPU_POWER_HANDLE_DBUS_IDtocore_perfdrm/msm: dpu: Removedpu_power_handle
drm/msm: dpu: Fix typo indpu_encoder
drm/msm: dpu: Add ->enabled todpu_encoder_virtdrm/msm: dpu: Move crtc runtime resume to encoder drm/msm: dpu: Don't drop locks incrtc_vblank_enabledrm/msm: dpu: Grab the modeset locks inframe_eventdrm/msm: dpu: Stop usingencoder->crtcpointer drm/msm: dpu: Add modeset lock checks where applicable drm/msm: dpu: Movepm_runtime_(get|put)fromvblank_enabledrm/msm: dpu: Removecrtc_lockfromsetup_mixersdrm/msm: dpu: Removevblank_callbackfrom encoder drm/msm: dpu: Useatomic_disablefordpu_crtc_disabledrm/msm: dpu: Don't bother checking ->enabled indpu_crtc_vblankdrm/msm: dpu: Separate crtc assignment from vblank enable drm/msm: dpu: Removevblank_requestedflag fromdpu_crtcdrm/msm: dpu: Removecrtc_lockdrivers/gpu/drm/msm/Makefile | 1 - drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 37 ++- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h | 22 +- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 216 +++++----------- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 15 +- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 97 ++++--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 24 +- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 76 ++---- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 6 +- .../gpu/drm/msm/disp/dpu1/dpu_power_handle.c | 240 ------------------ .../gpu/drm/msm/disp/dpu1/dpu_power_handle.h | 217 ---------------- drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h | 43 +--- 12 files changed, 204 insertions(+), 790 deletions(-) delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.c delete mode 100644 drivers/gpu/drm/msm/disp/dpu1/dpu_power_handle.hSignature · 1 line
Sean Paul, Software Engineer, Google / Chromium OS
Signature · 5 lines
Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel