@@ -941,11 +941,18 @@ static void xe_lrc_finish(struct xe_lrc *lrc)
941
941
* store it in the PPHSWP.
942
942
*/
943
943
#define CONTEXT_ACTIVE 1ULL
944
- static void xe_lrc_setup_utilization (struct xe_lrc * lrc )
944
+ static int xe_lrc_setup_utilization (struct xe_lrc * lrc )
945
945
{
946
- u32 * cmd ;
946
+ u32 * cmd , * buf = NULL ;
947
947
948
- cmd = lrc -> bb_per_ctx_bo -> vmap .vaddr ;
948
+ if (lrc -> bb_per_ctx_bo -> vmap .is_iomem ) {
949
+ buf = kmalloc (lrc -> bb_per_ctx_bo -> size , GFP_KERNEL );
950
+ if (!buf )
951
+ return - ENOMEM ;
952
+ cmd = buf ;
953
+ } else {
954
+ cmd = lrc -> bb_per_ctx_bo -> vmap .vaddr ;
955
+ }
949
956
950
957
* cmd ++ = MI_STORE_REGISTER_MEM | MI_SRM_USE_GGTT | MI_SRM_ADD_CS_OFFSET ;
951
958
* cmd ++ = ENGINE_ID (0 ).addr ;
@@ -966,9 +973,16 @@ static void xe_lrc_setup_utilization(struct xe_lrc *lrc)
966
973
967
974
* cmd ++ = MI_BATCH_BUFFER_END ;
968
975
976
+ if (buf ) {
977
+ xe_map_memcpy_to (gt_to_xe (lrc -> gt ), & lrc -> bb_per_ctx_bo -> vmap , 0 ,
978
+ buf , (cmd - buf ) * sizeof (* cmd ));
979
+ kfree (buf );
980
+ }
981
+
969
982
xe_lrc_write_ctx_reg (lrc , CTX_BB_PER_CTX_PTR ,
970
983
xe_bo_ggtt_addr (lrc -> bb_per_ctx_bo ) | 1 );
971
984
985
+ return 0 ;
972
986
}
973
987
974
988
#define PVC_CTX_ASID (0x2e + 1)
@@ -1125,7 +1139,9 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe,
1125
1139
map = __xe_lrc_start_seqno_map (lrc );
1126
1140
xe_map_write32 (lrc_to_xe (lrc ), & map , lrc -> fence_ctx .next_seqno - 1 );
1127
1141
1128
- xe_lrc_setup_utilization (lrc );
1142
+ err = xe_lrc_setup_utilization (lrc );
1143
+ if (err )
1144
+ goto err_lrc_finish ;
1129
1145
1130
1146
return 0 ;
1131
1147
0 commit comments