@@ -316,10 +316,9 @@ u32 intel_engine_context_size(struct intel_gt *gt, u8 class)
316316 * out in the wash.
317317 */
318318 cxt_size = intel_uncore_read (uncore , CXT_SIZE ) + 1 ;
319- drm_dbg (& gt -> i915 -> drm ,
320- "graphics_ver = %d CXT_SIZE = %d bytes [0x%08x]\n" ,
321- GRAPHICS_VER (gt -> i915 ), cxt_size * 64 ,
322- cxt_size - 1 );
319+ gt_dbg (gt , "graphics_ver = %d CXT_SIZE = %d bytes [0x%08x]\n" ,
320+ GRAPHICS_VER (gt -> i915 ), cxt_size * 64 ,
321+ cxt_size - 1 );
323322 return round_up (cxt_size * 64 , PAGE_SIZE );
324323 case 3 :
325324 case 2 :
@@ -788,16 +787,15 @@ static void engine_mask_apply_media_fuses(struct intel_gt *gt)
788787
789788 if (!(BIT (i ) & vdbox_mask )) {
790789 gt -> info .engine_mask &= ~BIT (_VCS (i ));
791- drm_dbg ( & i915 -> drm , "vcs%u fused off\n" , i );
790+ gt_dbg ( gt , "vcs%u fused off\n" , i );
792791 continue ;
793792 }
794793
795794 if (gen11_vdbox_has_sfc (gt , i , logical_vdbox , vdbox_mask ))
796795 gt -> info .vdbox_sfc_access |= BIT (i );
797796 logical_vdbox ++ ;
798797 }
799- drm_dbg (& i915 -> drm , "vdbox enable: %04x, instances: %04lx\n" ,
800- vdbox_mask , VDBOX_MASK (gt ));
798+ gt_dbg (gt , "vdbox enable: %04x, instances: %04lx\n" , vdbox_mask , VDBOX_MASK (gt ));
801799 GEM_BUG_ON (vdbox_mask != VDBOX_MASK (gt ));
802800
803801 for (i = 0 ; i < I915_MAX_VECS ; i ++ ) {
@@ -808,11 +806,10 @@ static void engine_mask_apply_media_fuses(struct intel_gt *gt)
808806
809807 if (!(BIT (i ) & vebox_mask )) {
810808 gt -> info .engine_mask &= ~BIT (_VECS (i ));
811- drm_dbg ( & i915 -> drm , "vecs%u fused off\n" , i );
809+ gt_dbg ( gt , "vecs%u fused off\n" , i );
812810 }
813811 }
814- drm_dbg (& i915 -> drm , "vebox enable: %04x, instances: %04lx\n" ,
815- vebox_mask , VEBOX_MASK (gt ));
812+ gt_dbg (gt , "vebox enable: %04x, instances: %04lx\n" , vebox_mask , VEBOX_MASK (gt ));
816813 GEM_BUG_ON (vebox_mask != VEBOX_MASK (gt ));
817814}
818815
@@ -838,7 +835,7 @@ static void engine_mask_apply_compute_fuses(struct intel_gt *gt)
838835 */
839836 for_each_clear_bit (i , & ccs_mask , I915_MAX_CCS ) {
840837 info -> engine_mask &= ~BIT (_CCS (i ));
841- drm_dbg ( & i915 -> drm , "ccs%u fused off\n" , i );
838+ gt_dbg ( gt , "ccs%u fused off\n" , i );
842839 }
843840}
844841
@@ -866,8 +863,8 @@ static void engine_mask_apply_copy_fuses(struct intel_gt *gt)
866863 _BCS (instance ));
867864
868865 if (mask & info -> engine_mask ) {
869- drm_dbg ( & i915 -> drm , "bcs%u fused off\n" , instance );
870- drm_dbg ( & i915 -> drm , "bcs%u fused off\n" , instance + 1 );
866+ gt_dbg ( gt , "bcs%u fused off\n" , instance );
867+ gt_dbg ( gt , "bcs%u fused off\n" , instance + 1 );
871868
872869 info -> engine_mask &= ~mask ;
873870 }
@@ -907,8 +904,7 @@ static intel_engine_mask_t init_engine_mask(struct intel_gt *gt)
907904 * submission, which will wake up the GSC power well.
908905 */
909906 if (__HAS_ENGINE (info -> engine_mask , GSC0 ) && !intel_uc_wants_gsc_uc (& gt -> uc )) {
910- drm_notice (& gt -> i915 -> drm ,
911- "No GSC FW selected, disabling GSC CS and media C6\n" );
907+ gt_notice (gt , "No GSC FW selected, disabling GSC CS and media C6\n" );
912908 info -> engine_mask &= ~BIT (GSC0 );
913909 }
914910
@@ -1097,8 +1093,7 @@ static int init_status_page(struct intel_engine_cs *engine)
10971093 */
10981094 obj = i915_gem_object_create_internal (engine -> i915 , PAGE_SIZE );
10991095 if (IS_ERR (obj )) {
1100- drm_err (& engine -> i915 -> drm ,
1101- "Failed to allocate status page\n" );
1096+ gt_err (engine -> gt , "Failed to allocate status page\n" );
11021097 return PTR_ERR (obj );
11031098 }
11041099
@@ -1418,6 +1413,20 @@ void intel_engine_destroy_pinned_context(struct intel_context *ce)
14181413 intel_context_put (ce );
14191414}
14201415
1416+ static struct intel_context *
1417+ create_ggtt_bind_context (struct intel_engine_cs * engine )
1418+ {
1419+ static struct lock_class_key kernel ;
1420+
1421+ /*
1422+ * MI_UPDATE_GTT can insert up to 511 PTE entries and there could be multiple
1423+ * bind requets at a time so get a bigger ring.
1424+ */
1425+ return intel_engine_create_pinned_context (engine , engine -> gt -> vm , SZ_512K ,
1426+ I915_GEM_HWS_GGTT_BIND_ADDR ,
1427+ & kernel , "ggtt_bind_context" );
1428+ }
1429+
14211430static struct intel_context *
14221431create_kernel_context (struct intel_engine_cs * engine )
14231432{
@@ -1441,7 +1450,7 @@ create_kernel_context(struct intel_engine_cs *engine)
14411450 */
14421451static int engine_init_common (struct intel_engine_cs * engine )
14431452{
1444- struct intel_context * ce ;
1453+ struct intel_context * ce , * bce = NULL ;
14451454 int ret ;
14461455
14471456 engine -> set_default_submission (engine );
@@ -1457,17 +1466,33 @@ static int engine_init_common(struct intel_engine_cs *engine)
14571466 ce = create_kernel_context (engine );
14581467 if (IS_ERR (ce ))
14591468 return PTR_ERR (ce );
1469+ /*
1470+ * Create a separate pinned context for GGTT update with blitter engine
1471+ * if a platform require such service. MI_UPDATE_GTT works on other
1472+ * engines as well but BCS should be less busy engine so pick that for
1473+ * GGTT updates.
1474+ */
1475+ if (i915_ggtt_require_binder (engine -> i915 ) && engine -> id == BCS0 ) {
1476+ bce = create_ggtt_bind_context (engine );
1477+ if (IS_ERR (bce )) {
1478+ ret = PTR_ERR (bce );
1479+ goto err_ce_context ;
1480+ }
1481+ }
14601482
14611483 ret = measure_breadcrumb_dw (ce );
14621484 if (ret < 0 )
1463- goto err_context ;
1485+ goto err_bce_context ;
14641486
14651487 engine -> emit_fini_breadcrumb_dw = ret ;
14661488 engine -> kernel_context = ce ;
1489+ engine -> bind_context = bce ;
14671490
14681491 return 0 ;
14691492
1470- err_context :
1493+ err_bce_context :
1494+ intel_engine_destroy_pinned_context (bce );
1495+ err_ce_context :
14711496 intel_engine_destroy_pinned_context (ce );
14721497 return ret ;
14731498}
@@ -1537,6 +1562,10 @@ void intel_engine_cleanup_common(struct intel_engine_cs *engine)
15371562 if (engine -> kernel_context )
15381563 intel_engine_destroy_pinned_context (engine -> kernel_context );
15391564
1565+ if (engine -> bind_context )
1566+ intel_engine_destroy_pinned_context (engine -> bind_context );
1567+
1568+
15401569 GEM_BUG_ON (!llist_empty (& engine -> barrier_tasks ));
15411570 cleanup_status_page (engine );
15421571
0 commit comments