15ca02815Sjsg /* SPDX-License-Identifier: MIT */
25ca02815Sjsg /*
35ca02815Sjsg * Copyright © 2014 Intel Corporation
45ca02815Sjsg */
55ca02815Sjsg
65ca02815Sjsg #ifndef __GEN8_ENGINE_CS_H__
75ca02815Sjsg #define __GEN8_ENGINE_CS_H__
85ca02815Sjsg
95ca02815Sjsg #include <linux/string.h>
105ca02815Sjsg #include <linux/types.h>
115ca02815Sjsg
125ca02815Sjsg #include "i915_gem.h" /* GEM_BUG_ON */
131bb76ff1Sjsg #include "intel_gt_regs.h"
145ca02815Sjsg #include "intel_gpu_commands.h"
155ca02815Sjsg
16df2f834eSjsg struct intel_engine_cs;
171bb76ff1Sjsg struct intel_gt;
185ca02815Sjsg struct i915_request;
195ca02815Sjsg
205ca02815Sjsg int gen8_emit_flush_rcs(struct i915_request *rq, u32 mode);
215ca02815Sjsg int gen11_emit_flush_rcs(struct i915_request *rq, u32 mode);
225ca02815Sjsg int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode);
235ca02815Sjsg
245ca02815Sjsg int gen8_emit_flush_xcs(struct i915_request *rq, u32 mode);
255ca02815Sjsg int gen12_emit_flush_xcs(struct i915_request *rq, u32 mode);
265ca02815Sjsg
275ca02815Sjsg int gen8_emit_init_breadcrumb(struct i915_request *rq);
285ca02815Sjsg
295ca02815Sjsg int gen8_emit_bb_start_noarb(struct i915_request *rq,
305ca02815Sjsg u64 offset, u32 len,
315ca02815Sjsg const unsigned int flags);
325ca02815Sjsg int gen8_emit_bb_start(struct i915_request *rq,
335ca02815Sjsg u64 offset, u32 len,
345ca02815Sjsg const unsigned int flags);
355ca02815Sjsg
36*f005ef32Sjsg int xehp_emit_bb_start_noarb(struct i915_request *rq,
371bb76ff1Sjsg u64 offset, u32 len,
381bb76ff1Sjsg const unsigned int flags);
39*f005ef32Sjsg int xehp_emit_bb_start(struct i915_request *rq,
401bb76ff1Sjsg u64 offset, u32 len,
411bb76ff1Sjsg const unsigned int flags);
421bb76ff1Sjsg
435ca02815Sjsg u32 *gen8_emit_fini_breadcrumb_xcs(struct i915_request *rq, u32 *cs);
445ca02815Sjsg u32 *gen12_emit_fini_breadcrumb_xcs(struct i915_request *rq, u32 *cs);
455ca02815Sjsg
465ca02815Sjsg u32 *gen8_emit_fini_breadcrumb_rcs(struct i915_request *rq, u32 *cs);
475ca02815Sjsg u32 *gen11_emit_fini_breadcrumb_rcs(struct i915_request *rq, u32 *cs);
485ca02815Sjsg u32 *gen12_emit_fini_breadcrumb_rcs(struct i915_request *rq, u32 *cs);
495ca02815Sjsg
50df2f834eSjsg u32 *gen12_emit_aux_table_inv(struct intel_engine_cs *engine, u32 *cs);
511bb76ff1Sjsg
525ca02815Sjsg static inline u32 *
__gen8_emit_pipe_control(u32 * batch,u32 bit_group_0,u32 bit_group_1,u32 offset)53*f005ef32Sjsg __gen8_emit_pipe_control(u32 *batch, u32 bit_group_0,
54*f005ef32Sjsg u32 bit_group_1, u32 offset)
555ca02815Sjsg {
565ca02815Sjsg memset(batch, 0, 6 * sizeof(u32));
575ca02815Sjsg
58*f005ef32Sjsg batch[0] = GFX_OP_PIPE_CONTROL(6) | bit_group_0;
59*f005ef32Sjsg batch[1] = bit_group_1;
605ca02815Sjsg batch[2] = offset;
615ca02815Sjsg
625ca02815Sjsg return batch + 6;
635ca02815Sjsg }
645ca02815Sjsg
gen8_emit_pipe_control(u32 * batch,u32 bit_group_1,u32 offset)65*f005ef32Sjsg static inline u32 *gen8_emit_pipe_control(u32 *batch,
66*f005ef32Sjsg u32 bit_group_1, u32 offset)
675ca02815Sjsg {
68*f005ef32Sjsg return __gen8_emit_pipe_control(batch, 0, bit_group_1, offset);
695ca02815Sjsg }
705ca02815Sjsg
gen12_emit_pipe_control(u32 * batch,u32 bit_group_0,u32 bit_group_1,u32 offset)71*f005ef32Sjsg static inline u32 *gen12_emit_pipe_control(u32 *batch, u32 bit_group_0,
72*f005ef32Sjsg u32 bit_group_1, u32 offset)
735ca02815Sjsg {
74*f005ef32Sjsg return __gen8_emit_pipe_control(batch, bit_group_0,
75*f005ef32Sjsg bit_group_1, offset);
765ca02815Sjsg }
775ca02815Sjsg
785ca02815Sjsg static inline u32 *
__gen8_emit_write_rcs(u32 * cs,u32 value,u32 offset,u32 flags0,u32 flags1)795ca02815Sjsg __gen8_emit_write_rcs(u32 *cs, u32 value, u32 offset, u32 flags0, u32 flags1)
805ca02815Sjsg {
815ca02815Sjsg *cs++ = GFX_OP_PIPE_CONTROL(6) | flags0;
825ca02815Sjsg *cs++ = flags1 | PIPE_CONTROL_QW_WRITE;
835ca02815Sjsg *cs++ = offset;
845ca02815Sjsg *cs++ = 0;
855ca02815Sjsg *cs++ = value;
865ca02815Sjsg *cs++ = 0; /* We're thrashing one extra dword. */
875ca02815Sjsg
885ca02815Sjsg return cs;
895ca02815Sjsg }
905ca02815Sjsg
915ca02815Sjsg static inline u32*
gen8_emit_ggtt_write_rcs(u32 * cs,u32 value,u32 gtt_offset,u32 flags)925ca02815Sjsg gen8_emit_ggtt_write_rcs(u32 *cs, u32 value, u32 gtt_offset, u32 flags)
935ca02815Sjsg {
945ca02815Sjsg /* We're using qword write, offset should be aligned to 8 bytes. */
955ca02815Sjsg GEM_BUG_ON(!IS_ALIGNED(gtt_offset, 8));
965ca02815Sjsg
975ca02815Sjsg return __gen8_emit_write_rcs(cs,
985ca02815Sjsg value,
995ca02815Sjsg gtt_offset,
1005ca02815Sjsg 0,
1015ca02815Sjsg flags | PIPE_CONTROL_GLOBAL_GTT_IVB);
1025ca02815Sjsg }
1035ca02815Sjsg
1045ca02815Sjsg static inline u32*
gen12_emit_ggtt_write_rcs(u32 * cs,u32 value,u32 gtt_offset,u32 flags0,u32 flags1)1055ca02815Sjsg gen12_emit_ggtt_write_rcs(u32 *cs, u32 value, u32 gtt_offset, u32 flags0, u32 flags1)
1065ca02815Sjsg {
1075ca02815Sjsg /* We're using qword write, offset should be aligned to 8 bytes. */
1085ca02815Sjsg GEM_BUG_ON(!IS_ALIGNED(gtt_offset, 8));
1095ca02815Sjsg
1105ca02815Sjsg return __gen8_emit_write_rcs(cs,
1115ca02815Sjsg value,
1125ca02815Sjsg gtt_offset,
1135ca02815Sjsg flags0,
1145ca02815Sjsg flags1 | PIPE_CONTROL_GLOBAL_GTT_IVB);
1155ca02815Sjsg }
1165ca02815Sjsg
1175ca02815Sjsg static inline u32 *
__gen8_emit_flush_dw(u32 * cs,u32 value,u32 gtt_offset,u32 flags)1185ca02815Sjsg __gen8_emit_flush_dw(u32 *cs, u32 value, u32 gtt_offset, u32 flags)
1195ca02815Sjsg {
1205ca02815Sjsg *cs++ = (MI_FLUSH_DW + 1) | flags;
1215ca02815Sjsg *cs++ = gtt_offset;
1225ca02815Sjsg *cs++ = 0;
1235ca02815Sjsg *cs++ = value;
1245ca02815Sjsg
1255ca02815Sjsg return cs;
1265ca02815Sjsg }
1275ca02815Sjsg
1285ca02815Sjsg static inline u32 *
gen8_emit_ggtt_write(u32 * cs,u32 value,u32 gtt_offset,u32 flags)1295ca02815Sjsg gen8_emit_ggtt_write(u32 *cs, u32 value, u32 gtt_offset, u32 flags)
1305ca02815Sjsg {
1315ca02815Sjsg /* w/a: bit 5 needs to be zero for MI_FLUSH_DW address. */
1325ca02815Sjsg GEM_BUG_ON(gtt_offset & (1 << 5));
1335ca02815Sjsg /* Offset should be aligned to 8 bytes for both (QW/DW) write types */
1345ca02815Sjsg GEM_BUG_ON(!IS_ALIGNED(gtt_offset, 8));
1355ca02815Sjsg
1365ca02815Sjsg return __gen8_emit_flush_dw(cs,
1375ca02815Sjsg value,
1385ca02815Sjsg gtt_offset | MI_FLUSH_DW_USE_GTT,
1395ca02815Sjsg flags | MI_FLUSH_DW_OP_STOREDW);
1405ca02815Sjsg }
1415ca02815Sjsg
1425ca02815Sjsg #endif /* __GEN8_ENGINE_CS_H__ */
143