Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/broadcom/qpu/qpu_instr.h
4560 views
1
/*
2
* Copyright © 2016 Broadcom
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
20
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
* IN THE SOFTWARE.
22
*/
23
24
/**
25
* @file qpu_instr.h
26
*
27
* Definitions of the unpacked form of QPU instructions. Assembly and
28
* disassembly will use this for talking about instructions, with qpu_encode.c
29
* and qpu_decode.c handling the pack and unpack of the actual 64-bit QPU
30
* instruction.
31
*/
32
33
#ifndef QPU_INSTR_H
34
#define QPU_INSTR_H
35
36
#include <stdbool.h>
37
#include <stdint.h>
38
#include "util/macros.h"
39
40
struct v3d_device_info;
41
42
struct v3d_qpu_sig {
43
bool thrsw:1;
44
bool ldunif:1;
45
bool ldunifa:1;
46
bool ldunifrf:1;
47
bool ldunifarf:1;
48
bool ldtmu:1;
49
bool ldvary:1;
50
bool ldvpm:1;
51
bool ldtlb:1;
52
bool ldtlbu:1;
53
bool small_imm:1;
54
bool ucb:1;
55
bool rotate:1;
56
bool wrtmuc:1;
57
};
58
59
enum v3d_qpu_cond {
60
V3D_QPU_COND_NONE,
61
V3D_QPU_COND_IFA,
62
V3D_QPU_COND_IFB,
63
V3D_QPU_COND_IFNA,
64
V3D_QPU_COND_IFNB,
65
};
66
67
enum v3d_qpu_pf {
68
V3D_QPU_PF_NONE,
69
V3D_QPU_PF_PUSHZ,
70
V3D_QPU_PF_PUSHN,
71
V3D_QPU_PF_PUSHC,
72
};
73
74
enum v3d_qpu_uf {
75
V3D_QPU_UF_NONE,
76
V3D_QPU_UF_ANDZ,
77
V3D_QPU_UF_ANDNZ,
78
V3D_QPU_UF_NORNZ,
79
V3D_QPU_UF_NORZ,
80
V3D_QPU_UF_ANDN,
81
V3D_QPU_UF_ANDNN,
82
V3D_QPU_UF_NORNN,
83
V3D_QPU_UF_NORN,
84
V3D_QPU_UF_ANDC,
85
V3D_QPU_UF_ANDNC,
86
V3D_QPU_UF_NORNC,
87
V3D_QPU_UF_NORC,
88
};
89
90
enum v3d_qpu_waddr {
91
V3D_QPU_WADDR_R0 = 0,
92
V3D_QPU_WADDR_R1 = 1,
93
V3D_QPU_WADDR_R2 = 2,
94
V3D_QPU_WADDR_R3 = 3,
95
V3D_QPU_WADDR_R4 = 4,
96
V3D_QPU_WADDR_R5 = 5,
97
/* 6 is reserved, but note 3.2.2.8: "Result Writes" */
98
V3D_QPU_WADDR_NOP = 6,
99
V3D_QPU_WADDR_TLB = 7,
100
V3D_QPU_WADDR_TLBU = 8,
101
V3D_QPU_WADDR_TMU = 9, /* V3D 3.x */
102
V3D_QPU_WADDR_UNIFA = 9, /* V3D 4.x */
103
V3D_QPU_WADDR_TMUL = 10,
104
V3D_QPU_WADDR_TMUD = 11,
105
V3D_QPU_WADDR_TMUA = 12,
106
V3D_QPU_WADDR_TMUAU = 13,
107
V3D_QPU_WADDR_VPM = 14,
108
V3D_QPU_WADDR_VPMU = 15,
109
V3D_QPU_WADDR_SYNC = 16,
110
V3D_QPU_WADDR_SYNCU = 17,
111
V3D_QPU_WADDR_SYNCB = 18,
112
V3D_QPU_WADDR_RECIP = 19,
113
V3D_QPU_WADDR_RSQRT = 20,
114
V3D_QPU_WADDR_EXP = 21,
115
V3D_QPU_WADDR_LOG = 22,
116
V3D_QPU_WADDR_SIN = 23,
117
V3D_QPU_WADDR_RSQRT2 = 24,
118
V3D_QPU_WADDR_TMUC = 32,
119
V3D_QPU_WADDR_TMUS = 33,
120
V3D_QPU_WADDR_TMUT = 34,
121
V3D_QPU_WADDR_TMUR = 35,
122
V3D_QPU_WADDR_TMUI = 36,
123
V3D_QPU_WADDR_TMUB = 37,
124
V3D_QPU_WADDR_TMUDREF = 38,
125
V3D_QPU_WADDR_TMUOFF = 39,
126
V3D_QPU_WADDR_TMUSCM = 40,
127
V3D_QPU_WADDR_TMUSF = 41,
128
V3D_QPU_WADDR_TMUSLOD = 42,
129
V3D_QPU_WADDR_TMUHS = 43,
130
V3D_QPU_WADDR_TMUHSCM = 44,
131
V3D_QPU_WADDR_TMUHSF = 45,
132
V3D_QPU_WADDR_TMUHSLOD = 46,
133
V3D_QPU_WADDR_R5REP = 55,
134
};
135
136
struct v3d_qpu_flags {
137
enum v3d_qpu_cond ac, mc;
138
enum v3d_qpu_pf apf, mpf;
139
enum v3d_qpu_uf auf, muf;
140
};
141
142
enum v3d_qpu_add_op {
143
V3D_QPU_A_FADD,
144
V3D_QPU_A_FADDNF,
145
V3D_QPU_A_VFPACK,
146
V3D_QPU_A_ADD,
147
V3D_QPU_A_SUB,
148
V3D_QPU_A_FSUB,
149
V3D_QPU_A_MIN,
150
V3D_QPU_A_MAX,
151
V3D_QPU_A_UMIN,
152
V3D_QPU_A_UMAX,
153
V3D_QPU_A_SHL,
154
V3D_QPU_A_SHR,
155
V3D_QPU_A_ASR,
156
V3D_QPU_A_ROR,
157
V3D_QPU_A_FMIN,
158
V3D_QPU_A_FMAX,
159
V3D_QPU_A_VFMIN,
160
V3D_QPU_A_AND,
161
V3D_QPU_A_OR,
162
V3D_QPU_A_XOR,
163
V3D_QPU_A_VADD,
164
V3D_QPU_A_VSUB,
165
V3D_QPU_A_NOT,
166
V3D_QPU_A_NEG,
167
V3D_QPU_A_FLAPUSH,
168
V3D_QPU_A_FLBPUSH,
169
V3D_QPU_A_FLPOP,
170
V3D_QPU_A_RECIP,
171
V3D_QPU_A_SETMSF,
172
V3D_QPU_A_SETREVF,
173
V3D_QPU_A_NOP,
174
V3D_QPU_A_TIDX,
175
V3D_QPU_A_EIDX,
176
V3D_QPU_A_LR,
177
V3D_QPU_A_VFLA,
178
V3D_QPU_A_VFLNA,
179
V3D_QPU_A_VFLB,
180
V3D_QPU_A_VFLNB,
181
V3D_QPU_A_FXCD,
182
V3D_QPU_A_XCD,
183
V3D_QPU_A_FYCD,
184
V3D_QPU_A_YCD,
185
V3D_QPU_A_MSF,
186
V3D_QPU_A_REVF,
187
V3D_QPU_A_VDWWT,
188
V3D_QPU_A_IID,
189
V3D_QPU_A_SAMPID,
190
V3D_QPU_A_BARRIERID,
191
V3D_QPU_A_TMUWT,
192
V3D_QPU_A_VPMSETUP,
193
V3D_QPU_A_VPMWT,
194
V3D_QPU_A_FLAFIRST,
195
V3D_QPU_A_FLNAFIRST,
196
V3D_QPU_A_LDVPMV_IN,
197
V3D_QPU_A_LDVPMV_OUT,
198
V3D_QPU_A_LDVPMD_IN,
199
V3D_QPU_A_LDVPMD_OUT,
200
V3D_QPU_A_LDVPMP,
201
V3D_QPU_A_RSQRT,
202
V3D_QPU_A_EXP,
203
V3D_QPU_A_LOG,
204
V3D_QPU_A_SIN,
205
V3D_QPU_A_RSQRT2,
206
V3D_QPU_A_LDVPMG_IN,
207
V3D_QPU_A_LDVPMG_OUT,
208
V3D_QPU_A_FCMP,
209
V3D_QPU_A_VFMAX,
210
V3D_QPU_A_FROUND,
211
V3D_QPU_A_FTOIN,
212
V3D_QPU_A_FTRUNC,
213
V3D_QPU_A_FTOIZ,
214
V3D_QPU_A_FFLOOR,
215
V3D_QPU_A_FTOUZ,
216
V3D_QPU_A_FCEIL,
217
V3D_QPU_A_FTOC,
218
V3D_QPU_A_FDX,
219
V3D_QPU_A_FDY,
220
V3D_QPU_A_STVPMV,
221
V3D_QPU_A_STVPMD,
222
V3D_QPU_A_STVPMP,
223
V3D_QPU_A_ITOF,
224
V3D_QPU_A_CLZ,
225
V3D_QPU_A_UTOF,
226
};
227
228
enum v3d_qpu_mul_op {
229
V3D_QPU_M_ADD,
230
V3D_QPU_M_SUB,
231
V3D_QPU_M_UMUL24,
232
V3D_QPU_M_VFMUL,
233
V3D_QPU_M_SMUL24,
234
V3D_QPU_M_MULTOP,
235
V3D_QPU_M_FMOV,
236
V3D_QPU_M_MOV,
237
V3D_QPU_M_NOP,
238
V3D_QPU_M_FMUL,
239
};
240
241
enum v3d_qpu_output_pack {
242
V3D_QPU_PACK_NONE,
243
/**
244
* Convert to 16-bit float, put in low 16 bits of destination leaving
245
* high unmodified.
246
*/
247
V3D_QPU_PACK_L,
248
/**
249
* Convert to 16-bit float, put in high 16 bits of destination leaving
250
* low unmodified.
251
*/
252
V3D_QPU_PACK_H,
253
};
254
255
enum v3d_qpu_input_unpack {
256
/**
257
* No-op input unpacking. Note that this enum's value doesn't match
258
* the packed QPU instruction value of the field (we use 0 so that the
259
* default on new instruction creation is no-op).
260
*/
261
V3D_QPU_UNPACK_NONE,
262
/** Absolute value. Only available for some operations. */
263
V3D_QPU_UNPACK_ABS,
264
/** Convert low 16 bits from 16-bit float to 32-bit float. */
265
V3D_QPU_UNPACK_L,
266
/** Convert high 16 bits from 16-bit float to 32-bit float. */
267
V3D_QPU_UNPACK_H,
268
269
/** Convert to 16f and replicate it to the high bits. */
270
V3D_QPU_UNPACK_REPLICATE_32F_16,
271
272
/** Replicate low 16 bits to high */
273
V3D_QPU_UNPACK_REPLICATE_L_16,
274
275
/** Replicate high 16 bits to low */
276
V3D_QPU_UNPACK_REPLICATE_H_16,
277
278
/** Swap high and low 16 bits */
279
V3D_QPU_UNPACK_SWAP_16,
280
};
281
282
enum v3d_qpu_mux {
283
V3D_QPU_MUX_R0,
284
V3D_QPU_MUX_R1,
285
V3D_QPU_MUX_R2,
286
V3D_QPU_MUX_R3,
287
V3D_QPU_MUX_R4,
288
V3D_QPU_MUX_R5,
289
V3D_QPU_MUX_A,
290
V3D_QPU_MUX_B,
291
};
292
293
struct v3d_qpu_alu_instr {
294
struct {
295
enum v3d_qpu_add_op op;
296
enum v3d_qpu_mux a, b;
297
uint8_t waddr;
298
bool magic_write;
299
enum v3d_qpu_output_pack output_pack;
300
enum v3d_qpu_input_unpack a_unpack;
301
enum v3d_qpu_input_unpack b_unpack;
302
} add;
303
304
struct {
305
enum v3d_qpu_mul_op op;
306
enum v3d_qpu_mux a, b;
307
uint8_t waddr;
308
bool magic_write;
309
enum v3d_qpu_output_pack output_pack;
310
enum v3d_qpu_input_unpack a_unpack;
311
enum v3d_qpu_input_unpack b_unpack;
312
} mul;
313
};
314
315
enum v3d_qpu_branch_cond {
316
V3D_QPU_BRANCH_COND_ALWAYS,
317
V3D_QPU_BRANCH_COND_A0,
318
V3D_QPU_BRANCH_COND_NA0,
319
V3D_QPU_BRANCH_COND_ALLA,
320
V3D_QPU_BRANCH_COND_ANYNA,
321
V3D_QPU_BRANCH_COND_ANYA,
322
V3D_QPU_BRANCH_COND_ALLNA,
323
};
324
325
enum v3d_qpu_msfign {
326
/** Ignore multisample flags when determining branch condition. */
327
V3D_QPU_MSFIGN_NONE,
328
/**
329
* If no multisample flags are set in the lane (a pixel in the FS, a
330
* vertex in the VS), ignore the lane's condition when computing the
331
* branch condition.
332
*/
333
V3D_QPU_MSFIGN_P,
334
/**
335
* If no multisample flags are set in a 2x2 quad in the FS, ignore the
336
* quad's a/b conditions.
337
*/
338
V3D_QPU_MSFIGN_Q,
339
};
340
341
enum v3d_qpu_branch_dest {
342
V3D_QPU_BRANCH_DEST_ABS,
343
V3D_QPU_BRANCH_DEST_REL,
344
V3D_QPU_BRANCH_DEST_LINK_REG,
345
V3D_QPU_BRANCH_DEST_REGFILE,
346
};
347
348
struct v3d_qpu_branch_instr {
349
enum v3d_qpu_branch_cond cond;
350
enum v3d_qpu_msfign msfign;
351
352
/** Selects how to compute the new IP if the branch is taken. */
353
enum v3d_qpu_branch_dest bdi;
354
355
/**
356
* Selects how to compute the new uniforms pointer if the branch is
357
* taken. (ABS/REL implicitly load a uniform and use that)
358
*/
359
enum v3d_qpu_branch_dest bdu;
360
361
/**
362
* If set, then udest determines how the uniform stream will branch,
363
* otherwise the uniform stream is left as is.
364
*/
365
bool ub;
366
367
uint8_t raddr_a;
368
369
uint32_t offset;
370
};
371
372
enum v3d_qpu_instr_type {
373
V3D_QPU_INSTR_TYPE_ALU,
374
V3D_QPU_INSTR_TYPE_BRANCH,
375
};
376
377
struct v3d_qpu_instr {
378
enum v3d_qpu_instr_type type;
379
380
struct v3d_qpu_sig sig;
381
uint8_t sig_addr;
382
bool sig_magic; /* If the signal writes to a magic address */
383
uint8_t raddr_a;
384
uint8_t raddr_b;
385
struct v3d_qpu_flags flags;
386
387
union {
388
struct v3d_qpu_alu_instr alu;
389
struct v3d_qpu_branch_instr branch;
390
};
391
};
392
393
const char *v3d_qpu_magic_waddr_name(const struct v3d_device_info *devinfo,
394
enum v3d_qpu_waddr waddr);
395
const char *v3d_qpu_add_op_name(enum v3d_qpu_add_op op);
396
const char *v3d_qpu_mul_op_name(enum v3d_qpu_mul_op op);
397
const char *v3d_qpu_cond_name(enum v3d_qpu_cond cond);
398
const char *v3d_qpu_pf_name(enum v3d_qpu_pf pf);
399
const char *v3d_qpu_uf_name(enum v3d_qpu_uf uf);
400
const char *v3d_qpu_pack_name(enum v3d_qpu_output_pack pack);
401
const char *v3d_qpu_unpack_name(enum v3d_qpu_input_unpack unpack);
402
const char *v3d_qpu_branch_cond_name(enum v3d_qpu_branch_cond cond);
403
const char *v3d_qpu_msfign_name(enum v3d_qpu_msfign msfign);
404
405
enum v3d_qpu_cond v3d_qpu_cond_invert(enum v3d_qpu_cond cond) ATTRIBUTE_CONST;
406
407
bool v3d_qpu_add_op_has_dst(enum v3d_qpu_add_op op);
408
bool v3d_qpu_mul_op_has_dst(enum v3d_qpu_mul_op op);
409
int v3d_qpu_add_op_num_src(enum v3d_qpu_add_op op);
410
int v3d_qpu_mul_op_num_src(enum v3d_qpu_mul_op op);
411
412
bool v3d_qpu_sig_pack(const struct v3d_device_info *devinfo,
413
const struct v3d_qpu_sig *sig,
414
uint32_t *packed_sig);
415
bool v3d_qpu_sig_unpack(const struct v3d_device_info *devinfo,
416
uint32_t packed_sig,
417
struct v3d_qpu_sig *sig);
418
419
bool
420
v3d_qpu_flags_pack(const struct v3d_device_info *devinfo,
421
const struct v3d_qpu_flags *cond,
422
uint32_t *packed_cond);
423
bool
424
v3d_qpu_flags_unpack(const struct v3d_device_info *devinfo,
425
uint32_t packed_cond,
426
struct v3d_qpu_flags *cond);
427
428
bool
429
v3d_qpu_small_imm_pack(const struct v3d_device_info *devinfo,
430
uint32_t value,
431
uint32_t *packed_small_immediate);
432
433
bool
434
v3d_qpu_small_imm_unpack(const struct v3d_device_info *devinfo,
435
uint32_t packed_small_immediate,
436
uint32_t *small_immediate);
437
438
bool
439
v3d_qpu_instr_pack(const struct v3d_device_info *devinfo,
440
const struct v3d_qpu_instr *instr,
441
uint64_t *packed_instr);
442
bool
443
v3d_qpu_instr_unpack(const struct v3d_device_info *devinfo,
444
uint64_t packed_instr,
445
struct v3d_qpu_instr *instr);
446
447
bool v3d_qpu_magic_waddr_is_sfu(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
448
bool v3d_qpu_magic_waddr_is_tmu(const struct v3d_device_info *devinfo,
449
enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
450
bool v3d_qpu_magic_waddr_is_tlb(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
451
bool v3d_qpu_magic_waddr_is_vpm(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
452
bool v3d_qpu_magic_waddr_is_tsy(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
453
bool v3d_qpu_magic_waddr_loads_unif(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
454
bool v3d_qpu_uses_tlb(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
455
bool v3d_qpu_instr_is_sfu(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
456
bool v3d_qpu_uses_sfu(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
457
bool v3d_qpu_writes_tmu(const struct v3d_device_info *devinfo,
458
const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
459
bool v3d_qpu_writes_tmu_not_tmuc(const struct v3d_device_info *devinfo,
460
const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
461
bool v3d_qpu_writes_r3(const struct v3d_device_info *devinfo,
462
const struct v3d_qpu_instr *instr) ATTRIBUTE_CONST;
463
bool v3d_qpu_writes_r4(const struct v3d_device_info *devinfo,
464
const struct v3d_qpu_instr *instr) ATTRIBUTE_CONST;
465
bool v3d_qpu_writes_r5(const struct v3d_device_info *devinfo,
466
const struct v3d_qpu_instr *instr) ATTRIBUTE_CONST;
467
bool v3d_qpu_writes_accum(const struct v3d_device_info *devinfo,
468
const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
469
bool v3d_qpu_waits_on_tmu(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
470
bool v3d_qpu_uses_mux(const struct v3d_qpu_instr *inst, enum v3d_qpu_mux mux);
471
bool v3d_qpu_uses_vpm(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
472
bool v3d_qpu_reads_vpm(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
473
bool v3d_qpu_writes_vpm(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
474
bool v3d_qpu_reads_or_writes_vpm(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
475
bool v3d_qpu_reads_flags(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
476
bool v3d_qpu_writes_flags(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
477
bool v3d_qpu_writes_unifa(const struct v3d_device_info *devinfo,
478
const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
479
bool v3d_qpu_sig_writes_address(const struct v3d_device_info *devinfo,
480
const struct v3d_qpu_sig *sig) ATTRIBUTE_CONST;
481
bool v3d_qpu_unpacks_f32(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
482
bool v3d_qpu_unpacks_f16(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
483
484
bool v3d_qpu_is_nop(struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
485
#endif
486
487