Lines Matching defs:lrc

53 lrc_to_xe(struct xe_lrc *lrc)
55 return gt_to_xe(lrc->fence_ctx.gt);
592 static inline u32 __xe_lrc_ring_offset(struct xe_lrc *lrc)
597 u32 xe_lrc_pphwsp_offset(struct xe_lrc *lrc)
599 return lrc->ring.size;
623 static inline u32 __xe_lrc_seqno_offset(struct xe_lrc *lrc)
626 return xe_lrc_pphwsp_offset(lrc) + LRC_SEQNO_PPHWSP_OFFSET;
629 static inline u32 __xe_lrc_start_seqno_offset(struct xe_lrc *lrc)
632 return xe_lrc_pphwsp_offset(lrc) + LRC_START_SEQNO_PPHWSP_OFFSET;
635 static inline u32 __xe_lrc_parallel_offset(struct xe_lrc *lrc)
638 return xe_lrc_pphwsp_offset(lrc) + LRC_PARALLEL_PPHWSP_OFFSET;
641 static inline u32 __xe_lrc_regs_offset(struct xe_lrc *lrc)
643 return xe_lrc_pphwsp_offset(lrc) + LRC_PPHWSP_SIZE;
647 static inline struct iosys_map __xe_lrc_##elem##_map(struct xe_lrc *lrc) \
649 struct iosys_map map = lrc->bo->vmap; \
651 xe_assert(lrc_to_xe(lrc), !iosys_map_is_null(&map)); \
652 iosys_map_incr(&map, __xe_lrc_##elem##_offset(lrc)); \
655 static inline u32 __maybe_unused __xe_lrc_##elem##_ggtt_addr(struct xe_lrc *lrc) \
657 return xe_bo_ggtt_addr(lrc->bo) + __xe_lrc_##elem##_offset(lrc); \
669 u32 xe_lrc_ggtt_addr(struct xe_lrc *lrc)
671 return __xe_lrc_pphwsp_ggtt_addr(lrc);
674 u32 xe_lrc_read_ctx_reg(struct xe_lrc *lrc, int reg_nr)
676 struct xe_device *xe = lrc_to_xe(lrc);
679 map = __xe_lrc_regs_map(lrc);
684 void xe_lrc_write_ctx_reg(struct xe_lrc *lrc, int reg_nr, u32 val)
686 struct xe_device *xe = lrc_to_xe(lrc);
689 map = __xe_lrc_regs_map(lrc);
714 static void xe_lrc_set_ppgtt(struct xe_lrc *lrc, struct xe_vm *vm)
716 u64 desc = xe_vm_pdp4_descriptor(vm, lrc->tile);
718 xe_lrc_write_ctx_reg(lrc, CTX_PDP0_UDW, upper_32_bits(desc));
719 xe_lrc_write_ctx_reg(lrc, CTX_PDP0_LDW, lower_32_bits(desc));
725 int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe,
736 lrc->flags = 0;
742 lrc->bo = xe_bo_create_pin_map(xe, tile, vm,
748 if (IS_ERR(lrc->bo))
749 return PTR_ERR(lrc->bo);
751 lrc->tile = gt_to_tile(hwe->gt);
752 lrc->ring.size = ring_size;
753 lrc->ring.tail = 0;
755 xe_hw_fence_ctx_init(&lrc->fence_ctx, hwe->gt,
770 map = __xe_lrc_pphwsp_map(lrc);
783 xe_lrc_set_ppgtt(lrc, vm);
786 xe_drm_client_add_bo(vm->xef->client, lrc->bo);
789 xe_lrc_write_ctx_reg(lrc, CTX_RING_START, __xe_lrc_ring_ggtt_addr(lrc));
790 xe_lrc_write_ctx_reg(lrc, CTX_RING_HEAD, 0);
791 xe_lrc_write_ctx_reg(lrc, CTX_RING_TAIL, lrc->ring.tail);
792 xe_lrc_write_ctx_reg(lrc, CTX_RING_CTL,
793 RING_CTL_SIZE(lrc->ring.size) | RING_VALID);
795 xe_lrc_write_ctx_reg(lrc, PVC_CTX_ASID, vm->usm.asid);
797 lrc->desc = LRC_VALID;
798 lrc->desc |= FIELD_PREP(LRC_ADDRESSING_MODE, LRC_LEGACY_64B_CONTEXT);
805 lrc->desc |= LRC_PRIVILEGE;
808 lrc->desc |= FIELD_PREP(LRC_ENGINE_INSTANCE, hwe->instance);
809 lrc->desc |= FIELD_PREP(LRC_ENGINE_CLASS, hwe->class);
813 xe_lrc_write_ring(lrc, &arb_enable, sizeof(arb_enable));
815 map = __xe_lrc_seqno_map(lrc);
816 xe_map_write32(lrc_to_xe(lrc), &map, lrc->fence_ctx.next_seqno - 1);
818 map = __xe_lrc_start_seqno_map(lrc);
819 xe_map_write32(lrc_to_xe(lrc), &map, lrc->fence_ctx.next_seqno - 1);
824 xe_lrc_finish(lrc);
828 void xe_lrc_finish(struct xe_lrc *lrc)
830 xe_hw_fence_ctx_finish(&lrc->fence_ctx);
831 xe_bo_lock(lrc->bo, false);
832 xe_bo_unpin(lrc->bo);
833 xe_bo_unlock(lrc->bo);
834 xe_bo_put(lrc->bo);
837 void xe_lrc_set_ring_head(struct xe_lrc *lrc, u32 head)
839 xe_lrc_write_ctx_reg(lrc, CTX_RING_HEAD, head);
842 u32 xe_lrc_ring_head(struct xe_lrc *lrc)
844 return xe_lrc_read_ctx_reg(lrc, CTX_RING_HEAD) & HEAD_ADDR;
847 u32 xe_lrc_ring_space(struct xe_lrc *lrc)
849 const u32 head = xe_lrc_ring_head(lrc);
850 const u32 tail = lrc->ring.tail;
851 const u32 size = lrc->ring.size;
856 static void __xe_lrc_write_ring(struct xe_lrc *lrc, struct iosys_map ring,
859 struct xe_device *xe = lrc_to_xe(lrc);
861 iosys_map_incr(&ring, lrc->ring.tail);
863 lrc->ring.tail = (lrc->ring.tail + size) & (lrc->ring.size - 1);
866 void xe_lrc_write_ring(struct xe_lrc *lrc, const void *data, size_t size)
868 struct xe_device *xe = lrc_to_xe(lrc);
876 ring = __xe_lrc_ring_map(lrc);
878 xe_assert(xe, lrc->ring.tail < lrc->ring.size);
879 rhs = lrc->ring.size - lrc->ring.tail;
881 __xe_lrc_write_ring(lrc, ring, data, rhs);
882 __xe_lrc_write_ring(lrc, ring, data + rhs, size - rhs);
884 __xe_lrc_write_ring(lrc, ring, data, size);
890 __xe_lrc_write_ring(lrc, ring, &noop, sizeof(noop));
894 u64 xe_lrc_descriptor(struct xe_lrc *lrc)
896 return lrc->desc | xe_lrc_ggtt_addr(lrc);
899 u32 xe_lrc_seqno_ggtt_addr(struct xe_lrc *lrc)
901 return __xe_lrc_seqno_ggtt_addr(lrc);
904 struct dma_fence *xe_lrc_create_seqno_fence(struct xe_lrc *lrc)
906 return &xe_hw_fence_create(&lrc->fence_ctx,
907 __xe_lrc_seqno_map(lrc))->dma;
910 s32 xe_lrc_seqno(struct xe_lrc *lrc)
912 struct iosys_map map = __xe_lrc_seqno_map(lrc);
914 return xe_map_read32(lrc_to_xe(lrc), &map);
917 s32 xe_lrc_start_seqno(struct xe_lrc *lrc)
919 struct iosys_map map = __xe_lrc_start_seqno_map(lrc);
921 return xe_map_read32(lrc_to_xe(lrc), &map);
924 u32 xe_lrc_start_seqno_ggtt_addr(struct xe_lrc *lrc)
926 return __xe_lrc_start_seqno_ggtt_addr(lrc);
929 u32 xe_lrc_parallel_ggtt_addr(struct xe_lrc *lrc)
931 return __xe_lrc_parallel_ggtt_addr(lrc);
934 struct iosys_map xe_lrc_parallel_map(struct xe_lrc *lrc)
936 return __xe_lrc_parallel_map(lrc);
1350 struct xe_lrc_snapshot *xe_lrc_snapshot_capture(struct xe_lrc *lrc)
1357 snapshot->context_desc = lower_32_bits(xe_lrc_ggtt_addr(lrc));
1358 snapshot->head = xe_lrc_ring_head(lrc);
1359 snapshot->tail.internal = lrc->ring.tail;
1360 snapshot->tail.memory = xe_lrc_read_ctx_reg(lrc, CTX_RING_TAIL);
1361 snapshot->start_seqno = xe_lrc_start_seqno(lrc);
1362 snapshot->seqno = xe_lrc_seqno(lrc);
1363 snapshot->lrc_bo = xe_bo_get(lrc->bo);
1364 snapshot->lrc_offset = xe_lrc_pphwsp_offset(lrc);
1365 snapshot->lrc_size = lrc->bo->size - snapshot->lrc_offset;