@@ -389,7 +389,7 @@ disable_all_flip_queue_events(struct drm_i915_private *i915)
389
389
enum intel_dmc_id dmc_id ;
390
390
391
391
/* TODO: check if the following applies to all D13+ platforms. */
392
- if (!IS_DG2 ( i915 ) && ! IS_TIGERLAKE (i915 ))
392
+ if (!IS_TIGERLAKE (i915 ))
393
393
return ;
394
394
395
395
for_each_dmc_id (dmc_id ) {
@@ -493,6 +493,45 @@ void intel_dmc_disable_pipe(struct drm_i915_private *i915, enum pipe pipe)
493
493
intel_de_rmw (i915 , PIPEDMC_CONTROL (pipe ), PIPEDMC_ENABLE , 0 );
494
494
}
495
495
496
+ static bool is_dmc_evt_ctl_reg (struct drm_i915_private * i915 ,
497
+ enum intel_dmc_id dmc_id , i915_reg_t reg )
498
+ {
499
+ u32 offset = i915_mmio_reg_offset (reg );
500
+ u32 start = i915_mmio_reg_offset (DMC_EVT_CTL (i915 , dmc_id , 0 ));
501
+ u32 end = i915_mmio_reg_offset (DMC_EVT_CTL (i915 , dmc_id , DMC_EVENT_HANDLER_COUNT_GEN12 ));
502
+
503
+ return offset >= start && offset < end ;
504
+ }
505
+
506
+ static bool disable_dmc_evt (struct drm_i915_private * i915 ,
507
+ enum intel_dmc_id dmc_id ,
508
+ i915_reg_t reg , u32 data )
509
+ {
510
+ if (!is_dmc_evt_ctl_reg (i915 , dmc_id , reg ))
511
+ return false;
512
+
513
+ /* keep all pipe DMC events disabled by default */
514
+ if (dmc_id != DMC_FW_MAIN )
515
+ return true;
516
+
517
+ return false;
518
+ }
519
+
520
+ static u32 dmc_mmiodata (struct drm_i915_private * i915 ,
521
+ struct intel_dmc * dmc ,
522
+ enum intel_dmc_id dmc_id , int i )
523
+ {
524
+ if (disable_dmc_evt (i915 , dmc_id ,
525
+ dmc -> dmc_info [dmc_id ].mmioaddr [i ],
526
+ dmc -> dmc_info [dmc_id ].mmiodata [i ]))
527
+ return REG_FIELD_PREP (DMC_EVT_CTL_TYPE_MASK ,
528
+ DMC_EVT_CTL_TYPE_EDGE_0_1 ) |
529
+ REG_FIELD_PREP (DMC_EVT_CTL_EVENT_ID_MASK ,
530
+ DMC_EVT_CTL_EVENT_ID_FALSE );
531
+ else
532
+ return dmc -> dmc_info [dmc_id ].mmiodata [i ];
533
+ }
534
+
496
535
/**
497
536
* intel_dmc_load_program() - write the firmware from memory to register.
498
537
* @i915: i915 drm device.
@@ -532,7 +571,7 @@ void intel_dmc_load_program(struct drm_i915_private *i915)
532
571
for_each_dmc_id (dmc_id ) {
533
572
for (i = 0 ; i < dmc -> dmc_info [dmc_id ].mmio_count ; i ++ ) {
534
573
intel_de_write (i915 , dmc -> dmc_info [dmc_id ].mmioaddr [i ],
535
- dmc -> dmc_info [ dmc_id ]. mmiodata [ i ] );
574
+ dmc_mmiodata ( i915 , dmc , dmc_id , i ) );
536
575
}
537
576
}
538
577
0 commit comments