xref: /linux/drivers/gpu/drm/xe/xe_lrc.h (revision 9b090d57746d965684f53a1aefcb363bab653ad3)
1dd08ebf6SMatthew Brost /* SPDX-License-Identifier: MIT */
2dd08ebf6SMatthew Brost /*
3dd08ebf6SMatthew Brost  * Copyright © 2021 Intel Corporation
4dd08ebf6SMatthew Brost  */
5dd08ebf6SMatthew Brost #ifndef _XE_LRC_H_
6dd08ebf6SMatthew Brost #define _XE_LRC_H_
7dd08ebf6SMatthew Brost 
838830bfeSMichal Wajdeczko #include <linux/types.h>
9dd08ebf6SMatthew Brost 
100f60547fSMatt Roper struct drm_printer;
11b1543a49SMatt Roper struct xe_bb;
12dd08ebf6SMatthew Brost struct xe_device;
139b9529ceSFrancois Dugast struct xe_exec_queue;
14dd08ebf6SMatthew Brost enum xe_engine_class;
1538830bfeSMichal Wajdeczko struct xe_gt;
16dd08ebf6SMatthew Brost struct xe_hw_engine;
1738830bfeSMichal Wajdeczko struct xe_lrc;
1838830bfeSMichal Wajdeczko struct xe_lrc_snapshot;
19dd08ebf6SMatthew Brost struct xe_vm;
20dd08ebf6SMatthew Brost 
21dd08ebf6SMatthew Brost #define LRC_PPHWSP_SCRATCH_ADDR (0x34 * 4)
22dd08ebf6SMatthew Brost 
23dd08ebf6SMatthew Brost int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe,
249b9529ceSFrancois Dugast 		struct xe_exec_queue *q, struct xe_vm *vm, u32 ring_size);
25dd08ebf6SMatthew Brost void xe_lrc_finish(struct xe_lrc *lrc);
26dd08ebf6SMatthew Brost 
27d6219e1cSNiranjana Vishwanathapura size_t xe_gt_lrc_size(struct xe_gt *gt, enum xe_engine_class class);
28dd08ebf6SMatthew Brost u32 xe_lrc_pphwsp_offset(struct xe_lrc *lrc);
29dd08ebf6SMatthew Brost 
30d6219e1cSNiranjana Vishwanathapura void xe_lrc_set_ring_tail(struct xe_lrc *lrc, u32 tail);
31d6219e1cSNiranjana Vishwanathapura u32 xe_lrc_ring_tail(struct xe_lrc *lrc);
32dd08ebf6SMatthew Brost void xe_lrc_set_ring_head(struct xe_lrc *lrc, u32 head);
33dd08ebf6SMatthew Brost u32 xe_lrc_ring_head(struct xe_lrc *lrc);
34dd08ebf6SMatthew Brost u32 xe_lrc_ring_space(struct xe_lrc *lrc);
35dd08ebf6SMatthew Brost void xe_lrc_write_ring(struct xe_lrc *lrc, const void *data, size_t size);
36dd08ebf6SMatthew Brost 
37d6219e1cSNiranjana Vishwanathapura u32 xe_lrc_indirect_ring_ggtt_addr(struct xe_lrc *lrc);
38dd08ebf6SMatthew Brost u32 xe_lrc_ggtt_addr(struct xe_lrc *lrc);
39dd08ebf6SMatthew Brost u32 *xe_lrc_regs(struct xe_lrc *lrc);
40dd08ebf6SMatthew Brost 
41dd08ebf6SMatthew Brost u32 xe_lrc_read_ctx_reg(struct xe_lrc *lrc, int reg_nr);
42dd08ebf6SMatthew Brost void xe_lrc_write_ctx_reg(struct xe_lrc *lrc, int reg_nr, u32 val);
43dd08ebf6SMatthew Brost 
44dd08ebf6SMatthew Brost u64 xe_lrc_descriptor(struct xe_lrc *lrc);
45dd08ebf6SMatthew Brost 
46dd08ebf6SMatthew Brost u32 xe_lrc_seqno_ggtt_addr(struct xe_lrc *lrc);
47dd08ebf6SMatthew Brost struct dma_fence *xe_lrc_create_seqno_fence(struct xe_lrc *lrc);
48dd08ebf6SMatthew Brost s32 xe_lrc_seqno(struct xe_lrc *lrc);
49dd08ebf6SMatthew Brost 
50dd08ebf6SMatthew Brost u32 xe_lrc_start_seqno_ggtt_addr(struct xe_lrc *lrc);
51dd08ebf6SMatthew Brost s32 xe_lrc_start_seqno(struct xe_lrc *lrc);
52dd08ebf6SMatthew Brost 
53dd08ebf6SMatthew Brost u32 xe_lrc_parallel_ggtt_addr(struct xe_lrc *lrc);
54dd08ebf6SMatthew Brost struct iosys_map xe_lrc_parallel_map(struct xe_lrc *lrc);
55dd08ebf6SMatthew Brost 
56dd08ebf6SMatthew Brost size_t xe_lrc_skip_size(struct xe_device *xe);
57dd08ebf6SMatthew Brost 
580f60547fSMatt Roper void xe_lrc_dump_default(struct drm_printer *p,
590f60547fSMatt Roper 			 struct xe_gt *gt,
600f60547fSMatt Roper 			 enum xe_engine_class);
610f60547fSMatt Roper 
62b1543a49SMatt Roper void xe_lrc_emit_hwe_state_instructions(struct xe_exec_queue *q, struct xe_bb *bb);
63b1543a49SMatt Roper 
6447058633SMaarten Lankhorst struct xe_lrc_snapshot *xe_lrc_snapshot_capture(struct xe_lrc *lrc);
65784b3410SMaarten Lankhorst void xe_lrc_snapshot_capture_delayed(struct xe_lrc_snapshot *snapshot);
6647058633SMaarten Lankhorst void xe_lrc_snapshot_print(struct xe_lrc_snapshot *snapshot, struct drm_printer *p);
6747058633SMaarten Lankhorst void xe_lrc_snapshot_free(struct xe_lrc_snapshot *snapshot);
6847058633SMaarten Lankhorst 
699b090d57SUmesh Nerlige Ramappa /**
709b090d57SUmesh Nerlige Ramappa  * xe_lrc_update_timestamp - readout LRC timestamp and update cached value
719b090d57SUmesh Nerlige Ramappa  * @lrc: logical ring context for this exec queue
729b090d57SUmesh Nerlige Ramappa  * @old_ts: pointer where to save the previous timestamp
739b090d57SUmesh Nerlige Ramappa  *
749b090d57SUmesh Nerlige Ramappa  * Read the current timestamp for this LRC and update the cached value. The
759b090d57SUmesh Nerlige Ramappa  * previous cached value is also returned in @old_ts so the caller can calculate
769b090d57SUmesh Nerlige Ramappa  * the delta between 2 updates. Note that this is not intended to be called from
779b090d57SUmesh Nerlige Ramappa  * any place, but just by the paths updating the drm client utilization.
789b090d57SUmesh Nerlige Ramappa  *
799b090d57SUmesh Nerlige Ramappa  * Returns the current LRC timestamp
809b090d57SUmesh Nerlige Ramappa  */
819b090d57SUmesh Nerlige Ramappa u32 xe_lrc_update_timestamp(struct xe_lrc *lrc, u32 *old_ts);
829b090d57SUmesh Nerlige Ramappa 
83dd08ebf6SMatthew Brost #endif
84