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