Home | History | Annotate | Download | only in a2xx
      1 /*
      2  * Copyright (c) 2012 Rob Clark <robdclark (at) 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