101e04c3fSmrg/*
201e04c3fSmrg * Copyright © 2016 Broadcom
301e04c3fSmrg *
401e04c3fSmrg * Permission is hereby granted, free of charge, to any person obtaining a
501e04c3fSmrg * copy of this software and associated documentation files (the "Software"),
601e04c3fSmrg * to deal in the Software without restriction, including without limitation
701e04c3fSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
801e04c3fSmrg * and/or sell copies of the Software, and to permit persons to whom the
901e04c3fSmrg * Software is furnished to do so, subject to the following conditions:
1001e04c3fSmrg *
1101e04c3fSmrg * The above copyright notice and this permission notice (including the next
1201e04c3fSmrg * paragraph) shall be included in all copies or substantial portions of the
1301e04c3fSmrg * Software.
1401e04c3fSmrg *
1501e04c3fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1601e04c3fSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1701e04c3fSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1801e04c3fSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1901e04c3fSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2001e04c3fSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
2101e04c3fSmrg * IN THE SOFTWARE.
2201e04c3fSmrg */
2301e04c3fSmrg
2401e04c3fSmrg/**
2501e04c3fSmrg * @file qpu_instr.h
2601e04c3fSmrg *
2701e04c3fSmrg * Definitions of the unpacked form of QPU instructions.  Assembly and
2801e04c3fSmrg * disassembly will use this for talking about instructions, with qpu_encode.c
2901e04c3fSmrg * and qpu_decode.c handling the pack and unpack of the actual 64-bit QPU
3001e04c3fSmrg * instruction.
3101e04c3fSmrg */
3201e04c3fSmrg
3301e04c3fSmrg#ifndef QPU_INSTR_H
3401e04c3fSmrg#define QPU_INSTR_H
3501e04c3fSmrg
3601e04c3fSmrg#include <stdbool.h>
3701e04c3fSmrg#include <stdint.h>
3801e04c3fSmrg#include "util/macros.h"
3901e04c3fSmrg
4001e04c3fSmrgstruct v3d_device_info;
4101e04c3fSmrg
4201e04c3fSmrgstruct v3d_qpu_sig {
4301e04c3fSmrg        bool thrsw:1;
4401e04c3fSmrg        bool ldunif:1;
4501e04c3fSmrg        bool ldunifa:1;
4601e04c3fSmrg        bool ldunifrf:1;
4701e04c3fSmrg        bool ldunifarf:1;
4801e04c3fSmrg        bool ldtmu:1;
4901e04c3fSmrg        bool ldvary:1;
5001e04c3fSmrg        bool ldvpm:1;
5101e04c3fSmrg        bool ldtlb:1;
5201e04c3fSmrg        bool ldtlbu:1;
5301e04c3fSmrg        bool small_imm:1;
5401e04c3fSmrg        bool ucb:1;
5501e04c3fSmrg        bool rotate:1;
5601e04c3fSmrg        bool wrtmuc:1;
5701e04c3fSmrg};
5801e04c3fSmrg
5901e04c3fSmrgenum v3d_qpu_cond {
6001e04c3fSmrg        V3D_QPU_COND_NONE,
6101e04c3fSmrg        V3D_QPU_COND_IFA,
6201e04c3fSmrg        V3D_QPU_COND_IFB,
6301e04c3fSmrg        V3D_QPU_COND_IFNA,
6401e04c3fSmrg        V3D_QPU_COND_IFNB,
6501e04c3fSmrg};
6601e04c3fSmrg
6701e04c3fSmrgenum v3d_qpu_pf {
6801e04c3fSmrg        V3D_QPU_PF_NONE,
6901e04c3fSmrg        V3D_QPU_PF_PUSHZ,
7001e04c3fSmrg        V3D_QPU_PF_PUSHN,
7101e04c3fSmrg        V3D_QPU_PF_PUSHC,
7201e04c3fSmrg};
7301e04c3fSmrg
7401e04c3fSmrgenum v3d_qpu_uf {
7501e04c3fSmrg        V3D_QPU_UF_NONE,
7601e04c3fSmrg        V3D_QPU_UF_ANDZ,
7701e04c3fSmrg        V3D_QPU_UF_ANDNZ,
7801e04c3fSmrg        V3D_QPU_UF_NORNZ,
7901e04c3fSmrg        V3D_QPU_UF_NORZ,
8001e04c3fSmrg        V3D_QPU_UF_ANDN,
8101e04c3fSmrg        V3D_QPU_UF_ANDNN,
8201e04c3fSmrg        V3D_QPU_UF_NORNN,
8301e04c3fSmrg        V3D_QPU_UF_NORN,
8401e04c3fSmrg        V3D_QPU_UF_ANDC,
8501e04c3fSmrg        V3D_QPU_UF_ANDNC,
8601e04c3fSmrg        V3D_QPU_UF_NORNC,
8701e04c3fSmrg        V3D_QPU_UF_NORC,
8801e04c3fSmrg};
8901e04c3fSmrg
9001e04c3fSmrgenum v3d_qpu_waddr {
9101e04c3fSmrg        V3D_QPU_WADDR_R0 = 0,
9201e04c3fSmrg        V3D_QPU_WADDR_R1 = 1,
9301e04c3fSmrg        V3D_QPU_WADDR_R2 = 2,
9401e04c3fSmrg        V3D_QPU_WADDR_R3 = 3,
9501e04c3fSmrg        V3D_QPU_WADDR_R4 = 4,
9601e04c3fSmrg        V3D_QPU_WADDR_R5 = 5,
9701e04c3fSmrg        V3D_QPU_WADDR_NOP = 6,
9801e04c3fSmrg        V3D_QPU_WADDR_TLB = 7,
9901e04c3fSmrg        V3D_QPU_WADDR_TLBU = 8,
1007ec681f3Smrg        V3D_QPU_WADDR_TMU = 9,   /* V3D 3.x */
1017ec681f3Smrg        V3D_QPU_WADDR_UNIFA = 9, /* V3D 4.x */
10201e04c3fSmrg        V3D_QPU_WADDR_TMUL = 10,
10301e04c3fSmrg        V3D_QPU_WADDR_TMUD = 11,
10401e04c3fSmrg        V3D_QPU_WADDR_TMUA = 12,
10501e04c3fSmrg        V3D_QPU_WADDR_TMUAU = 13,
10601e04c3fSmrg        V3D_QPU_WADDR_VPM = 14,
10701e04c3fSmrg        V3D_QPU_WADDR_VPMU = 15,
10801e04c3fSmrg        V3D_QPU_WADDR_SYNC = 16,
10901e04c3fSmrg        V3D_QPU_WADDR_SYNCU = 17,
11001e04c3fSmrg        V3D_QPU_WADDR_SYNCB = 18,
11101e04c3fSmrg        V3D_QPU_WADDR_RECIP = 19,
11201e04c3fSmrg        V3D_QPU_WADDR_RSQRT = 20,
11301e04c3fSmrg        V3D_QPU_WADDR_EXP = 21,
11401e04c3fSmrg        V3D_QPU_WADDR_LOG = 22,
11501e04c3fSmrg        V3D_QPU_WADDR_SIN = 23,
11601e04c3fSmrg        V3D_QPU_WADDR_RSQRT2 = 24,
11701e04c3fSmrg        V3D_QPU_WADDR_TMUC = 32,
11801e04c3fSmrg        V3D_QPU_WADDR_TMUS = 33,
11901e04c3fSmrg        V3D_QPU_WADDR_TMUT = 34,
12001e04c3fSmrg        V3D_QPU_WADDR_TMUR = 35,
12101e04c3fSmrg        V3D_QPU_WADDR_TMUI = 36,
12201e04c3fSmrg        V3D_QPU_WADDR_TMUB = 37,
12301e04c3fSmrg        V3D_QPU_WADDR_TMUDREF = 38,
12401e04c3fSmrg        V3D_QPU_WADDR_TMUOFF = 39,
12501e04c3fSmrg        V3D_QPU_WADDR_TMUSCM = 40,
12601e04c3fSmrg        V3D_QPU_WADDR_TMUSF = 41,
12701e04c3fSmrg        V3D_QPU_WADDR_TMUSLOD = 42,
12801e04c3fSmrg        V3D_QPU_WADDR_TMUHS = 43,
12901e04c3fSmrg        V3D_QPU_WADDR_TMUHSCM = 44,
13001e04c3fSmrg        V3D_QPU_WADDR_TMUHSF = 45,
13101e04c3fSmrg        V3D_QPU_WADDR_TMUHSLOD = 46,
13201e04c3fSmrg        V3D_QPU_WADDR_R5REP = 55,
13301e04c3fSmrg};
13401e04c3fSmrg
13501e04c3fSmrgstruct v3d_qpu_flags {
13601e04c3fSmrg        enum v3d_qpu_cond ac, mc;
13701e04c3fSmrg        enum v3d_qpu_pf apf, mpf;
13801e04c3fSmrg        enum v3d_qpu_uf auf, muf;
13901e04c3fSmrg};
14001e04c3fSmrg
14101e04c3fSmrgenum v3d_qpu_add_op {
14201e04c3fSmrg        V3D_QPU_A_FADD,
14301e04c3fSmrg        V3D_QPU_A_FADDNF,
14401e04c3fSmrg        V3D_QPU_A_VFPACK,
14501e04c3fSmrg        V3D_QPU_A_ADD,
14601e04c3fSmrg        V3D_QPU_A_SUB,
14701e04c3fSmrg        V3D_QPU_A_FSUB,
14801e04c3fSmrg        V3D_QPU_A_MIN,
14901e04c3fSmrg        V3D_QPU_A_MAX,
15001e04c3fSmrg        V3D_QPU_A_UMIN,
15101e04c3fSmrg        V3D_QPU_A_UMAX,
15201e04c3fSmrg        V3D_QPU_A_SHL,
15301e04c3fSmrg        V3D_QPU_A_SHR,
15401e04c3fSmrg        V3D_QPU_A_ASR,
15501e04c3fSmrg        V3D_QPU_A_ROR,
15601e04c3fSmrg        V3D_QPU_A_FMIN,
15701e04c3fSmrg        V3D_QPU_A_FMAX,
15801e04c3fSmrg        V3D_QPU_A_VFMIN,
15901e04c3fSmrg        V3D_QPU_A_AND,
16001e04c3fSmrg        V3D_QPU_A_OR,
16101e04c3fSmrg        V3D_QPU_A_XOR,
16201e04c3fSmrg        V3D_QPU_A_VADD,
16301e04c3fSmrg        V3D_QPU_A_VSUB,
16401e04c3fSmrg        V3D_QPU_A_NOT,
16501e04c3fSmrg        V3D_QPU_A_NEG,
16601e04c3fSmrg        V3D_QPU_A_FLAPUSH,
16701e04c3fSmrg        V3D_QPU_A_FLBPUSH,
16801e04c3fSmrg        V3D_QPU_A_FLPOP,
16901e04c3fSmrg        V3D_QPU_A_RECIP,
17001e04c3fSmrg        V3D_QPU_A_SETMSF,
17101e04c3fSmrg        V3D_QPU_A_SETREVF,
17201e04c3fSmrg        V3D_QPU_A_NOP,
17301e04c3fSmrg        V3D_QPU_A_TIDX,
17401e04c3fSmrg        V3D_QPU_A_EIDX,
17501e04c3fSmrg        V3D_QPU_A_LR,
17601e04c3fSmrg        V3D_QPU_A_VFLA,
17701e04c3fSmrg        V3D_QPU_A_VFLNA,
17801e04c3fSmrg        V3D_QPU_A_VFLB,
17901e04c3fSmrg        V3D_QPU_A_VFLNB,
18001e04c3fSmrg        V3D_QPU_A_FXCD,
18101e04c3fSmrg        V3D_QPU_A_XCD,
18201e04c3fSmrg        V3D_QPU_A_FYCD,
18301e04c3fSmrg        V3D_QPU_A_YCD,
18401e04c3fSmrg        V3D_QPU_A_MSF,
18501e04c3fSmrg        V3D_QPU_A_REVF,
18601e04c3fSmrg        V3D_QPU_A_VDWWT,
18701e04c3fSmrg        V3D_QPU_A_IID,
18801e04c3fSmrg        V3D_QPU_A_SAMPID,
18901e04c3fSmrg        V3D_QPU_A_BARRIERID,
19001e04c3fSmrg        V3D_QPU_A_TMUWT,
19101e04c3fSmrg        V3D_QPU_A_VPMSETUP,
19201e04c3fSmrg        V3D_QPU_A_VPMWT,
1937ec681f3Smrg        V3D_QPU_A_FLAFIRST,
1947ec681f3Smrg        V3D_QPU_A_FLNAFIRST,
19501e04c3fSmrg        V3D_QPU_A_LDVPMV_IN,
19601e04c3fSmrg        V3D_QPU_A_LDVPMV_OUT,
19701e04c3fSmrg        V3D_QPU_A_LDVPMD_IN,
19801e04c3fSmrg        V3D_QPU_A_LDVPMD_OUT,
19901e04c3fSmrg        V3D_QPU_A_LDVPMP,
20001e04c3fSmrg        V3D_QPU_A_RSQRT,
20101e04c3fSmrg        V3D_QPU_A_EXP,
20201e04c3fSmrg        V3D_QPU_A_LOG,
20301e04c3fSmrg        V3D_QPU_A_SIN,
20401e04c3fSmrg        V3D_QPU_A_RSQRT2,
20501e04c3fSmrg        V3D_QPU_A_LDVPMG_IN,
20601e04c3fSmrg        V3D_QPU_A_LDVPMG_OUT,
20701e04c3fSmrg        V3D_QPU_A_FCMP,
20801e04c3fSmrg        V3D_QPU_A_VFMAX,
20901e04c3fSmrg        V3D_QPU_A_FROUND,
21001e04c3fSmrg        V3D_QPU_A_FTOIN,
21101e04c3fSmrg        V3D_QPU_A_FTRUNC,
21201e04c3fSmrg        V3D_QPU_A_FTOIZ,
21301e04c3fSmrg        V3D_QPU_A_FFLOOR,
21401e04c3fSmrg        V3D_QPU_A_FTOUZ,
21501e04c3fSmrg        V3D_QPU_A_FCEIL,
21601e04c3fSmrg        V3D_QPU_A_FTOC,
21701e04c3fSmrg        V3D_QPU_A_FDX,
21801e04c3fSmrg        V3D_QPU_A_FDY,
21901e04c3fSmrg        V3D_QPU_A_STVPMV,
22001e04c3fSmrg        V3D_QPU_A_STVPMD,
22101e04c3fSmrg        V3D_QPU_A_STVPMP,
22201e04c3fSmrg        V3D_QPU_A_ITOF,
22301e04c3fSmrg        V3D_QPU_A_CLZ,
22401e04c3fSmrg        V3D_QPU_A_UTOF,
22501e04c3fSmrg};
22601e04c3fSmrg
22701e04c3fSmrgenum v3d_qpu_mul_op {
22801e04c3fSmrg        V3D_QPU_M_ADD,
22901e04c3fSmrg        V3D_QPU_M_SUB,
23001e04c3fSmrg        V3D_QPU_M_UMUL24,
23101e04c3fSmrg        V3D_QPU_M_VFMUL,
23201e04c3fSmrg        V3D_QPU_M_SMUL24,
23301e04c3fSmrg        V3D_QPU_M_MULTOP,
23401e04c3fSmrg        V3D_QPU_M_FMOV,
23501e04c3fSmrg        V3D_QPU_M_MOV,
23601e04c3fSmrg        V3D_QPU_M_NOP,
23701e04c3fSmrg        V3D_QPU_M_FMUL,
23801e04c3fSmrg};
23901e04c3fSmrg
24001e04c3fSmrgenum v3d_qpu_output_pack {
24101e04c3fSmrg        V3D_QPU_PACK_NONE,
24201e04c3fSmrg        /**
24301e04c3fSmrg         * Convert to 16-bit float, put in low 16 bits of destination leaving
24401e04c3fSmrg         * high unmodified.
24501e04c3fSmrg         */
24601e04c3fSmrg        V3D_QPU_PACK_L,
24701e04c3fSmrg        /**
24801e04c3fSmrg         * Convert to 16-bit float, put in high 16 bits of destination leaving
24901e04c3fSmrg         * low unmodified.
25001e04c3fSmrg         */
25101e04c3fSmrg        V3D_QPU_PACK_H,
25201e04c3fSmrg};
25301e04c3fSmrg
25401e04c3fSmrgenum v3d_qpu_input_unpack {
25501e04c3fSmrg        /**
25601e04c3fSmrg         * No-op input unpacking.  Note that this enum's value doesn't match
25701e04c3fSmrg         * the packed QPU instruction value of the field (we use 0 so that the
25801e04c3fSmrg         * default on new instruction creation is no-op).
25901e04c3fSmrg         */
26001e04c3fSmrg        V3D_QPU_UNPACK_NONE,
26101e04c3fSmrg        /** Absolute value.  Only available for some operations. */
26201e04c3fSmrg        V3D_QPU_UNPACK_ABS,
26301e04c3fSmrg        /** Convert low 16 bits from 16-bit float to 32-bit float. */
26401e04c3fSmrg        V3D_QPU_UNPACK_L,
26501e04c3fSmrg        /** Convert high 16 bits from 16-bit float to 32-bit float. */
26601e04c3fSmrg        V3D_QPU_UNPACK_H,
26701e04c3fSmrg
26801e04c3fSmrg        /** Convert to 16f and replicate it to the high bits. */
26901e04c3fSmrg        V3D_QPU_UNPACK_REPLICATE_32F_16,
27001e04c3fSmrg
27101e04c3fSmrg        /** Replicate low 16 bits to high */
27201e04c3fSmrg        V3D_QPU_UNPACK_REPLICATE_L_16,
27301e04c3fSmrg
27401e04c3fSmrg        /** Replicate high 16 bits to low */
27501e04c3fSmrg        V3D_QPU_UNPACK_REPLICATE_H_16,
27601e04c3fSmrg
27701e04c3fSmrg        /** Swap high and low 16 bits */
27801e04c3fSmrg        V3D_QPU_UNPACK_SWAP_16,
27901e04c3fSmrg};
28001e04c3fSmrg
28101e04c3fSmrgenum v3d_qpu_mux {
28201e04c3fSmrg        V3D_QPU_MUX_R0,
28301e04c3fSmrg        V3D_QPU_MUX_R1,
28401e04c3fSmrg        V3D_QPU_MUX_R2,
28501e04c3fSmrg        V3D_QPU_MUX_R3,
28601e04c3fSmrg        V3D_QPU_MUX_R4,
28701e04c3fSmrg        V3D_QPU_MUX_R5,
28801e04c3fSmrg        V3D_QPU_MUX_A,
28901e04c3fSmrg        V3D_QPU_MUX_B,
29001e04c3fSmrg};
29101e04c3fSmrg
29201e04c3fSmrgstruct v3d_qpu_alu_instr {
29301e04c3fSmrg        struct {
29401e04c3fSmrg                enum v3d_qpu_add_op op;
29501e04c3fSmrg                enum v3d_qpu_mux a, b;
29601e04c3fSmrg                uint8_t waddr;
29701e04c3fSmrg                bool magic_write;
29801e04c3fSmrg                enum v3d_qpu_output_pack output_pack;
29901e04c3fSmrg                enum v3d_qpu_input_unpack a_unpack;
30001e04c3fSmrg                enum v3d_qpu_input_unpack b_unpack;
30101e04c3fSmrg        } add;
30201e04c3fSmrg
30301e04c3fSmrg        struct {
30401e04c3fSmrg                enum v3d_qpu_mul_op op;
30501e04c3fSmrg                enum v3d_qpu_mux a, b;
30601e04c3fSmrg                uint8_t waddr;
30701e04c3fSmrg                bool magic_write;
30801e04c3fSmrg                enum v3d_qpu_output_pack output_pack;
30901e04c3fSmrg                enum v3d_qpu_input_unpack a_unpack;
31001e04c3fSmrg                enum v3d_qpu_input_unpack b_unpack;
31101e04c3fSmrg        } mul;
31201e04c3fSmrg};
31301e04c3fSmrg
31401e04c3fSmrgenum v3d_qpu_branch_cond {
31501e04c3fSmrg        V3D_QPU_BRANCH_COND_ALWAYS,
31601e04c3fSmrg        V3D_QPU_BRANCH_COND_A0,
31701e04c3fSmrg        V3D_QPU_BRANCH_COND_NA0,
31801e04c3fSmrg        V3D_QPU_BRANCH_COND_ALLA,
31901e04c3fSmrg        V3D_QPU_BRANCH_COND_ANYNA,
32001e04c3fSmrg        V3D_QPU_BRANCH_COND_ANYA,
32101e04c3fSmrg        V3D_QPU_BRANCH_COND_ALLNA,
32201e04c3fSmrg};
32301e04c3fSmrg
32401e04c3fSmrgenum v3d_qpu_msfign {
32501e04c3fSmrg        /** Ignore multisample flags when determining branch condition. */
32601e04c3fSmrg        V3D_QPU_MSFIGN_NONE,
32701e04c3fSmrg        /**
32801e04c3fSmrg         * If no multisample flags are set in the lane (a pixel in the FS, a
32901e04c3fSmrg         * vertex in the VS), ignore the lane's condition when computing the
33001e04c3fSmrg         * branch condition.
33101e04c3fSmrg         */
33201e04c3fSmrg        V3D_QPU_MSFIGN_P,
33301e04c3fSmrg        /**
33401e04c3fSmrg         * If no multisample flags are set in a 2x2 quad in the FS, ignore the
33501e04c3fSmrg         * quad's a/b conditions.
33601e04c3fSmrg         */
33701e04c3fSmrg        V3D_QPU_MSFIGN_Q,
33801e04c3fSmrg};
33901e04c3fSmrg
34001e04c3fSmrgenum v3d_qpu_branch_dest {
34101e04c3fSmrg        V3D_QPU_BRANCH_DEST_ABS,
34201e04c3fSmrg        V3D_QPU_BRANCH_DEST_REL,
34301e04c3fSmrg        V3D_QPU_BRANCH_DEST_LINK_REG,
34401e04c3fSmrg        V3D_QPU_BRANCH_DEST_REGFILE,
34501e04c3fSmrg};
34601e04c3fSmrg
34701e04c3fSmrgstruct v3d_qpu_branch_instr {
34801e04c3fSmrg        enum v3d_qpu_branch_cond cond;
34901e04c3fSmrg        enum v3d_qpu_msfign msfign;
35001e04c3fSmrg
35101e04c3fSmrg        /** Selects how to compute the new IP if the branch is taken. */
35201e04c3fSmrg        enum v3d_qpu_branch_dest bdi;
35301e04c3fSmrg
35401e04c3fSmrg        /**
35501e04c3fSmrg         * Selects how to compute the new uniforms pointer if the branch is
35601e04c3fSmrg         * taken.  (ABS/REL implicitly load a uniform and use that)
35701e04c3fSmrg         */
35801e04c3fSmrg        enum v3d_qpu_branch_dest bdu;
35901e04c3fSmrg
36001e04c3fSmrg        /**
36101e04c3fSmrg         * If set, then udest determines how the uniform stream will branch,
36201e04c3fSmrg         * otherwise the uniform stream is left as is.
36301e04c3fSmrg         */
36401e04c3fSmrg        bool ub;
36501e04c3fSmrg
36601e04c3fSmrg        uint8_t raddr_a;
36701e04c3fSmrg
36801e04c3fSmrg        uint32_t offset;
36901e04c3fSmrg};
37001e04c3fSmrg
37101e04c3fSmrgenum v3d_qpu_instr_type {
37201e04c3fSmrg        V3D_QPU_INSTR_TYPE_ALU,
37301e04c3fSmrg        V3D_QPU_INSTR_TYPE_BRANCH,
37401e04c3fSmrg};
37501e04c3fSmrg
37601e04c3fSmrgstruct v3d_qpu_instr {
37701e04c3fSmrg        enum v3d_qpu_instr_type type;
37801e04c3fSmrg
37901e04c3fSmrg        struct v3d_qpu_sig sig;
38001e04c3fSmrg        uint8_t sig_addr;
38101e04c3fSmrg        bool sig_magic; /* If the signal writes to a magic address */
38201e04c3fSmrg        uint8_t raddr_a;
38301e04c3fSmrg        uint8_t raddr_b;
38401e04c3fSmrg        struct v3d_qpu_flags flags;
38501e04c3fSmrg
38601e04c3fSmrg        union {
38701e04c3fSmrg                struct v3d_qpu_alu_instr alu;
38801e04c3fSmrg                struct v3d_qpu_branch_instr branch;
38901e04c3fSmrg        };
39001e04c3fSmrg};
39101e04c3fSmrg
3927ec681f3Smrgconst char *v3d_qpu_magic_waddr_name(const struct v3d_device_info *devinfo,
3937ec681f3Smrg                                     enum v3d_qpu_waddr waddr);
39401e04c3fSmrgconst char *v3d_qpu_add_op_name(enum v3d_qpu_add_op op);
39501e04c3fSmrgconst char *v3d_qpu_mul_op_name(enum v3d_qpu_mul_op op);
39601e04c3fSmrgconst char *v3d_qpu_cond_name(enum v3d_qpu_cond cond);
39701e04c3fSmrgconst char *v3d_qpu_pf_name(enum v3d_qpu_pf pf);
39801e04c3fSmrgconst char *v3d_qpu_uf_name(enum v3d_qpu_uf uf);
39901e04c3fSmrgconst char *v3d_qpu_pack_name(enum v3d_qpu_output_pack pack);
40001e04c3fSmrgconst char *v3d_qpu_unpack_name(enum v3d_qpu_input_unpack unpack);
40101e04c3fSmrgconst char *v3d_qpu_branch_cond_name(enum v3d_qpu_branch_cond cond);
40201e04c3fSmrgconst char *v3d_qpu_msfign_name(enum v3d_qpu_msfign msfign);
40301e04c3fSmrg
404ed98bd31Smayaenum v3d_qpu_cond v3d_qpu_cond_invert(enum v3d_qpu_cond cond) ATTRIBUTE_CONST;
405ed98bd31Smaya
40601e04c3fSmrgbool v3d_qpu_add_op_has_dst(enum v3d_qpu_add_op op);
40701e04c3fSmrgbool v3d_qpu_mul_op_has_dst(enum v3d_qpu_mul_op op);
40801e04c3fSmrgint v3d_qpu_add_op_num_src(enum v3d_qpu_add_op op);
40901e04c3fSmrgint v3d_qpu_mul_op_num_src(enum v3d_qpu_mul_op op);
41001e04c3fSmrg
41101e04c3fSmrgbool v3d_qpu_sig_pack(const struct v3d_device_info *devinfo,
41201e04c3fSmrg                      const struct v3d_qpu_sig *sig,
41301e04c3fSmrg                      uint32_t *packed_sig);
41401e04c3fSmrgbool v3d_qpu_sig_unpack(const struct v3d_device_info *devinfo,
41501e04c3fSmrg                        uint32_t packed_sig,
41601e04c3fSmrg                        struct v3d_qpu_sig *sig);
41701e04c3fSmrg
41801e04c3fSmrgbool
41901e04c3fSmrgv3d_qpu_flags_pack(const struct v3d_device_info *devinfo,
42001e04c3fSmrg                   const struct v3d_qpu_flags *cond,
42101e04c3fSmrg                   uint32_t *packed_cond);
42201e04c3fSmrgbool
42301e04c3fSmrgv3d_qpu_flags_unpack(const struct v3d_device_info *devinfo,
42401e04c3fSmrg                     uint32_t packed_cond,
42501e04c3fSmrg                     struct v3d_qpu_flags *cond);
42601e04c3fSmrg
42701e04c3fSmrgbool
42801e04c3fSmrgv3d_qpu_small_imm_pack(const struct v3d_device_info *devinfo,
42901e04c3fSmrg                       uint32_t value,
43001e04c3fSmrg                       uint32_t *packed_small_immediate);
43101e04c3fSmrg
43201e04c3fSmrgbool
43301e04c3fSmrgv3d_qpu_small_imm_unpack(const struct v3d_device_info *devinfo,
43401e04c3fSmrg                         uint32_t packed_small_immediate,
43501e04c3fSmrg                         uint32_t *small_immediate);
43601e04c3fSmrg
43701e04c3fSmrgbool
43801e04c3fSmrgv3d_qpu_instr_pack(const struct v3d_device_info *devinfo,
43901e04c3fSmrg                   const struct v3d_qpu_instr *instr,
44001e04c3fSmrg                   uint64_t *packed_instr);
44101e04c3fSmrgbool
44201e04c3fSmrgv3d_qpu_instr_unpack(const struct v3d_device_info *devinfo,
44301e04c3fSmrg                     uint64_t packed_instr,
44401e04c3fSmrg                     struct v3d_qpu_instr *instr);
44501e04c3fSmrg
44601e04c3fSmrgbool v3d_qpu_magic_waddr_is_sfu(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
4477ec681f3Smrgbool v3d_qpu_magic_waddr_is_tmu(const struct v3d_device_info *devinfo,
4487ec681f3Smrg                                enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
44901e04c3fSmrgbool v3d_qpu_magic_waddr_is_tlb(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
45001e04c3fSmrgbool v3d_qpu_magic_waddr_is_vpm(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
45101e04c3fSmrgbool v3d_qpu_magic_waddr_is_tsy(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
452ed98bd31Smayabool v3d_qpu_magic_waddr_loads_unif(enum v3d_qpu_waddr waddr) ATTRIBUTE_CONST;
45301e04c3fSmrgbool v3d_qpu_uses_tlb(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
4547ec681f3Smrgbool v3d_qpu_instr_is_sfu(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
45501e04c3fSmrgbool v3d_qpu_uses_sfu(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
4567ec681f3Smrgbool v3d_qpu_writes_tmu(const struct v3d_device_info *devinfo,
4577ec681f3Smrg                        const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
4587ec681f3Smrgbool v3d_qpu_writes_tmu_not_tmuc(const struct v3d_device_info *devinfo,
4597ec681f3Smrg                                 const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
46001e04c3fSmrgbool v3d_qpu_writes_r3(const struct v3d_device_info *devinfo,
46101e04c3fSmrg                       const struct v3d_qpu_instr *instr) ATTRIBUTE_CONST;
46201e04c3fSmrgbool v3d_qpu_writes_r4(const struct v3d_device_info *devinfo,
46301e04c3fSmrg                       const struct v3d_qpu_instr *instr) ATTRIBUTE_CONST;
46401e04c3fSmrgbool v3d_qpu_writes_r5(const struct v3d_device_info *devinfo,
46501e04c3fSmrg                       const struct v3d_qpu_instr *instr) ATTRIBUTE_CONST;
4667ec681f3Smrgbool v3d_qpu_writes_accum(const struct v3d_device_info *devinfo,
4677ec681f3Smrg                          const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
46801e04c3fSmrgbool v3d_qpu_waits_on_tmu(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
46901e04c3fSmrgbool v3d_qpu_uses_mux(const struct v3d_qpu_instr *inst, enum v3d_qpu_mux mux);
47001e04c3fSmrgbool v3d_qpu_uses_vpm(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
47101e04c3fSmrgbool v3d_qpu_reads_vpm(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
47201e04c3fSmrgbool v3d_qpu_writes_vpm(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
4737ec681f3Smrgbool v3d_qpu_reads_or_writes_vpm(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
474ed98bd31Smayabool v3d_qpu_reads_flags(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
475ed98bd31Smayabool v3d_qpu_writes_flags(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
4767ec681f3Smrgbool v3d_qpu_writes_unifa(const struct v3d_device_info *devinfo,
4777ec681f3Smrg                          const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
47801e04c3fSmrgbool v3d_qpu_sig_writes_address(const struct v3d_device_info *devinfo,
47901e04c3fSmrg                                const struct v3d_qpu_sig *sig) ATTRIBUTE_CONST;
480ed98bd31Smayabool v3d_qpu_unpacks_f32(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
481ed98bd31Smayabool v3d_qpu_unpacks_f16(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
48201e04c3fSmrg
4837ec681f3Smrgbool v3d_qpu_is_nop(struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
48401e04c3fSmrg#endif
485