@@ -1326,7 +1326,7 @@ static void dpu_encoder_virt_atomic_disable(struct drm_encoder *drm_enc,
1326
1326
trace_dpu_enc_disable (DRMID (drm_enc ));
1327
1327
1328
1328
/* wait for idle */
1329
- dpu_encoder_wait_for_event (drm_enc , MSM_ENC_TX_COMPLETE );
1329
+ dpu_encoder_wait_for_tx_complete (drm_enc );
1330
1330
1331
1331
dpu_encoder_resource_control (drm_enc , DPU_ENC_RC_EVENT_PRE_STOP );
1332
1332
@@ -2524,10 +2524,18 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
2524
2524
return & dpu_enc -> base ;
2525
2525
}
2526
2526
2527
- int dpu_encoder_wait_for_event (struct drm_encoder * drm_enc ,
2528
- enum msm_event_wait event )
2527
+ /**
2528
+ * dpu_encoder_wait_for_commit_done() - Wait for encoder to flush pending state
2529
+ * @drm_enc: encoder pointer
2530
+ *
2531
+ * Wait for hardware to have flushed the current pending changes to hardware at
2532
+ * a vblank or CTL_START. Physical encoders will map this differently depending
2533
+ * on the type: vid mode -> vsync_irq, cmd mode -> CTL_START.
2534
+ *
2535
+ * Return: 0 on success, -EWOULDBLOCK if already signaled, error otherwise
2536
+ */
2537
+ int dpu_encoder_wait_for_commit_done (struct drm_encoder * drm_enc )
2529
2538
{
2530
- int (* fn_wait )(struct dpu_encoder_phys * phys_enc ) = NULL ;
2531
2539
struct dpu_encoder_virt * dpu_enc = NULL ;
2532
2540
int i , ret = 0 ;
2533
2541
@@ -2541,23 +2549,47 @@ int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
2541
2549
for (i = 0 ; i < dpu_enc -> num_phys_encs ; i ++ ) {
2542
2550
struct dpu_encoder_phys * phys = dpu_enc -> phys_encs [i ];
2543
2551
2544
- switch (event ) {
2545
- case MSM_ENC_COMMIT_DONE :
2546
- fn_wait = phys -> ops .wait_for_commit_done ;
2547
- break ;
2548
- case MSM_ENC_TX_COMPLETE :
2549
- fn_wait = phys -> ops .wait_for_tx_complete ;
2550
- break ;
2551
- default :
2552
- DPU_ERROR_ENC (dpu_enc , "unknown wait event %d\n" ,
2553
- event );
2554
- return - EINVAL ;
2552
+ if (phys -> ops .wait_for_commit_done ) {
2553
+ DPU_ATRACE_BEGIN ("wait_for_commit_done" );
2554
+ ret = phys -> ops .wait_for_commit_done (phys );
2555
+ DPU_ATRACE_END ("wait_for_commit_done" );
2556
+ if (ret )
2557
+ return ret ;
2555
2558
}
2559
+ }
2560
+
2561
+ return ret ;
2562
+ }
2563
+
2564
+ /**
2565
+ * dpu_encoder_wait_for_tx_complete() - Wait for encoder to transfer pixels to panel
2566
+ * @drm_enc: encoder pointer
2567
+ *
2568
+ * Wait for the hardware to transfer all the pixels to the panel. Physical
2569
+ * encoders will map this differently depending on the type: vid mode -> vsync_irq,
2570
+ * cmd mode -> pp_done.
2571
+ *
2572
+ * Return: 0 on success, -EWOULDBLOCK if already signaled, error otherwise
2573
+ */
2574
+ int dpu_encoder_wait_for_tx_complete (struct drm_encoder * drm_enc )
2575
+ {
2576
+ struct dpu_encoder_virt * dpu_enc = NULL ;
2577
+ int i , ret = 0 ;
2578
+
2579
+ if (!drm_enc ) {
2580
+ DPU_ERROR ("invalid encoder\n" );
2581
+ return - EINVAL ;
2582
+ }
2583
+ dpu_enc = to_dpu_encoder_virt (drm_enc );
2584
+ DPU_DEBUG_ENC (dpu_enc , "\n" );
2585
+
2586
+ for (i = 0 ; i < dpu_enc -> num_phys_encs ; i ++ ) {
2587
+ struct dpu_encoder_phys * phys = dpu_enc -> phys_encs [i ];
2556
2588
2557
- if (fn_wait ) {
2558
- DPU_ATRACE_BEGIN ("wait_for_completion_event " );
2559
- ret = fn_wait (phys );
2560
- DPU_ATRACE_END ("wait_for_completion_event " );
2589
+ if (phys -> ops . wait_for_tx_complete ) {
2590
+ DPU_ATRACE_BEGIN ("wait_for_tx_complete " );
2591
+ ret = phys -> ops . wait_for_tx_complete (phys );
2592
+ DPU_ATRACE_END ("wait_for_tx_complete " );
2561
2593
if (ret )
2562
2594
return ret ;
2563
2595
}
0 commit comments