xref: /aosp_15_r20/external/mesa3d/src/intel/compiler/brw_eu.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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