1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker Copyright (C) Intel Corp. 2006. All Rights Reserved.
3*61046927SAndroid Build Coastguard Worker Intel funded Tungsten Graphics to
4*61046927SAndroid Build Coastguard Worker develop this 3D driver.
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining
7*61046927SAndroid Build Coastguard Worker a copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker distribute, sublicense, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker the following conditions:
13*61046927SAndroid Build Coastguard Worker
14*61046927SAndroid Build Coastguard Worker The above copyright notice and this permission notice (including the
15*61046927SAndroid Build Coastguard Worker next paragraph) shall be included in all copies or substantial
16*61046927SAndroid Build Coastguard Worker portions of the Software.
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19*61046927SAndroid Build Coastguard Worker EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*61046927SAndroid Build Coastguard Worker MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21*61046927SAndroid Build Coastguard Worker IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22*61046927SAndroid Build Coastguard Worker LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23*61046927SAndroid Build Coastguard Worker OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24*61046927SAndroid Build Coastguard Worker WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker **********************************************************************/
27*61046927SAndroid Build Coastguard Worker /*
28*61046927SAndroid Build Coastguard Worker * Authors:
29*61046927SAndroid Build Coastguard Worker * Keith Whitwell <[email protected]>
30*61046927SAndroid Build Coastguard Worker */
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker #ifndef BRW_EU_H
34*61046927SAndroid Build Coastguard Worker #define BRW_EU_H
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
37*61046927SAndroid Build Coastguard Worker #include <stdio.h>
38*61046927SAndroid Build Coastguard Worker #include "brw_inst.h"
39*61046927SAndroid Build Coastguard Worker #include "brw_compiler.h"
40*61046927SAndroid Build Coastguard Worker #include "brw_eu_defines.h"
41*61046927SAndroid Build Coastguard Worker #include "brw_isa_info.h"
42*61046927SAndroid Build Coastguard Worker #include "brw_reg.h"
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker #include "intel_wa.h"
45*61046927SAndroid Build Coastguard Worker #include "util/bitset.h"
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
48*61046927SAndroid Build Coastguard Worker extern "C" {
49*61046927SAndroid Build Coastguard Worker #endif
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker struct disasm_info;
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker #define BRW_EU_MAX_INSN_STACK 5
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker struct brw_insn_state {
56*61046927SAndroid Build Coastguard Worker /* One of BRW_EXECUTE_* */
57*61046927SAndroid Build Coastguard Worker unsigned exec_size:3;
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker /* Group in units of channels */
60*61046927SAndroid Build Coastguard Worker unsigned group:5;
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker /* One of BRW_MASK_* */
63*61046927SAndroid Build Coastguard Worker unsigned mask_control:1;
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker /* Scheduling info for Gfx12+ */
66*61046927SAndroid Build Coastguard Worker struct tgl_swsb swsb;
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker bool saturate:1;
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker /* One of BRW_ALIGN_* */
71*61046927SAndroid Build Coastguard Worker unsigned access_mode:1;
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard Worker /* One of BRW_PREDICATE_* */
74*61046927SAndroid Build Coastguard Worker enum brw_predicate predicate:4;
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker bool pred_inv:1;
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker /* Flag subreg. Bottom bit is subreg, top bit is reg */
79*61046927SAndroid Build Coastguard Worker unsigned flag_subreg:2;
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker bool acc_wr_control:1;
82*61046927SAndroid Build Coastguard Worker };
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker /* A helper for accessing the last instruction emitted. This makes it easy
86*61046927SAndroid Build Coastguard Worker * to set various bits on an instruction without having to create temporary
87*61046927SAndroid Build Coastguard Worker * variable and assign the emitted instruction to those.
88*61046927SAndroid Build Coastguard Worker */
89*61046927SAndroid Build Coastguard Worker #define brw_last_inst (&p->store[p->nr_insn - 1])
90*61046927SAndroid Build Coastguard Worker
91*61046927SAndroid Build Coastguard Worker struct brw_codegen {
92*61046927SAndroid Build Coastguard Worker brw_inst *store;
93*61046927SAndroid Build Coastguard Worker int store_size;
94*61046927SAndroid Build Coastguard Worker unsigned nr_insn;
95*61046927SAndroid Build Coastguard Worker unsigned int next_insn_offset;
96*61046927SAndroid Build Coastguard Worker
97*61046927SAndroid Build Coastguard Worker void *mem_ctx;
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker /* Allow clients to push/pop instruction state:
100*61046927SAndroid Build Coastguard Worker */
101*61046927SAndroid Build Coastguard Worker struct brw_insn_state stack[BRW_EU_MAX_INSN_STACK];
102*61046927SAndroid Build Coastguard Worker struct brw_insn_state *current;
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker const struct brw_isa_info *isa;
105*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo;
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Worker /* Control flow stacks:
108*61046927SAndroid Build Coastguard Worker * - if_stack contains IF and ELSE instructions which must be patched
109*61046927SAndroid Build Coastguard Worker * (and popped) once the matching ENDIF instruction is encountered.
110*61046927SAndroid Build Coastguard Worker *
111*61046927SAndroid Build Coastguard Worker * Just store the instruction pointer(an index).
112*61046927SAndroid Build Coastguard Worker */
113*61046927SAndroid Build Coastguard Worker int *if_stack;
114*61046927SAndroid Build Coastguard Worker int if_stack_depth;
115*61046927SAndroid Build Coastguard Worker int if_stack_array_size;
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker /**
118*61046927SAndroid Build Coastguard Worker * loop_stack contains the instruction pointers of the starts of loops which
119*61046927SAndroid Build Coastguard Worker * must be patched (and popped) once the matching WHILE instruction is
120*61046927SAndroid Build Coastguard Worker * encountered.
121*61046927SAndroid Build Coastguard Worker */
122*61046927SAndroid Build Coastguard Worker int *loop_stack;
123*61046927SAndroid Build Coastguard Worker int loop_stack_depth;
124*61046927SAndroid Build Coastguard Worker int loop_stack_array_size;
125*61046927SAndroid Build Coastguard Worker
126*61046927SAndroid Build Coastguard Worker struct brw_shader_reloc *relocs;
127*61046927SAndroid Build Coastguard Worker int num_relocs;
128*61046927SAndroid Build Coastguard Worker int reloc_array_size;
129*61046927SAndroid Build Coastguard Worker };
130*61046927SAndroid Build Coastguard Worker
131*61046927SAndroid Build Coastguard Worker struct brw_label {
132*61046927SAndroid Build Coastguard Worker int offset;
133*61046927SAndroid Build Coastguard Worker int number;
134*61046927SAndroid Build Coastguard Worker struct brw_label *next;
135*61046927SAndroid Build Coastguard Worker };
136*61046927SAndroid Build Coastguard Worker
137*61046927SAndroid Build Coastguard Worker void brw_pop_insn_state( struct brw_codegen *p );
138*61046927SAndroid Build Coastguard Worker void brw_push_insn_state( struct brw_codegen *p );
139*61046927SAndroid Build Coastguard Worker unsigned brw_get_default_exec_size(struct brw_codegen *p);
140*61046927SAndroid Build Coastguard Worker unsigned brw_get_default_group(struct brw_codegen *p);
141*61046927SAndroid Build Coastguard Worker unsigned brw_get_default_access_mode(struct brw_codegen *p);
142*61046927SAndroid Build Coastguard Worker struct tgl_swsb brw_get_default_swsb(struct brw_codegen *p);
143*61046927SAndroid Build Coastguard Worker void brw_set_default_exec_size(struct brw_codegen *p, unsigned value);
144*61046927SAndroid Build Coastguard Worker void brw_set_default_mask_control( struct brw_codegen *p, unsigned value );
145*61046927SAndroid Build Coastguard Worker void brw_set_default_saturate( struct brw_codegen *p, bool enable );
146*61046927SAndroid Build Coastguard Worker void brw_set_default_access_mode( struct brw_codegen *p, unsigned access_mode );
147*61046927SAndroid Build Coastguard Worker void brw_inst_set_group(const struct intel_device_info *devinfo,
148*61046927SAndroid Build Coastguard Worker brw_inst *inst, unsigned group);
149*61046927SAndroid Build Coastguard Worker void brw_set_default_group(struct brw_codegen *p, unsigned group);
150*61046927SAndroid Build Coastguard Worker void brw_set_default_predicate_control(struct brw_codegen *p, enum brw_predicate pc);
151*61046927SAndroid Build Coastguard Worker void brw_set_default_predicate_inverse(struct brw_codegen *p, bool predicate_inverse);
152*61046927SAndroid Build Coastguard Worker void brw_set_default_flag_reg(struct brw_codegen *p, int reg, int subreg);
153*61046927SAndroid Build Coastguard Worker void brw_set_default_acc_write_control(struct brw_codegen *p, unsigned value);
154*61046927SAndroid Build Coastguard Worker void brw_set_default_swsb(struct brw_codegen *p, struct tgl_swsb value);
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker void brw_init_codegen(const struct brw_isa_info *isa,
157*61046927SAndroid Build Coastguard Worker struct brw_codegen *p, void *mem_ctx);
158*61046927SAndroid Build Coastguard Worker bool brw_has_jip(const struct intel_device_info *devinfo, enum opcode opcode);
159*61046927SAndroid Build Coastguard Worker bool brw_has_uip(const struct intel_device_info *devinfo, enum opcode opcode);
160*61046927SAndroid Build Coastguard Worker const struct brw_shader_reloc *brw_get_shader_relocs(struct brw_codegen *p,
161*61046927SAndroid Build Coastguard Worker unsigned *num_relocs);
162*61046927SAndroid Build Coastguard Worker const unsigned *brw_get_program( struct brw_codegen *p, unsigned *sz );
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker bool brw_should_dump_shader_bin(void);
165*61046927SAndroid Build Coastguard Worker void brw_dump_shader_bin(void *assembly, int start_offset, int end_offset,
166*61046927SAndroid Build Coastguard Worker const char *identifier);
167*61046927SAndroid Build Coastguard Worker
168*61046927SAndroid Build Coastguard Worker bool brw_try_override_assembly(struct brw_codegen *p, int start_offset,
169*61046927SAndroid Build Coastguard Worker const char *identifier);
170*61046927SAndroid Build Coastguard Worker
171*61046927SAndroid Build Coastguard Worker void brw_realign(struct brw_codegen *p, unsigned alignment);
172*61046927SAndroid Build Coastguard Worker int brw_append_data(struct brw_codegen *p, void *data,
173*61046927SAndroid Build Coastguard Worker unsigned size, unsigned alignment);
174*61046927SAndroid Build Coastguard Worker brw_inst *brw_next_insn(struct brw_codegen *p, unsigned opcode);
175*61046927SAndroid Build Coastguard Worker void brw_add_reloc(struct brw_codegen *p, uint32_t id,
176*61046927SAndroid Build Coastguard Worker enum brw_shader_reloc_type type,
177*61046927SAndroid Build Coastguard Worker uint32_t offset, uint32_t delta);
178*61046927SAndroid Build Coastguard Worker void brw_set_dest(struct brw_codegen *p, brw_inst *insn, struct brw_reg dest);
179*61046927SAndroid Build Coastguard Worker void brw_set_src0(struct brw_codegen *p, brw_inst *insn, struct brw_reg reg);
180*61046927SAndroid Build Coastguard Worker
181*61046927SAndroid Build Coastguard Worker /* Helpers for regular instructions:
182*61046927SAndroid Build Coastguard Worker */
183*61046927SAndroid Build Coastguard Worker #define ALU1(OP) \
184*61046927SAndroid Build Coastguard Worker brw_inst *brw_##OP(struct brw_codegen *p, \
185*61046927SAndroid Build Coastguard Worker struct brw_reg dest, \
186*61046927SAndroid Build Coastguard Worker struct brw_reg src0);
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker #define ALU2(OP) \
189*61046927SAndroid Build Coastguard Worker brw_inst *brw_##OP(struct brw_codegen *p, \
190*61046927SAndroid Build Coastguard Worker struct brw_reg dest, \
191*61046927SAndroid Build Coastguard Worker struct brw_reg src0, \
192*61046927SAndroid Build Coastguard Worker struct brw_reg src1);
193*61046927SAndroid Build Coastguard Worker
194*61046927SAndroid Build Coastguard Worker #define ALU3(OP) \
195*61046927SAndroid Build Coastguard Worker brw_inst *brw_##OP(struct brw_codegen *p, \
196*61046927SAndroid Build Coastguard Worker struct brw_reg dest, \
197*61046927SAndroid Build Coastguard Worker struct brw_reg src0, \
198*61046927SAndroid Build Coastguard Worker struct brw_reg src1, \
199*61046927SAndroid Build Coastguard Worker struct brw_reg src2);
200*61046927SAndroid Build Coastguard Worker
201*61046927SAndroid Build Coastguard Worker ALU1(MOV)
ALU2(SEL)202*61046927SAndroid Build Coastguard Worker ALU2(SEL)
203*61046927SAndroid Build Coastguard Worker ALU1(NOT)
204*61046927SAndroid Build Coastguard Worker ALU2(AND)
205*61046927SAndroid Build Coastguard Worker ALU2(OR)
206*61046927SAndroid Build Coastguard Worker ALU2(XOR)
207*61046927SAndroid Build Coastguard Worker ALU2(SHR)
208*61046927SAndroid Build Coastguard Worker ALU2(SHL)
209*61046927SAndroid Build Coastguard Worker ALU1(DIM)
210*61046927SAndroid Build Coastguard Worker ALU2(ASR)
211*61046927SAndroid Build Coastguard Worker ALU2(ROL)
212*61046927SAndroid Build Coastguard Worker ALU2(ROR)
213*61046927SAndroid Build Coastguard Worker ALU3(CSEL)
214*61046927SAndroid Build Coastguard Worker ALU1(F32TO16)
215*61046927SAndroid Build Coastguard Worker ALU1(F16TO32)
216*61046927SAndroid Build Coastguard Worker ALU2(ADD)
217*61046927SAndroid Build Coastguard Worker ALU3(ADD3)
218*61046927SAndroid Build Coastguard Worker ALU2(AVG)
219*61046927SAndroid Build Coastguard Worker ALU2(MUL)
220*61046927SAndroid Build Coastguard Worker ALU1(FRC)
221*61046927SAndroid Build Coastguard Worker ALU1(RNDD)
222*61046927SAndroid Build Coastguard Worker ALU1(RNDE)
223*61046927SAndroid Build Coastguard Worker ALU1(RNDU)
224*61046927SAndroid Build Coastguard Worker ALU1(RNDZ)
225*61046927SAndroid Build Coastguard Worker ALU2(MAC)
226*61046927SAndroid Build Coastguard Worker ALU2(MACH)
227*61046927SAndroid Build Coastguard Worker ALU1(LZD)
228*61046927SAndroid Build Coastguard Worker ALU2(DP4)
229*61046927SAndroid Build Coastguard Worker ALU2(DPH)
230*61046927SAndroid Build Coastguard Worker ALU2(DP3)
231*61046927SAndroid Build Coastguard Worker ALU2(DP2)
232*61046927SAndroid Build Coastguard Worker ALU3(DP4A)
233*61046927SAndroid Build Coastguard Worker ALU2(LINE)
234*61046927SAndroid Build Coastguard Worker ALU2(PLN)
235*61046927SAndroid Build Coastguard Worker ALU3(MAD)
236*61046927SAndroid Build Coastguard Worker ALU3(LRP)
237*61046927SAndroid Build Coastguard Worker ALU1(BFREV)
238*61046927SAndroid Build Coastguard Worker ALU3(BFE)
239*61046927SAndroid Build Coastguard Worker ALU2(BFI1)
240*61046927SAndroid Build Coastguard Worker ALU3(BFI2)
241*61046927SAndroid Build Coastguard Worker ALU1(FBH)
242*61046927SAndroid Build Coastguard Worker ALU1(FBL)
243*61046927SAndroid Build Coastguard Worker ALU1(CBIT)
244*61046927SAndroid Build Coastguard Worker ALU2(ADDC)
245*61046927SAndroid Build Coastguard Worker ALU2(SUBB)
246*61046927SAndroid Build Coastguard Worker
247*61046927SAndroid Build Coastguard Worker #undef ALU1
248*61046927SAndroid Build Coastguard Worker #undef ALU2
249*61046927SAndroid Build Coastguard Worker #undef ALU3
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker static inline unsigned
252*61046927SAndroid Build Coastguard Worker reg_unit(const struct intel_device_info *devinfo)
253*61046927SAndroid Build Coastguard Worker {
254*61046927SAndroid Build Coastguard Worker return devinfo->ver >= 20 ? 2 : 1;
255*61046927SAndroid Build Coastguard Worker }
256*61046927SAndroid Build Coastguard Worker
257*61046927SAndroid Build Coastguard Worker
258*61046927SAndroid Build Coastguard Worker /* Helpers for SEND instruction:
259*61046927SAndroid Build Coastguard Worker */
260*61046927SAndroid Build Coastguard Worker
261*61046927SAndroid Build Coastguard Worker /**
262*61046927SAndroid Build Coastguard Worker * Construct a message descriptor immediate with the specified common
263*61046927SAndroid Build Coastguard Worker * descriptor controls.
264*61046927SAndroid Build Coastguard Worker */
265*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_message_desc(const struct intel_device_info * devinfo,unsigned msg_length,unsigned response_length,bool header_present)266*61046927SAndroid Build Coastguard Worker brw_message_desc(const struct intel_device_info *devinfo,
267*61046927SAndroid Build Coastguard Worker unsigned msg_length,
268*61046927SAndroid Build Coastguard Worker unsigned response_length,
269*61046927SAndroid Build Coastguard Worker bool header_present)
270*61046927SAndroid Build Coastguard Worker {
271*61046927SAndroid Build Coastguard Worker assert(msg_length % reg_unit(devinfo) == 0);
272*61046927SAndroid Build Coastguard Worker assert(response_length % reg_unit(devinfo) == 0);
273*61046927SAndroid Build Coastguard Worker return (SET_BITS(msg_length / reg_unit(devinfo), 28, 25) |
274*61046927SAndroid Build Coastguard Worker SET_BITS(response_length / reg_unit(devinfo), 24, 20) |
275*61046927SAndroid Build Coastguard Worker SET_BITS(header_present, 19, 19));
276*61046927SAndroid Build Coastguard Worker }
277*61046927SAndroid Build Coastguard Worker
278*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_message_desc_mlen(const struct intel_device_info * devinfo,uint32_t desc)279*61046927SAndroid Build Coastguard Worker brw_message_desc_mlen(const struct intel_device_info *devinfo, uint32_t desc)
280*61046927SAndroid Build Coastguard Worker {
281*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 28, 25) * reg_unit(devinfo);
282*61046927SAndroid Build Coastguard Worker }
283*61046927SAndroid Build Coastguard Worker
284*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_message_desc_rlen(const struct intel_device_info * devinfo,uint32_t desc)285*61046927SAndroid Build Coastguard Worker brw_message_desc_rlen(const struct intel_device_info *devinfo, uint32_t desc)
286*61046927SAndroid Build Coastguard Worker {
287*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 24, 20) * reg_unit(devinfo);
288*61046927SAndroid Build Coastguard Worker }
289*61046927SAndroid Build Coastguard Worker
290*61046927SAndroid Build Coastguard Worker static inline bool
brw_message_desc_header_present(ASSERTED const struct intel_device_info * devinfo,uint32_t desc)291*61046927SAndroid Build Coastguard Worker brw_message_desc_header_present(ASSERTED
292*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo,
293*61046927SAndroid Build Coastguard Worker uint32_t desc)
294*61046927SAndroid Build Coastguard Worker {
295*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 19, 19);
296*61046927SAndroid Build Coastguard Worker }
297*61046927SAndroid Build Coastguard Worker
298*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_message_ex_desc(const struct intel_device_info * devinfo,unsigned ex_msg_length)299*61046927SAndroid Build Coastguard Worker brw_message_ex_desc(const struct intel_device_info *devinfo,
300*61046927SAndroid Build Coastguard Worker unsigned ex_msg_length)
301*61046927SAndroid Build Coastguard Worker {
302*61046927SAndroid Build Coastguard Worker assert(ex_msg_length % reg_unit(devinfo) == 0);
303*61046927SAndroid Build Coastguard Worker return devinfo->ver >= 20 ?
304*61046927SAndroid Build Coastguard Worker SET_BITS(ex_msg_length / reg_unit(devinfo), 10, 6) :
305*61046927SAndroid Build Coastguard Worker SET_BITS(ex_msg_length / reg_unit(devinfo), 9, 6);
306*61046927SAndroid Build Coastguard Worker }
307*61046927SAndroid Build Coastguard Worker
308*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_message_ex_desc_ex_mlen(const struct intel_device_info * devinfo,uint32_t ex_desc)309*61046927SAndroid Build Coastguard Worker brw_message_ex_desc_ex_mlen(const struct intel_device_info *devinfo,
310*61046927SAndroid Build Coastguard Worker uint32_t ex_desc)
311*61046927SAndroid Build Coastguard Worker {
312*61046927SAndroid Build Coastguard Worker return devinfo->ver >= 20 ?
313*61046927SAndroid Build Coastguard Worker GET_BITS(ex_desc, 10, 6) * reg_unit(devinfo) :
314*61046927SAndroid Build Coastguard Worker GET_BITS(ex_desc, 9, 6) * reg_unit(devinfo);
315*61046927SAndroid Build Coastguard Worker }
316*61046927SAndroid Build Coastguard Worker
317*61046927SAndroid Build Coastguard Worker 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)318*61046927SAndroid Build Coastguard Worker brw_urb_desc(const struct intel_device_info *devinfo,
319*61046927SAndroid Build Coastguard Worker unsigned msg_type,
320*61046927SAndroid Build Coastguard Worker bool per_slot_offset_present,
321*61046927SAndroid Build Coastguard Worker bool channel_mask_present,
322*61046927SAndroid Build Coastguard Worker unsigned global_offset)
323*61046927SAndroid Build Coastguard Worker {
324*61046927SAndroid Build Coastguard Worker return (SET_BITS(per_slot_offset_present, 17, 17) |
325*61046927SAndroid Build Coastguard Worker SET_BITS(channel_mask_present, 15, 15) |
326*61046927SAndroid Build Coastguard Worker SET_BITS(global_offset, 14, 4) |
327*61046927SAndroid Build Coastguard Worker SET_BITS(msg_type, 3, 0));
328*61046927SAndroid Build Coastguard Worker }
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_urb_desc_msg_type(ASSERTED const struct intel_device_info * devinfo,uint32_t desc)331*61046927SAndroid Build Coastguard Worker brw_urb_desc_msg_type(ASSERTED const struct intel_device_info *devinfo,
332*61046927SAndroid Build Coastguard Worker uint32_t desc)
333*61046927SAndroid Build Coastguard Worker {
334*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 3, 0);
335*61046927SAndroid Build Coastguard Worker }
336*61046927SAndroid Build Coastguard Worker
337*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_urb_fence_desc(const struct intel_device_info * devinfo)338*61046927SAndroid Build Coastguard Worker brw_urb_fence_desc(const struct intel_device_info *devinfo)
339*61046927SAndroid Build Coastguard Worker {
340*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
341*61046927SAndroid Build Coastguard Worker return brw_urb_desc(devinfo, GFX125_URB_OPCODE_FENCE, false, false, 0);
342*61046927SAndroid Build Coastguard Worker }
343*61046927SAndroid Build Coastguard Worker
344*61046927SAndroid Build Coastguard Worker /**
345*61046927SAndroid Build Coastguard Worker * Construct a message descriptor immediate with the specified sampler
346*61046927SAndroid Build Coastguard Worker * function controls.
347*61046927SAndroid Build Coastguard Worker */
348*61046927SAndroid Build Coastguard Worker 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)349*61046927SAndroid Build Coastguard Worker brw_sampler_desc(const struct intel_device_info *devinfo,
350*61046927SAndroid Build Coastguard Worker unsigned binding_table_index,
351*61046927SAndroid Build Coastguard Worker unsigned sampler,
352*61046927SAndroid Build Coastguard Worker unsigned msg_type,
353*61046927SAndroid Build Coastguard Worker unsigned simd_mode,
354*61046927SAndroid Build Coastguard Worker unsigned return_format)
355*61046927SAndroid Build Coastguard Worker {
356*61046927SAndroid Build Coastguard Worker const unsigned desc = (SET_BITS(binding_table_index, 7, 0) |
357*61046927SAndroid Build Coastguard Worker SET_BITS(sampler, 11, 8));
358*61046927SAndroid Build Coastguard Worker
359*61046927SAndroid Build Coastguard Worker /* From GFX20 Bspec: Shared Functions - Message Descriptor -
360*61046927SAndroid Build Coastguard Worker * Sampling Engine:
361*61046927SAndroid Build Coastguard Worker *
362*61046927SAndroid Build Coastguard Worker * Message Type[5] 31 This bit represents the upper bit of message type
363*61046927SAndroid Build Coastguard Worker * 6-bit encoding (c.f. [16:12]). This bit is set
364*61046927SAndroid Build Coastguard Worker * for messages with programmable offsets.
365*61046927SAndroid Build Coastguard Worker */
366*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 20)
367*61046927SAndroid Build Coastguard Worker return desc | SET_BITS(msg_type & 0x1F, 16, 12) |
368*61046927SAndroid Build Coastguard Worker SET_BITS(simd_mode & 0x3, 18, 17) |
369*61046927SAndroid Build Coastguard Worker SET_BITS(simd_mode >> 2, 29, 29) |
370*61046927SAndroid Build Coastguard Worker SET_BITS(return_format, 30, 30) |
371*61046927SAndroid Build Coastguard Worker SET_BITS(msg_type >> 5, 31, 31);
372*61046927SAndroid Build Coastguard Worker
373*61046927SAndroid Build Coastguard Worker /* From the CHV Bspec: Shared Functions - Message Descriptor -
374*61046927SAndroid Build Coastguard Worker * Sampling Engine:
375*61046927SAndroid Build Coastguard Worker *
376*61046927SAndroid Build Coastguard Worker * SIMD Mode[2] 29 This field is the upper bit of the 3-bit
377*61046927SAndroid Build Coastguard Worker * SIMD Mode field.
378*61046927SAndroid Build Coastguard Worker */
379*61046927SAndroid Build Coastguard Worker return desc | SET_BITS(msg_type, 16, 12) |
380*61046927SAndroid Build Coastguard Worker SET_BITS(simd_mode & 0x3, 18, 17) |
381*61046927SAndroid Build Coastguard Worker SET_BITS(simd_mode >> 2, 29, 29) |
382*61046927SAndroid Build Coastguard Worker SET_BITS(return_format, 30, 30);
383*61046927SAndroid Build Coastguard Worker }
384*61046927SAndroid Build Coastguard Worker
385*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_sampler_desc_binding_table_index(UNUSED const struct intel_device_info * devinfo,uint32_t desc)386*61046927SAndroid Build Coastguard Worker brw_sampler_desc_binding_table_index(UNUSED
387*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo,
388*61046927SAndroid Build Coastguard Worker uint32_t desc)
389*61046927SAndroid Build Coastguard Worker {
390*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 7, 0);
391*61046927SAndroid Build Coastguard Worker }
392*61046927SAndroid Build Coastguard Worker
393*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_sampler_desc_sampler(UNUSED const struct intel_device_info * devinfo,uint32_t desc)394*61046927SAndroid Build Coastguard Worker brw_sampler_desc_sampler(UNUSED const struct intel_device_info *devinfo,
395*61046927SAndroid Build Coastguard Worker uint32_t desc)
396*61046927SAndroid Build Coastguard Worker {
397*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 11, 8);
398*61046927SAndroid Build Coastguard Worker }
399*61046927SAndroid Build Coastguard Worker
400*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_sampler_desc_msg_type(const struct intel_device_info * devinfo,uint32_t desc)401*61046927SAndroid Build Coastguard Worker brw_sampler_desc_msg_type(const struct intel_device_info *devinfo, uint32_t desc)
402*61046927SAndroid Build Coastguard Worker {
403*61046927SAndroid Build Coastguard Worker if (devinfo->ver >= 20)
404*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 31, 31) << 5 | GET_BITS(desc, 16, 12);
405*61046927SAndroid Build Coastguard Worker else
406*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 16, 12);
407*61046927SAndroid Build Coastguard Worker }
408*61046927SAndroid Build Coastguard Worker
409*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_sampler_desc_simd_mode(const struct intel_device_info * devinfo,uint32_t desc)410*61046927SAndroid Build Coastguard Worker brw_sampler_desc_simd_mode(const struct intel_device_info *devinfo,
411*61046927SAndroid Build Coastguard Worker uint32_t desc)
412*61046927SAndroid Build Coastguard Worker {
413*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 18, 17) | GET_BITS(desc, 29, 29) << 2;
414*61046927SAndroid Build Coastguard Worker }
415*61046927SAndroid Build Coastguard Worker
416*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_sampler_desc_return_format(ASSERTED const struct intel_device_info * devinfo,uint32_t desc)417*61046927SAndroid Build Coastguard Worker brw_sampler_desc_return_format(ASSERTED const struct intel_device_info *devinfo,
418*61046927SAndroid Build Coastguard Worker uint32_t desc)
419*61046927SAndroid Build Coastguard Worker {
420*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 30, 30);
421*61046927SAndroid Build Coastguard Worker }
422*61046927SAndroid Build Coastguard Worker
423*61046927SAndroid Build Coastguard Worker /**
424*61046927SAndroid Build Coastguard Worker * Construct a message descriptor for the dataport
425*61046927SAndroid Build Coastguard Worker */
426*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_dp_desc(const struct intel_device_info * devinfo,unsigned binding_table_index,unsigned msg_type,unsigned msg_control)427*61046927SAndroid Build Coastguard Worker brw_dp_desc(const struct intel_device_info *devinfo,
428*61046927SAndroid Build Coastguard Worker unsigned binding_table_index,
429*61046927SAndroid Build Coastguard Worker unsigned msg_type,
430*61046927SAndroid Build Coastguard Worker unsigned msg_control)
431*61046927SAndroid Build Coastguard Worker {
432*61046927SAndroid Build Coastguard Worker return SET_BITS(binding_table_index, 7, 0) |
433*61046927SAndroid Build Coastguard Worker SET_BITS(msg_control, 13, 8) |
434*61046927SAndroid Build Coastguard Worker SET_BITS(msg_type, 18, 14);
435*61046927SAndroid Build Coastguard Worker }
436*61046927SAndroid Build Coastguard Worker
437*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_dp_desc_binding_table_index(UNUSED const struct intel_device_info * devinfo,uint32_t desc)438*61046927SAndroid Build Coastguard Worker brw_dp_desc_binding_table_index(UNUSED const struct intel_device_info *devinfo,
439*61046927SAndroid Build Coastguard Worker uint32_t desc)
440*61046927SAndroid Build Coastguard Worker {
441*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 7, 0);
442*61046927SAndroid Build Coastguard Worker }
443*61046927SAndroid Build Coastguard Worker
444*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_dp_desc_msg_type(const struct intel_device_info * devinfo,uint32_t desc)445*61046927SAndroid Build Coastguard Worker brw_dp_desc_msg_type(const struct intel_device_info *devinfo, uint32_t desc)
446*61046927SAndroid Build Coastguard Worker {
447*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 18, 14);
448*61046927SAndroid Build Coastguard Worker }
449*61046927SAndroid Build Coastguard Worker
450*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_dp_desc_msg_control(const struct intel_device_info * devinfo,uint32_t desc)451*61046927SAndroid Build Coastguard Worker brw_dp_desc_msg_control(const struct intel_device_info *devinfo, uint32_t desc)
452*61046927SAndroid Build Coastguard Worker {
453*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 13, 8);
454*61046927SAndroid Build Coastguard Worker }
455*61046927SAndroid Build Coastguard Worker
456*61046927SAndroid Build Coastguard Worker /**
457*61046927SAndroid Build Coastguard Worker * Construct a message descriptor immediate with the specified dataport read
458*61046927SAndroid Build Coastguard Worker * function controls.
459*61046927SAndroid Build Coastguard Worker */
460*61046927SAndroid Build Coastguard Worker 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)461*61046927SAndroid Build Coastguard Worker brw_dp_read_desc(const struct intel_device_info *devinfo,
462*61046927SAndroid Build Coastguard Worker unsigned binding_table_index,
463*61046927SAndroid Build Coastguard Worker unsigned msg_control,
464*61046927SAndroid Build Coastguard Worker unsigned msg_type,
465*61046927SAndroid Build Coastguard Worker unsigned target_cache)
466*61046927SAndroid Build Coastguard Worker {
467*61046927SAndroid Build Coastguard Worker return brw_dp_desc(devinfo, binding_table_index, msg_type, msg_control);
468*61046927SAndroid Build Coastguard Worker }
469*61046927SAndroid Build Coastguard Worker
470*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_dp_read_desc_msg_type(const struct intel_device_info * devinfo,uint32_t desc)471*61046927SAndroid Build Coastguard Worker brw_dp_read_desc_msg_type(const struct intel_device_info *devinfo,
472*61046927SAndroid Build Coastguard Worker uint32_t desc)
473*61046927SAndroid Build Coastguard Worker {
474*61046927SAndroid Build Coastguard Worker return brw_dp_desc_msg_type(devinfo, desc);
475*61046927SAndroid Build Coastguard Worker }
476*61046927SAndroid Build Coastguard Worker
477*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_dp_read_desc_msg_control(const struct intel_device_info * devinfo,uint32_t desc)478*61046927SAndroid Build Coastguard Worker brw_dp_read_desc_msg_control(const struct intel_device_info *devinfo,
479*61046927SAndroid Build Coastguard Worker uint32_t desc)
480*61046927SAndroid Build Coastguard Worker {
481*61046927SAndroid Build Coastguard Worker return brw_dp_desc_msg_control(devinfo, desc);
482*61046927SAndroid Build Coastguard Worker }
483*61046927SAndroid Build Coastguard Worker
484*61046927SAndroid Build Coastguard Worker /**
485*61046927SAndroid Build Coastguard Worker * Construct a message descriptor immediate with the specified dataport write
486*61046927SAndroid Build Coastguard Worker * function controls.
487*61046927SAndroid Build Coastguard Worker */
488*61046927SAndroid Build Coastguard Worker 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)489*61046927SAndroid Build Coastguard Worker brw_dp_write_desc(const struct intel_device_info *devinfo,
490*61046927SAndroid Build Coastguard Worker unsigned binding_table_index,
491*61046927SAndroid Build Coastguard Worker unsigned msg_control,
492*61046927SAndroid Build Coastguard Worker unsigned msg_type,
493*61046927SAndroid Build Coastguard Worker unsigned send_commit_msg)
494*61046927SAndroid Build Coastguard Worker {
495*61046927SAndroid Build Coastguard Worker assert(!send_commit_msg);
496*61046927SAndroid Build Coastguard Worker return brw_dp_desc(devinfo, binding_table_index, msg_type, msg_control) |
497*61046927SAndroid Build Coastguard Worker SET_BITS(send_commit_msg, 17, 17);
498*61046927SAndroid Build Coastguard Worker }
499*61046927SAndroid Build Coastguard Worker
500*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_dp_write_desc_msg_type(const struct intel_device_info * devinfo,uint32_t desc)501*61046927SAndroid Build Coastguard Worker brw_dp_write_desc_msg_type(const struct intel_device_info *devinfo,
502*61046927SAndroid Build Coastguard Worker uint32_t desc)
503*61046927SAndroid Build Coastguard Worker {
504*61046927SAndroid Build Coastguard Worker return brw_dp_desc_msg_type(devinfo, desc);
505*61046927SAndroid Build Coastguard Worker }
506*61046927SAndroid Build Coastguard Worker
507*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_dp_write_desc_msg_control(const struct intel_device_info * devinfo,uint32_t desc)508*61046927SAndroid Build Coastguard Worker brw_dp_write_desc_msg_control(const struct intel_device_info *devinfo,
509*61046927SAndroid Build Coastguard Worker uint32_t desc)
510*61046927SAndroid Build Coastguard Worker {
511*61046927SAndroid Build Coastguard Worker return brw_dp_desc_msg_control(devinfo, desc);
512*61046927SAndroid Build Coastguard Worker }
513*61046927SAndroid Build Coastguard Worker
514*61046927SAndroid Build Coastguard Worker /**
515*61046927SAndroid Build Coastguard Worker * Construct a message descriptor immediate with the specified dataport
516*61046927SAndroid Build Coastguard Worker * surface function controls.
517*61046927SAndroid Build Coastguard Worker */
518*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_dp_surface_desc(const struct intel_device_info * devinfo,unsigned msg_type,unsigned msg_control)519*61046927SAndroid Build Coastguard Worker brw_dp_surface_desc(const struct intel_device_info *devinfo,
520*61046927SAndroid Build Coastguard Worker unsigned msg_type,
521*61046927SAndroid Build Coastguard Worker unsigned msg_control)
522*61046927SAndroid Build Coastguard Worker {
523*61046927SAndroid Build Coastguard Worker /* We'll OR in the binding table index later */
524*61046927SAndroid Build Coastguard Worker return brw_dp_desc(devinfo, 0, msg_type, msg_control);
525*61046927SAndroid Build Coastguard Worker }
526*61046927SAndroid Build Coastguard Worker
527*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_dp_untyped_atomic_desc(const struct intel_device_info * devinfo,unsigned exec_size,unsigned atomic_op,bool response_expected)528*61046927SAndroid Build Coastguard Worker brw_dp_untyped_atomic_desc(const struct intel_device_info *devinfo,
529*61046927SAndroid Build Coastguard Worker unsigned exec_size, /**< 0 for SIMD4x2 */
530*61046927SAndroid Build Coastguard Worker unsigned atomic_op,
531*61046927SAndroid Build Coastguard Worker bool response_expected)
532*61046927SAndroid Build Coastguard Worker {
533*61046927SAndroid Build Coastguard Worker assert(exec_size <= 8 || exec_size == 16);
534*61046927SAndroid Build Coastguard Worker
535*61046927SAndroid Build Coastguard Worker unsigned msg_type;
536*61046927SAndroid Build Coastguard Worker if (exec_size > 0) {
537*61046927SAndroid Build Coastguard Worker msg_type = HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP;
538*61046927SAndroid Build Coastguard Worker } else {
539*61046927SAndroid Build Coastguard Worker msg_type = HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2;
540*61046927SAndroid Build Coastguard Worker }
541*61046927SAndroid Build Coastguard Worker
542*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
543*61046927SAndroid Build Coastguard Worker SET_BITS(atomic_op, 3, 0) |
544*61046927SAndroid Build Coastguard Worker SET_BITS(0 < exec_size && exec_size <= 8, 4, 4) |
545*61046927SAndroid Build Coastguard Worker SET_BITS(response_expected, 5, 5);
546*61046927SAndroid Build Coastguard Worker
547*61046927SAndroid Build Coastguard Worker return brw_dp_surface_desc(devinfo, msg_type, msg_control);
548*61046927SAndroid Build Coastguard Worker }
549*61046927SAndroid Build Coastguard Worker
550*61046927SAndroid Build Coastguard Worker 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)551*61046927SAndroid Build Coastguard Worker brw_dp_untyped_atomic_float_desc(const struct intel_device_info *devinfo,
552*61046927SAndroid Build Coastguard Worker unsigned exec_size,
553*61046927SAndroid Build Coastguard Worker unsigned atomic_op,
554*61046927SAndroid Build Coastguard Worker bool response_expected)
555*61046927SAndroid Build Coastguard Worker {
556*61046927SAndroid Build Coastguard Worker assert(exec_size <= 8 || exec_size == 16);
557*61046927SAndroid Build Coastguard Worker
558*61046927SAndroid Build Coastguard Worker assert(exec_size > 0);
559*61046927SAndroid Build Coastguard Worker const unsigned msg_type = GFX9_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_FLOAT_OP;
560*61046927SAndroid Build Coastguard Worker
561*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
562*61046927SAndroid Build Coastguard Worker SET_BITS(atomic_op, 1, 0) |
563*61046927SAndroid Build Coastguard Worker SET_BITS(exec_size <= 8, 4, 4) |
564*61046927SAndroid Build Coastguard Worker SET_BITS(response_expected, 5, 5);
565*61046927SAndroid Build Coastguard Worker
566*61046927SAndroid Build Coastguard Worker return brw_dp_surface_desc(devinfo, msg_type, msg_control);
567*61046927SAndroid Build Coastguard Worker }
568*61046927SAndroid Build Coastguard Worker
569*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_mdc_cmask(unsigned num_channels)570*61046927SAndroid Build Coastguard Worker brw_mdc_cmask(unsigned num_channels)
571*61046927SAndroid Build Coastguard Worker {
572*61046927SAndroid Build Coastguard Worker /* See also MDC_CMASK in the SKL PRM Vol 2d. */
573*61046927SAndroid Build Coastguard Worker return 0xf & (0xf << num_channels);
574*61046927SAndroid Build Coastguard Worker }
575*61046927SAndroid Build Coastguard Worker
576*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_dp_untyped_surface_rw_desc(const struct intel_device_info * devinfo,unsigned exec_size,unsigned num_channels,bool write)577*61046927SAndroid Build Coastguard Worker brw_dp_untyped_surface_rw_desc(const struct intel_device_info *devinfo,
578*61046927SAndroid Build Coastguard Worker unsigned exec_size, /**< 0 for SIMD4x2 */
579*61046927SAndroid Build Coastguard Worker unsigned num_channels,
580*61046927SAndroid Build Coastguard Worker bool write)
581*61046927SAndroid Build Coastguard Worker {
582*61046927SAndroid Build Coastguard Worker assert(exec_size <= 8 || exec_size == 16);
583*61046927SAndroid Build Coastguard Worker
584*61046927SAndroid Build Coastguard Worker const unsigned msg_type =
585*61046927SAndroid Build Coastguard Worker write ? HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_WRITE :
586*61046927SAndroid Build Coastguard Worker HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_READ;
587*61046927SAndroid Build Coastguard Worker
588*61046927SAndroid Build Coastguard Worker /* See also MDC_SM3 in the SKL PRM Vol 2d. */
589*61046927SAndroid Build Coastguard Worker const unsigned simd_mode = exec_size == 0 ? 0 : /* SIMD4x2 */
590*61046927SAndroid Build Coastguard Worker exec_size <= 8 ? 2 : 1;
591*61046927SAndroid Build Coastguard Worker
592*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
593*61046927SAndroid Build Coastguard Worker SET_BITS(brw_mdc_cmask(num_channels), 3, 0) |
594*61046927SAndroid Build Coastguard Worker SET_BITS(simd_mode, 5, 4);
595*61046927SAndroid Build Coastguard Worker
596*61046927SAndroid Build Coastguard Worker return brw_dp_surface_desc(devinfo, msg_type, msg_control);
597*61046927SAndroid Build Coastguard Worker }
598*61046927SAndroid Build Coastguard Worker
599*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_mdc_ds(unsigned bit_size)600*61046927SAndroid Build Coastguard Worker brw_mdc_ds(unsigned bit_size)
601*61046927SAndroid Build Coastguard Worker {
602*61046927SAndroid Build Coastguard Worker switch (bit_size) {
603*61046927SAndroid Build Coastguard Worker case 8:
604*61046927SAndroid Build Coastguard Worker return GFX7_BYTE_SCATTERED_DATA_ELEMENT_BYTE;
605*61046927SAndroid Build Coastguard Worker case 16:
606*61046927SAndroid Build Coastguard Worker return GFX7_BYTE_SCATTERED_DATA_ELEMENT_WORD;
607*61046927SAndroid Build Coastguard Worker case 32:
608*61046927SAndroid Build Coastguard Worker return GFX7_BYTE_SCATTERED_DATA_ELEMENT_DWORD;
609*61046927SAndroid Build Coastguard Worker default:
610*61046927SAndroid Build Coastguard Worker unreachable("Unsupported bit_size for byte scattered messages");
611*61046927SAndroid Build Coastguard Worker }
612*61046927SAndroid Build Coastguard Worker }
613*61046927SAndroid Build Coastguard Worker
614*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_dp_byte_scattered_rw_desc(const struct intel_device_info * devinfo,unsigned exec_size,unsigned bit_size,bool write)615*61046927SAndroid Build Coastguard Worker brw_dp_byte_scattered_rw_desc(const struct intel_device_info *devinfo,
616*61046927SAndroid Build Coastguard Worker unsigned exec_size,
617*61046927SAndroid Build Coastguard Worker unsigned bit_size,
618*61046927SAndroid Build Coastguard Worker bool write)
619*61046927SAndroid Build Coastguard Worker {
620*61046927SAndroid Build Coastguard Worker assert(exec_size <= 8 || exec_size == 16);
621*61046927SAndroid Build Coastguard Worker
622*61046927SAndroid Build Coastguard Worker const unsigned msg_type =
623*61046927SAndroid Build Coastguard Worker write ? HSW_DATAPORT_DC_PORT0_BYTE_SCATTERED_WRITE :
624*61046927SAndroid Build Coastguard Worker HSW_DATAPORT_DC_PORT0_BYTE_SCATTERED_READ;
625*61046927SAndroid Build Coastguard Worker
626*61046927SAndroid Build Coastguard Worker assert(exec_size > 0);
627*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
628*61046927SAndroid Build Coastguard Worker SET_BITS(exec_size == 16, 0, 0) |
629*61046927SAndroid Build Coastguard Worker SET_BITS(brw_mdc_ds(bit_size), 3, 2);
630*61046927SAndroid Build Coastguard Worker
631*61046927SAndroid Build Coastguard Worker return brw_dp_surface_desc(devinfo, msg_type, msg_control);
632*61046927SAndroid Build Coastguard Worker }
633*61046927SAndroid Build Coastguard Worker
634*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_dp_dword_scattered_rw_desc(const struct intel_device_info * devinfo,unsigned exec_size,bool write)635*61046927SAndroid Build Coastguard Worker brw_dp_dword_scattered_rw_desc(const struct intel_device_info *devinfo,
636*61046927SAndroid Build Coastguard Worker unsigned exec_size,
637*61046927SAndroid Build Coastguard Worker bool write)
638*61046927SAndroid Build Coastguard Worker {
639*61046927SAndroid Build Coastguard Worker assert(exec_size == 8 || exec_size == 16);
640*61046927SAndroid Build Coastguard Worker
641*61046927SAndroid Build Coastguard Worker const unsigned msg_type =
642*61046927SAndroid Build Coastguard Worker write ? GFX6_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE :
643*61046927SAndroid Build Coastguard Worker GFX7_DATAPORT_DC_DWORD_SCATTERED_READ;
644*61046927SAndroid Build Coastguard Worker
645*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
646*61046927SAndroid Build Coastguard Worker SET_BITS(1, 1, 1) | /* Legacy SIMD Mode */
647*61046927SAndroid Build Coastguard Worker SET_BITS(exec_size == 16, 0, 0);
648*61046927SAndroid Build Coastguard Worker
649*61046927SAndroid Build Coastguard Worker return brw_dp_surface_desc(devinfo, msg_type, msg_control);
650*61046927SAndroid Build Coastguard Worker }
651*61046927SAndroid Build Coastguard Worker
652*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_dp_oword_block_rw_desc(const struct intel_device_info * devinfo,bool align_16B,unsigned num_dwords,bool write)653*61046927SAndroid Build Coastguard Worker brw_dp_oword_block_rw_desc(const struct intel_device_info *devinfo,
654*61046927SAndroid Build Coastguard Worker bool align_16B,
655*61046927SAndroid Build Coastguard Worker unsigned num_dwords,
656*61046927SAndroid Build Coastguard Worker bool write)
657*61046927SAndroid Build Coastguard Worker {
658*61046927SAndroid Build Coastguard Worker /* Writes can only have addresses aligned by OWORDs (16 Bytes). */
659*61046927SAndroid Build Coastguard Worker assert(!write || align_16B);
660*61046927SAndroid Build Coastguard Worker
661*61046927SAndroid Build Coastguard Worker const unsigned msg_type =
662*61046927SAndroid Build Coastguard Worker write ? GFX7_DATAPORT_DC_OWORD_BLOCK_WRITE :
663*61046927SAndroid Build Coastguard Worker align_16B ? GFX7_DATAPORT_DC_OWORD_BLOCK_READ :
664*61046927SAndroid Build Coastguard Worker GFX7_DATAPORT_DC_UNALIGNED_OWORD_BLOCK_READ;
665*61046927SAndroid Build Coastguard Worker
666*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
667*61046927SAndroid Build Coastguard Worker SET_BITS(BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_dwords), 2, 0);
668*61046927SAndroid Build Coastguard Worker
669*61046927SAndroid Build Coastguard Worker return brw_dp_surface_desc(devinfo, msg_type, msg_control);
670*61046927SAndroid Build Coastguard Worker }
671*61046927SAndroid Build Coastguard Worker
672*61046927SAndroid Build Coastguard Worker 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)673*61046927SAndroid Build Coastguard Worker brw_dp_a64_untyped_surface_rw_desc(const struct intel_device_info *devinfo,
674*61046927SAndroid Build Coastguard Worker unsigned exec_size, /**< 0 for SIMD4x2 */
675*61046927SAndroid Build Coastguard Worker unsigned num_channels,
676*61046927SAndroid Build Coastguard Worker bool write)
677*61046927SAndroid Build Coastguard Worker {
678*61046927SAndroid Build Coastguard Worker assert(exec_size <= 8 || exec_size == 16);
679*61046927SAndroid Build Coastguard Worker
680*61046927SAndroid Build Coastguard Worker unsigned msg_type =
681*61046927SAndroid Build Coastguard Worker write ? GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_WRITE :
682*61046927SAndroid Build Coastguard Worker GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_READ;
683*61046927SAndroid Build Coastguard Worker
684*61046927SAndroid Build Coastguard Worker /* See also MDC_SM3 in the SKL PRM Vol 2d. */
685*61046927SAndroid Build Coastguard Worker const unsigned simd_mode = exec_size == 0 ? 0 : /* SIMD4x2 */
686*61046927SAndroid Build Coastguard Worker exec_size <= 8 ? 2 : 1;
687*61046927SAndroid Build Coastguard Worker
688*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
689*61046927SAndroid Build Coastguard Worker SET_BITS(brw_mdc_cmask(num_channels), 3, 0) |
690*61046927SAndroid Build Coastguard Worker SET_BITS(simd_mode, 5, 4);
691*61046927SAndroid Build Coastguard Worker
692*61046927SAndroid Build Coastguard Worker return brw_dp_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
693*61046927SAndroid Build Coastguard Worker msg_type, msg_control);
694*61046927SAndroid Build Coastguard Worker }
695*61046927SAndroid Build Coastguard Worker
696*61046927SAndroid Build Coastguard Worker 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)697*61046927SAndroid Build Coastguard Worker brw_dp_a64_oword_block_rw_desc(const struct intel_device_info *devinfo,
698*61046927SAndroid Build Coastguard Worker bool align_16B,
699*61046927SAndroid Build Coastguard Worker unsigned num_dwords,
700*61046927SAndroid Build Coastguard Worker bool write)
701*61046927SAndroid Build Coastguard Worker {
702*61046927SAndroid Build Coastguard Worker /* Writes can only have addresses aligned by OWORDs (16 Bytes). */
703*61046927SAndroid Build Coastguard Worker assert(!write || align_16B);
704*61046927SAndroid Build Coastguard Worker
705*61046927SAndroid Build Coastguard Worker unsigned msg_type =
706*61046927SAndroid Build Coastguard Worker write ? GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_WRITE :
707*61046927SAndroid Build Coastguard Worker GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_READ;
708*61046927SAndroid Build Coastguard Worker
709*61046927SAndroid Build Coastguard Worker unsigned msg_control =
710*61046927SAndroid Build Coastguard Worker SET_BITS(!align_16B, 4, 3) |
711*61046927SAndroid Build Coastguard Worker SET_BITS(BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_dwords), 2, 0);
712*61046927SAndroid Build Coastguard Worker
713*61046927SAndroid Build Coastguard Worker return brw_dp_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
714*61046927SAndroid Build Coastguard Worker msg_type, msg_control);
715*61046927SAndroid Build Coastguard Worker }
716*61046927SAndroid Build Coastguard Worker
717*61046927SAndroid Build Coastguard Worker /**
718*61046927SAndroid Build Coastguard Worker * Calculate the data size (see MDC_A64_DS in the "Structures" volume of the
719*61046927SAndroid Build Coastguard Worker * Skylake PRM).
720*61046927SAndroid Build Coastguard Worker */
721*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_mdc_a64_ds(unsigned elems)722*61046927SAndroid Build Coastguard Worker brw_mdc_a64_ds(unsigned elems)
723*61046927SAndroid Build Coastguard Worker {
724*61046927SAndroid Build Coastguard Worker switch (elems) {
725*61046927SAndroid Build Coastguard Worker case 1: return 0;
726*61046927SAndroid Build Coastguard Worker case 2: return 1;
727*61046927SAndroid Build Coastguard Worker case 4: return 2;
728*61046927SAndroid Build Coastguard Worker case 8: return 3;
729*61046927SAndroid Build Coastguard Worker default:
730*61046927SAndroid Build Coastguard Worker unreachable("Unsupported elmeent count for A64 scattered message");
731*61046927SAndroid Build Coastguard Worker }
732*61046927SAndroid Build Coastguard Worker }
733*61046927SAndroid Build Coastguard Worker
734*61046927SAndroid Build Coastguard Worker 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)735*61046927SAndroid Build Coastguard Worker brw_dp_a64_byte_scattered_rw_desc(const struct intel_device_info *devinfo,
736*61046927SAndroid Build Coastguard Worker unsigned exec_size, /**< 0 for SIMD4x2 */
737*61046927SAndroid Build Coastguard Worker unsigned bit_size,
738*61046927SAndroid Build Coastguard Worker bool write)
739*61046927SAndroid Build Coastguard Worker {
740*61046927SAndroid Build Coastguard Worker assert(exec_size <= 8 || exec_size == 16);
741*61046927SAndroid Build Coastguard Worker
742*61046927SAndroid Build Coastguard Worker unsigned msg_type =
743*61046927SAndroid Build Coastguard Worker write ? GFX8_DATAPORT_DC_PORT1_A64_SCATTERED_WRITE :
744*61046927SAndroid Build Coastguard Worker GFX9_DATAPORT_DC_PORT1_A64_SCATTERED_READ;
745*61046927SAndroid Build Coastguard Worker
746*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
747*61046927SAndroid Build Coastguard Worker SET_BITS(GFX8_A64_SCATTERED_SUBTYPE_BYTE, 1, 0) |
748*61046927SAndroid Build Coastguard Worker SET_BITS(brw_mdc_a64_ds(bit_size / 8), 3, 2) |
749*61046927SAndroid Build Coastguard Worker SET_BITS(exec_size == 16, 4, 4);
750*61046927SAndroid Build Coastguard Worker
751*61046927SAndroid Build Coastguard Worker return brw_dp_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
752*61046927SAndroid Build Coastguard Worker msg_type, msg_control);
753*61046927SAndroid Build Coastguard Worker }
754*61046927SAndroid Build Coastguard Worker
755*61046927SAndroid Build Coastguard Worker 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)756*61046927SAndroid Build Coastguard Worker brw_dp_a64_untyped_atomic_desc(const struct intel_device_info *devinfo,
757*61046927SAndroid Build Coastguard Worker ASSERTED unsigned exec_size, /**< 0 for SIMD4x2 */
758*61046927SAndroid Build Coastguard Worker unsigned bit_size,
759*61046927SAndroid Build Coastguard Worker unsigned atomic_op,
760*61046927SAndroid Build Coastguard Worker bool response_expected)
761*61046927SAndroid Build Coastguard Worker {
762*61046927SAndroid Build Coastguard Worker assert(exec_size == 8);
763*61046927SAndroid Build Coastguard Worker assert(bit_size == 16 || bit_size == 32 || bit_size == 64);
764*61046927SAndroid Build Coastguard Worker assert(devinfo->ver >= 12 || bit_size >= 32);
765*61046927SAndroid Build Coastguard Worker
766*61046927SAndroid Build Coastguard Worker const unsigned msg_type = bit_size == 16 ?
767*61046927SAndroid Build Coastguard Worker GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_INT_OP :
768*61046927SAndroid Build Coastguard Worker GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_OP;
769*61046927SAndroid Build Coastguard Worker
770*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
771*61046927SAndroid Build Coastguard Worker SET_BITS(atomic_op, 3, 0) |
772*61046927SAndroid Build Coastguard Worker SET_BITS(bit_size == 64, 4, 4) |
773*61046927SAndroid Build Coastguard Worker SET_BITS(response_expected, 5, 5);
774*61046927SAndroid Build Coastguard Worker
775*61046927SAndroid Build Coastguard Worker return brw_dp_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
776*61046927SAndroid Build Coastguard Worker msg_type, msg_control);
777*61046927SAndroid Build Coastguard Worker }
778*61046927SAndroid Build Coastguard Worker
779*61046927SAndroid Build Coastguard Worker 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)780*61046927SAndroid Build Coastguard Worker brw_dp_a64_untyped_atomic_float_desc(const struct intel_device_info *devinfo,
781*61046927SAndroid Build Coastguard Worker ASSERTED unsigned exec_size,
782*61046927SAndroid Build Coastguard Worker unsigned bit_size,
783*61046927SAndroid Build Coastguard Worker unsigned atomic_op,
784*61046927SAndroid Build Coastguard Worker bool response_expected)
785*61046927SAndroid Build Coastguard Worker {
786*61046927SAndroid Build Coastguard Worker assert(exec_size == 8);
787*61046927SAndroid Build Coastguard Worker assert(bit_size == 16 || bit_size == 32);
788*61046927SAndroid Build Coastguard Worker assert(devinfo->ver >= 12 || bit_size == 32);
789*61046927SAndroid Build Coastguard Worker
790*61046927SAndroid Build Coastguard Worker assert(exec_size > 0);
791*61046927SAndroid Build Coastguard Worker const unsigned msg_type = bit_size == 32 ?
792*61046927SAndroid Build Coastguard Worker GFX9_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_FLOAT_OP :
793*61046927SAndroid Build Coastguard Worker GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_FLOAT_OP;
794*61046927SAndroid Build Coastguard Worker
795*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
796*61046927SAndroid Build Coastguard Worker SET_BITS(atomic_op, 1, 0) |
797*61046927SAndroid Build Coastguard Worker SET_BITS(response_expected, 5, 5);
798*61046927SAndroid Build Coastguard Worker
799*61046927SAndroid Build Coastguard Worker return brw_dp_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
800*61046927SAndroid Build Coastguard Worker msg_type, msg_control);
801*61046927SAndroid Build Coastguard Worker }
802*61046927SAndroid Build Coastguard Worker
803*61046927SAndroid Build Coastguard Worker 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)804*61046927SAndroid Build Coastguard Worker brw_dp_typed_atomic_desc(const struct intel_device_info *devinfo,
805*61046927SAndroid Build Coastguard Worker unsigned exec_size,
806*61046927SAndroid Build Coastguard Worker unsigned exec_group,
807*61046927SAndroid Build Coastguard Worker unsigned atomic_op,
808*61046927SAndroid Build Coastguard Worker bool response_expected)
809*61046927SAndroid Build Coastguard Worker {
810*61046927SAndroid Build Coastguard Worker assert(exec_size > 0 || exec_group == 0);
811*61046927SAndroid Build Coastguard Worker assert(exec_group % 8 == 0);
812*61046927SAndroid Build Coastguard Worker
813*61046927SAndroid Build Coastguard Worker const unsigned msg_type =
814*61046927SAndroid Build Coastguard Worker exec_size == 0 ? HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2 :
815*61046927SAndroid Build Coastguard Worker HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP;
816*61046927SAndroid Build Coastguard Worker
817*61046927SAndroid Build Coastguard Worker const bool high_sample_mask = (exec_group / 8) % 2 == 1;
818*61046927SAndroid Build Coastguard Worker
819*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
820*61046927SAndroid Build Coastguard Worker SET_BITS(atomic_op, 3, 0) |
821*61046927SAndroid Build Coastguard Worker SET_BITS(high_sample_mask, 4, 4) |
822*61046927SAndroid Build Coastguard Worker SET_BITS(response_expected, 5, 5);
823*61046927SAndroid Build Coastguard Worker
824*61046927SAndroid Build Coastguard Worker return brw_dp_surface_desc(devinfo, msg_type, msg_control);
825*61046927SAndroid Build Coastguard Worker }
826*61046927SAndroid Build Coastguard Worker
827*61046927SAndroid Build Coastguard Worker 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)828*61046927SAndroid Build Coastguard Worker brw_dp_typed_surface_rw_desc(const struct intel_device_info *devinfo,
829*61046927SAndroid Build Coastguard Worker unsigned exec_size,
830*61046927SAndroid Build Coastguard Worker unsigned exec_group,
831*61046927SAndroid Build Coastguard Worker unsigned num_channels,
832*61046927SAndroid Build Coastguard Worker bool write)
833*61046927SAndroid Build Coastguard Worker {
834*61046927SAndroid Build Coastguard Worker assert(exec_size > 0 || exec_group == 0);
835*61046927SAndroid Build Coastguard Worker assert(exec_group % 8 == 0);
836*61046927SAndroid Build Coastguard Worker
837*61046927SAndroid Build Coastguard Worker /* Typed surface reads and writes don't support SIMD16 */
838*61046927SAndroid Build Coastguard Worker assert(exec_size <= 8);
839*61046927SAndroid Build Coastguard Worker
840*61046927SAndroid Build Coastguard Worker const unsigned msg_type =
841*61046927SAndroid Build Coastguard Worker write ? HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_WRITE :
842*61046927SAndroid Build Coastguard Worker HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_READ;
843*61046927SAndroid Build Coastguard Worker
844*61046927SAndroid Build Coastguard Worker /* See also MDC_SG3 in the SKL PRM Vol 2d. */
845*61046927SAndroid Build Coastguard Worker const unsigned slot_group = exec_size == 0 ? 0 : /* SIMD4x2 */
846*61046927SAndroid Build Coastguard Worker 1 + ((exec_group / 8) % 2);
847*61046927SAndroid Build Coastguard Worker
848*61046927SAndroid Build Coastguard Worker const unsigned msg_control =
849*61046927SAndroid Build Coastguard Worker SET_BITS(brw_mdc_cmask(num_channels), 3, 0) |
850*61046927SAndroid Build Coastguard Worker SET_BITS(slot_group, 5, 4);
851*61046927SAndroid Build Coastguard Worker
852*61046927SAndroid Build Coastguard Worker return brw_dp_surface_desc(devinfo, msg_type, msg_control);
853*61046927SAndroid Build Coastguard Worker }
854*61046927SAndroid Build Coastguard Worker
855*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_fb_desc(const struct intel_device_info * devinfo,unsigned binding_table_index,unsigned msg_type,unsigned msg_control)856*61046927SAndroid Build Coastguard Worker brw_fb_desc(const struct intel_device_info *devinfo,
857*61046927SAndroid Build Coastguard Worker unsigned binding_table_index,
858*61046927SAndroid Build Coastguard Worker unsigned msg_type,
859*61046927SAndroid Build Coastguard Worker unsigned msg_control)
860*61046927SAndroid Build Coastguard Worker {
861*61046927SAndroid Build Coastguard Worker return SET_BITS(binding_table_index, 7, 0) |
862*61046927SAndroid Build Coastguard Worker SET_BITS(msg_control, 13, 8) |
863*61046927SAndroid Build Coastguard Worker SET_BITS(msg_type, 17, 14);
864*61046927SAndroid Build Coastguard Worker }
865*61046927SAndroid Build Coastguard Worker
866*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_fb_desc_binding_table_index(UNUSED const struct intel_device_info * devinfo,uint32_t desc)867*61046927SAndroid Build Coastguard Worker brw_fb_desc_binding_table_index(UNUSED const struct intel_device_info *devinfo,
868*61046927SAndroid Build Coastguard Worker uint32_t desc)
869*61046927SAndroid Build Coastguard Worker {
870*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 7, 0);
871*61046927SAndroid Build Coastguard Worker }
872*61046927SAndroid Build Coastguard Worker
873*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_fb_desc_msg_control(const struct intel_device_info * devinfo,uint32_t desc)874*61046927SAndroid Build Coastguard Worker brw_fb_desc_msg_control(const struct intel_device_info *devinfo, uint32_t desc)
875*61046927SAndroid Build Coastguard Worker {
876*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 13, 8);
877*61046927SAndroid Build Coastguard Worker }
878*61046927SAndroid Build Coastguard Worker
879*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_fb_desc_msg_type(const struct intel_device_info * devinfo,uint32_t desc)880*61046927SAndroid Build Coastguard Worker brw_fb_desc_msg_type(const struct intel_device_info *devinfo, uint32_t desc)
881*61046927SAndroid Build Coastguard Worker {
882*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 17, 14);
883*61046927SAndroid Build Coastguard Worker }
884*61046927SAndroid Build Coastguard Worker
885*61046927SAndroid Build Coastguard Worker 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)886*61046927SAndroid Build Coastguard Worker brw_fb_read_desc(const struct intel_device_info *devinfo,
887*61046927SAndroid Build Coastguard Worker unsigned binding_table_index,
888*61046927SAndroid Build Coastguard Worker unsigned msg_control,
889*61046927SAndroid Build Coastguard Worker unsigned exec_size,
890*61046927SAndroid Build Coastguard Worker bool per_sample)
891*61046927SAndroid Build Coastguard Worker {
892*61046927SAndroid Build Coastguard Worker assert(exec_size == 8 || exec_size == 16);
893*61046927SAndroid Build Coastguard Worker
894*61046927SAndroid Build Coastguard Worker return brw_fb_desc(devinfo, binding_table_index,
895*61046927SAndroid Build Coastguard Worker GFX9_DATAPORT_RC_RENDER_TARGET_READ, msg_control) |
896*61046927SAndroid Build Coastguard Worker SET_BITS(per_sample, 13, 13) |
897*61046927SAndroid Build Coastguard Worker SET_BITS(exec_size == 8, 8, 8) /* Render Target Message Subtype */;
898*61046927SAndroid Build Coastguard Worker }
899*61046927SAndroid Build Coastguard Worker
900*61046927SAndroid Build Coastguard Worker 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)901*61046927SAndroid Build Coastguard Worker brw_fb_write_desc(const struct intel_device_info *devinfo,
902*61046927SAndroid Build Coastguard Worker unsigned binding_table_index,
903*61046927SAndroid Build Coastguard Worker unsigned msg_control,
904*61046927SAndroid Build Coastguard Worker bool last_render_target,
905*61046927SAndroid Build Coastguard Worker bool coarse_write)
906*61046927SAndroid Build Coastguard Worker {
907*61046927SAndroid Build Coastguard Worker const unsigned msg_type = GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE;
908*61046927SAndroid Build Coastguard Worker
909*61046927SAndroid Build Coastguard Worker assert(devinfo->ver >= 10 || !coarse_write);
910*61046927SAndroid Build Coastguard Worker
911*61046927SAndroid Build Coastguard Worker return brw_fb_desc(devinfo, binding_table_index, msg_type, msg_control) |
912*61046927SAndroid Build Coastguard Worker SET_BITS(last_render_target, 12, 12) |
913*61046927SAndroid Build Coastguard Worker SET_BITS(coarse_write, 18, 18);
914*61046927SAndroid Build Coastguard Worker }
915*61046927SAndroid Build Coastguard Worker
916*61046927SAndroid Build Coastguard Worker static inline bool
brw_fb_write_desc_last_render_target(const struct intel_device_info * devinfo,uint32_t desc)917*61046927SAndroid Build Coastguard Worker brw_fb_write_desc_last_render_target(const struct intel_device_info *devinfo,
918*61046927SAndroid Build Coastguard Worker uint32_t desc)
919*61046927SAndroid Build Coastguard Worker {
920*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 12, 12);
921*61046927SAndroid Build Coastguard Worker }
922*61046927SAndroid Build Coastguard Worker
923*61046927SAndroid Build Coastguard Worker static inline bool
brw_fb_write_desc_coarse_write(const struct intel_device_info * devinfo,uint32_t desc)924*61046927SAndroid Build Coastguard Worker brw_fb_write_desc_coarse_write(const struct intel_device_info *devinfo,
925*61046927SAndroid Build Coastguard Worker uint32_t desc)
926*61046927SAndroid Build Coastguard Worker {
927*61046927SAndroid Build Coastguard Worker assert(devinfo->ver >= 10);
928*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 18, 18);
929*61046927SAndroid Build Coastguard Worker }
930*61046927SAndroid Build Coastguard Worker
931*61046927SAndroid Build Coastguard Worker static inline bool
lsc_opcode_has_cmask(enum lsc_opcode opcode)932*61046927SAndroid Build Coastguard Worker lsc_opcode_has_cmask(enum lsc_opcode opcode)
933*61046927SAndroid Build Coastguard Worker {
934*61046927SAndroid Build Coastguard Worker return opcode == LSC_OP_LOAD_CMASK || opcode == LSC_OP_STORE_CMASK;
935*61046927SAndroid Build Coastguard Worker }
936*61046927SAndroid Build Coastguard Worker
937*61046927SAndroid Build Coastguard Worker static inline bool
lsc_opcode_has_transpose(enum lsc_opcode opcode)938*61046927SAndroid Build Coastguard Worker lsc_opcode_has_transpose(enum lsc_opcode opcode)
939*61046927SAndroid Build Coastguard Worker {
940*61046927SAndroid Build Coastguard Worker return opcode == LSC_OP_LOAD || opcode == LSC_OP_STORE;
941*61046927SAndroid Build Coastguard Worker }
942*61046927SAndroid Build Coastguard Worker
943*61046927SAndroid Build Coastguard Worker static inline bool
lsc_opcode_is_store(enum lsc_opcode opcode)944*61046927SAndroid Build Coastguard Worker lsc_opcode_is_store(enum lsc_opcode opcode)
945*61046927SAndroid Build Coastguard Worker {
946*61046927SAndroid Build Coastguard Worker return opcode == LSC_OP_STORE ||
947*61046927SAndroid Build Coastguard Worker opcode == LSC_OP_STORE_CMASK;
948*61046927SAndroid Build Coastguard Worker }
949*61046927SAndroid Build Coastguard Worker
950*61046927SAndroid Build Coastguard Worker static inline bool
lsc_opcode_is_atomic(enum lsc_opcode opcode)951*61046927SAndroid Build Coastguard Worker lsc_opcode_is_atomic(enum lsc_opcode opcode)
952*61046927SAndroid Build Coastguard Worker {
953*61046927SAndroid Build Coastguard Worker switch (opcode) {
954*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_INC:
955*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_DEC:
956*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_LOAD:
957*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_STORE:
958*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_ADD:
959*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_SUB:
960*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_MIN:
961*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_MAX:
962*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_UMIN:
963*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_UMAX:
964*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_CMPXCHG:
965*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FADD:
966*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FSUB:
967*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FMIN:
968*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FMAX:
969*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FCMPXCHG:
970*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_AND:
971*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_OR:
972*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_XOR:
973*61046927SAndroid Build Coastguard Worker return true;
974*61046927SAndroid Build Coastguard Worker
975*61046927SAndroid Build Coastguard Worker default:
976*61046927SAndroid Build Coastguard Worker return false;
977*61046927SAndroid Build Coastguard Worker }
978*61046927SAndroid Build Coastguard Worker }
979*61046927SAndroid Build Coastguard Worker
980*61046927SAndroid Build Coastguard Worker static inline bool
lsc_opcode_is_atomic_float(enum lsc_opcode opcode)981*61046927SAndroid Build Coastguard Worker lsc_opcode_is_atomic_float(enum lsc_opcode opcode)
982*61046927SAndroid Build Coastguard Worker {
983*61046927SAndroid Build Coastguard Worker switch (opcode) {
984*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FADD:
985*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FSUB:
986*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FMIN:
987*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FMAX:
988*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FCMPXCHG:
989*61046927SAndroid Build Coastguard Worker return true;
990*61046927SAndroid Build Coastguard Worker
991*61046927SAndroid Build Coastguard Worker default:
992*61046927SAndroid Build Coastguard Worker return false;
993*61046927SAndroid Build Coastguard Worker }
994*61046927SAndroid Build Coastguard Worker }
995*61046927SAndroid Build Coastguard Worker
996*61046927SAndroid Build Coastguard Worker static inline unsigned
lsc_op_num_data_values(unsigned _op)997*61046927SAndroid Build Coastguard Worker lsc_op_num_data_values(unsigned _op)
998*61046927SAndroid Build Coastguard Worker {
999*61046927SAndroid Build Coastguard Worker enum lsc_opcode op = (enum lsc_opcode) _op;
1000*61046927SAndroid Build Coastguard Worker
1001*61046927SAndroid Build Coastguard Worker switch (op) {
1002*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_CMPXCHG:
1003*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FCMPXCHG:
1004*61046927SAndroid Build Coastguard Worker return 2;
1005*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_INC:
1006*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_DEC:
1007*61046927SAndroid Build Coastguard Worker case LSC_OP_LOAD:
1008*61046927SAndroid Build Coastguard Worker case LSC_OP_LOAD_CMASK:
1009*61046927SAndroid Build Coastguard Worker case LSC_OP_FENCE:
1010*61046927SAndroid Build Coastguard Worker /* XXX: actually check docs */
1011*61046927SAndroid Build Coastguard Worker return 0;
1012*61046927SAndroid Build Coastguard Worker default:
1013*61046927SAndroid Build Coastguard Worker return 1;
1014*61046927SAndroid Build Coastguard Worker }
1015*61046927SAndroid Build Coastguard Worker }
1016*61046927SAndroid Build Coastguard Worker
1017*61046927SAndroid Build Coastguard Worker static inline unsigned
lsc_op_to_legacy_atomic(unsigned _op)1018*61046927SAndroid Build Coastguard Worker lsc_op_to_legacy_atomic(unsigned _op)
1019*61046927SAndroid Build Coastguard Worker {
1020*61046927SAndroid Build Coastguard Worker enum lsc_opcode op = (enum lsc_opcode) _op;
1021*61046927SAndroid Build Coastguard Worker
1022*61046927SAndroid Build Coastguard Worker switch (op) {
1023*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_INC:
1024*61046927SAndroid Build Coastguard Worker return BRW_AOP_INC;
1025*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_DEC:
1026*61046927SAndroid Build Coastguard Worker return BRW_AOP_DEC;
1027*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_STORE:
1028*61046927SAndroid Build Coastguard Worker return BRW_AOP_MOV;
1029*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_ADD:
1030*61046927SAndroid Build Coastguard Worker return BRW_AOP_ADD;
1031*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_SUB:
1032*61046927SAndroid Build Coastguard Worker return BRW_AOP_SUB;
1033*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_MIN:
1034*61046927SAndroid Build Coastguard Worker return BRW_AOP_IMIN;
1035*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_MAX:
1036*61046927SAndroid Build Coastguard Worker return BRW_AOP_IMAX;
1037*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_UMIN:
1038*61046927SAndroid Build Coastguard Worker return BRW_AOP_UMIN;
1039*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_UMAX:
1040*61046927SAndroid Build Coastguard Worker return BRW_AOP_UMAX;
1041*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_CMPXCHG:
1042*61046927SAndroid Build Coastguard Worker return BRW_AOP_CMPWR;
1043*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FADD:
1044*61046927SAndroid Build Coastguard Worker return BRW_AOP_FADD;
1045*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FMIN:
1046*61046927SAndroid Build Coastguard Worker return BRW_AOP_FMIN;
1047*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FMAX:
1048*61046927SAndroid Build Coastguard Worker return BRW_AOP_FMAX;
1049*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FCMPXCHG:
1050*61046927SAndroid Build Coastguard Worker return BRW_AOP_FCMPWR;
1051*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_AND:
1052*61046927SAndroid Build Coastguard Worker return BRW_AOP_AND;
1053*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_OR:
1054*61046927SAndroid Build Coastguard Worker return BRW_AOP_OR;
1055*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_XOR:
1056*61046927SAndroid Build Coastguard Worker return BRW_AOP_XOR;
1057*61046927SAndroid Build Coastguard Worker /* No LSC op maps to BRW_AOP_PREDEC */
1058*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_LOAD:
1059*61046927SAndroid Build Coastguard Worker case LSC_OP_ATOMIC_FSUB:
1060*61046927SAndroid Build Coastguard Worker unreachable("no corresponding legacy atomic operation");
1061*61046927SAndroid Build Coastguard Worker case LSC_OP_LOAD:
1062*61046927SAndroid Build Coastguard Worker case LSC_OP_LOAD_CMASK:
1063*61046927SAndroid Build Coastguard Worker case LSC_OP_STORE:
1064*61046927SAndroid Build Coastguard Worker case LSC_OP_STORE_CMASK:
1065*61046927SAndroid Build Coastguard Worker case LSC_OP_FENCE:
1066*61046927SAndroid Build Coastguard Worker unreachable("not an atomic op");
1067*61046927SAndroid Build Coastguard Worker }
1068*61046927SAndroid Build Coastguard Worker
1069*61046927SAndroid Build Coastguard Worker unreachable("invalid LSC op");
1070*61046927SAndroid Build Coastguard Worker }
1071*61046927SAndroid Build Coastguard Worker
1072*61046927SAndroid Build Coastguard Worker static inline uint32_t
lsc_data_size_bytes(enum lsc_data_size data_size)1073*61046927SAndroid Build Coastguard Worker lsc_data_size_bytes(enum lsc_data_size data_size)
1074*61046927SAndroid Build Coastguard Worker {
1075*61046927SAndroid Build Coastguard Worker switch (data_size) {
1076*61046927SAndroid Build Coastguard Worker case LSC_DATA_SIZE_D8:
1077*61046927SAndroid Build Coastguard Worker return 1;
1078*61046927SAndroid Build Coastguard Worker case LSC_DATA_SIZE_D16:
1079*61046927SAndroid Build Coastguard Worker return 2;
1080*61046927SAndroid Build Coastguard Worker case LSC_DATA_SIZE_D32:
1081*61046927SAndroid Build Coastguard Worker case LSC_DATA_SIZE_D8U32:
1082*61046927SAndroid Build Coastguard Worker case LSC_DATA_SIZE_D16U32:
1083*61046927SAndroid Build Coastguard Worker case LSC_DATA_SIZE_D16BF32:
1084*61046927SAndroid Build Coastguard Worker return 4;
1085*61046927SAndroid Build Coastguard Worker case LSC_DATA_SIZE_D64:
1086*61046927SAndroid Build Coastguard Worker return 8;
1087*61046927SAndroid Build Coastguard Worker default:
1088*61046927SAndroid Build Coastguard Worker unreachable("Unsupported data payload size.");
1089*61046927SAndroid Build Coastguard Worker }
1090*61046927SAndroid Build Coastguard Worker }
1091*61046927SAndroid Build Coastguard Worker
1092*61046927SAndroid Build Coastguard Worker static inline uint32_t
lsc_addr_size_bytes(enum lsc_addr_size addr_size)1093*61046927SAndroid Build Coastguard Worker lsc_addr_size_bytes(enum lsc_addr_size addr_size)
1094*61046927SAndroid Build Coastguard Worker {
1095*61046927SAndroid Build Coastguard Worker switch (addr_size) {
1096*61046927SAndroid Build Coastguard Worker case LSC_ADDR_SIZE_A16: return 2;
1097*61046927SAndroid Build Coastguard Worker case LSC_ADDR_SIZE_A32: return 4;
1098*61046927SAndroid Build Coastguard Worker case LSC_ADDR_SIZE_A64: return 8;
1099*61046927SAndroid Build Coastguard Worker default:
1100*61046927SAndroid Build Coastguard Worker unreachable("Unsupported address size.");
1101*61046927SAndroid Build Coastguard Worker }
1102*61046927SAndroid Build Coastguard Worker }
1103*61046927SAndroid Build Coastguard Worker
1104*61046927SAndroid Build Coastguard Worker static inline uint32_t
lsc_vector_length(enum lsc_vect_size vect_size)1105*61046927SAndroid Build Coastguard Worker lsc_vector_length(enum lsc_vect_size vect_size)
1106*61046927SAndroid Build Coastguard Worker {
1107*61046927SAndroid Build Coastguard Worker switch (vect_size) {
1108*61046927SAndroid Build Coastguard Worker case LSC_VECT_SIZE_V1: return 1;
1109*61046927SAndroid Build Coastguard Worker case LSC_VECT_SIZE_V2: return 2;
1110*61046927SAndroid Build Coastguard Worker case LSC_VECT_SIZE_V3: return 3;
1111*61046927SAndroid Build Coastguard Worker case LSC_VECT_SIZE_V4: return 4;
1112*61046927SAndroid Build Coastguard Worker case LSC_VECT_SIZE_V8: return 8;
1113*61046927SAndroid Build Coastguard Worker case LSC_VECT_SIZE_V16: return 16;
1114*61046927SAndroid Build Coastguard Worker case LSC_VECT_SIZE_V32: return 32;
1115*61046927SAndroid Build Coastguard Worker case LSC_VECT_SIZE_V64: return 64;
1116*61046927SAndroid Build Coastguard Worker default:
1117*61046927SAndroid Build Coastguard Worker unreachable("Unsupported size of vector");
1118*61046927SAndroid Build Coastguard Worker }
1119*61046927SAndroid Build Coastguard Worker }
1120*61046927SAndroid Build Coastguard Worker
1121*61046927SAndroid Build Coastguard Worker static inline enum lsc_vect_size
lsc_vect_size(unsigned vect_size)1122*61046927SAndroid Build Coastguard Worker lsc_vect_size(unsigned vect_size)
1123*61046927SAndroid Build Coastguard Worker {
1124*61046927SAndroid Build Coastguard Worker switch(vect_size) {
1125*61046927SAndroid Build Coastguard Worker case 1: return LSC_VECT_SIZE_V1;
1126*61046927SAndroid Build Coastguard Worker case 2: return LSC_VECT_SIZE_V2;
1127*61046927SAndroid Build Coastguard Worker case 3: return LSC_VECT_SIZE_V3;
1128*61046927SAndroid Build Coastguard Worker case 4: return LSC_VECT_SIZE_V4;
1129*61046927SAndroid Build Coastguard Worker case 8: return LSC_VECT_SIZE_V8;
1130*61046927SAndroid Build Coastguard Worker case 16: return LSC_VECT_SIZE_V16;
1131*61046927SAndroid Build Coastguard Worker case 32: return LSC_VECT_SIZE_V32;
1132*61046927SAndroid Build Coastguard Worker case 64: return LSC_VECT_SIZE_V64;
1133*61046927SAndroid Build Coastguard Worker default:
1134*61046927SAndroid Build Coastguard Worker unreachable("Unsupported vector size for dataport");
1135*61046927SAndroid Build Coastguard Worker }
1136*61046927SAndroid Build Coastguard Worker }
1137*61046927SAndroid Build Coastguard Worker
1138*61046927SAndroid Build Coastguard Worker static inline uint32_t
lsc_msg_desc(const struct intel_device_info * devinfo,enum lsc_opcode opcode,enum lsc_addr_surface_type addr_type,enum lsc_addr_size addr_sz,enum lsc_data_size data_sz,unsigned num_channels_or_cmask,bool transpose,unsigned cache_ctrl)1139*61046927SAndroid Build Coastguard Worker lsc_msg_desc(const struct intel_device_info *devinfo,
1140*61046927SAndroid Build Coastguard Worker enum lsc_opcode opcode,
1141*61046927SAndroid Build Coastguard Worker enum lsc_addr_surface_type addr_type,
1142*61046927SAndroid Build Coastguard Worker enum lsc_addr_size addr_sz,
1143*61046927SAndroid Build Coastguard Worker enum lsc_data_size data_sz, unsigned num_channels_or_cmask,
1144*61046927SAndroid Build Coastguard Worker bool transpose, unsigned cache_ctrl)
1145*61046927SAndroid Build Coastguard Worker {
1146*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1147*61046927SAndroid Build Coastguard Worker assert(!transpose || lsc_opcode_has_transpose(opcode));
1148*61046927SAndroid Build Coastguard Worker
1149*61046927SAndroid Build Coastguard Worker unsigned msg_desc =
1150*61046927SAndroid Build Coastguard Worker SET_BITS(opcode, 5, 0) |
1151*61046927SAndroid Build Coastguard Worker SET_BITS(addr_sz, 8, 7) |
1152*61046927SAndroid Build Coastguard Worker SET_BITS(data_sz, 11, 9) |
1153*61046927SAndroid Build Coastguard Worker SET_BITS(transpose, 15, 15) |
1154*61046927SAndroid Build Coastguard Worker (devinfo->ver >= 20 ? SET_BITS(cache_ctrl, 19, 16) :
1155*61046927SAndroid Build Coastguard Worker SET_BITS(cache_ctrl, 19, 17)) |
1156*61046927SAndroid Build Coastguard Worker SET_BITS(addr_type, 30, 29);
1157*61046927SAndroid Build Coastguard Worker
1158*61046927SAndroid Build Coastguard Worker if (lsc_opcode_has_cmask(opcode))
1159*61046927SAndroid Build Coastguard Worker msg_desc |= SET_BITS(num_channels_or_cmask, 15, 12);
1160*61046927SAndroid Build Coastguard Worker else
1161*61046927SAndroid Build Coastguard Worker msg_desc |= SET_BITS(lsc_vect_size(num_channels_or_cmask), 14, 12);
1162*61046927SAndroid Build Coastguard Worker
1163*61046927SAndroid Build Coastguard Worker return msg_desc;
1164*61046927SAndroid Build Coastguard Worker }
1165*61046927SAndroid Build Coastguard Worker
1166*61046927SAndroid Build Coastguard Worker static inline enum lsc_opcode
lsc_msg_desc_opcode(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1167*61046927SAndroid Build Coastguard Worker lsc_msg_desc_opcode(UNUSED const struct intel_device_info *devinfo,
1168*61046927SAndroid Build Coastguard Worker uint32_t desc)
1169*61046927SAndroid Build Coastguard Worker {
1170*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1171*61046927SAndroid Build Coastguard Worker return (enum lsc_opcode) GET_BITS(desc, 5, 0);
1172*61046927SAndroid Build Coastguard Worker }
1173*61046927SAndroid Build Coastguard Worker
1174*61046927SAndroid Build Coastguard Worker static inline enum lsc_addr_size
lsc_msg_desc_addr_size(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1175*61046927SAndroid Build Coastguard Worker lsc_msg_desc_addr_size(UNUSED const struct intel_device_info *devinfo,
1176*61046927SAndroid Build Coastguard Worker uint32_t desc)
1177*61046927SAndroid Build Coastguard Worker {
1178*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1179*61046927SAndroid Build Coastguard Worker return (enum lsc_addr_size) GET_BITS(desc, 8, 7);
1180*61046927SAndroid Build Coastguard Worker }
1181*61046927SAndroid Build Coastguard Worker
1182*61046927SAndroid Build Coastguard Worker static inline enum lsc_data_size
lsc_msg_desc_data_size(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1183*61046927SAndroid Build Coastguard Worker lsc_msg_desc_data_size(UNUSED const struct intel_device_info *devinfo,
1184*61046927SAndroid Build Coastguard Worker uint32_t desc)
1185*61046927SAndroid Build Coastguard Worker {
1186*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1187*61046927SAndroid Build Coastguard Worker return (enum lsc_data_size) GET_BITS(desc, 11, 9);
1188*61046927SAndroid Build Coastguard Worker }
1189*61046927SAndroid Build Coastguard Worker
1190*61046927SAndroid Build Coastguard Worker static inline enum lsc_vect_size
lsc_msg_desc_vect_size(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1191*61046927SAndroid Build Coastguard Worker lsc_msg_desc_vect_size(UNUSED const struct intel_device_info *devinfo,
1192*61046927SAndroid Build Coastguard Worker uint32_t desc)
1193*61046927SAndroid Build Coastguard Worker {
1194*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1195*61046927SAndroid Build Coastguard Worker assert(!lsc_opcode_has_cmask(lsc_msg_desc_opcode(devinfo, desc)));
1196*61046927SAndroid Build Coastguard Worker return (enum lsc_vect_size) GET_BITS(desc, 14, 12);
1197*61046927SAndroid Build Coastguard Worker }
1198*61046927SAndroid Build Coastguard Worker
1199*61046927SAndroid Build Coastguard Worker static inline enum lsc_cmask
lsc_msg_desc_cmask(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1200*61046927SAndroid Build Coastguard Worker lsc_msg_desc_cmask(UNUSED const struct intel_device_info *devinfo,
1201*61046927SAndroid Build Coastguard Worker uint32_t desc)
1202*61046927SAndroid Build Coastguard Worker {
1203*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1204*61046927SAndroid Build Coastguard Worker assert(lsc_opcode_has_cmask(lsc_msg_desc_opcode(devinfo, desc)));
1205*61046927SAndroid Build Coastguard Worker return (enum lsc_cmask) GET_BITS(desc, 15, 12);
1206*61046927SAndroid Build Coastguard Worker }
1207*61046927SAndroid Build Coastguard Worker
1208*61046927SAndroid Build Coastguard Worker static inline bool
lsc_msg_desc_transpose(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1209*61046927SAndroid Build Coastguard Worker lsc_msg_desc_transpose(UNUSED const struct intel_device_info *devinfo,
1210*61046927SAndroid Build Coastguard Worker uint32_t desc)
1211*61046927SAndroid Build Coastguard Worker {
1212*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1213*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 15, 15);
1214*61046927SAndroid Build Coastguard Worker }
1215*61046927SAndroid Build Coastguard Worker
1216*61046927SAndroid Build Coastguard Worker static inline unsigned
lsc_msg_desc_cache_ctrl(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1217*61046927SAndroid Build Coastguard Worker lsc_msg_desc_cache_ctrl(UNUSED const struct intel_device_info *devinfo,
1218*61046927SAndroid Build Coastguard Worker uint32_t desc)
1219*61046927SAndroid Build Coastguard Worker {
1220*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1221*61046927SAndroid Build Coastguard Worker return devinfo->ver >= 20 ? GET_BITS(desc, 19, 16) : GET_BITS(desc, 19, 17);
1222*61046927SAndroid Build Coastguard Worker }
1223*61046927SAndroid Build Coastguard Worker
1224*61046927SAndroid Build Coastguard Worker static inline unsigned
lsc_msg_dest_len(const struct intel_device_info * devinfo,enum lsc_data_size data_sz,unsigned n)1225*61046927SAndroid Build Coastguard Worker lsc_msg_dest_len(const struct intel_device_info *devinfo,
1226*61046927SAndroid Build Coastguard Worker enum lsc_data_size data_sz, unsigned n)
1227*61046927SAndroid Build Coastguard Worker {
1228*61046927SAndroid Build Coastguard Worker return DIV_ROUND_UP(lsc_data_size_bytes(data_sz) * n,
1229*61046927SAndroid Build Coastguard Worker reg_unit(devinfo) * REG_SIZE) * reg_unit(devinfo);
1230*61046927SAndroid Build Coastguard Worker }
1231*61046927SAndroid Build Coastguard Worker
1232*61046927SAndroid Build Coastguard Worker static inline unsigned
lsc_msg_addr_len(const struct intel_device_info * devinfo,enum lsc_addr_size addr_sz,unsigned n)1233*61046927SAndroid Build Coastguard Worker lsc_msg_addr_len(const struct intel_device_info *devinfo,
1234*61046927SAndroid Build Coastguard Worker enum lsc_addr_size addr_sz, unsigned n)
1235*61046927SAndroid Build Coastguard Worker {
1236*61046927SAndroid Build Coastguard Worker return DIV_ROUND_UP(lsc_addr_size_bytes(addr_sz) * n,
1237*61046927SAndroid Build Coastguard Worker reg_unit(devinfo) * REG_SIZE) * reg_unit(devinfo);
1238*61046927SAndroid Build Coastguard Worker }
1239*61046927SAndroid Build Coastguard Worker
1240*61046927SAndroid Build Coastguard Worker static inline enum lsc_addr_surface_type
lsc_msg_desc_addr_type(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1241*61046927SAndroid Build Coastguard Worker lsc_msg_desc_addr_type(UNUSED const struct intel_device_info *devinfo,
1242*61046927SAndroid Build Coastguard Worker uint32_t desc)
1243*61046927SAndroid Build Coastguard Worker {
1244*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1245*61046927SAndroid Build Coastguard Worker return (enum lsc_addr_surface_type) GET_BITS(desc, 30, 29);
1246*61046927SAndroid Build Coastguard Worker }
1247*61046927SAndroid Build Coastguard Worker
1248*61046927SAndroid Build Coastguard Worker 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)1249*61046927SAndroid Build Coastguard Worker lsc_fence_msg_desc(UNUSED const struct intel_device_info *devinfo,
1250*61046927SAndroid Build Coastguard Worker enum lsc_fence_scope scope,
1251*61046927SAndroid Build Coastguard Worker enum lsc_flush_type flush_type,
1252*61046927SAndroid Build Coastguard Worker bool route_to_lsc)
1253*61046927SAndroid Build Coastguard Worker {
1254*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1255*61046927SAndroid Build Coastguard Worker
1256*61046927SAndroid Build Coastguard Worker #if INTEL_NEEDS_WA_22017182272
1257*61046927SAndroid Build Coastguard Worker assert(flush_type != LSC_FLUSH_TYPE_DISCARD);
1258*61046927SAndroid Build Coastguard Worker #endif
1259*61046927SAndroid Build Coastguard Worker
1260*61046927SAndroid Build Coastguard Worker return SET_BITS(LSC_OP_FENCE, 5, 0) |
1261*61046927SAndroid Build Coastguard Worker SET_BITS(LSC_ADDR_SIZE_A32, 8, 7) |
1262*61046927SAndroid Build Coastguard Worker SET_BITS(scope, 11, 9) |
1263*61046927SAndroid Build Coastguard Worker SET_BITS(flush_type, 14, 12) |
1264*61046927SAndroid Build Coastguard Worker SET_BITS(route_to_lsc, 18, 18) |
1265*61046927SAndroid Build Coastguard Worker SET_BITS(LSC_ADDR_SURFTYPE_FLAT, 30, 29);
1266*61046927SAndroid Build Coastguard Worker }
1267*61046927SAndroid Build Coastguard Worker
1268*61046927SAndroid Build Coastguard Worker static inline enum lsc_fence_scope
lsc_fence_msg_desc_scope(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1269*61046927SAndroid Build Coastguard Worker lsc_fence_msg_desc_scope(UNUSED const struct intel_device_info *devinfo,
1270*61046927SAndroid Build Coastguard Worker uint32_t desc)
1271*61046927SAndroid Build Coastguard Worker {
1272*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1273*61046927SAndroid Build Coastguard Worker return (enum lsc_fence_scope) GET_BITS(desc, 11, 9);
1274*61046927SAndroid Build Coastguard Worker }
1275*61046927SAndroid Build Coastguard Worker
1276*61046927SAndroid Build Coastguard Worker static inline enum lsc_flush_type
lsc_fence_msg_desc_flush_type(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1277*61046927SAndroid Build Coastguard Worker lsc_fence_msg_desc_flush_type(UNUSED const struct intel_device_info *devinfo,
1278*61046927SAndroid Build Coastguard Worker uint32_t desc)
1279*61046927SAndroid Build Coastguard Worker {
1280*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1281*61046927SAndroid Build Coastguard Worker return (enum lsc_flush_type) GET_BITS(desc, 14, 12);
1282*61046927SAndroid Build Coastguard Worker }
1283*61046927SAndroid Build Coastguard Worker
1284*61046927SAndroid Build Coastguard Worker static inline enum lsc_backup_fence_routing
lsc_fence_msg_desc_backup_routing(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1285*61046927SAndroid Build Coastguard Worker lsc_fence_msg_desc_backup_routing(UNUSED const struct intel_device_info *devinfo,
1286*61046927SAndroid Build Coastguard Worker uint32_t desc)
1287*61046927SAndroid Build Coastguard Worker {
1288*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1289*61046927SAndroid Build Coastguard Worker return (enum lsc_backup_fence_routing) GET_BITS(desc, 18, 18);
1290*61046927SAndroid Build Coastguard Worker }
1291*61046927SAndroid Build Coastguard Worker
1292*61046927SAndroid Build Coastguard Worker static inline uint32_t
lsc_bti_ex_desc(const struct intel_device_info * devinfo,unsigned bti)1293*61046927SAndroid Build Coastguard Worker lsc_bti_ex_desc(const struct intel_device_info *devinfo, unsigned bti)
1294*61046927SAndroid Build Coastguard Worker {
1295*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1296*61046927SAndroid Build Coastguard Worker return SET_BITS(bti, 31, 24) |
1297*61046927SAndroid Build Coastguard Worker SET_BITS(0, 23, 12); /* base offset */
1298*61046927SAndroid Build Coastguard Worker }
1299*61046927SAndroid Build Coastguard Worker
1300*61046927SAndroid Build Coastguard Worker static inline unsigned
lsc_bti_ex_desc_base_offset(const struct intel_device_info * devinfo,uint32_t ex_desc)1301*61046927SAndroid Build Coastguard Worker lsc_bti_ex_desc_base_offset(const struct intel_device_info *devinfo,
1302*61046927SAndroid Build Coastguard Worker uint32_t ex_desc)
1303*61046927SAndroid Build Coastguard Worker {
1304*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1305*61046927SAndroid Build Coastguard Worker return GET_BITS(ex_desc, 23, 12);
1306*61046927SAndroid Build Coastguard Worker }
1307*61046927SAndroid Build Coastguard Worker
1308*61046927SAndroid Build Coastguard Worker static inline unsigned
lsc_bti_ex_desc_index(const struct intel_device_info * devinfo,uint32_t ex_desc)1309*61046927SAndroid Build Coastguard Worker lsc_bti_ex_desc_index(const struct intel_device_info *devinfo,
1310*61046927SAndroid Build Coastguard Worker uint32_t ex_desc)
1311*61046927SAndroid Build Coastguard Worker {
1312*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1313*61046927SAndroid Build Coastguard Worker return GET_BITS(ex_desc, 31, 24);
1314*61046927SAndroid Build Coastguard Worker }
1315*61046927SAndroid Build Coastguard Worker
1316*61046927SAndroid Build Coastguard Worker static inline unsigned
lsc_flat_ex_desc_base_offset(const struct intel_device_info * devinfo,uint32_t ex_desc)1317*61046927SAndroid Build Coastguard Worker lsc_flat_ex_desc_base_offset(const struct intel_device_info *devinfo,
1318*61046927SAndroid Build Coastguard Worker uint32_t ex_desc)
1319*61046927SAndroid Build Coastguard Worker {
1320*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1321*61046927SAndroid Build Coastguard Worker return GET_BITS(ex_desc, 31, 12);
1322*61046927SAndroid Build Coastguard Worker }
1323*61046927SAndroid Build Coastguard Worker
1324*61046927SAndroid Build Coastguard Worker static inline uint32_t
lsc_bss_ex_desc(const struct intel_device_info * devinfo,unsigned surface_state_index)1325*61046927SAndroid Build Coastguard Worker lsc_bss_ex_desc(const struct intel_device_info *devinfo,
1326*61046927SAndroid Build Coastguard Worker unsigned surface_state_index)
1327*61046927SAndroid Build Coastguard Worker {
1328*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1329*61046927SAndroid Build Coastguard Worker return SET_BITS(surface_state_index, 31, 6);
1330*61046927SAndroid Build Coastguard Worker }
1331*61046927SAndroid Build Coastguard Worker
1332*61046927SAndroid Build Coastguard Worker static inline unsigned
lsc_bss_ex_desc_index(const struct intel_device_info * devinfo,uint32_t ex_desc)1333*61046927SAndroid Build Coastguard Worker lsc_bss_ex_desc_index(const struct intel_device_info *devinfo,
1334*61046927SAndroid Build Coastguard Worker uint32_t ex_desc)
1335*61046927SAndroid Build Coastguard Worker {
1336*61046927SAndroid Build Coastguard Worker assert(devinfo->has_lsc);
1337*61046927SAndroid Build Coastguard Worker return GET_BITS(ex_desc, 31, 6);
1338*61046927SAndroid Build Coastguard Worker }
1339*61046927SAndroid Build Coastguard Worker
1340*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_mdc_sm2(unsigned exec_size)1341*61046927SAndroid Build Coastguard Worker brw_mdc_sm2(unsigned exec_size)
1342*61046927SAndroid Build Coastguard Worker {
1343*61046927SAndroid Build Coastguard Worker assert(exec_size == 8 || exec_size == 16);
1344*61046927SAndroid Build Coastguard Worker return exec_size > 8;
1345*61046927SAndroid Build Coastguard Worker }
1346*61046927SAndroid Build Coastguard Worker
1347*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_mdc_sm2_exec_size(uint32_t sm2)1348*61046927SAndroid Build Coastguard Worker brw_mdc_sm2_exec_size(uint32_t sm2)
1349*61046927SAndroid Build Coastguard Worker {
1350*61046927SAndroid Build Coastguard Worker assert(sm2 <= 1);
1351*61046927SAndroid Build Coastguard Worker return 8 << sm2;
1352*61046927SAndroid Build Coastguard Worker }
1353*61046927SAndroid Build Coastguard Worker
1354*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_btd_spawn_desc(ASSERTED const struct intel_device_info * devinfo,unsigned exec_size,unsigned msg_type)1355*61046927SAndroid Build Coastguard Worker brw_btd_spawn_desc(ASSERTED const struct intel_device_info *devinfo,
1356*61046927SAndroid Build Coastguard Worker unsigned exec_size, unsigned msg_type)
1357*61046927SAndroid Build Coastguard Worker {
1358*61046927SAndroid Build Coastguard Worker assert(devinfo->has_ray_tracing);
1359*61046927SAndroid Build Coastguard Worker assert(devinfo->ver < 20 || exec_size == 16);
1360*61046927SAndroid Build Coastguard Worker
1361*61046927SAndroid Build Coastguard Worker return SET_BITS(0, 19, 19) | /* No header */
1362*61046927SAndroid Build Coastguard Worker SET_BITS(msg_type, 17, 14) |
1363*61046927SAndroid Build Coastguard Worker SET_BITS(brw_mdc_sm2(exec_size), 8, 8);
1364*61046927SAndroid Build Coastguard Worker }
1365*61046927SAndroid Build Coastguard Worker
1366*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_btd_spawn_msg_type(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1367*61046927SAndroid Build Coastguard Worker brw_btd_spawn_msg_type(UNUSED const struct intel_device_info *devinfo,
1368*61046927SAndroid Build Coastguard Worker uint32_t desc)
1369*61046927SAndroid Build Coastguard Worker {
1370*61046927SAndroid Build Coastguard Worker return GET_BITS(desc, 17, 14);
1371*61046927SAndroid Build Coastguard Worker }
1372*61046927SAndroid Build Coastguard Worker
1373*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_btd_spawn_exec_size(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1374*61046927SAndroid Build Coastguard Worker brw_btd_spawn_exec_size(UNUSED const struct intel_device_info *devinfo,
1375*61046927SAndroid Build Coastguard Worker uint32_t desc)
1376*61046927SAndroid Build Coastguard Worker {
1377*61046927SAndroid Build Coastguard Worker return brw_mdc_sm2_exec_size(GET_BITS(desc, 8, 8));
1378*61046927SAndroid Build Coastguard Worker }
1379*61046927SAndroid Build Coastguard Worker
1380*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_rt_trace_ray_desc(ASSERTED const struct intel_device_info * devinfo,unsigned exec_size)1381*61046927SAndroid Build Coastguard Worker brw_rt_trace_ray_desc(ASSERTED const struct intel_device_info *devinfo,
1382*61046927SAndroid Build Coastguard Worker unsigned exec_size)
1383*61046927SAndroid Build Coastguard Worker {
1384*61046927SAndroid Build Coastguard Worker assert(devinfo->has_ray_tracing);
1385*61046927SAndroid Build Coastguard Worker assert(devinfo->ver < 20 || exec_size == 16);
1386*61046927SAndroid Build Coastguard Worker
1387*61046927SAndroid Build Coastguard Worker return SET_BITS(0, 19, 19) | /* No header */
1388*61046927SAndroid Build Coastguard Worker SET_BITS(0, 17, 14) | /* Message type */
1389*61046927SAndroid Build Coastguard Worker SET_BITS(brw_mdc_sm2(exec_size), 8, 8);
1390*61046927SAndroid Build Coastguard Worker }
1391*61046927SAndroid Build Coastguard Worker
1392*61046927SAndroid Build Coastguard Worker static inline uint32_t
brw_rt_trace_ray_desc_exec_size(UNUSED const struct intel_device_info * devinfo,uint32_t desc)1393*61046927SAndroid Build Coastguard Worker brw_rt_trace_ray_desc_exec_size(UNUSED const struct intel_device_info *devinfo,
1394*61046927SAndroid Build Coastguard Worker uint32_t desc)
1395*61046927SAndroid Build Coastguard Worker {
1396*61046927SAndroid Build Coastguard Worker return brw_mdc_sm2_exec_size(GET_BITS(desc, 8, 8));
1397*61046927SAndroid Build Coastguard Worker }
1398*61046927SAndroid Build Coastguard Worker
1399*61046927SAndroid Build Coastguard Worker /**
1400*61046927SAndroid Build Coastguard Worker * Construct a message descriptor immediate with the specified pixel
1401*61046927SAndroid Build Coastguard Worker * interpolator function controls.
1402*61046927SAndroid Build Coastguard Worker */
1403*61046927SAndroid Build Coastguard Worker 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 exec_size,unsigned group)1404*61046927SAndroid Build Coastguard Worker brw_pixel_interp_desc(UNUSED const struct intel_device_info *devinfo,
1405*61046927SAndroid Build Coastguard Worker unsigned msg_type,
1406*61046927SAndroid Build Coastguard Worker bool noperspective,
1407*61046927SAndroid Build Coastguard Worker bool coarse_pixel_rate,
1408*61046927SAndroid Build Coastguard Worker unsigned exec_size,
1409*61046927SAndroid Build Coastguard Worker unsigned group)
1410*61046927SAndroid Build Coastguard Worker {
1411*61046927SAndroid Build Coastguard Worker assert(exec_size == 8 || exec_size == 16);
1412*61046927SAndroid Build Coastguard Worker const bool simd_mode = exec_size == 16;
1413*61046927SAndroid Build Coastguard Worker const bool slot_group = group >= 16;
1414*61046927SAndroid Build Coastguard Worker
1415*61046927SAndroid Build Coastguard Worker assert(devinfo->ver >= 10 || !coarse_pixel_rate);
1416*61046927SAndroid Build Coastguard Worker return (SET_BITS(slot_group, 11, 11) |
1417*61046927SAndroid Build Coastguard Worker SET_BITS(msg_type, 13, 12) |
1418*61046927SAndroid Build Coastguard Worker SET_BITS(!!noperspective, 14, 14) |
1419*61046927SAndroid Build Coastguard Worker SET_BITS(coarse_pixel_rate, 15, 15) |
1420*61046927SAndroid Build Coastguard Worker SET_BITS(simd_mode, 16, 16));
1421*61046927SAndroid Build Coastguard Worker }
1422*61046927SAndroid Build Coastguard Worker
1423*61046927SAndroid Build Coastguard Worker /**
1424*61046927SAndroid Build Coastguard Worker * Send message to shared unit \p sfid with a possibly indirect descriptor \p
1425*61046927SAndroid Build Coastguard Worker * desc. If \p desc is not an immediate it will be transparently loaded to an
1426*61046927SAndroid Build Coastguard Worker * address register using an OR instruction.
1427*61046927SAndroid Build Coastguard Worker */
1428*61046927SAndroid Build Coastguard Worker void
1429*61046927SAndroid Build Coastguard Worker brw_send_indirect_message(struct brw_codegen *p,
1430*61046927SAndroid Build Coastguard Worker unsigned sfid,
1431*61046927SAndroid Build Coastguard Worker struct brw_reg dst,
1432*61046927SAndroid Build Coastguard Worker struct brw_reg payload,
1433*61046927SAndroid Build Coastguard Worker struct brw_reg desc,
1434*61046927SAndroid Build Coastguard Worker unsigned desc_imm,
1435*61046927SAndroid Build Coastguard Worker bool eot);
1436*61046927SAndroid Build Coastguard Worker
1437*61046927SAndroid Build Coastguard Worker void
1438*61046927SAndroid Build Coastguard Worker brw_send_indirect_split_message(struct brw_codegen *p,
1439*61046927SAndroid Build Coastguard Worker unsigned sfid,
1440*61046927SAndroid Build Coastguard Worker struct brw_reg dst,
1441*61046927SAndroid Build Coastguard Worker struct brw_reg payload0,
1442*61046927SAndroid Build Coastguard Worker struct brw_reg payload1,
1443*61046927SAndroid Build Coastguard Worker struct brw_reg desc,
1444*61046927SAndroid Build Coastguard Worker unsigned desc_imm,
1445*61046927SAndroid Build Coastguard Worker struct brw_reg ex_desc,
1446*61046927SAndroid Build Coastguard Worker unsigned ex_desc_imm,
1447*61046927SAndroid Build Coastguard Worker bool ex_desc_scratch,
1448*61046927SAndroid Build Coastguard Worker bool ex_bso,
1449*61046927SAndroid Build Coastguard Worker bool eot);
1450*61046927SAndroid Build Coastguard Worker
1451*61046927SAndroid Build Coastguard Worker void gfx6_math(struct brw_codegen *p,
1452*61046927SAndroid Build Coastguard Worker struct brw_reg dest,
1453*61046927SAndroid Build Coastguard Worker unsigned function,
1454*61046927SAndroid Build Coastguard Worker struct brw_reg src0,
1455*61046927SAndroid Build Coastguard Worker struct brw_reg src1);
1456*61046927SAndroid Build Coastguard Worker
1457*61046927SAndroid Build Coastguard Worker /**
1458*61046927SAndroid Build Coastguard Worker * Return the generation-specific jump distance scaling factor.
1459*61046927SAndroid Build Coastguard Worker *
1460*61046927SAndroid Build Coastguard Worker * Given the number of instructions to jump, we need to scale by
1461*61046927SAndroid Build Coastguard Worker * some number to obtain the actual jump distance to program in an
1462*61046927SAndroid Build Coastguard Worker * instruction.
1463*61046927SAndroid Build Coastguard Worker */
1464*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_jump_scale(const struct intel_device_info * devinfo)1465*61046927SAndroid Build Coastguard Worker brw_jump_scale(const struct intel_device_info *devinfo)
1466*61046927SAndroid Build Coastguard Worker {
1467*61046927SAndroid Build Coastguard Worker /* Broadwell measures jump targets in bytes. */
1468*61046927SAndroid Build Coastguard Worker return 16;
1469*61046927SAndroid Build Coastguard Worker }
1470*61046927SAndroid Build Coastguard Worker
1471*61046927SAndroid Build Coastguard Worker void brw_barrier(struct brw_codegen *p, struct brw_reg src);
1472*61046927SAndroid Build Coastguard Worker
1473*61046927SAndroid Build Coastguard Worker /* If/else/endif. Works by manipulating the execution flags on each
1474*61046927SAndroid Build Coastguard Worker * channel.
1475*61046927SAndroid Build Coastguard Worker */
1476*61046927SAndroid Build Coastguard Worker brw_inst *brw_IF(struct brw_codegen *p, unsigned execute_size);
1477*61046927SAndroid Build Coastguard Worker
1478*61046927SAndroid Build Coastguard Worker void brw_ELSE(struct brw_codegen *p);
1479*61046927SAndroid Build Coastguard Worker void brw_ENDIF(struct brw_codegen *p);
1480*61046927SAndroid Build Coastguard Worker
1481*61046927SAndroid Build Coastguard Worker /* DO/WHILE loops:
1482*61046927SAndroid Build Coastguard Worker */
1483*61046927SAndroid Build Coastguard Worker brw_inst *brw_DO(struct brw_codegen *p, unsigned execute_size);
1484*61046927SAndroid Build Coastguard Worker
1485*61046927SAndroid Build Coastguard Worker brw_inst *brw_WHILE(struct brw_codegen *p);
1486*61046927SAndroid Build Coastguard Worker
1487*61046927SAndroid Build Coastguard Worker brw_inst *brw_BREAK(struct brw_codegen *p);
1488*61046927SAndroid Build Coastguard Worker brw_inst *brw_CONT(struct brw_codegen *p);
1489*61046927SAndroid Build Coastguard Worker brw_inst *brw_HALT(struct brw_codegen *p);
1490*61046927SAndroid Build Coastguard Worker
1491*61046927SAndroid Build Coastguard Worker /* Forward jumps:
1492*61046927SAndroid Build Coastguard Worker */
1493*61046927SAndroid Build Coastguard Worker brw_inst *brw_JMPI(struct brw_codegen *p, struct brw_reg index,
1494*61046927SAndroid Build Coastguard Worker unsigned predicate_control);
1495*61046927SAndroid Build Coastguard Worker
1496*61046927SAndroid Build Coastguard Worker void brw_NOP(struct brw_codegen *p);
1497*61046927SAndroid Build Coastguard Worker
1498*61046927SAndroid Build Coastguard Worker void brw_WAIT(struct brw_codegen *p);
1499*61046927SAndroid Build Coastguard Worker
1500*61046927SAndroid Build Coastguard Worker void brw_SYNC(struct brw_codegen *p, enum tgl_sync_function func);
1501*61046927SAndroid Build Coastguard Worker
1502*61046927SAndroid Build Coastguard Worker /* Special case: there is never a destination, execution size will be
1503*61046927SAndroid Build Coastguard Worker * taken from src0:
1504*61046927SAndroid Build Coastguard Worker */
1505*61046927SAndroid Build Coastguard Worker void brw_CMP(struct brw_codegen *p,
1506*61046927SAndroid Build Coastguard Worker struct brw_reg dest,
1507*61046927SAndroid Build Coastguard Worker unsigned conditional,
1508*61046927SAndroid Build Coastguard Worker struct brw_reg src0,
1509*61046927SAndroid Build Coastguard Worker struct brw_reg src1);
1510*61046927SAndroid Build Coastguard Worker
1511*61046927SAndroid Build Coastguard Worker void brw_CMPN(struct brw_codegen *p,
1512*61046927SAndroid Build Coastguard Worker struct brw_reg dest,
1513*61046927SAndroid Build Coastguard Worker unsigned conditional,
1514*61046927SAndroid Build Coastguard Worker struct brw_reg src0,
1515*61046927SAndroid Build Coastguard Worker struct brw_reg src1);
1516*61046927SAndroid Build Coastguard Worker
1517*61046927SAndroid Build Coastguard Worker brw_inst *brw_DPAS(struct brw_codegen *p, enum gfx12_systolic_depth sdepth,
1518*61046927SAndroid Build Coastguard Worker unsigned rcount, struct brw_reg dest, struct brw_reg src0,
1519*61046927SAndroid Build Coastguard Worker struct brw_reg src1, struct brw_reg src2);
1520*61046927SAndroid Build Coastguard Worker
1521*61046927SAndroid Build Coastguard Worker void
1522*61046927SAndroid Build Coastguard Worker brw_memory_fence(struct brw_codegen *p,
1523*61046927SAndroid Build Coastguard Worker struct brw_reg dst,
1524*61046927SAndroid Build Coastguard Worker struct brw_reg src,
1525*61046927SAndroid Build Coastguard Worker enum opcode send_op,
1526*61046927SAndroid Build Coastguard Worker enum brw_message_target sfid,
1527*61046927SAndroid Build Coastguard Worker uint32_t desc,
1528*61046927SAndroid Build Coastguard Worker bool commit_enable,
1529*61046927SAndroid Build Coastguard Worker unsigned bti);
1530*61046927SAndroid Build Coastguard Worker
1531*61046927SAndroid Build Coastguard Worker void
1532*61046927SAndroid Build Coastguard Worker brw_broadcast(struct brw_codegen *p,
1533*61046927SAndroid Build Coastguard Worker struct brw_reg dst,
1534*61046927SAndroid Build Coastguard Worker struct brw_reg src,
1535*61046927SAndroid Build Coastguard Worker struct brw_reg idx);
1536*61046927SAndroid Build Coastguard Worker
1537*61046927SAndroid Build Coastguard Worker void
1538*61046927SAndroid Build Coastguard Worker brw_float_controls_mode(struct brw_codegen *p,
1539*61046927SAndroid Build Coastguard Worker unsigned mode, unsigned mask);
1540*61046927SAndroid Build Coastguard Worker
1541*61046927SAndroid Build Coastguard Worker void
1542*61046927SAndroid Build Coastguard Worker brw_update_reloc_imm(const struct brw_isa_info *isa,
1543*61046927SAndroid Build Coastguard Worker brw_inst *inst,
1544*61046927SAndroid Build Coastguard Worker uint32_t value);
1545*61046927SAndroid Build Coastguard Worker
1546*61046927SAndroid Build Coastguard Worker void
1547*61046927SAndroid Build Coastguard Worker brw_MOV_reloc_imm(struct brw_codegen *p,
1548*61046927SAndroid Build Coastguard Worker struct brw_reg dst,
1549*61046927SAndroid Build Coastguard Worker enum brw_reg_type src_type,
1550*61046927SAndroid Build Coastguard Worker uint32_t id, uint32_t base);
1551*61046927SAndroid Build Coastguard Worker
1552*61046927SAndroid Build Coastguard Worker unsigned
1553*61046927SAndroid Build Coastguard Worker brw_num_sources_from_inst(const struct brw_isa_info *isa,
1554*61046927SAndroid Build Coastguard Worker const brw_inst *inst);
1555*61046927SAndroid Build Coastguard Worker
1556*61046927SAndroid Build Coastguard Worker void brw_set_src1(struct brw_codegen *p, brw_inst *insn, struct brw_reg reg);
1557*61046927SAndroid Build Coastguard Worker
1558*61046927SAndroid Build Coastguard Worker void brw_set_desc_ex(struct brw_codegen *p, brw_inst *insn,
1559*61046927SAndroid Build Coastguard Worker unsigned desc, unsigned ex_desc);
1560*61046927SAndroid Build Coastguard Worker
1561*61046927SAndroid Build Coastguard Worker static inline void
brw_set_desc(struct brw_codegen * p,brw_inst * insn,unsigned desc)1562*61046927SAndroid Build Coastguard Worker brw_set_desc(struct brw_codegen *p, brw_inst *insn, unsigned desc)
1563*61046927SAndroid Build Coastguard Worker {
1564*61046927SAndroid Build Coastguard Worker brw_set_desc_ex(p, insn, desc, 0);
1565*61046927SAndroid Build Coastguard Worker }
1566*61046927SAndroid Build Coastguard Worker
1567*61046927SAndroid Build Coastguard Worker void brw_set_uip_jip(struct brw_codegen *p, int start_offset);
1568*61046927SAndroid Build Coastguard Worker
1569*61046927SAndroid Build Coastguard Worker enum brw_conditional_mod brw_negate_cmod(enum brw_conditional_mod cmod);
1570*61046927SAndroid Build Coastguard Worker enum brw_conditional_mod brw_swap_cmod(enum brw_conditional_mod cmod);
1571*61046927SAndroid Build Coastguard Worker
1572*61046927SAndroid Build Coastguard Worker /* brw_eu_compact.c */
1573*61046927SAndroid Build Coastguard Worker void brw_compact_instructions(struct brw_codegen *p, int start_offset,
1574*61046927SAndroid Build Coastguard Worker struct disasm_info *disasm);
1575*61046927SAndroid Build Coastguard Worker void brw_uncompact_instruction(const struct brw_isa_info *isa,
1576*61046927SAndroid Build Coastguard Worker brw_inst *dst, brw_compact_inst *src);
1577*61046927SAndroid Build Coastguard Worker bool brw_try_compact_instruction(const struct brw_isa_info *isa,
1578*61046927SAndroid Build Coastguard Worker brw_compact_inst *dst, const brw_inst *src);
1579*61046927SAndroid Build Coastguard Worker
1580*61046927SAndroid Build Coastguard Worker void brw_debug_compact_uncompact(const struct brw_isa_info *isa,
1581*61046927SAndroid Build Coastguard Worker brw_inst *orig, brw_inst *uncompacted);
1582*61046927SAndroid Build Coastguard Worker
1583*61046927SAndroid Build Coastguard Worker /* brw_eu_validate.c */
1584*61046927SAndroid Build Coastguard Worker bool brw_validate_instruction(const struct brw_isa_info *isa,
1585*61046927SAndroid Build Coastguard Worker const brw_inst *inst, int offset,
1586*61046927SAndroid Build Coastguard Worker unsigned inst_size,
1587*61046927SAndroid Build Coastguard Worker struct disasm_info *disasm);
1588*61046927SAndroid Build Coastguard Worker bool brw_validate_instructions(const struct brw_isa_info *isa,
1589*61046927SAndroid Build Coastguard Worker const void *assembly, int start_offset, int end_offset,
1590*61046927SAndroid Build Coastguard Worker struct disasm_info *disasm);
1591*61046927SAndroid Build Coastguard Worker
1592*61046927SAndroid Build Coastguard Worker static inline int
next_offset(const struct intel_device_info * devinfo,void * store,int offset)1593*61046927SAndroid Build Coastguard Worker next_offset(const struct intel_device_info *devinfo, void *store, int offset)
1594*61046927SAndroid Build Coastguard Worker {
1595*61046927SAndroid Build Coastguard Worker brw_inst *insn = (brw_inst *)((char *)store + offset);
1596*61046927SAndroid Build Coastguard Worker
1597*61046927SAndroid Build Coastguard Worker if (brw_inst_cmpt_control(devinfo, insn))
1598*61046927SAndroid Build Coastguard Worker return offset + 8;
1599*61046927SAndroid Build Coastguard Worker else
1600*61046927SAndroid Build Coastguard Worker return offset + 16;
1601*61046927SAndroid Build Coastguard Worker }
1602*61046927SAndroid Build Coastguard Worker
1603*61046927SAndroid Build Coastguard Worker /** Maximum SEND message length */
1604*61046927SAndroid Build Coastguard Worker #define BRW_MAX_MSG_LENGTH 15
1605*61046927SAndroid Build Coastguard Worker
1606*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
1607*61046927SAndroid Build Coastguard Worker }
1608*61046927SAndroid Build Coastguard Worker #endif
1609*61046927SAndroid Build Coastguard Worker
1610*61046927SAndroid Build Coastguard Worker #endif
1611