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