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