• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2012 Rob Clark <robdclark@gmail.com>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  */
23 
24 #ifndef INSTR_A2XX_H_
25 #define INSTR_A2XX_H_
26 
27 #define PACKED __attribute__((__packed__))
28 
29 #include "util/u_math.h"
30 #include "adreno_common.xml.h"
31 #include "adreno_pm4.xml.h"
32 #include "a2xx.xml.h"
33 
34 
35 /*
36  * ALU instructions:
37  */
38 
39 typedef enum {
40 	ADDs = 0,
41 	ADD_PREVs = 1,
42 	MULs = 2,
43 	MUL_PREVs = 3,
44 	MUL_PREV2s = 4,
45 	MAXs = 5,
46 	MINs = 6,
47 	SETEs = 7,
48 	SETGTs = 8,
49 	SETGTEs = 9,
50 	SETNEs = 10,
51 	FRACs = 11,
52 	TRUNCs = 12,
53 	FLOORs = 13,
54 	EXP_IEEE = 14,
55 	LOG_CLAMP = 15,
56 	LOG_IEEE = 16,
57 	RECIP_CLAMP = 17,
58 	RECIP_FF = 18,
59 	RECIP_IEEE = 19,
60 	RECIPSQ_CLAMP = 20,
61 	RECIPSQ_FF = 21,
62 	RECIPSQ_IEEE = 22,
63 	MOVAs = 23,
64 	MOVA_FLOORs = 24,
65 	SUBs = 25,
66 	SUB_PREVs = 26,
67 	PRED_SETEs = 27,
68 	PRED_SETNEs = 28,
69 	PRED_SETGTs = 29,
70 	PRED_SETGTEs = 30,
71 	PRED_SET_INVs = 31,
72 	PRED_SET_POPs = 32,
73 	PRED_SET_CLRs = 33,
74 	PRED_SET_RESTOREs = 34,
75 	KILLEs = 35,
76 	KILLGTs = 36,
77 	KILLGTEs = 37,
78 	KILLNEs = 38,
79 	KILLONEs = 39,
80 	SQRT_IEEE = 40,
81 	MUL_CONST_0 = 42,
82 	MUL_CONST_1 = 43,
83 	ADD_CONST_0 = 44,
84 	ADD_CONST_1 = 45,
85 	SUB_CONST_0 = 46,
86 	SUB_CONST_1 = 47,
87 	SIN = 48,
88 	COS = 49,
89 	RETAIN_PREV = 50,
90 } instr_scalar_opc_t;
91 
92 typedef enum {
93 	ADDv = 0,
94 	MULv = 1,
95 	MAXv = 2,
96 	MINv = 3,
97 	SETEv = 4,
98 	SETGTv = 5,
99 	SETGTEv = 6,
100 	SETNEv = 7,
101 	FRACv = 8,
102 	TRUNCv = 9,
103 	FLOORv = 10,
104 	MULADDv = 11,
105 	CNDEv = 12,
106 	CNDGTEv = 13,
107 	CNDGTv = 14,
108 	DOT4v = 15,
109 	DOT3v = 16,
110 	DOT2ADDv = 17,
111 	CUBEv = 18,
112 	MAX4v = 19,
113 	PRED_SETE_PUSHv = 20,
114 	PRED_SETNE_PUSHv = 21,
115 	PRED_SETGT_PUSHv = 22,
116 	PRED_SETGTE_PUSHv = 23,
117 	KILLEv = 24,
118 	KILLGTv = 25,
119 	KILLGTEv = 26,
120 	KILLNEv = 27,
121 	DSTv = 28,
122 	MOVAv = 29,
123 } instr_vector_opc_t;
124 
125 typedef struct PACKED {
126 	/* dword0: */
127 	uint8_t             vector_dest              : 6;
128 	uint8_t             vector_dest_rel          : 1;
129 	uint8_t             low_precision_16b_fp     : 1;
130 	uint8_t             scalar_dest              : 6;
131 	uint8_t             scalar_dest_rel          : 1;
132 	uint8_t             export_data              : 1;
133 	uint8_t             vector_write_mask        : 4;
134 	uint8_t             scalar_write_mask        : 4;
135 	uint8_t             vector_clamp             : 1;
136 	uint8_t             scalar_clamp             : 1;
137 	instr_scalar_opc_t  scalar_opc               : 6;
138 	/* dword1: */
139 	uint8_t             src3_swiz                : 8;
140 	uint8_t             src2_swiz                : 8;
141 	uint8_t             src1_swiz                : 8;
142 	uint8_t             src3_reg_negate          : 1;
143 	uint8_t             src2_reg_negate          : 1;
144 	uint8_t             src1_reg_negate          : 1;
145 	uint8_t             pred_select              : 2;
146 	uint8_t             relative_addr            : 1;
147 	uint8_t             const_1_rel_abs          : 1;
148 	uint8_t             const_0_rel_abs          : 1;
149 	/* dword2: */
150 	uint8_t             src3_reg                 : 6;
151 	uint8_t             src3_reg_select          : 1;
152 	uint8_t             src3_reg_abs             : 1;
153 	uint8_t             src2_reg                 : 6;
154 	uint8_t             src2_reg_select          : 1;
155 	uint8_t             src2_reg_abs             : 1;
156 	uint8_t             src1_reg                 : 6;
157 	uint8_t             src1_reg_select          : 1;
158 	uint8_t             src1_reg_abs             : 1;
159 	instr_vector_opc_t  vector_opc               : 5;
160 	uint8_t             src3_sel                 : 1;
161 	uint8_t             src2_sel                 : 1;
162 	uint8_t             src1_sel                 : 1;
163 } instr_alu_t;
164 
165 
166 
167 /*
168  * CF instructions:
169  */
170 
171 typedef enum {
172 	NOP = 0,
173 	EXEC = 1,
174 	EXEC_END = 2,
175 	COND_EXEC = 3,
176 	COND_EXEC_END = 4,
177 	COND_PRED_EXEC = 5,
178 	COND_PRED_EXEC_END = 6,
179 	LOOP_START = 7,
180 	LOOP_END = 8,
181 	COND_CALL = 9,
182 	RETURN = 10,
183 	COND_JMP = 11,
184 	ALLOC = 12,
185 	COND_EXEC_PRED_CLEAN = 13,
186 	COND_EXEC_PRED_CLEAN_END = 14,
187 	MARK_VS_FETCH_DONE = 15,
188 } instr_cf_opc_t;
189 
190 typedef enum {
191 	RELATIVE_ADDR = 0,
192 	ABSOLUTE_ADDR = 1,
193 } instr_addr_mode_t;
194 
195 typedef enum {
196 	SQ_NO_ALLOC = 0,
197 	SQ_POSITION = 1,
198 	SQ_PARAMETER_PIXEL = 2,
199 	SQ_MEMORY = 3,
200 } instr_alloc_type_t;
201 
202 typedef struct PACKED {
203 	uint16_t            address                  : 9;
204 	uint8_t             reserved0                : 3;
205 	uint8_t             count                    : 3;
206 	uint8_t             yeild                    : 1;
207 	uint16_t            serialize                : 12;
208 	uint8_t             vc                       : 6;   /* vertex cache? */
209 	uint8_t             bool_addr                : 8;
210 	uint8_t             condition                : 1;
211 	instr_addr_mode_t   address_mode             : 1;
212 	instr_cf_opc_t      opc                      : 4;
213 } instr_cf_exec_t;
214 
215 typedef struct PACKED {
216 	uint16_t            address                  : 10;
217 	uint8_t             reserved0                : 6;
218 	uint8_t             loop_id                  : 5;
219 	uint32_t            reserved1                : 22;
220 	instr_addr_mode_t   address_mode             : 1;
221 	instr_cf_opc_t      opc                      : 4;
222 } instr_cf_loop_t;
223 
224 typedef struct PACKED {
225 	uint16_t            address                  : 10;
226 	uint8_t             reserved0                : 3;
227 	uint8_t             force_call               : 1;
228 	uint8_t             predicated_jmp           : 1;
229 	uint32_t            reserved1                : 18;
230 	uint8_t             direction                : 1;
231 	uint8_t             bool_addr                : 8;
232 	uint8_t             condition                : 1;
233 	instr_addr_mode_t   address_mode             : 1;
234 	instr_cf_opc_t      opc                      : 4;
235 } instr_cf_jmp_call_t;
236 
237 typedef struct PACKED {
238 	uint8_t             size                     : 4;
239 	uint64_t            reserved0                : 36;
240 	uint8_t             no_serial                : 1;
241 	instr_alloc_type_t  buffer_select            : 2;
242 	uint8_t             alloc_mode               : 1;
243 	instr_cf_opc_t      opc                      : 4;
244 } instr_cf_alloc_t;
245 
246 typedef union PACKED {
247 	instr_cf_exec_t     exec;
248 	instr_cf_loop_t     loop;
249 	instr_cf_jmp_call_t jmp_call;
250 	instr_cf_alloc_t    alloc;
251 	struct PACKED {
252 		uint64_t        dummy                    : 44;
253 		instr_cf_opc_t  opc                      : 4;
254 	};
255 } instr_cf_t;
256 
257 
258 
259 /*
260  * FETCH instructions:
261  */
262 
263 typedef enum {
264 	VTX_FETCH = 0,
265 	TEX_FETCH = 1,
266 	TEX_GET_BORDER_COLOR_FRAC = 16,
267 	TEX_GET_COMP_TEX_LOD = 17,
268 	TEX_GET_GRADIENTS = 18,
269 	TEX_GET_WEIGHTS = 19,
270 	TEX_SET_TEX_LOD = 24,
271 	TEX_SET_GRADIENTS_H = 25,
272 	TEX_SET_GRADIENTS_V = 26,
273 	TEX_RESERVED_4 = 27,
274 } instr_fetch_opc_t;
275 
276 typedef enum {
277 	TEX_FILTER_POINT = 0,
278 	TEX_FILTER_LINEAR = 1,
279 	TEX_FILTER_BASEMAP = 2,            /* only applicable for mip-filter */
280 	TEX_FILTER_USE_FETCH_CONST = 3,
281 } instr_tex_filter_t;
282 
283 typedef enum {
284 	ANISO_FILTER_DISABLED = 0,
285 	ANISO_FILTER_MAX_1_1 = 1,
286 	ANISO_FILTER_MAX_2_1 = 2,
287 	ANISO_FILTER_MAX_4_1 = 3,
288 	ANISO_FILTER_MAX_8_1 = 4,
289 	ANISO_FILTER_MAX_16_1 = 5,
290 	ANISO_FILTER_USE_FETCH_CONST = 7,
291 } instr_aniso_filter_t;
292 
293 typedef enum {
294 	ARBITRARY_FILTER_2X4_SYM = 0,
295 	ARBITRARY_FILTER_2X4_ASYM = 1,
296 	ARBITRARY_FILTER_4X2_SYM = 2,
297 	ARBITRARY_FILTER_4X2_ASYM = 3,
298 	ARBITRARY_FILTER_4X4_SYM = 4,
299 	ARBITRARY_FILTER_4X4_ASYM = 5,
300 	ARBITRARY_FILTER_USE_FETCH_CONST = 7,
301 } instr_arbitrary_filter_t;
302 
303 typedef enum {
304 	SAMPLE_CENTROID = 0,
305 	SAMPLE_CENTER = 1,
306 } instr_sample_loc_t;
307 
308 typedef enum a2xx_sq_surfaceformat instr_surf_fmt_t;
309 
310 typedef struct PACKED {
311 	/* dword0: */
312 	instr_fetch_opc_t   opc                      : 5;
313 	uint8_t             src_reg                  : 6;
314 	uint8_t             src_reg_am               : 1;
315 	uint8_t             dst_reg                  : 6;
316 	uint8_t             dst_reg_am               : 1;
317 	uint8_t             fetch_valid_only         : 1;
318 	uint8_t             const_idx                : 5;
319 	uint8_t             tx_coord_denorm          : 1;
320 	uint8_t             src_swiz                 : 6;
321 	/* dword1: */
322 	uint16_t            dst_swiz                 : 12;
323 	instr_tex_filter_t  mag_filter               : 2;
324 	instr_tex_filter_t  min_filter               : 2;
325 	instr_tex_filter_t  mip_filter               : 2;
326 	instr_aniso_filter_t aniso_filter            : 3;
327 	instr_arbitrary_filter_t arbitrary_filter    : 3;
328 	instr_tex_filter_t  vol_mag_filter           : 2;
329 	instr_tex_filter_t  vol_min_filter           : 2;
330 	uint8_t             use_comp_lod             : 1;
331 	uint8_t             use_reg_lod              : 2;  /* 0 for cube, 1 for 2d */
332 	uint8_t             pred_select              : 1;
333 	/* dword2: */
334 	uint8_t             use_reg_gradients        : 1;
335 	instr_sample_loc_t  sample_location          : 1;
336 	uint8_t             lod_bias                 : 7;
337 	uint8_t             unused                   : 7;
338 	uint8_t             offset_x                 : 5;
339 	uint8_t             offset_y                 : 5;
340 	uint8_t             offset_z                 : 5;
341 	uint8_t             pred_condition           : 1;
342 } instr_fetch_tex_t;
343 
344 typedef struct PACKED {
345 	/* dword0: */
346 	instr_fetch_opc_t   opc                      : 5;
347 	uint8_t             src_reg                  : 6;
348 	uint8_t             src_reg_am               : 1;
349 	uint8_t             dst_reg                  : 6;
350 	uint8_t             dst_reg_am               : 1;
351 	uint8_t             must_be_one              : 1;
352 	uint8_t             const_index              : 5;
353 	uint8_t             const_index_sel          : 2;
354 	uint8_t             reserved0                : 3;
355 	uint8_t             src_swiz                 : 2;
356 	/* dword1: */
357 	uint16_t            dst_swiz                 : 12;
358 	uint8_t             format_comp_all          : 1;   /* '1' for signed, '0' for unsigned? */
359 	uint8_t             num_format_all           : 1;   /* '0' for normalized, '1' for unnormalized */
360 	uint8_t             signed_rf_mode_all       : 1;
361 	uint8_t             reserved1                : 1;
362 	instr_surf_fmt_t    format                   : 6;
363 	uint8_t             reserved2                : 1;
364 	uint8_t             exp_adjust_all           : 7;
365 	uint8_t             reserved3                : 1;
366 	uint8_t             pred_select              : 1;
367 	/* dword2: */
368 	uint8_t             stride                   : 8;
369 	/* possibly offset and reserved4 are swapped on a200? */
370 	uint8_t             offset                   : 8;
371 	uint8_t             reserved4                : 8;
372 	uint8_t             reserved5                : 7;
373 	uint8_t             pred_condition           : 1;
374 } instr_fetch_vtx_t;
375 
376 typedef union PACKED {
377 	instr_fetch_tex_t   tex;
378 	instr_fetch_vtx_t   vtx;
379 	struct PACKED {
380 		/* dword0: */
381 		instr_fetch_opc_t opc                    : 5;
382 		uint32_t        dummy0                   : 27;
383 		/* dword1: */
384 		uint32_t        dummy1                   : 32;
385 		/* dword2: */
386 		uint32_t        dummy2                   : 32;
387 	};
388 } instr_fetch_t;
389 
390 #endif /* INSTR_H_ */
391