1 /*
2 Copyright (C) Intel Corp. 2006. All Rights Reserved.
3 Intel funded Tungsten Graphics to
4 develop this 3D driver.
5
6 Permission is hereby granted, free of charge, to any person obtaining
7 a copy of this software and associated documentation files (the
8 "Software"), to deal in the Software without restriction, including
9 without limitation the rights to use, copy, modify, merge, publish,
10 distribute, sublicense, and/or sell copies of the Software, and to
11 permit persons to whom the Software is furnished to do so, subject to
12 the following conditions:
13
14 The above copyright notice and this permission notice (including the
15 next paragraph) shall be included in all copies or substantial
16 portions of the Software.
17
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
26 **********************************************************************/
27 /*
28 * Authors:
29 * Keith Whitwell <keithw@vmware.com>
30 */
31
32
33 #ifndef BRW_EU_H
34 #define BRW_EU_H
35
36 #include <stdbool.h>
37 #include <stdio.h>
38 #include "brw_inst.h"
39 #include "brw_compiler.h"
40 #include "brw_eu_defines.h"
41 #include "brw_reg.h"
42 #include "brw_disasm_info.h"
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 #define BRW_EU_MAX_INSN_STACK 5
49
50 struct brw_insn_state {
51 /* One of BRW_EXECUTE_* */
52 unsigned exec_size:3;
53
54 /* Group in units of channels */
55 unsigned group:5;
56
57 /* Compression control on gfx4-5 */
58 bool compressed:1;
59
60 /* One of BRW_MASK_* */
61 unsigned mask_control:1;
62
63 /* Scheduling info for Gfx12+ */
64 struct tgl_swsb swsb;
65
66 bool saturate:1;
67
68 /* One of BRW_ALIGN_* */
69 unsigned access_mode:1;
70
71 /* One of BRW_PREDICATE_* */
72 enum brw_predicate predicate:4;
73
74 bool pred_inv:1;
75
76 /* Flag subreg. Bottom bit is subreg, top bit is reg */
77 unsigned flag_subreg:2;
78
79 bool acc_wr_control:1;
80 };
81
82
83 /* A helper for accessing the last instruction emitted. This makes it easy
84 * to set various bits on an instruction without having to create temporary
85 * variable and assign the emitted instruction to those.
86 */
87 #define brw_last_inst (&p->store[p->nr_insn - 1])
88
89 struct brw_codegen {
90 brw_inst *store;
91 int store_size;
92 unsigned nr_insn;
93 unsigned int next_insn_offset;
94
95 void *mem_ctx;
96
97 /* Allow clients to push/pop instruction state:
98 */
99 struct brw_insn_state stack[BRW_EU_MAX_INSN_STACK];
100 struct brw_insn_state *current;
101
102 /** Whether or not the user wants automatic exec sizes
103 *
104 * If true, codegen will try to automatically infer the exec size of an
105 * instruction from the width of the destination register. If false, it
106 * will take whatever is set by brw_set_default_exec_size verbatim.
107 *
108 * This is set to true by default in brw_init_codegen.
109 */
110 bool automatic_exec_sizes;
111
112 bool single_program_flow;
113 const struct intel_device_info *devinfo;
114
115 /* Control flow stacks:
116 * - if_stack contains IF and ELSE instructions which must be patched
117 * (and popped) once the matching ENDIF instruction is encountered.
118 *
119 * Just store the instruction pointer(an index).
120 */
121 int *if_stack;
122 int if_stack_depth;
123 int if_stack_array_size;
124
125 /**
126 * loop_stack contains the instruction pointers of the starts of loops which
127 * must be patched (and popped) once the matching WHILE instruction is
128 * encountered.
129 */
130 int *loop_stack;
131 /**
132 * pre-gfx6, the BREAK and CONT instructions had to tell how many IF/ENDIF
133 * blocks they were popping out of, to fix up the mask stack. This tracks
134 * the IF/ENDIF nesting in each current nested loop level.
135 */
136 int *if_depth_in_loop;
137 int loop_stack_depth;
138 int loop_stack_array_size;
139
140 struct brw_shader_reloc *relocs;
141 int num_relocs;
142 int reloc_array_size;
143 };
144
145 struct brw_label {
146 int offset;
147 int number;
148 struct brw_label *next;
149 };
150
151 void brw_pop_insn_state( struct brw_codegen *p );
152 void brw_push_insn_state( struct brw_codegen *p );
153 unsigned brw_get_default_exec_size(struct brw_codegen *p);
154 unsigned brw_get_default_group(struct brw_codegen *p);
155 unsigned brw_get_default_access_mode(struct brw_codegen *p);
156 struct tgl_swsb brw_get_default_swsb(struct brw_codegen *p);
157 void brw_set_default_exec_size(struct brw_codegen *p, unsigned value);
158 void brw_set_default_mask_control( struct brw_codegen *p, unsigned value );
159 void brw_set_default_saturate( struct brw_codegen *p, bool enable );
160 void brw_set_default_access_mode( struct brw_codegen *p, unsigned access_mode );
161 void brw_inst_set_compression(const struct intel_device_info *devinfo,
162 brw_inst *inst, bool on);
163 void brw_set_default_compression(struct brw_codegen *p, bool on);
164 void brw_inst_set_group(const struct intel_device_info *devinfo,
165 brw_inst *inst, unsigned group);
166 void brw_set_default_group(struct brw_codegen *p, unsigned group);
167 void brw_set_default_compression_control(struct brw_codegen *p, enum brw_compression c);
168 void brw_set_default_predicate_control(struct brw_codegen *p, enum brw_predicate pc);
169 void brw_set_default_predicate_inverse(struct brw_codegen *p, bool predicate_inverse);
170 void brw_set_default_flag_reg(struct brw_codegen *p, int reg, int subreg);
171 void brw_set_default_acc_write_control(struct brw_codegen *p, unsigned value);
172 void brw_set_default_swsb(struct brw_codegen *p, struct tgl_swsb value);
173
174 void brw_init_codegen(const struct intel_device_info *, struct brw_codegen *p,
175 void *mem_ctx);
176 bool brw_has_jip(const struct intel_device_info *devinfo, enum opcode opcode);
177 bool brw_has_uip(const struct intel_device_info *devinfo, enum opcode opcode);
178 const struct brw_label *brw_find_label(const struct brw_label *root, int offset);
179 void brw_create_label(struct brw_label **labels, int offset, void *mem_ctx);
180 int brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
181 const struct brw_inst *inst, bool is_compacted,
182 int offset, const struct brw_label *root_label);
183 const struct
184 brw_label *brw_label_assembly(const struct intel_device_info *devinfo,
185 const void *assembly, int start, int end,
186 void *mem_ctx);
187 void brw_disassemble_with_labels(const struct intel_device_info *devinfo,
188 const void *assembly, int start, int end, FILE *out);
189 void brw_disassemble(const struct intel_device_info *devinfo,
190 const void *assembly, int start, int end,
191 const struct brw_label *root_label, FILE *out);
192 const struct brw_shader_reloc *brw_get_shader_relocs(struct brw_codegen *p,
193 unsigned *num_relocs);
194 const unsigned *brw_get_program( struct brw_codegen *p, unsigned *sz );
195
196 bool brw_try_override_assembly(struct brw_codegen *p, int start_offset,
197 const char *identifier);
198
199 void brw_realign(struct brw_codegen *p, unsigned align);
200 int brw_append_data(struct brw_codegen *p, void *data,
201 unsigned size, unsigned align);
202 brw_inst *brw_next_insn(struct brw_codegen *p, unsigned opcode);
203 void brw_add_reloc(struct brw_codegen *p, uint32_t id,
204 enum brw_shader_reloc_type type,
205 uint32_t offset, uint32_t delta);
206 void brw_set_dest(struct brw_codegen *p, brw_inst *insn, struct brw_reg dest);
207 void brw_set_src0(struct brw_codegen *p, brw_inst *insn, struct brw_reg reg);
208
209 void gfx6_resolve_implied_move(struct brw_codegen *p,
210 struct brw_reg *src,
211 unsigned msg_reg_nr);
212
213 /* Helpers for regular instructions:
214 */
215 #define ALU1(OP) \
216 brw_inst *brw_##OP(struct brw_codegen *p, \
217 struct brw_reg dest, \
218 struct brw_reg src0);
219
220 #define ALU2(OP) \
221 brw_inst *brw_##OP(struct brw_codegen *p, \
222 struct brw_reg dest, \
223 struct brw_reg src0, \
224 struct brw_reg src1);
225
226 #define ALU3(OP) \
227 brw_inst *brw_##OP(struct brw_codegen *p, \
228 struct brw_reg dest, \
229 struct brw_reg src0, \
230 struct brw_reg src1, \
231 struct brw_reg src2);
232
233 ALU1(MOV)
ALU2(SEL)234 ALU2(SEL)
235 ALU1(NOT)
236 ALU2(AND)
237 ALU2(OR)
238 ALU2(XOR)
239 ALU2(SHR)
240 ALU2(SHL)
241 ALU1(DIM)
242 ALU2(ASR)
243 ALU2(ROL)
244 ALU2(ROR)
245 ALU3(CSEL)
246 ALU1(F32TO16)
247 ALU1(F16TO32)
248 ALU2(ADD)
249 ALU3(ADD3)
250 ALU2(AVG)
251 ALU2(MUL)
252 ALU1(FRC)
253 ALU1(RNDD)
254 ALU1(RNDE)
255 ALU1(RNDU)
256 ALU1(RNDZ)
257 ALU2(MAC)
258 ALU2(MACH)
259 ALU1(LZD)
260 ALU2(DP4)
261 ALU2(DPH)
262 ALU2(DP3)
263 ALU2(DP2)
264 ALU3(DP4A)
265 ALU2(LINE)
266 ALU2(PLN)
267 ALU3(MAD)
268 ALU3(LRP)
269 ALU1(BFREV)
270 ALU3(BFE)
271 ALU2(BFI1)
272 ALU3(BFI2)
273 ALU1(FBH)
274 ALU1(FBL)
275 ALU1(CBIT)
276 ALU2(ADDC)
277 ALU2(SUBB)
278
279 #undef ALU1
280 #undef ALU2
281 #undef ALU3
282
283
284 /* Helpers for SEND instruction:
285 */
286
287 /**
288 * Construct a message descriptor immediate with the specified common
289 * descriptor controls.
290 */
291 static inline uint32_t
292 brw_message_desc(const struct intel_device_info *devinfo,
293 unsigned msg_length,
294 unsigned response_length,
295 bool header_present)
296 {
297 if (devinfo->ver >= 5) {
298 return (SET_BITS(msg_length, 28, 25) |
299 SET_BITS(response_length, 24, 20) |
300 SET_BITS(header_present, 19, 19));
301 } else {
302 return (SET_BITS(msg_length, 23, 20) |
303 SET_BITS(response_length, 19, 16));
304 }
305 }
306
307 static inline unsigned
brw_message_desc_mlen(const struct intel_device_info * devinfo,uint32_t desc)308 brw_message_desc_mlen(const struct intel_device_info *devinfo, uint32_t desc)
309 {
310 if (devinfo->ver >= 5)
311 return GET_BITS(desc, 28, 25);
312 else
313 return GET_BITS(desc, 23, 20);
314 }
315
316 static inline unsigned
brw_message_desc_rlen(const struct intel_device_info * devinfo,uint32_t desc)317 brw_message_desc_rlen(const struct intel_device_info *devinfo, uint32_t desc)
318 {
319 if (devinfo->ver >= 5)
320 return GET_BITS(desc, 24, 20);
321 else
322 return GET_BITS(desc, 19, 16);
323 }
324
325 static inline bool
brw_message_desc_header_present(ASSERTED const struct intel_device_info * devinfo,uint32_t desc)326 brw_message_desc_header_present(ASSERTED
327 const struct intel_device_info *devinfo,
328 uint32_t desc)
329 {
330 assert(devinfo->ver >= 5);
331 return GET_BITS(desc, 19, 19);
332 }
333
334 static inline unsigned
brw_message_ex_desc(UNUSED const struct intel_device_info * devinfo,unsigned ex_msg_length)335 brw_message_ex_desc(UNUSED const struct intel_device_info *devinfo,
336 unsigned ex_msg_length)
337 {
338 return SET_BITS(ex_msg_length, 9, 6);
339 }
340
341 static inline unsigned
brw_message_ex_desc_ex_mlen(UNUSED const struct intel_device_info * devinfo,uint32_t ex_desc)342 brw_message_ex_desc_ex_mlen(UNUSED const struct intel_device_info *devinfo,
343 uint32_t ex_desc)
344 {
345 return GET_BITS(ex_desc, 9, 6);
346 }
347
348 static inline uint32_t
brw_urb_desc(const struct intel_device_info * devinfo,unsigned msg_type,bool per_slot_offset_present,bool channel_mask_present,unsigned global_offset)349 brw_urb_desc(const struct intel_device_info *devinfo,
350 unsigned msg_type,
351 bool per_slot_offset_present,
352 bool channel_mask_present,
353 unsigned global_offset)
354 {
355 if (devinfo->ver >= 8) {
356 return (SET_BITS(per_slot_offset_present, 17, 17) |
357 SET_BITS(channel_mask_present, 15, 15) |
358 SET_BITS(global_offset, 14, 4) |
359 SET_BITS(msg_type, 3, 0));
360 } else if (devinfo->ver >= 7) {
361 assert(!channel_mask_present);
362 return (SET_BITS(per_slot_offset_present, 16, 16) |
363 SET_BITS(global_offset, 13, 3) |
364 SET_BITS(msg_type, 3, 0));
365 } else {
366 unreachable("unhandled URB write generation");
367 }
368 }
369
370 static inline uint32_t
brw_urb_desc_msg_type(ASSERTED const struct intel_device_info * devinfo,uint32_t desc)371 brw_urb_desc_msg_type(ASSERTED const struct intel_device_info *devinfo,
372 uint32_t desc)
373 {
374 assert(devinfo->ver >= 7);
375 return GET_BITS(desc, 3, 0);
376 }
377
378 static inline uint32_t
brw_urb_fence_desc(const struct intel_device_info * devinfo)379 brw_urb_fence_desc(const struct intel_device_info *devinfo)
380 {
381 assert(devinfo->has_lsc);
382 return brw_urb_desc(devinfo, GFX125_URB_OPCODE_FENCE, false, false, 0);
383 }
384
385 /**
386 * Construct a message descriptor immediate with the specified sampler
387 * function controls.
388 */
389 static inline uint32_t
brw_sampler_desc(const struct intel_device_info * devinfo,unsigned binding_table_index,unsigned sampler,unsigned msg_type,unsigned simd_mode,unsigned return_format)390 brw_sampler_desc(const struct intel_device_info *devinfo,
391 unsigned binding_table_index,
392 unsigned sampler,
393 unsigned msg_type,
394 unsigned simd_mode,
395 unsigned return_format)
396 {
397 const unsigned desc = (SET_BITS(binding_table_index, 7, 0) |
398 SET_BITS(sampler, 11, 8));
399 if (devinfo->ver >= 7)
400 return (desc | SET_BITS(msg_type, 16, 12) |
401 SET_BITS(simd_mode, 18, 17));
402 else if (devinfo->ver >= 5)
403 return (desc | SET_BITS(msg_type, 15, 12) |
404 SET_BITS(simd_mode, 17, 16));
405 else if (devinfo->is_g4x)
406 return desc | SET_BITS(msg_type, 15, 12);
407 else
408 return (desc | SET_BITS(return_format, 13, 12) |
409 SET_BITS(msg_type, 15, 14));
410 }
411
412 static inline unsigned
brw_sampler_desc_binding_table_index(UNUSED const struct intel_device_info * devinfo,uint32_t desc)413 brw_sampler_desc_binding_table_index(UNUSED
414 const struct intel_device_info *devinfo,
415 uint32_t desc)
416 {
417 return GET_BITS(desc, 7, 0);
418 }
419
420 static inline unsigned
brw_sampler_desc_sampler(UNUSED const struct intel_device_info * devinfo,uint32_t desc)421 brw_sampler_desc_sampler(UNUSED const struct intel_device_info *devinfo,
422 uint32_t desc)
423 {
424 return GET_BITS(desc, 11, 8);
425 }
426
427 static inline unsigned
brw_sampler_desc_msg_type(const struct intel_device_info * devinfo,uint32_t desc)428 brw_sampler_desc_msg_type(const struct intel_device_info *devinfo, uint32_t desc)
429 {
430 if (devinfo->ver >= 7)
431 return GET_BITS(desc, 16, 12);
432 else if (devinfo->ver >= 5 || devinfo->is_g4x)
433 return GET_BITS(desc, 15, 12);
434 else
435 return GET_BITS(desc, 15, 14);
436 }
437
438 static inline unsigned
brw_sampler_desc_simd_mode(const struct intel_device_info * devinfo,uint32_t desc)439 brw_sampler_desc_simd_mode(const struct intel_device_info *devinfo,
440 uint32_t desc)
441 {
442 assert(devinfo->ver >= 5);
443 if (devinfo->ver >= 7)
444 return GET_BITS(desc, 18, 17);
445 else
446 return GET_BITS(desc, 17, 16);
447 }
448
449 static inline unsigned
brw_sampler_desc_return_format(ASSERTED const struct intel_device_info * devinfo,uint32_t desc)450 brw_sampler_desc_return_format(ASSERTED const struct intel_device_info *devinfo,
451 uint32_t desc)
452 {
453 assert(devinfo->ver == 4 && !devinfo->is_g4x);
454 return GET_BITS(desc, 13, 12);
455 }
456
457 /**
458 * Construct a message descriptor for the dataport
459 */
460 static inline uint32_t
brw_dp_desc(const struct intel_device_info * devinfo,unsigned binding_table_index,unsigned msg_type,unsigned msg_control)461 brw_dp_desc(const struct intel_device_info *devinfo,
462 unsigned binding_table_index,
463 unsigned msg_type,
464 unsigned msg_control)
465 {
466 /* Prior to gfx6, things are too inconsistent; use the dp_read/write_desc
467 * helpers instead.
468 */
469 assert(devinfo->ver >= 6);
470 const unsigned desc = SET_BITS(binding_table_index, 7, 0);
471 if (devinfo->ver >= 8) {
472 return (desc | SET_BITS(msg_control, 13, 8) |
473 SET_BITS(msg_type, 18, 14));
474 } else if (devinfo->ver >= 7) {
475 return (desc | SET_BITS(msg_control, 13, 8) |
476 SET_BITS(msg_type, 17, 14));
477 } else {
478 return (desc | SET_BITS(msg_control, 12, 8) |
479 SET_BITS(msg_type, 16, 13));
480 }
481 }
482
483 static inline unsigned
brw_dp_desc_binding_table_index(UNUSED const struct intel_device_info * devinfo,uint32_t desc)484 brw_dp_desc_binding_table_index(UNUSED const struct intel_device_info *devinfo,
485 uint32_t desc)
486 {
487 return GET_BITS(desc, 7, 0);
488 }
489
490 static inline unsigned
brw_dp_desc_msg_type(const struct intel_device_info * devinfo,uint32_t desc)491 brw_dp_desc_msg_type(const struct intel_device_info *devinfo, uint32_t desc)
492 {
493 assert(devinfo->ver >= 6);
494 if (devinfo->ver >= 8)
495 return GET_BITS(desc, 18, 14);
496 else if (devinfo->ver >= 7)
497 return GET_BITS(desc, 17, 14);
498 else
499 return GET_BITS(desc, 16, 13);
500 }
501
502 static inline unsigned
brw_dp_desc_msg_control(const struct intel_device_info * devinfo,uint32_t desc)503 brw_dp_desc_msg_control(const struct intel_device_info *devinfo, uint32_t desc)
504 {
505 assert(devinfo->ver >= 6);
506 if (devinfo->ver >= 7)
507 return GET_BITS(desc, 13, 8);
508 else
509 return GET_BITS(desc, 12, 8);
510 }
511
512 /**
513 * Construct a message descriptor immediate with the specified dataport read
514 * function controls.
515 */
516 static inline uint32_t
brw_dp_read_desc(const struct intel_device_info * devinfo,unsigned binding_table_index,unsigned msg_control,unsigned msg_type,unsigned target_cache)517 brw_dp_read_desc(const struct intel_device_info *devinfo,
518 unsigned binding_table_index,
519 unsigned msg_control,
520 unsigned msg_type,
521 unsigned target_cache)
522 {
523 if (devinfo->ver >= 6)
524 return brw_dp_desc(devinfo, binding_table_index, msg_type, msg_control);
525 else if (devinfo->ver >= 5 || devinfo->is_g4x)
526 return (SET_BITS(binding_table_index, 7, 0) |
527 SET_BITS(msg_control, 10, 8) |
528 SET_BITS(msg_type, 13, 11) |
529 SET_BITS(target_cache, 15, 14));
530 else
531 return (SET_BITS(binding_table_index, 7, 0) |
532 SET_BITS(msg_control, 11, 8) |
533 SET_BITS(msg_type, 13, 12) |
534 SET_BITS(target_cache, 15, 14));
535 }
536
537 static inline unsigned
brw_dp_read_desc_msg_type(const struct intel_device_info * devinfo,uint32_t desc)538 brw_dp_read_desc_msg_type(const struct intel_device_info *devinfo,
539 uint32_t desc)
540 {
541 if (devinfo->ver >= 6)
542 return brw_dp_desc_msg_type(devinfo, desc);
543 else if (devinfo->ver >= 5 || devinfo->is_g4x)
544 return GET_BITS(desc, 13, 11);
545 else
546 return GET_BITS(desc, 13, 12);
547 }
548
549 static inline unsigned
brw_dp_read_desc_msg_control(const struct intel_device_info * devinfo,uint32_t desc)550 brw_dp_read_desc_msg_control(const struct intel_device_info *devinfo,
551 uint32_t desc)
552 {
553 if (devinfo->ver >= 6)
554 return brw_dp_desc_msg_control(devinfo, desc);
555 else if (devinfo->ver >= 5 || devinfo->is_g4x)
556 return GET_BITS(desc, 10, 8);
557 else
558 return GET_BITS(desc, 11, 8);
559 }
560
561 /**
562 * Construct a message descriptor immediate with the specified dataport write
563 * function controls.
564 */
565 static inline uint32_t
brw_dp_write_desc(const struct intel_device_info * devinfo,unsigned binding_table_index,unsigned msg_control,unsigned msg_type,unsigned send_commit_msg)566 brw_dp_write_desc(const struct intel_device_info *devinfo,
567 unsigned binding_table_index,
568 unsigned msg_control,
569 unsigned msg_type,
570 unsigned send_commit_msg)
571 {
572 assert(devinfo->ver <= 6 || !send_commit_msg);
573 if (devinfo->ver >= 6) {
574 return brw_dp_desc(devinfo, binding_table_index, msg_type, msg_control) |
575 SET_BITS(send_commit_msg, 17, 17);
576 } else {
577 return (SET_BITS(binding_table_index, 7, 0) |
578 SET_BITS(msg_control, 11, 8) |
579 SET_BITS(msg_type, 14, 12) |
580 SET_BITS(send_commit_msg, 15, 15));
581 }
582 }
583
584 static inline unsigned
brw_dp_write_desc_msg_type(const struct intel_device_info * devinfo,uint32_t desc)585 brw_dp_write_desc_msg_type(const struct intel_device_info *devinfo,
586 uint32_t desc)
587 {
588 if (devinfo->ver >= 6)
589 return brw_dp_desc_msg_type(devinfo, desc);
590 else
591 return GET_BITS(desc, 14, 12);
592 }
593
594 static inline unsigned
brw_dp_write_desc_msg_control(const struct intel_device_info * devinfo,uint32_t desc)595 brw_dp_write_desc_msg_control(const struct intel_device_info *devinfo,
596 uint32_t desc)
597 {
598 if (devinfo->ver >= 6)
599 return brw_dp_desc_msg_control(devinfo, desc);
600 else
601 return GET_BITS(desc, 11, 8);
602 }
603
604 static inline bool
brw_dp_write_desc_write_commit(const struct intel_device_info * devinfo,uint32_t desc)605 brw_dp_write_desc_write_commit(const struct intel_device_info *devinfo,
606 uint32_t desc)
607 {
608 assert(devinfo->ver <= 6);
609 if (devinfo->ver >= 6)
610 return GET_BITS(desc, 17, 17);
611 else
612 return GET_BITS(desc, 15, 15);
613 }
614
615 /**
616 * Construct a message descriptor immediate with the specified dataport
617 * surface function controls.
618 */
619 static inline uint32_t
brw_dp_surface_desc(const struct intel_device_info * devinfo,unsigned msg_type,unsigned msg_control)620 brw_dp_surface_desc(const struct intel_device_info *devinfo,
621 unsigned msg_type,
622 unsigned msg_control)
623 {
624 assert(devinfo->ver >= 7);
625 /* We'll OR in the binding table index later */
626 return brw_dp_desc(devinfo, 0, msg_type, msg_control);
627 }
628
629 static inline uint32_t
brw_dp_untyped_atomic_desc(const struct intel_device_info * devinfo,unsigned exec_size,unsigned atomic_op,bool response_expected)630 brw_dp_untyped_atomic_desc(const struct intel_device_info *devinfo,
631 unsigned exec_size, /**< 0 for SIMD4x2 */
632 unsigned atomic_op,
633 bool response_expected)
634 {
635 assert(exec_size <= 8 || exec_size == 16);
636
637 unsigned msg_type;
638 if (devinfo->verx10 >= 75) {
639 if (exec_size > 0) {
640 msg_type = HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP;
641 } else {
642 msg_type = HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2;
643 }
644 } else {
645 msg_type = GFX7_DATAPORT_DC_UNTYPED_ATOMIC_OP;
646 }
647
648 const unsigned msg_control =
649 SET_BITS(atomic_op, 3, 0) |
650 SET_BITS(0 < exec_size && exec_size <= 8, 4, 4) |
651 SET_BITS(response_expected, 5, 5);
652
653 return brw_dp_surface_desc(devinfo, msg_type, msg_control);
654 }
655
656 static inline uint32_t
brw_dp_untyped_atomic_float_desc(const struct intel_device_info * devinfo,unsigned exec_size,unsigned atomic_op,bool response_expected)657 brw_dp_untyped_atomic_float_desc(const struct intel_device_info *devinfo,
658 unsigned exec_size,
659 unsigned atomic_op,
660 bool response_expected)
661 {
662 assert(exec_size <= 8 || exec_size == 16);
663 assert(devinfo->ver >= 9);
664
665 assert(exec_size > 0);
666 const unsigned msg_type = GFX9_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_FLOAT_OP;
667
668 const unsigned msg_control =
669 SET_BITS(atomic_op, 1, 0) |
670 SET_BITS(exec_size <= 8, 4, 4) |
671 SET_BITS(response_expected, 5, 5);
672
673 return brw_dp_surface_desc(devinfo, msg_type, msg_control);
674 }
675
676 static inline unsigned
brw_mdc_cmask(unsigned num_channels)677 brw_mdc_cmask(unsigned num_channels)
678 {
679 /* See also MDC_CMASK in the SKL PRM Vol 2d. */
680 return 0xf & (0xf << num_channels);
681 }
682
683 static inline unsigned
lsc_cmask(unsigned num_channels)684 lsc_cmask(unsigned num_channels)
685 {
686 assert(num_channels > 0 && num_channels <= 4);
687 return BITSET_MASK(num_channels);
688 }
689
690 static inline uint32_t
brw_dp_untyped_surface_rw_desc(const struct intel_device_info * devinfo,unsigned exec_size,unsigned num_channels,bool write)691 brw_dp_untyped_surface_rw_desc(const struct intel_device_info *devinfo,
692 unsigned exec_size, /**< 0 for SIMD4x2 */
693 unsigned num_channels,
694 bool write)
695 {
696 assert(exec_size <= 8 || exec_size == 16);
697
698 unsigned msg_type;
699 if (write) {
700 if (devinfo->verx10 >= 75) {
701 msg_type = HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_WRITE;
702 } else {
703 msg_type = GFX7_DATAPORT_DC_UNTYPED_SURFACE_WRITE;
704 }
705 } else {
706 /* Read */
707 if (devinfo->verx10 >= 75) {
708 msg_type = HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_READ;
709 } else {
710 msg_type = GFX7_DATAPORT_DC_UNTYPED_SURFACE_READ;
711 }
712 }
713
714 /* SIMD4x2 is only valid for read messages on IVB; use SIMD8 instead */
715 if (write && devinfo->verx10 == 70 && exec_size == 0)
716 exec_size = 8;
717
718 /* See also MDC_SM3 in the SKL PRM Vol 2d. */
719 const unsigned simd_mode = exec_size == 0 ? 0 : /* SIMD4x2 */
720 exec_size <= 8 ? 2 : 1;
721
722 const unsigned msg_control =
723 SET_BITS(brw_mdc_cmask(num_channels), 3, 0) |
724 SET_BITS(simd_mode, 5, 4);
725
726 return brw_dp_surface_desc(devinfo, msg_type, msg_control);
727 }
728
729 static inline unsigned
brw_mdc_ds(unsigned bit_size)730 brw_mdc_ds(unsigned bit_size)
731 {
732 switch (bit_size) {
733 case 8:
734 return GFX7_BYTE_SCATTERED_DATA_ELEMENT_BYTE;
735 case 16:
736 return GFX7_BYTE_SCATTERED_DATA_ELEMENT_WORD;
737 case 32:
738 return GFX7_BYTE_SCATTERED_DATA_ELEMENT_DWORD;
739 default:
740 unreachable("Unsupported bit_size for byte scattered messages");
741 }
742 }
743
744 static inline uint32_t
brw_dp_byte_scattered_rw_desc(const struct intel_device_info * devinfo,unsigned exec_size,unsigned bit_size,bool write)745 brw_dp_byte_scattered_rw_desc(const struct intel_device_info *devinfo,
746 unsigned exec_size,
747 unsigned bit_size,
748 bool write)
749 {
750 assert(exec_size <= 8 || exec_size == 16);
751
752 assert(devinfo->verx10 >= 75);
753 const unsigned msg_type =
754 write ? HSW_DATAPORT_DC_PORT0_BYTE_SCATTERED_WRITE :
755 HSW_DATAPORT_DC_PORT0_BYTE_SCATTERED_READ;
756
757 assert(exec_size > 0);
758 const unsigned msg_control =
759 SET_BITS(exec_size == 16, 0, 0) |
760 SET_BITS(brw_mdc_ds(bit_size), 3, 2);
761
762 return brw_dp_surface_desc(devinfo, msg_type, msg_control);
763 }
764
765 static inline uint32_t
brw_dp_dword_scattered_rw_desc(const struct intel_device_info * devinfo,unsigned exec_size,bool write)766 brw_dp_dword_scattered_rw_desc(const struct intel_device_info *devinfo,
767 unsigned exec_size,
768 bool write)
769 {
770 assert(exec_size == 8 || exec_size == 16);
771
772 unsigned msg_type;
773 if (write) {
774 if (devinfo->ver >= 6) {
775 msg_type = GFX6_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE;
776 } else {
777 msg_type = BRW_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE;
778 }
779 } else {
780 if (devinfo->ver >= 7) {
781 msg_type = GFX7_DATAPORT_DC_DWORD_SCATTERED_READ;
782 } else if (devinfo->ver > 4 || devinfo->is_g4x) {
783 msg_type = G45_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ;
784 } else {
785 msg_type = BRW_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ;
786 }
787 }
788
789 const unsigned msg_control =
790 SET_BITS(1, 1, 1) | /* Legacy SIMD Mode */
791 SET_BITS(exec_size == 16, 0, 0);
792
793 return brw_dp_surface_desc(devinfo, msg_type, msg_control);
794 }
795
796 static inline uint32_t
brw_dp_oword_block_rw_desc(const struct intel_device_info * devinfo,bool align_16B,unsigned num_dwords,bool write)797 brw_dp_oword_block_rw_desc(const struct intel_device_info *devinfo,
798 bool align_16B,
799 unsigned num_dwords,
800 bool write)
801 {
802 /* Writes can only have addresses aligned by OWORDs (16 Bytes). */
803 assert(!write || align_16B);
804
805 const unsigned msg_type =
806 write ? GFX7_DATAPORT_DC_OWORD_BLOCK_WRITE :
807 align_16B ? GFX7_DATAPORT_DC_OWORD_BLOCK_READ :
808 GFX7_DATAPORT_DC_UNALIGNED_OWORD_BLOCK_READ;
809
810 const unsigned msg_control =
811 SET_BITS(BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_dwords), 2, 0);
812
813 return brw_dp_surface_desc(devinfo, msg_type, msg_control);
814 }
815
816 static inline uint32_t
brw_dp_a64_untyped_surface_rw_desc(const struct intel_device_info * devinfo,unsigned exec_size,unsigned num_channels,bool write)817 brw_dp_a64_untyped_surface_rw_desc(const struct intel_device_info *devinfo,
818 unsigned exec_size, /**< 0 for SIMD4x2 */
819 unsigned num_channels,
820 bool write)
821 {
822 assert(exec_size <= 8 || exec_size == 16);
823 assert(devinfo->ver >= 8);
824
825 unsigned msg_type =
826 write ? GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_WRITE :
827 GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_READ;
828
829 /* See also MDC_SM3 in the SKL PRM Vol 2d. */
830 const unsigned simd_mode = exec_size == 0 ? 0 : /* SIMD4x2 */
831 exec_size <= 8 ? 2 : 1;
832
833 const unsigned msg_control =
834 SET_BITS(brw_mdc_cmask(num_channels), 3, 0) |
835 SET_BITS(simd_mode, 5, 4);
836
837 return brw_dp_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
838 msg_type, msg_control);
839 }
840
841 static inline uint32_t
brw_dp_a64_oword_block_rw_desc(const struct intel_device_info * devinfo,bool align_16B,unsigned num_dwords,bool write)842 brw_dp_a64_oword_block_rw_desc(const struct intel_device_info *devinfo,
843 bool align_16B,
844 unsigned num_dwords,
845 bool write)
846 {
847 /* Writes can only have addresses aligned by OWORDs (16 Bytes). */
848 assert(!write || align_16B);
849
850 unsigned msg_type =
851 write ? GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_WRITE :
852 GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_READ;
853
854 unsigned msg_control =
855 SET_BITS(!align_16B, 4, 3) |
856 SET_BITS(BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_dwords), 2, 0);
857
858 return brw_dp_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
859 msg_type, msg_control);
860 }
861
862 /**
863 * Calculate the data size (see MDC_A64_DS in the "Structures" volume of the
864 * Skylake PRM).
865 */
866 static inline uint32_t
brw_mdc_a64_ds(unsigned elems)867 brw_mdc_a64_ds(unsigned elems)
868 {
869 switch (elems) {
870 case 1: return 0;
871 case 2: return 1;
872 case 4: return 2;
873 case 8: return 3;
874 default:
875 unreachable("Unsupported elmeent count for A64 scattered message");
876 }
877 }
878
879 static inline uint32_t
brw_dp_a64_byte_scattered_rw_desc(const struct intel_device_info * devinfo,unsigned exec_size,unsigned bit_size,bool write)880 brw_dp_a64_byte_scattered_rw_desc(const struct intel_device_info *devinfo,
881 unsigned exec_size, /**< 0 for SIMD4x2 */
882 unsigned bit_size,
883 bool write)
884 {
885 assert(exec_size <= 8 || exec_size == 16);
886 assert(devinfo->ver >= 8);
887
888 unsigned msg_type =
889 write ? GFX8_DATAPORT_DC_PORT1_A64_SCATTERED_WRITE :
890 GFX9_DATAPORT_DC_PORT1_A64_SCATTERED_READ;
891
892 const unsigned msg_control =
893 SET_BITS(GFX8_A64_SCATTERED_SUBTYPE_BYTE, 1, 0) |
894 SET_BITS(brw_mdc_a64_ds(bit_size / 8), 3, 2) |
895 SET_BITS(exec_size == 16, 4, 4);
896
897 return brw_dp_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
898 msg_type, msg_control);
899 }
900
901 static inline uint32_t
brw_dp_a64_untyped_atomic_desc(const struct intel_device_info * devinfo,ASSERTED unsigned exec_size,unsigned bit_size,unsigned atomic_op,bool response_expected)902 brw_dp_a64_untyped_atomic_desc(const struct intel_device_info *devinfo,
903 ASSERTED unsigned exec_size, /**< 0 for SIMD4x2 */
904 unsigned bit_size,
905 unsigned atomic_op,
906 bool response_expected)
907 {
908 assert(exec_size == 8);
909 assert(devinfo->ver >= 8);
910 assert(bit_size == 16 || bit_size == 32 || bit_size == 64);
911 assert(devinfo->ver >= 12 || bit_size >= 32);
912
913 const unsigned msg_type = bit_size == 16 ?
914 GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_INT_OP :
915 GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_OP;
916
917 const unsigned msg_control =
918 SET_BITS(atomic_op, 3, 0) |
919 SET_BITS(bit_size == 64, 4, 4) |
920 SET_BITS(response_expected, 5, 5);
921
922 return brw_dp_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
923 msg_type, msg_control);
924 }
925
926 static inline uint32_t
brw_dp_a64_untyped_atomic_float_desc(const struct intel_device_info * devinfo,ASSERTED unsigned exec_size,unsigned bit_size,unsigned atomic_op,bool response_expected)927 brw_dp_a64_untyped_atomic_float_desc(const struct intel_device_info *devinfo,
928 ASSERTED unsigned exec_size,
929 unsigned bit_size,
930 unsigned atomic_op,
931 bool response_expected)
932 {
933 assert(exec_size == 8);
934 assert(devinfo->ver >= 9);
935 assert(bit_size == 16 || bit_size == 32);
936 assert(devinfo->ver >= 12 || bit_size == 32);
937
938 assert(exec_size > 0);
939 const unsigned msg_type = bit_size == 32 ?
940 GFX9_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_FLOAT_OP :
941 GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_FLOAT_OP;
942
943 const unsigned msg_control =
944 SET_BITS(atomic_op, 1, 0) |
945 SET_BITS(response_expected, 5, 5);
946
947 return brw_dp_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
948 msg_type, msg_control);
949 }
950
951 static inline uint32_t
brw_dp_typed_atomic_desc(const struct intel_device_info * devinfo,unsigned exec_size,unsigned exec_group,unsigned atomic_op,bool response_expected)952 brw_dp_typed_atomic_desc(const struct intel_device_info *devinfo,
953 unsigned exec_size,
954 unsigned exec_group,
955 unsigned atomic_op,
956 bool response_expected)
957 {
958 assert(exec_size > 0 || exec_group == 0);
959 assert(exec_group % 8 == 0);
960
961 unsigned msg_type;
962 if (devinfo->verx10 >= 75) {
963 if (exec_size == 0) {
964 msg_type = HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2;
965 } else {
966 msg_type = HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP;
967 }
968 } else {
969 /* SIMD4x2 typed surface R/W messages only exist on HSW+ */
970 assert(exec_size > 0);
971 msg_type = GFX7_DATAPORT_RC_TYPED_ATOMIC_OP;
972 }
973
974 const bool high_sample_mask = (exec_group / 8) % 2 == 1;
975
976 const unsigned msg_control =
977 SET_BITS(atomic_op, 3, 0) |
978 SET_BITS(high_sample_mask, 4, 4) |
979 SET_BITS(response_expected, 5, 5);
980
981 return brw_dp_surface_desc(devinfo, msg_type, msg_control);
982 }
983
984 static inline uint32_t
brw_dp_typed_surface_rw_desc(const struct intel_device_info * devinfo,unsigned exec_size,unsigned exec_group,unsigned num_channels,bool write)985 brw_dp_typed_surface_rw_desc(const struct intel_device_info *devinfo,
986 unsigned exec_size,
987 unsigned exec_group,
988 unsigned num_channels,
989 bool write)
990 {
991 assert(exec_size > 0 || exec_group == 0);
992 assert(exec_group % 8 == 0);
993
994 /* Typed surface reads and writes don't support SIMD16 */
995 assert(exec_size <= 8);
996
997 unsigned msg_type;
998 if (write) {
999 if (devinfo->verx10 >= 75) {
1000 msg_type = HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_WRITE;
1001 } else {
1002 msg_type = GFX7_DATAPORT_RC_TYPED_SURFACE_WRITE;
1003 }
1004 } else {
1005 if (devinfo->verx10 >= 75) {
1006 msg_type = HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_READ;
1007 } else {
1008 msg_type = GFX7_DATAPORT_RC_TYPED_SURFACE_READ;
1009 }
1010 }
1011
1012 /* See also MDC_SG3 in the SKL PRM Vol 2d. */
1013 unsigned msg_control;
1014 if (devinfo->verx10 >= 75) {
1015 /* See also MDC_SG3 in the SKL PRM Vol 2d. */
1016 const unsigned slot_group = exec_size == 0 ? 0 : /* SIMD4x2 */
1017 1 + ((exec_group / 8) % 2);
1018
1019 msg_control =
1020 SET_BITS(brw_mdc_cmask(num_channels), 3, 0) |
1021 SET_BITS(slot_group, 5, 4);
1022 } else {
1023 /* SIMD4x2 typed surface R/W messages only exist on HSW+ */
1024 assert(exec_size > 0);
1025 const unsigned slot_group = ((exec_group / 8) % 2);
1026
1027 msg_control =
1028 SET_BITS(brw_mdc_cmask(num_channels), 3, 0) |
1029 SET_BITS(slot_group, 5, 5);
1030 }
1031
1032 return brw_dp_surface_desc(devinfo, msg_type, msg_control);
1033 }
1034
1035 static inline uint32_t
brw_fb_desc(const struct intel_device_info * devinfo,unsigned binding_table_index,unsigned msg_type,unsigned msg_control)1036 brw_fb_desc(const struct intel_device_info *devinfo,
1037 unsigned binding_table_index,
1038 unsigned msg_type,
1039 unsigned msg_control)
1040 {
1041 /* Prior to gen6, things are too inconsistent; use the fb_(read|write)_desc
1042 * helpers instead.
1043 */
1044 assert(devinfo->ver >= 6);
1045 const unsigned desc = SET_BITS(binding_table_index, 7, 0);
1046 if (devinfo->ver >= 7) {
1047 return (desc | SET_BITS(msg_control, 13, 8) |
1048 SET_BITS(msg_type, 17, 14));
1049 } else {
1050 return (desc | SET_BITS(msg_control, 12, 8) |
1051 SET_BITS(msg_type, 16, 13));
1052 }
1053 }
1054
1055 static inline unsigned
brw_fb_desc_binding_table_index(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1056 brw_fb_desc_binding_table_index(UNUSED const struct intel_device_info *devinfo,
1057 uint32_t desc)
1058 {
1059 return GET_BITS(desc, 7, 0);
1060 }
1061
1062 static inline uint32_t
brw_fb_desc_msg_control(const struct intel_device_info * devinfo,uint32_t desc)1063 brw_fb_desc_msg_control(const struct intel_device_info *devinfo, uint32_t desc)
1064 {
1065 assert(devinfo->ver >= 6);
1066 if (devinfo->ver >= 7)
1067 return GET_BITS(desc, 13, 8);
1068 else
1069 return GET_BITS(desc, 12, 8);
1070 }
1071
1072 static inline unsigned
brw_fb_desc_msg_type(const struct intel_device_info * devinfo,uint32_t desc)1073 brw_fb_desc_msg_type(const struct intel_device_info *devinfo, uint32_t desc)
1074 {
1075 assert(devinfo->ver >= 6);
1076 if (devinfo->ver >= 7)
1077 return GET_BITS(desc, 17, 14);
1078 else
1079 return GET_BITS(desc, 16, 13);
1080 }
1081
1082 static inline uint32_t
brw_fb_read_desc(const struct intel_device_info * devinfo,unsigned binding_table_index,unsigned msg_control,unsigned exec_size,bool per_sample)1083 brw_fb_read_desc(const struct intel_device_info *devinfo,
1084 unsigned binding_table_index,
1085 unsigned msg_control,
1086 unsigned exec_size,
1087 bool per_sample)
1088 {
1089 assert(devinfo->ver >= 9);
1090 assert(exec_size == 8 || exec_size == 16);
1091
1092 return brw_fb_desc(devinfo, binding_table_index,
1093 GFX9_DATAPORT_RC_RENDER_TARGET_READ, msg_control) |
1094 SET_BITS(per_sample, 13, 13) |
1095 SET_BITS(exec_size == 8, 8, 8) /* Render Target Message Subtype */;
1096 }
1097
1098 static inline uint32_t
brw_fb_write_desc(const struct intel_device_info * devinfo,unsigned binding_table_index,unsigned msg_control,bool last_render_target,bool coarse_write)1099 brw_fb_write_desc(const struct intel_device_info *devinfo,
1100 unsigned binding_table_index,
1101 unsigned msg_control,
1102 bool last_render_target,
1103 bool coarse_write)
1104 {
1105 const unsigned msg_type =
1106 devinfo->ver >= 6 ?
1107 GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE :
1108 BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE;
1109
1110 assert(devinfo->ver >= 10 || !coarse_write);
1111
1112 if (devinfo->ver >= 6) {
1113 return brw_fb_desc(devinfo, binding_table_index, msg_type, msg_control) |
1114 SET_BITS(last_render_target, 12, 12) |
1115 SET_BITS(coarse_write, 18, 18);
1116 } else {
1117 return (SET_BITS(binding_table_index, 7, 0) |
1118 SET_BITS(msg_control, 11, 8) |
1119 SET_BITS(last_render_target, 11, 11) |
1120 SET_BITS(msg_type, 14, 12));
1121 }
1122 }
1123
1124 static inline unsigned
brw_fb_write_desc_msg_type(const struct intel_device_info * devinfo,uint32_t desc)1125 brw_fb_write_desc_msg_type(const struct intel_device_info *devinfo,
1126 uint32_t desc)
1127 {
1128 if (devinfo->ver >= 6)
1129 return brw_fb_desc_msg_type(devinfo, desc);
1130 else
1131 return GET_BITS(desc, 14, 12);
1132 }
1133
1134 static inline unsigned
brw_fb_write_desc_msg_control(const struct intel_device_info * devinfo,uint32_t desc)1135 brw_fb_write_desc_msg_control(const struct intel_device_info *devinfo,
1136 uint32_t desc)
1137 {
1138 if (devinfo->ver >= 6)
1139 return brw_fb_desc_msg_control(devinfo, desc);
1140 else
1141 return GET_BITS(desc, 11, 8);
1142 }
1143
1144 static inline bool
brw_fb_write_desc_last_render_target(const struct intel_device_info * devinfo,uint32_t desc)1145 brw_fb_write_desc_last_render_target(const struct intel_device_info *devinfo,
1146 uint32_t desc)
1147 {
1148 if (devinfo->ver >= 6)
1149 return GET_BITS(desc, 12, 12);
1150 else
1151 return GET_BITS(desc, 11, 11);
1152 }
1153
1154 static inline bool
brw_fb_write_desc_write_commit(const struct intel_device_info * devinfo,uint32_t desc)1155 brw_fb_write_desc_write_commit(const struct intel_device_info *devinfo,
1156 uint32_t desc)
1157 {
1158 assert(devinfo->ver <= 6);
1159 if (devinfo->ver >= 6)
1160 return GET_BITS(desc, 17, 17);
1161 else
1162 return GET_BITS(desc, 15, 15);
1163 }
1164
1165 static inline bool
brw_fb_write_desc_coarse_write(const struct intel_device_info * devinfo,uint32_t desc)1166 brw_fb_write_desc_coarse_write(const struct intel_device_info *devinfo,
1167 uint32_t desc)
1168 {
1169 assert(devinfo->ver >= 10);
1170 return GET_BITS(desc, 18, 18);
1171 }
1172
1173 static inline bool
lsc_opcode_has_cmask(enum lsc_opcode opcode)1174 lsc_opcode_has_cmask(enum lsc_opcode opcode)
1175 {
1176 return opcode == LSC_OP_LOAD_CMASK || opcode == LSC_OP_STORE_CMASK;
1177 }
1178
1179 static inline bool
lsc_opcode_has_transpose(enum lsc_opcode opcode)1180 lsc_opcode_has_transpose(enum lsc_opcode opcode)
1181 {
1182 return opcode == LSC_OP_LOAD || opcode == LSC_OP_STORE;
1183 }
1184
1185 static inline uint32_t
lsc_data_size_bytes(enum lsc_data_size data_size)1186 lsc_data_size_bytes(enum lsc_data_size data_size)
1187 {
1188 switch (data_size) {
1189 case LSC_DATA_SIZE_D8:
1190 return 1;
1191 case LSC_DATA_SIZE_D16:
1192 return 2;
1193 case LSC_DATA_SIZE_D32:
1194 case LSC_DATA_SIZE_D8U32:
1195 case LSC_DATA_SIZE_D16U32:
1196 case LSC_DATA_SIZE_D16BF32:
1197 return 4;
1198 case LSC_DATA_SIZE_D64:
1199 return 8;
1200 default:
1201 unreachable("Unsupported data payload size.");
1202 }
1203 }
1204
1205 static inline uint32_t
lsc_addr_size_bytes(enum lsc_addr_size addr_size)1206 lsc_addr_size_bytes(enum lsc_addr_size addr_size)
1207 {
1208 switch (addr_size) {
1209 case LSC_ADDR_SIZE_A16: return 2;
1210 case LSC_ADDR_SIZE_A32: return 4;
1211 case LSC_ADDR_SIZE_A64: return 8;
1212 default:
1213 unreachable("Unsupported address size.");
1214 }
1215 }
1216
1217 static inline uint32_t
lsc_vector_length(enum lsc_vect_size vect_size)1218 lsc_vector_length(enum lsc_vect_size vect_size)
1219 {
1220 switch (vect_size) {
1221 case LSC_VECT_SIZE_V1: return 1;
1222 case LSC_VECT_SIZE_V2: return 2;
1223 case LSC_VECT_SIZE_V3: return 3;
1224 case LSC_VECT_SIZE_V4: return 4;
1225 case LSC_VECT_SIZE_V8: return 8;
1226 case LSC_VECT_SIZE_V16: return 16;
1227 case LSC_VECT_SIZE_V32: return 32;
1228 case LSC_VECT_SIZE_V64: return 64;
1229 default:
1230 unreachable("Unsupported size of vector");
1231 }
1232 }
1233
1234 static inline enum lsc_vect_size
lsc_vect_size(unsigned vect_size)1235 lsc_vect_size(unsigned vect_size)
1236 {
1237 switch(vect_size) {
1238 case 1: return LSC_VECT_SIZE_V1;
1239 case 2: return LSC_VECT_SIZE_V2;
1240 case 3: return LSC_VECT_SIZE_V3;
1241 case 4: return LSC_VECT_SIZE_V4;
1242 case 8: return LSC_VECT_SIZE_V8;
1243 case 16: return LSC_VECT_SIZE_V16;
1244 case 32: return LSC_VECT_SIZE_V32;
1245 case 64: return LSC_VECT_SIZE_V64;
1246 default:
1247 unreachable("Unsupported vector size for dataport");
1248 }
1249 }
1250
1251 static inline uint32_t
lsc_msg_desc(UNUSED const struct intel_device_info * devinfo,enum lsc_opcode opcode,unsigned simd_size,enum lsc_addr_surface_type addr_type,enum lsc_addr_size addr_sz,unsigned num_coordinates,enum lsc_data_size data_sz,unsigned num_channels,bool transpose,unsigned cache_ctrl,bool has_dest)1252 lsc_msg_desc(UNUSED const struct intel_device_info *devinfo,
1253 enum lsc_opcode opcode, unsigned simd_size,
1254 enum lsc_addr_surface_type addr_type,
1255 enum lsc_addr_size addr_sz, unsigned num_coordinates,
1256 enum lsc_data_size data_sz, unsigned num_channels,
1257 bool transpose, unsigned cache_ctrl, bool has_dest)
1258 {
1259 assert(devinfo->has_lsc);
1260
1261 unsigned dest_length = !has_dest ? 0 :
1262 DIV_ROUND_UP(lsc_data_size_bytes(data_sz) * num_channels * simd_size,
1263 REG_SIZE);
1264
1265 unsigned src0_length =
1266 DIV_ROUND_UP(lsc_addr_size_bytes(addr_sz) * num_coordinates * simd_size,
1267 REG_SIZE);
1268
1269 assert(!transpose || lsc_opcode_has_transpose(opcode));
1270
1271 unsigned msg_desc =
1272 SET_BITS(opcode, 5, 0) |
1273 SET_BITS(addr_sz, 8, 7) |
1274 SET_BITS(data_sz, 11, 9) |
1275 SET_BITS(transpose, 15, 15) |
1276 SET_BITS(cache_ctrl, 19, 17) |
1277 SET_BITS(dest_length, 24, 20) |
1278 SET_BITS(src0_length, 28, 25) |
1279 SET_BITS(addr_type, 30, 29);
1280
1281 if (lsc_opcode_has_cmask(opcode))
1282 msg_desc |= SET_BITS(lsc_cmask(num_channels), 15, 12);
1283 else
1284 msg_desc |= SET_BITS(lsc_vect_size(num_channels), 14, 12);
1285
1286 return msg_desc;
1287 }
1288
1289 static inline enum lsc_opcode
lsc_msg_desc_opcode(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1290 lsc_msg_desc_opcode(UNUSED const struct intel_device_info *devinfo,
1291 uint32_t desc)
1292 {
1293 assert(devinfo->has_lsc);
1294 return (enum lsc_opcode) GET_BITS(desc, 5, 0);
1295 }
1296
1297 static inline enum lsc_addr_size
lsc_msg_desc_addr_size(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1298 lsc_msg_desc_addr_size(UNUSED const struct intel_device_info *devinfo,
1299 uint32_t desc)
1300 {
1301 assert(devinfo->has_lsc);
1302 return (enum lsc_addr_size) GET_BITS(desc, 8, 7);
1303 }
1304
1305 static inline enum lsc_data_size
lsc_msg_desc_data_size(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1306 lsc_msg_desc_data_size(UNUSED const struct intel_device_info *devinfo,
1307 uint32_t desc)
1308 {
1309 assert(devinfo->has_lsc);
1310 return (enum lsc_data_size) GET_BITS(desc, 11, 9);
1311 }
1312
1313 static inline enum lsc_vect_size
lsc_msg_desc_vect_size(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1314 lsc_msg_desc_vect_size(UNUSED const struct intel_device_info *devinfo,
1315 uint32_t desc)
1316 {
1317 assert(devinfo->has_lsc);
1318 assert(!lsc_opcode_has_cmask(lsc_msg_desc_opcode(devinfo, desc)));
1319 return (enum lsc_vect_size) GET_BITS(desc, 14, 12);
1320 }
1321
1322 static inline enum lsc_cmask
lsc_msg_desc_cmask(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1323 lsc_msg_desc_cmask(UNUSED const struct intel_device_info *devinfo,
1324 uint32_t desc)
1325 {
1326 assert(devinfo->has_lsc);
1327 assert(lsc_opcode_has_cmask(lsc_msg_desc_opcode(devinfo, desc)));
1328 return (enum lsc_cmask) GET_BITS(desc, 15, 12);
1329 }
1330
1331 static inline bool
lsc_msg_desc_transpose(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1332 lsc_msg_desc_transpose(UNUSED const struct intel_device_info *devinfo,
1333 uint32_t desc)
1334 {
1335 assert(devinfo->has_lsc);
1336 return GET_BITS(desc, 15, 15);
1337 }
1338
1339 static inline unsigned
lsc_msg_desc_cache_ctrl(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1340 lsc_msg_desc_cache_ctrl(UNUSED const struct intel_device_info *devinfo,
1341 uint32_t desc)
1342 {
1343 assert(devinfo->has_lsc);
1344 return GET_BITS(desc, 19, 17);
1345 }
1346
1347 static inline unsigned
lsc_msg_desc_dest_len(const struct intel_device_info * devinfo,uint32_t desc)1348 lsc_msg_desc_dest_len(const struct intel_device_info *devinfo,
1349 uint32_t desc)
1350 {
1351 assert(devinfo->has_lsc);
1352 return GET_BITS(desc, 24, 20);
1353 }
1354
1355 static inline unsigned
lsc_msg_desc_src0_len(const struct intel_device_info * devinfo,uint32_t desc)1356 lsc_msg_desc_src0_len(const struct intel_device_info *devinfo,
1357 uint32_t desc)
1358 {
1359 assert(devinfo->has_lsc);
1360 return GET_BITS(desc, 28, 25);
1361 }
1362
1363 static inline enum lsc_addr_surface_type
lsc_msg_desc_addr_type(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1364 lsc_msg_desc_addr_type(UNUSED const struct intel_device_info *devinfo,
1365 uint32_t desc)
1366 {
1367 assert(devinfo->has_lsc);
1368 return (enum lsc_addr_surface_type) GET_BITS(desc, 30, 29);
1369 }
1370
1371 static inline uint32_t
lsc_fence_msg_desc(UNUSED const struct intel_device_info * devinfo,enum lsc_fence_scope scope,enum lsc_flush_type flush_type,bool route_to_lsc)1372 lsc_fence_msg_desc(UNUSED const struct intel_device_info *devinfo,
1373 enum lsc_fence_scope scope,
1374 enum lsc_flush_type flush_type,
1375 bool route_to_lsc)
1376 {
1377 assert(devinfo->has_lsc);
1378 return SET_BITS(LSC_OP_FENCE, 5, 0) |
1379 SET_BITS(LSC_ADDR_SIZE_A32, 8, 7) |
1380 SET_BITS(scope, 11, 9) |
1381 SET_BITS(flush_type, 14, 12) |
1382 SET_BITS(route_to_lsc, 18, 18) |
1383 SET_BITS(LSC_ADDR_SURFTYPE_FLAT, 30, 29);
1384 }
1385
1386 static inline enum lsc_fence_scope
lsc_fence_msg_desc_scope(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1387 lsc_fence_msg_desc_scope(UNUSED const struct intel_device_info *devinfo,
1388 uint32_t desc)
1389 {
1390 assert(devinfo->has_lsc);
1391 return (enum lsc_fence_scope) GET_BITS(desc, 11, 9);
1392 }
1393
1394 static inline enum lsc_flush_type
lsc_fence_msg_desc_flush_type(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1395 lsc_fence_msg_desc_flush_type(UNUSED const struct intel_device_info *devinfo,
1396 uint32_t desc)
1397 {
1398 assert(devinfo->has_lsc);
1399 return (enum lsc_flush_type) GET_BITS(desc, 14, 12);
1400 }
1401
1402 static inline enum lsc_backup_fence_routing
lsc_fence_msg_desc_backup_routing(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1403 lsc_fence_msg_desc_backup_routing(UNUSED const struct intel_device_info *devinfo,
1404 uint32_t desc)
1405 {
1406 assert(devinfo->has_lsc);
1407 return (enum lsc_backup_fence_routing) GET_BITS(desc, 18, 18);
1408 }
1409
1410 static inline uint32_t
lsc_bti_ex_desc(const struct intel_device_info * devinfo,unsigned bti)1411 lsc_bti_ex_desc(const struct intel_device_info *devinfo, unsigned bti)
1412 {
1413 assert(devinfo->has_lsc);
1414 return SET_BITS(bti, 31, 24) |
1415 SET_BITS(0, 23, 12); /* base offset */
1416 }
1417
1418 static inline unsigned
lsc_bti_ex_desc_base_offset(const struct intel_device_info * devinfo,uint32_t ex_desc)1419 lsc_bti_ex_desc_base_offset(const struct intel_device_info *devinfo,
1420 uint32_t ex_desc)
1421 {
1422 assert(devinfo->has_lsc);
1423 return GET_BITS(ex_desc, 23, 12);
1424 }
1425
1426 static inline unsigned
lsc_bti_ex_desc_index(const struct intel_device_info * devinfo,uint32_t ex_desc)1427 lsc_bti_ex_desc_index(const struct intel_device_info *devinfo,
1428 uint32_t ex_desc)
1429 {
1430 assert(devinfo->has_lsc);
1431 return GET_BITS(ex_desc, 31, 24);
1432 }
1433
1434 static inline unsigned
lsc_flat_ex_desc_base_offset(const struct intel_device_info * devinfo,uint32_t ex_desc)1435 lsc_flat_ex_desc_base_offset(const struct intel_device_info *devinfo,
1436 uint32_t ex_desc)
1437 {
1438 assert(devinfo->has_lsc);
1439 return GET_BITS(ex_desc, 31, 12);
1440 }
1441
1442 static inline uint32_t
lsc_bss_ex_desc(const struct intel_device_info * devinfo,unsigned surface_state_index)1443 lsc_bss_ex_desc(const struct intel_device_info *devinfo,
1444 unsigned surface_state_index)
1445 {
1446 assert(devinfo->has_lsc);
1447 return SET_BITS(surface_state_index, 31, 6);
1448 }
1449
1450 static inline unsigned
lsc_bss_ex_desc_index(const struct intel_device_info * devinfo,uint32_t ex_desc)1451 lsc_bss_ex_desc_index(const struct intel_device_info *devinfo,
1452 uint32_t ex_desc)
1453 {
1454 assert(devinfo->has_lsc);
1455 return GET_BITS(ex_desc, 31, 6);
1456 }
1457
1458 static inline uint32_t
brw_mdc_sm2(unsigned exec_size)1459 brw_mdc_sm2(unsigned exec_size)
1460 {
1461 assert(exec_size == 8 || exec_size == 16);
1462 return exec_size > 8;
1463 }
1464
1465 static inline uint32_t
brw_mdc_sm2_exec_size(uint32_t sm2)1466 brw_mdc_sm2_exec_size(uint32_t sm2)
1467 {
1468 assert(sm2 <= 1);
1469 return 8 << sm2;
1470 }
1471
1472 static inline uint32_t
brw_btd_spawn_desc(ASSERTED const struct intel_device_info * devinfo,unsigned exec_size,unsigned msg_type)1473 brw_btd_spawn_desc(ASSERTED const struct intel_device_info *devinfo,
1474 unsigned exec_size, unsigned msg_type)
1475 {
1476 assert(devinfo->has_ray_tracing);
1477
1478 return SET_BITS(0, 19, 19) | /* No header */
1479 SET_BITS(msg_type, 17, 14) |
1480 SET_BITS(brw_mdc_sm2(exec_size), 8, 8);
1481 }
1482
1483 static inline uint32_t
brw_btd_spawn_msg_type(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1484 brw_btd_spawn_msg_type(UNUSED const struct intel_device_info *devinfo,
1485 uint32_t desc)
1486 {
1487 return GET_BITS(desc, 17, 14);
1488 }
1489
1490 static inline uint32_t
brw_btd_spawn_exec_size(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1491 brw_btd_spawn_exec_size(UNUSED const struct intel_device_info *devinfo,
1492 uint32_t desc)
1493 {
1494 return brw_mdc_sm2_exec_size(GET_BITS(desc, 8, 8));
1495 }
1496
1497 static inline uint32_t
brw_rt_trace_ray_desc(ASSERTED const struct intel_device_info * devinfo,unsigned exec_size)1498 brw_rt_trace_ray_desc(ASSERTED const struct intel_device_info *devinfo,
1499 unsigned exec_size)
1500 {
1501 assert(devinfo->has_ray_tracing);
1502
1503 return SET_BITS(0, 19, 19) | /* No header */
1504 SET_BITS(0, 17, 14) | /* Message type */
1505 SET_BITS(brw_mdc_sm2(exec_size), 8, 8);
1506 }
1507
1508 static inline uint32_t
brw_rt_trace_ray_desc_exec_size(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1509 brw_rt_trace_ray_desc_exec_size(UNUSED const struct intel_device_info *devinfo,
1510 uint32_t desc)
1511 {
1512 return brw_mdc_sm2_exec_size(GET_BITS(desc, 8, 8));
1513 }
1514
1515 /**
1516 * Construct a message descriptor immediate with the specified pixel
1517 * interpolator function controls.
1518 */
1519 static inline uint32_t
brw_pixel_interp_desc(UNUSED const struct intel_device_info * devinfo,unsigned msg_type,bool noperspective,bool coarse_pixel_rate,unsigned simd_mode,unsigned slot_group)1520 brw_pixel_interp_desc(UNUSED const struct intel_device_info *devinfo,
1521 unsigned msg_type,
1522 bool noperspective,
1523 bool coarse_pixel_rate,
1524 unsigned simd_mode,
1525 unsigned slot_group)
1526 {
1527 assert(devinfo->ver >= 10 || !coarse_pixel_rate);
1528 return (SET_BITS(slot_group, 11, 11) |
1529 SET_BITS(msg_type, 13, 12) |
1530 SET_BITS(!!noperspective, 14, 14) |
1531 SET_BITS(coarse_pixel_rate, 15, 15) |
1532 SET_BITS(simd_mode, 16, 16));
1533 }
1534
1535 void brw_urb_WRITE(struct brw_codegen *p,
1536 struct brw_reg dest,
1537 unsigned msg_reg_nr,
1538 struct brw_reg src0,
1539 enum brw_urb_write_flags flags,
1540 unsigned msg_length,
1541 unsigned response_length,
1542 unsigned offset,
1543 unsigned swizzle);
1544
1545 /**
1546 * Send message to shared unit \p sfid with a possibly indirect descriptor \p
1547 * desc. If \p desc is not an immediate it will be transparently loaded to an
1548 * address register using an OR instruction.
1549 */
1550 void
1551 brw_send_indirect_message(struct brw_codegen *p,
1552 unsigned sfid,
1553 struct brw_reg dst,
1554 struct brw_reg payload,
1555 struct brw_reg desc,
1556 unsigned desc_imm,
1557 bool eot);
1558
1559 void
1560 brw_send_indirect_split_message(struct brw_codegen *p,
1561 unsigned sfid,
1562 struct brw_reg dst,
1563 struct brw_reg payload0,
1564 struct brw_reg payload1,
1565 struct brw_reg desc,
1566 unsigned desc_imm,
1567 struct brw_reg ex_desc,
1568 unsigned ex_desc_imm,
1569 bool eot);
1570
1571 void brw_ff_sync(struct brw_codegen *p,
1572 struct brw_reg dest,
1573 unsigned msg_reg_nr,
1574 struct brw_reg src0,
1575 bool allocate,
1576 unsigned response_length,
1577 bool eot);
1578
1579 void brw_svb_write(struct brw_codegen *p,
1580 struct brw_reg dest,
1581 unsigned msg_reg_nr,
1582 struct brw_reg src0,
1583 unsigned binding_table_index,
1584 bool send_commit_msg);
1585
1586 brw_inst *brw_fb_WRITE(struct brw_codegen *p,
1587 struct brw_reg payload,
1588 struct brw_reg implied_header,
1589 unsigned msg_control,
1590 unsigned binding_table_index,
1591 unsigned msg_length,
1592 unsigned response_length,
1593 bool eot,
1594 bool last_render_target,
1595 bool header_present);
1596
1597 brw_inst *gfx9_fb_READ(struct brw_codegen *p,
1598 struct brw_reg dst,
1599 struct brw_reg payload,
1600 unsigned binding_table_index,
1601 unsigned msg_length,
1602 unsigned response_length,
1603 bool per_sample);
1604
1605 void brw_SAMPLE(struct brw_codegen *p,
1606 struct brw_reg dest,
1607 unsigned msg_reg_nr,
1608 struct brw_reg src0,
1609 unsigned binding_table_index,
1610 unsigned sampler,
1611 unsigned msg_type,
1612 unsigned response_length,
1613 unsigned msg_length,
1614 unsigned header_present,
1615 unsigned simd_mode,
1616 unsigned return_format);
1617
1618 void brw_adjust_sampler_state_pointer(struct brw_codegen *p,
1619 struct brw_reg header,
1620 struct brw_reg sampler_index);
1621
1622 void gfx4_math(struct brw_codegen *p,
1623 struct brw_reg dest,
1624 unsigned function,
1625 unsigned msg_reg_nr,
1626 struct brw_reg src,
1627 unsigned precision );
1628
1629 void gfx6_math(struct brw_codegen *p,
1630 struct brw_reg dest,
1631 unsigned function,
1632 struct brw_reg src0,
1633 struct brw_reg src1);
1634
1635 void brw_oword_block_read(struct brw_codegen *p,
1636 struct brw_reg dest,
1637 struct brw_reg mrf,
1638 uint32_t offset,
1639 uint32_t bind_table_index);
1640
1641 unsigned brw_scratch_surface_idx(const struct brw_codegen *p);
1642
1643 void brw_oword_block_read_scratch(struct brw_codegen *p,
1644 struct brw_reg dest,
1645 struct brw_reg mrf,
1646 int num_regs,
1647 unsigned offset);
1648
1649 void brw_oword_block_write_scratch(struct brw_codegen *p,
1650 struct brw_reg mrf,
1651 int num_regs,
1652 unsigned offset);
1653
1654 void gfx7_block_read_scratch(struct brw_codegen *p,
1655 struct brw_reg dest,
1656 int num_regs,
1657 unsigned offset);
1658
1659 void brw_shader_time_add(struct brw_codegen *p,
1660 struct brw_reg payload,
1661 uint32_t surf_index);
1662
1663 /**
1664 * Return the generation-specific jump distance scaling factor.
1665 *
1666 * Given the number of instructions to jump, we need to scale by
1667 * some number to obtain the actual jump distance to program in an
1668 * instruction.
1669 */
1670 static inline unsigned
brw_jump_scale(const struct intel_device_info * devinfo)1671 brw_jump_scale(const struct intel_device_info *devinfo)
1672 {
1673 /* Broadwell measures jump targets in bytes. */
1674 if (devinfo->ver >= 8)
1675 return 16;
1676
1677 /* Ironlake and later measure jump targets in 64-bit data chunks (in order
1678 * (to support compaction), so each 128-bit instruction requires 2 chunks.
1679 */
1680 if (devinfo->ver >= 5)
1681 return 2;
1682
1683 /* Gfx4 simply uses the number of 128-bit instructions. */
1684 return 1;
1685 }
1686
1687 void brw_barrier(struct brw_codegen *p, struct brw_reg src);
1688
1689 /* If/else/endif. Works by manipulating the execution flags on each
1690 * channel.
1691 */
1692 brw_inst *brw_IF(struct brw_codegen *p, unsigned execute_size);
1693 brw_inst *gfx6_IF(struct brw_codegen *p, enum brw_conditional_mod conditional,
1694 struct brw_reg src0, struct brw_reg src1);
1695
1696 void brw_ELSE(struct brw_codegen *p);
1697 void brw_ENDIF(struct brw_codegen *p);
1698
1699 /* DO/WHILE loops:
1700 */
1701 brw_inst *brw_DO(struct brw_codegen *p, unsigned execute_size);
1702
1703 brw_inst *brw_WHILE(struct brw_codegen *p);
1704
1705 brw_inst *brw_BREAK(struct brw_codegen *p);
1706 brw_inst *brw_CONT(struct brw_codegen *p);
1707 brw_inst *brw_HALT(struct brw_codegen *p);
1708
1709 /* Forward jumps:
1710 */
1711 void brw_land_fwd_jump(struct brw_codegen *p, int jmp_insn_idx);
1712
1713 brw_inst *brw_JMPI(struct brw_codegen *p, struct brw_reg index,
1714 unsigned predicate_control);
1715
1716 void brw_NOP(struct brw_codegen *p);
1717
1718 void brw_WAIT(struct brw_codegen *p);
1719
1720 void brw_SYNC(struct brw_codegen *p, enum tgl_sync_function func);
1721
1722 /* Special case: there is never a destination, execution size will be
1723 * taken from src0:
1724 */
1725 void brw_CMP(struct brw_codegen *p,
1726 struct brw_reg dest,
1727 unsigned conditional,
1728 struct brw_reg src0,
1729 struct brw_reg src1);
1730
1731 void brw_CMPN(struct brw_codegen *p,
1732 struct brw_reg dest,
1733 unsigned conditional,
1734 struct brw_reg src0,
1735 struct brw_reg src1);
1736
1737 void
1738 brw_untyped_atomic(struct brw_codegen *p,
1739 struct brw_reg dst,
1740 struct brw_reg payload,
1741 struct brw_reg surface,
1742 unsigned atomic_op,
1743 unsigned msg_length,
1744 bool response_expected,
1745 bool header_present);
1746
1747 void
1748 brw_untyped_surface_read(struct brw_codegen *p,
1749 struct brw_reg dst,
1750 struct brw_reg payload,
1751 struct brw_reg surface,
1752 unsigned msg_length,
1753 unsigned num_channels);
1754
1755 void
1756 brw_untyped_surface_write(struct brw_codegen *p,
1757 struct brw_reg payload,
1758 struct brw_reg surface,
1759 unsigned msg_length,
1760 unsigned num_channels,
1761 bool header_present);
1762
1763 void
1764 brw_memory_fence(struct brw_codegen *p,
1765 struct brw_reg dst,
1766 struct brw_reg src,
1767 enum opcode send_op,
1768 enum brw_message_target sfid,
1769 bool commit_enable,
1770 unsigned bti);
1771
1772 void
1773 brw_pixel_interpolator_query(struct brw_codegen *p,
1774 struct brw_reg dest,
1775 struct brw_reg mrf,
1776 bool noperspective,
1777 bool coarse_pixel_rate,
1778 unsigned mode,
1779 struct brw_reg data,
1780 unsigned msg_length,
1781 unsigned response_length);
1782
1783 void
1784 brw_find_live_channel(struct brw_codegen *p,
1785 struct brw_reg dst,
1786 struct brw_reg mask);
1787
1788 void
1789 brw_broadcast(struct brw_codegen *p,
1790 struct brw_reg dst,
1791 struct brw_reg src,
1792 struct brw_reg idx);
1793
1794 void
1795 brw_float_controls_mode(struct brw_codegen *p,
1796 unsigned mode, unsigned mask);
1797
1798 void
1799 brw_update_reloc_imm(const struct intel_device_info *devinfo,
1800 brw_inst *inst,
1801 uint32_t value);
1802
1803 void
1804 brw_MOV_reloc_imm(struct brw_codegen *p,
1805 struct brw_reg dst,
1806 enum brw_reg_type src_type,
1807 uint32_t id);
1808
1809 /***********************************************************************
1810 * brw_eu_util.c:
1811 */
1812
1813 void brw_copy_indirect_to_indirect(struct brw_codegen *p,
1814 struct brw_indirect dst_ptr,
1815 struct brw_indirect src_ptr,
1816 unsigned count);
1817
1818 void brw_copy_from_indirect(struct brw_codegen *p,
1819 struct brw_reg dst,
1820 struct brw_indirect ptr,
1821 unsigned count);
1822
1823 void brw_copy4(struct brw_codegen *p,
1824 struct brw_reg dst,
1825 struct brw_reg src,
1826 unsigned count);
1827
1828 void brw_copy8(struct brw_codegen *p,
1829 struct brw_reg dst,
1830 struct brw_reg src,
1831 unsigned count);
1832
1833 void brw_math_invert( struct brw_codegen *p,
1834 struct brw_reg dst,
1835 struct brw_reg src);
1836
1837 void brw_set_src1(struct brw_codegen *p, brw_inst *insn, struct brw_reg reg);
1838
1839 void brw_set_desc_ex(struct brw_codegen *p, brw_inst *insn,
1840 unsigned desc, unsigned ex_desc);
1841
1842 static inline void
brw_set_desc(struct brw_codegen * p,brw_inst * insn,unsigned desc)1843 brw_set_desc(struct brw_codegen *p, brw_inst *insn, unsigned desc)
1844 {
1845 brw_set_desc_ex(p, insn, desc, 0);
1846 }
1847
1848 void brw_set_uip_jip(struct brw_codegen *p, int start_offset);
1849
1850 enum brw_conditional_mod brw_negate_cmod(enum brw_conditional_mod cmod);
1851 enum brw_conditional_mod brw_swap_cmod(enum brw_conditional_mod cmod);
1852
1853 /* brw_eu_compact.c */
1854 void brw_compact_instructions(struct brw_codegen *p, int start_offset,
1855 struct disasm_info *disasm);
1856 void brw_uncompact_instruction(const struct intel_device_info *devinfo,
1857 brw_inst *dst, brw_compact_inst *src);
1858 bool brw_try_compact_instruction(const struct intel_device_info *devinfo,
1859 brw_compact_inst *dst, const brw_inst *src);
1860
1861 void brw_debug_compact_uncompact(const struct intel_device_info *devinfo,
1862 brw_inst *orig, brw_inst *uncompacted);
1863
1864 /* brw_eu_validate.c */
1865 bool brw_validate_instruction(const struct intel_device_info *devinfo,
1866 const brw_inst *inst, int offset,
1867 struct disasm_info *disasm);
1868 bool brw_validate_instructions(const struct intel_device_info *devinfo,
1869 const void *assembly, int start_offset, int end_offset,
1870 struct disasm_info *disasm);
1871
1872 static inline int
next_offset(const struct intel_device_info * devinfo,void * store,int offset)1873 next_offset(const struct intel_device_info *devinfo, void *store, int offset)
1874 {
1875 brw_inst *insn = (brw_inst *)((char *)store + offset);
1876
1877 if (brw_inst_cmpt_control(devinfo, insn))
1878 return offset + 8;
1879 else
1880 return offset + 16;
1881 }
1882
1883 struct opcode_desc {
1884 unsigned ir;
1885 unsigned hw;
1886 const char *name;
1887 int nsrc;
1888 int ndst;
1889 int gfx_vers;
1890 };
1891
1892 const struct opcode_desc *
1893 brw_opcode_desc(const struct intel_device_info *devinfo, enum opcode opcode);
1894
1895 const struct opcode_desc *
1896 brw_opcode_desc_from_hw(const struct intel_device_info *devinfo, unsigned hw);
1897
1898 static inline unsigned
brw_opcode_encode(const struct intel_device_info * devinfo,enum opcode opcode)1899 brw_opcode_encode(const struct intel_device_info *devinfo, enum opcode opcode)
1900 {
1901 return brw_opcode_desc(devinfo, opcode)->hw;
1902 }
1903
1904 static inline enum opcode
brw_opcode_decode(const struct intel_device_info * devinfo,unsigned hw)1905 brw_opcode_decode(const struct intel_device_info *devinfo, unsigned hw)
1906 {
1907 const struct opcode_desc *desc = brw_opcode_desc_from_hw(devinfo, hw);
1908 return desc ? (enum opcode)desc->ir : BRW_OPCODE_ILLEGAL;
1909 }
1910
1911 static inline void
brw_inst_set_opcode(const struct intel_device_info * devinfo,brw_inst * inst,enum opcode opcode)1912 brw_inst_set_opcode(const struct intel_device_info *devinfo,
1913 brw_inst *inst, enum opcode opcode)
1914 {
1915 brw_inst_set_hw_opcode(devinfo, inst, brw_opcode_encode(devinfo, opcode));
1916 }
1917
1918 static inline enum opcode
brw_inst_opcode(const struct intel_device_info * devinfo,const brw_inst * inst)1919 brw_inst_opcode(const struct intel_device_info *devinfo, const brw_inst *inst)
1920 {
1921 return brw_opcode_decode(devinfo, brw_inst_hw_opcode(devinfo, inst));
1922 }
1923
1924 static inline bool
is_3src(const struct intel_device_info * devinfo,enum opcode opcode)1925 is_3src(const struct intel_device_info *devinfo, enum opcode opcode)
1926 {
1927 const struct opcode_desc *desc = brw_opcode_desc(devinfo, opcode);
1928 return desc && desc->nsrc == 3;
1929 }
1930
1931 /** Maximum SEND message length */
1932 #define BRW_MAX_MSG_LENGTH 15
1933
1934 /** First MRF register used by pull loads */
1935 #define FIRST_SPILL_MRF(gen) ((gen) == 6 ? 21 : 13)
1936
1937 /** First MRF register used by spills */
1938 #define FIRST_PULL_LOAD_MRF(gen) ((gen) == 6 ? 16 : 13)
1939
1940 #ifdef __cplusplus
1941 }
1942 #endif
1943
1944 #endif
1945