* store it in the PPHSWP.
  */
 #define CONTEXT_ACTIVE 1ULL
-static void xe_lrc_setup_utilization(struct xe_lrc *lrc)
+static int xe_lrc_setup_utilization(struct xe_lrc *lrc)
 {
-       u32 *cmd;
+       u32 *cmd, *buf = NULL;
 
-       cmd = lrc->bb_per_ctx_bo->vmap.vaddr;
+       if (lrc->bb_per_ctx_bo->vmap.is_iomem) {
+               buf = kmalloc(lrc->bb_per_ctx_bo->size, GFP_KERNEL);
+               if (!buf)
+                       return -ENOMEM;
+               cmd = buf;
+       } else {
+               cmd = lrc->bb_per_ctx_bo->vmap.vaddr;
+       }
 
        *cmd++ = MI_STORE_REGISTER_MEM | MI_SRM_USE_GGTT | MI_SRM_ADD_CS_OFFSET;
        *cmd++ = ENGINE_ID(0).addr;
 
        *cmd++ = MI_BATCH_BUFFER_END;
 
+       if (buf) {
+               xe_map_memcpy_to(gt_to_xe(lrc->gt), &lrc->bb_per_ctx_bo->vmap, 0,
+                                buf, (cmd - buf) * sizeof(*cmd));
+               kfree(buf);
+       }
+
        xe_lrc_write_ctx_reg(lrc, CTX_BB_PER_CTX_PTR,
                             xe_bo_ggtt_addr(lrc->bb_per_ctx_bo) | 1);
 
+       return 0;
 }
 
 #define PVC_CTX_ASID           (0x2e + 1)
        map = __xe_lrc_start_seqno_map(lrc);
        xe_map_write32(lrc_to_xe(lrc), &map, lrc->fence_ctx.next_seqno - 1);
 
-       xe_lrc_setup_utilization(lrc);
+       err = xe_lrc_setup_utilization(lrc);
+       if (err)
+               goto err_lrc_finish;
 
        return 0;