Path: blob/21.2-virgl/src/gallium/drivers/vc4/vc4_qpu_defines.h
4570 views
/*1* Copyright © 2014 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#ifndef VC4_QPU_DEFINES_H24#define VC4_QPU_DEFINES_H2526#include <assert.h>27#include <util/macros.h>2829enum qpu_op_add {30QPU_A_NOP,31QPU_A_FADD,32QPU_A_FSUB,33QPU_A_FMIN,34QPU_A_FMAX,35QPU_A_FMINABS,36QPU_A_FMAXABS,37QPU_A_FTOI,38QPU_A_ITOF,39QPU_A_ADD = 12,40QPU_A_SUB,41QPU_A_SHR,42QPU_A_ASR,43QPU_A_ROR,44QPU_A_SHL,45QPU_A_MIN,46QPU_A_MAX,47QPU_A_AND,48QPU_A_OR,49QPU_A_XOR,50QPU_A_NOT,51QPU_A_CLZ,52QPU_A_V8ADDS = 30,53QPU_A_V8SUBS = 31,54};5556enum qpu_op_mul {57QPU_M_NOP,58QPU_M_FMUL,59QPU_M_MUL24,60QPU_M_V8MULD,61QPU_M_V8MIN,62QPU_M_V8MAX,63QPU_M_V8ADDS,64QPU_M_V8SUBS,65};6667enum qpu_raddr {68QPU_R_FRAG_PAYLOAD_ZW = 15, /* W for A file, Z for B file */69/* 0-31 are the plain regfile a or b fields */70QPU_R_UNIF = 32,71QPU_R_VARY = 35,72QPU_R_ELEM_QPU = 38,73QPU_R_NOP,74QPU_R_XY_PIXEL_COORD = 41,75QPU_R_MS_REV_FLAGS = 42,76QPU_R_VPM = 48,77QPU_R_VPM_LD_BUSY,78QPU_R_VPM_LD_WAIT,79QPU_R_MUTEX_ACQUIRE,80};8182enum qpu_waddr {83/* 0-31 are the plain regfile a or b fields */84QPU_W_ACC0 = 32, /* aka r0 */85QPU_W_ACC1,86QPU_W_ACC2,87QPU_W_ACC3,88QPU_W_TMU_NOSWAP,89QPU_W_ACC5,90QPU_W_HOST_INT,91QPU_W_NOP,92QPU_W_UNIFORMS_ADDRESS,93QPU_W_QUAD_XY, /* X for regfile a, Y for regfile b */94QPU_W_MS_FLAGS = 42,95QPU_W_REV_FLAG = 42,96QPU_W_TLB_STENCIL_SETUP = 43,97QPU_W_TLB_Z,98QPU_W_TLB_COLOR_MS,99QPU_W_TLB_COLOR_ALL,100QPU_W_TLB_ALPHA_MASK,101QPU_W_VPM,102QPU_W_VPMVCD_SETUP, /* LD for regfile a, ST for regfile b */103QPU_W_VPM_ADDR, /* LD for regfile a, ST for regfile b */104QPU_W_MUTEX_RELEASE,105QPU_W_SFU_RECIP,106QPU_W_SFU_RECIPSQRT,107QPU_W_SFU_EXP,108QPU_W_SFU_LOG,109QPU_W_TMU0_S,110QPU_W_TMU0_T,111QPU_W_TMU0_R,112QPU_W_TMU0_B,113QPU_W_TMU1_S,114QPU_W_TMU1_T,115QPU_W_TMU1_R,116QPU_W_TMU1_B,117};118119enum qpu_sig_bits {120QPU_SIG_SW_BREAKPOINT,121QPU_SIG_NONE,122QPU_SIG_THREAD_SWITCH,123QPU_SIG_PROG_END,124QPU_SIG_WAIT_FOR_SCOREBOARD,125QPU_SIG_SCOREBOARD_UNLOCK,126QPU_SIG_LAST_THREAD_SWITCH,127QPU_SIG_COVERAGE_LOAD,128QPU_SIG_COLOR_LOAD,129QPU_SIG_COLOR_LOAD_END,130QPU_SIG_LOAD_TMU0,131QPU_SIG_LOAD_TMU1,132QPU_SIG_ALPHA_MASK_LOAD,133QPU_SIG_SMALL_IMM,134QPU_SIG_LOAD_IMM,135QPU_SIG_BRANCH136};137138enum qpu_mux {139/* hardware mux values */140QPU_MUX_R0,141QPU_MUX_R1,142QPU_MUX_R2,143QPU_MUX_R3,144QPU_MUX_R4,145QPU_MUX_R5,146QPU_MUX_A,147QPU_MUX_B,148149/**150* Non-hardware mux value, stores a small immediate field to be151* programmed into raddr_b in the qpu_reg.index.152*/153QPU_MUX_SMALL_IMM,154};155156enum qpu_cond {157QPU_COND_NEVER,158QPU_COND_ALWAYS,159QPU_COND_ZS,160QPU_COND_ZC,161QPU_COND_NS,162QPU_COND_NC,163QPU_COND_CS,164QPU_COND_CC,165};166167enum qpu_branch_cond {168QPU_COND_BRANCH_ALL_ZS,169QPU_COND_BRANCH_ALL_ZC,170QPU_COND_BRANCH_ANY_ZS,171QPU_COND_BRANCH_ANY_ZC,172QPU_COND_BRANCH_ALL_NS,173QPU_COND_BRANCH_ALL_NC,174QPU_COND_BRANCH_ANY_NS,175QPU_COND_BRANCH_ANY_NC,176QPU_COND_BRANCH_ALL_CS,177QPU_COND_BRANCH_ALL_CC,178QPU_COND_BRANCH_ANY_CS,179QPU_COND_BRANCH_ANY_CC,180181QPU_COND_BRANCH_ALWAYS = 15182};183184enum qpu_pack_mul {185QPU_PACK_MUL_NOP,186QPU_PACK_MUL_8888 = 3, /* replicated to each 8 bits of the 32-bit dst. */187QPU_PACK_MUL_8A,188QPU_PACK_MUL_8B,189QPU_PACK_MUL_8C,190QPU_PACK_MUL_8D,191};192193enum qpu_pack_a {194QPU_PACK_A_NOP,195/* convert to 16 bit float if float input, or to int16. */196QPU_PACK_A_16A,197QPU_PACK_A_16B,198/* replicated to each 8 bits of the 32-bit dst. */199QPU_PACK_A_8888,200/* Convert to 8-bit unsigned int. */201QPU_PACK_A_8A,202QPU_PACK_A_8B,203QPU_PACK_A_8C,204QPU_PACK_A_8D,205206/* Saturating variants of the previous instructions. */207QPU_PACK_A_32_SAT, /* int-only */208QPU_PACK_A_16A_SAT, /* int or float */209QPU_PACK_A_16B_SAT,210QPU_PACK_A_8888_SAT,211QPU_PACK_A_8A_SAT,212QPU_PACK_A_8B_SAT,213QPU_PACK_A_8C_SAT,214QPU_PACK_A_8D_SAT,215};216217enum qpu_unpack {218QPU_UNPACK_NOP,219QPU_UNPACK_16A,220QPU_UNPACK_16B,221QPU_UNPACK_8D_REP,222QPU_UNPACK_8A,223QPU_UNPACK_8B,224QPU_UNPACK_8C,225QPU_UNPACK_8D,226};227228#define QPU_MASK(high, low) ((((uint64_t)1<<((high)-(low)+1))-1)<<(low))229/* Using the GNU statement expression extension */230#define QPU_SET_FIELD(value, field) \231({ \232uint64_t fieldval = (uint64_t)(value) << field ## _SHIFT; \233assert((fieldval & ~ field ## _MASK) == 0); \234fieldval & field ## _MASK; \235})236237#define QPU_GET_FIELD(word, field) ((uint32_t)(((word) & field ## _MASK) >> field ## _SHIFT))238239#define QPU_UPDATE_FIELD(inst, value, field) \240(((inst) & ~(field ## _MASK)) | QPU_SET_FIELD(value, field))241242#define QPU_SIG_SHIFT 60243#define QPU_SIG_MASK QPU_MASK(63, 60)244245#define QPU_UNPACK_SHIFT 57246#define QPU_UNPACK_MASK QPU_MASK(59, 57)247248#define QPU_LOAD_IMM_MODE_SHIFT 57249#define QPU_LOAD_IMM_MODE_MASK QPU_MASK(59, 57)250# define QPU_LOAD_IMM_MODE_U32 0251# define QPU_LOAD_IMM_MODE_I2 1252# define QPU_LOAD_IMM_MODE_U2 3253254/**255* If set, the pack field means PACK_MUL or R4 packing, instead of normal256* regfile a packing.257*/258#define QPU_PM ((uint64_t)1 << 56)259260#define QPU_PACK_SHIFT 52261#define QPU_PACK_MASK QPU_MASK(55, 52)262263#define QPU_COND_ADD_SHIFT 49264#define QPU_COND_ADD_MASK QPU_MASK(51, 49)265#define QPU_COND_MUL_SHIFT 46266#define QPU_COND_MUL_MASK QPU_MASK(48, 46)267268269#define QPU_BRANCH_COND_SHIFT 52270#define QPU_BRANCH_COND_MASK QPU_MASK(55, 52)271272#define QPU_BRANCH_REL ((uint64_t)1 << 51)273#define QPU_BRANCH_REG ((uint64_t)1 << 50)274275#define QPU_BRANCH_RADDR_A_SHIFT 45276#define QPU_BRANCH_RADDR_A_MASK QPU_MASK(49, 45)277278#define QPU_SF ((uint64_t)1 << 45)279280#define QPU_WADDR_ADD_SHIFT 38281#define QPU_WADDR_ADD_MASK QPU_MASK(43, 38)282#define QPU_WADDR_MUL_SHIFT 32283#define QPU_WADDR_MUL_MASK QPU_MASK(37, 32)284285#define QPU_OP_MUL_SHIFT 29286#define QPU_OP_MUL_MASK QPU_MASK(31, 29)287288#define QPU_RADDR_A_SHIFT 18289#define QPU_RADDR_A_MASK QPU_MASK(23, 18)290#define QPU_RADDR_B_SHIFT 12291#define QPU_RADDR_B_MASK QPU_MASK(17, 12)292#define QPU_SMALL_IMM_SHIFT 12293#define QPU_SMALL_IMM_MASK QPU_MASK(17, 12)294/* Small immediate value for rotate-by-r5, and 49-63 are "rotate by n295* channels"296*/297#define QPU_SMALL_IMM_MUL_ROT 48298299#define QPU_ADD_A_SHIFT 9300#define QPU_ADD_A_MASK QPU_MASK(11, 9)301#define QPU_ADD_B_SHIFT 6302#define QPU_ADD_B_MASK QPU_MASK(8, 6)303#define QPU_MUL_A_SHIFT 3304#define QPU_MUL_A_MASK QPU_MASK(5, 3)305#define QPU_MUL_B_SHIFT 0306#define QPU_MUL_B_MASK QPU_MASK(2, 0)307308#define QPU_WS ((uint64_t)1 << 44)309310#define QPU_OP_ADD_SHIFT 24311#define QPU_OP_ADD_MASK QPU_MASK(28, 24)312313#define QPU_LOAD_IMM_SHIFT 0314#define QPU_LOAD_IMM_MASK QPU_MASK(31, 0)315316#define QPU_BRANCH_TARGET_SHIFT 0317#define QPU_BRANCH_TARGET_MASK QPU_MASK(31, 0)318319#endif /* VC4_QPU_DEFINES_H */320321322