1*7688df22SAndroid Build Coastguard Worker /* 2*7688df22SAndroid Build Coastguard Worker * Copyright © 2014 Broadcom 3*7688df22SAndroid Build Coastguard Worker * 4*7688df22SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 5*7688df22SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 6*7688df22SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 7*7688df22SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*7688df22SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 9*7688df22SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 10*7688df22SAndroid Build Coastguard Worker * 11*7688df22SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 12*7688df22SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 13*7688df22SAndroid Build Coastguard Worker * Software. 14*7688df22SAndroid Build Coastguard Worker * 15*7688df22SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*7688df22SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*7688df22SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*7688df22SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*7688df22SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20*7688df22SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21*7688df22SAndroid Build Coastguard Worker * IN THE SOFTWARE. 22*7688df22SAndroid Build Coastguard Worker */ 23*7688df22SAndroid Build Coastguard Worker 24*7688df22SAndroid Build Coastguard Worker #ifndef VC4_QPU_DEFINES_H 25*7688df22SAndroid Build Coastguard Worker #define VC4_QPU_DEFINES_H 26*7688df22SAndroid Build Coastguard Worker 27*7688df22SAndroid Build Coastguard Worker enum qpu_op_add { 28*7688df22SAndroid Build Coastguard Worker QPU_A_NOP, 29*7688df22SAndroid Build Coastguard Worker QPU_A_FADD, 30*7688df22SAndroid Build Coastguard Worker QPU_A_FSUB, 31*7688df22SAndroid Build Coastguard Worker QPU_A_FMIN, 32*7688df22SAndroid Build Coastguard Worker QPU_A_FMAX, 33*7688df22SAndroid Build Coastguard Worker QPU_A_FMINABS, 34*7688df22SAndroid Build Coastguard Worker QPU_A_FMAXABS, 35*7688df22SAndroid Build Coastguard Worker QPU_A_FTOI, 36*7688df22SAndroid Build Coastguard Worker QPU_A_ITOF, 37*7688df22SAndroid Build Coastguard Worker QPU_A_ADD = 12, 38*7688df22SAndroid Build Coastguard Worker QPU_A_SUB, 39*7688df22SAndroid Build Coastguard Worker QPU_A_SHR, 40*7688df22SAndroid Build Coastguard Worker QPU_A_ASR, 41*7688df22SAndroid Build Coastguard Worker QPU_A_ROR, 42*7688df22SAndroid Build Coastguard Worker QPU_A_SHL, 43*7688df22SAndroid Build Coastguard Worker QPU_A_MIN, 44*7688df22SAndroid Build Coastguard Worker QPU_A_MAX, 45*7688df22SAndroid Build Coastguard Worker QPU_A_AND, 46*7688df22SAndroid Build Coastguard Worker QPU_A_OR, 47*7688df22SAndroid Build Coastguard Worker QPU_A_XOR, 48*7688df22SAndroid Build Coastguard Worker QPU_A_NOT, 49*7688df22SAndroid Build Coastguard Worker QPU_A_CLZ, 50*7688df22SAndroid Build Coastguard Worker QPU_A_V8ADDS = 30, 51*7688df22SAndroid Build Coastguard Worker QPU_A_V8SUBS = 31, 52*7688df22SAndroid Build Coastguard Worker }; 53*7688df22SAndroid Build Coastguard Worker 54*7688df22SAndroid Build Coastguard Worker enum qpu_op_mul { 55*7688df22SAndroid Build Coastguard Worker QPU_M_NOP, 56*7688df22SAndroid Build Coastguard Worker QPU_M_FMUL, 57*7688df22SAndroid Build Coastguard Worker QPU_M_MUL24, 58*7688df22SAndroid Build Coastguard Worker QPU_M_V8MULD, 59*7688df22SAndroid Build Coastguard Worker QPU_M_V8MIN, 60*7688df22SAndroid Build Coastguard Worker QPU_M_V8MAX, 61*7688df22SAndroid Build Coastguard Worker QPU_M_V8ADDS, 62*7688df22SAndroid Build Coastguard Worker QPU_M_V8SUBS, 63*7688df22SAndroid Build Coastguard Worker }; 64*7688df22SAndroid Build Coastguard Worker 65*7688df22SAndroid Build Coastguard Worker enum qpu_raddr { 66*7688df22SAndroid Build Coastguard Worker QPU_R_FRAG_PAYLOAD_ZW = 15, /* W for A file, Z for B file */ 67*7688df22SAndroid Build Coastguard Worker /* 0-31 are the plain regfile a or b fields */ 68*7688df22SAndroid Build Coastguard Worker QPU_R_UNIF = 32, 69*7688df22SAndroid Build Coastguard Worker QPU_R_VARY = 35, 70*7688df22SAndroid Build Coastguard Worker QPU_R_ELEM_QPU = 38, 71*7688df22SAndroid Build Coastguard Worker QPU_R_NOP, 72*7688df22SAndroid Build Coastguard Worker QPU_R_XY_PIXEL_COORD = 41, 73*7688df22SAndroid Build Coastguard Worker QPU_R_MS_REV_FLAGS = 42, 74*7688df22SAndroid Build Coastguard Worker QPU_R_VPM = 48, 75*7688df22SAndroid Build Coastguard Worker QPU_R_VPM_LD_BUSY, 76*7688df22SAndroid Build Coastguard Worker QPU_R_VPM_LD_WAIT, 77*7688df22SAndroid Build Coastguard Worker QPU_R_MUTEX_ACQUIRE, 78*7688df22SAndroid Build Coastguard Worker }; 79*7688df22SAndroid Build Coastguard Worker 80*7688df22SAndroid Build Coastguard Worker enum qpu_waddr { 81*7688df22SAndroid Build Coastguard Worker /* 0-31 are the plain regfile a or b fields */ 82*7688df22SAndroid Build Coastguard Worker QPU_W_ACC0 = 32, /* aka r0 */ 83*7688df22SAndroid Build Coastguard Worker QPU_W_ACC1, 84*7688df22SAndroid Build Coastguard Worker QPU_W_ACC2, 85*7688df22SAndroid Build Coastguard Worker QPU_W_ACC3, 86*7688df22SAndroid Build Coastguard Worker QPU_W_TMU_NOSWAP, 87*7688df22SAndroid Build Coastguard Worker QPU_W_ACC5, 88*7688df22SAndroid Build Coastguard Worker QPU_W_HOST_INT, 89*7688df22SAndroid Build Coastguard Worker QPU_W_NOP, 90*7688df22SAndroid Build Coastguard Worker QPU_W_UNIFORMS_ADDRESS, 91*7688df22SAndroid Build Coastguard Worker QPU_W_QUAD_XY, /* X for regfile a, Y for regfile b */ 92*7688df22SAndroid Build Coastguard Worker QPU_W_MS_FLAGS = 42, 93*7688df22SAndroid Build Coastguard Worker QPU_W_REV_FLAG = 42, 94*7688df22SAndroid Build Coastguard Worker QPU_W_TLB_STENCIL_SETUP = 43, 95*7688df22SAndroid Build Coastguard Worker QPU_W_TLB_Z, 96*7688df22SAndroid Build Coastguard Worker QPU_W_TLB_COLOR_MS, 97*7688df22SAndroid Build Coastguard Worker QPU_W_TLB_COLOR_ALL, 98*7688df22SAndroid Build Coastguard Worker QPU_W_TLB_ALPHA_MASK, 99*7688df22SAndroid Build Coastguard Worker QPU_W_VPM, 100*7688df22SAndroid Build Coastguard Worker QPU_W_VPMVCD_SETUP, /* LD for regfile a, ST for regfile b */ 101*7688df22SAndroid Build Coastguard Worker QPU_W_VPM_ADDR, /* LD for regfile a, ST for regfile b */ 102*7688df22SAndroid Build Coastguard Worker QPU_W_MUTEX_RELEASE, 103*7688df22SAndroid Build Coastguard Worker QPU_W_SFU_RECIP, 104*7688df22SAndroid Build Coastguard Worker QPU_W_SFU_RECIPSQRT, 105*7688df22SAndroid Build Coastguard Worker QPU_W_SFU_EXP, 106*7688df22SAndroid Build Coastguard Worker QPU_W_SFU_LOG, 107*7688df22SAndroid Build Coastguard Worker QPU_W_TMU0_S, 108*7688df22SAndroid Build Coastguard Worker QPU_W_TMU0_T, 109*7688df22SAndroid Build Coastguard Worker QPU_W_TMU0_R, 110*7688df22SAndroid Build Coastguard Worker QPU_W_TMU0_B, 111*7688df22SAndroid Build Coastguard Worker QPU_W_TMU1_S, 112*7688df22SAndroid Build Coastguard Worker QPU_W_TMU1_T, 113*7688df22SAndroid Build Coastguard Worker QPU_W_TMU1_R, 114*7688df22SAndroid Build Coastguard Worker QPU_W_TMU1_B, 115*7688df22SAndroid Build Coastguard Worker }; 116*7688df22SAndroid Build Coastguard Worker 117*7688df22SAndroid Build Coastguard Worker enum qpu_sig_bits { 118*7688df22SAndroid Build Coastguard Worker QPU_SIG_SW_BREAKPOINT, 119*7688df22SAndroid Build Coastguard Worker QPU_SIG_NONE, 120*7688df22SAndroid Build Coastguard Worker QPU_SIG_THREAD_SWITCH, 121*7688df22SAndroid Build Coastguard Worker QPU_SIG_PROG_END, 122*7688df22SAndroid Build Coastguard Worker QPU_SIG_WAIT_FOR_SCOREBOARD, 123*7688df22SAndroid Build Coastguard Worker QPU_SIG_SCOREBOARD_UNLOCK, 124*7688df22SAndroid Build Coastguard Worker QPU_SIG_LAST_THREAD_SWITCH, 125*7688df22SAndroid Build Coastguard Worker QPU_SIG_COVERAGE_LOAD, 126*7688df22SAndroid Build Coastguard Worker QPU_SIG_COLOR_LOAD, 127*7688df22SAndroid Build Coastguard Worker QPU_SIG_COLOR_LOAD_END, 128*7688df22SAndroid Build Coastguard Worker QPU_SIG_LOAD_TMU0, 129*7688df22SAndroid Build Coastguard Worker QPU_SIG_LOAD_TMU1, 130*7688df22SAndroid Build Coastguard Worker QPU_SIG_ALPHA_MASK_LOAD, 131*7688df22SAndroid Build Coastguard Worker QPU_SIG_SMALL_IMM, 132*7688df22SAndroid Build Coastguard Worker QPU_SIG_LOAD_IMM, 133*7688df22SAndroid Build Coastguard Worker QPU_SIG_BRANCH 134*7688df22SAndroid Build Coastguard Worker }; 135*7688df22SAndroid Build Coastguard Worker 136*7688df22SAndroid Build Coastguard Worker enum qpu_mux { 137*7688df22SAndroid Build Coastguard Worker /* hardware mux values */ 138*7688df22SAndroid Build Coastguard Worker QPU_MUX_R0, 139*7688df22SAndroid Build Coastguard Worker QPU_MUX_R1, 140*7688df22SAndroid Build Coastguard Worker QPU_MUX_R2, 141*7688df22SAndroid Build Coastguard Worker QPU_MUX_R3, 142*7688df22SAndroid Build Coastguard Worker QPU_MUX_R4, 143*7688df22SAndroid Build Coastguard Worker QPU_MUX_R5, 144*7688df22SAndroid Build Coastguard Worker QPU_MUX_A, 145*7688df22SAndroid Build Coastguard Worker QPU_MUX_B, 146*7688df22SAndroid Build Coastguard Worker 147*7688df22SAndroid Build Coastguard Worker /** 148*7688df22SAndroid Build Coastguard Worker * Non-hardware mux value, stores a small immediate field to be 149*7688df22SAndroid Build Coastguard Worker * programmed into raddr_b in the qpu_reg.index. 150*7688df22SAndroid Build Coastguard Worker */ 151*7688df22SAndroid Build Coastguard Worker QPU_MUX_SMALL_IMM, 152*7688df22SAndroid Build Coastguard Worker }; 153*7688df22SAndroid Build Coastguard Worker 154*7688df22SAndroid Build Coastguard Worker enum qpu_cond { 155*7688df22SAndroid Build Coastguard Worker QPU_COND_NEVER, 156*7688df22SAndroid Build Coastguard Worker QPU_COND_ALWAYS, 157*7688df22SAndroid Build Coastguard Worker QPU_COND_ZS, 158*7688df22SAndroid Build Coastguard Worker QPU_COND_ZC, 159*7688df22SAndroid Build Coastguard Worker QPU_COND_NS, 160*7688df22SAndroid Build Coastguard Worker QPU_COND_NC, 161*7688df22SAndroid Build Coastguard Worker QPU_COND_CS, 162*7688df22SAndroid Build Coastguard Worker QPU_COND_CC, 163*7688df22SAndroid Build Coastguard Worker }; 164*7688df22SAndroid Build Coastguard Worker 165*7688df22SAndroid Build Coastguard Worker enum qpu_pack_mul { 166*7688df22SAndroid Build Coastguard Worker QPU_PACK_MUL_NOP, 167*7688df22SAndroid Build Coastguard Worker QPU_PACK_MUL_8888 = 3, /* replicated to each 8 bits of the 32-bit dst. */ 168*7688df22SAndroid Build Coastguard Worker QPU_PACK_MUL_8A, 169*7688df22SAndroid Build Coastguard Worker QPU_PACK_MUL_8B, 170*7688df22SAndroid Build Coastguard Worker QPU_PACK_MUL_8C, 171*7688df22SAndroid Build Coastguard Worker QPU_PACK_MUL_8D, 172*7688df22SAndroid Build Coastguard Worker }; 173*7688df22SAndroid Build Coastguard Worker 174*7688df22SAndroid Build Coastguard Worker enum qpu_pack_a { 175*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_NOP, 176*7688df22SAndroid Build Coastguard Worker /* convert to 16 bit float if float input, or to int16. */ 177*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_16A, 178*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_16B, 179*7688df22SAndroid Build Coastguard Worker /* replicated to each 8 bits of the 32-bit dst. */ 180*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_8888, 181*7688df22SAndroid Build Coastguard Worker /* Convert to 8-bit unsigned int. */ 182*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_8A, 183*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_8B, 184*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_8C, 185*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_8D, 186*7688df22SAndroid Build Coastguard Worker 187*7688df22SAndroid Build Coastguard Worker /* Saturating variants of the previous instructions. */ 188*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_32_SAT, /* int-only */ 189*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_16A_SAT, /* int or float */ 190*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_16B_SAT, 191*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_8888_SAT, 192*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_8A_SAT, 193*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_8B_SAT, 194*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_8C_SAT, 195*7688df22SAndroid Build Coastguard Worker QPU_PACK_A_8D_SAT, 196*7688df22SAndroid Build Coastguard Worker }; 197*7688df22SAndroid Build Coastguard Worker 198*7688df22SAndroid Build Coastguard Worker enum qpu_unpack { 199*7688df22SAndroid Build Coastguard Worker QPU_UNPACK_NOP, 200*7688df22SAndroid Build Coastguard Worker QPU_UNPACK_16A, 201*7688df22SAndroid Build Coastguard Worker QPU_UNPACK_16B, 202*7688df22SAndroid Build Coastguard Worker QPU_UNPACK_8D_REP, 203*7688df22SAndroid Build Coastguard Worker QPU_UNPACK_8A, 204*7688df22SAndroid Build Coastguard Worker QPU_UNPACK_8B, 205*7688df22SAndroid Build Coastguard Worker QPU_UNPACK_8C, 206*7688df22SAndroid Build Coastguard Worker QPU_UNPACK_8D, 207*7688df22SAndroid Build Coastguard Worker }; 208*7688df22SAndroid Build Coastguard Worker 209*7688df22SAndroid Build Coastguard Worker #define QPU_MASK(high, low) ((((uint64_t)1<<((high)-(low)+1))-1)<<(low)) 210*7688df22SAndroid Build Coastguard Worker /* Using the GNU statement expression extension */ 211*7688df22SAndroid Build Coastguard Worker #define QPU_SET_FIELD(value, field) \ 212*7688df22SAndroid Build Coastguard Worker ({ \ 213*7688df22SAndroid Build Coastguard Worker uint64_t fieldval = (uint64_t)(value) << field ## _SHIFT; \ 214*7688df22SAndroid Build Coastguard Worker assert((fieldval & ~ field ## _MASK) == 0); \ 215*7688df22SAndroid Build Coastguard Worker fieldval & field ## _MASK; \ 216*7688df22SAndroid Build Coastguard Worker }) 217*7688df22SAndroid Build Coastguard Worker 218*7688df22SAndroid Build Coastguard Worker #define QPU_GET_FIELD(word, field) ((uint32_t)(((word) & field ## _MASK) >> field ## _SHIFT)) 219*7688df22SAndroid Build Coastguard Worker 220*7688df22SAndroid Build Coastguard Worker #define QPU_UPDATE_FIELD(inst, value, field) \ 221*7688df22SAndroid Build Coastguard Worker (((inst) & ~(field ## _MASK)) | QPU_SET_FIELD(value, field)) 222*7688df22SAndroid Build Coastguard Worker 223*7688df22SAndroid Build Coastguard Worker #define QPU_SIG_SHIFT 60 224*7688df22SAndroid Build Coastguard Worker #define QPU_SIG_MASK QPU_MASK(63, 60) 225*7688df22SAndroid Build Coastguard Worker 226*7688df22SAndroid Build Coastguard Worker #define QPU_UNPACK_SHIFT 57 227*7688df22SAndroid Build Coastguard Worker #define QPU_UNPACK_MASK QPU_MASK(59, 57) 228*7688df22SAndroid Build Coastguard Worker 229*7688df22SAndroid Build Coastguard Worker /** 230*7688df22SAndroid Build Coastguard Worker * If set, the pack field means PACK_MUL or R4 packing, instead of normal 231*7688df22SAndroid Build Coastguard Worker * regfile a packing. 232*7688df22SAndroid Build Coastguard Worker */ 233*7688df22SAndroid Build Coastguard Worker #define QPU_PM ((uint64_t)1 << 56) 234*7688df22SAndroid Build Coastguard Worker 235*7688df22SAndroid Build Coastguard Worker #define QPU_PACK_SHIFT 52 236*7688df22SAndroid Build Coastguard Worker #define QPU_PACK_MASK QPU_MASK(55, 52) 237*7688df22SAndroid Build Coastguard Worker 238*7688df22SAndroid Build Coastguard Worker #define QPU_COND_ADD_SHIFT 49 239*7688df22SAndroid Build Coastguard Worker #define QPU_COND_ADD_MASK QPU_MASK(51, 49) 240*7688df22SAndroid Build Coastguard Worker #define QPU_COND_MUL_SHIFT 46 241*7688df22SAndroid Build Coastguard Worker #define QPU_COND_MUL_MASK QPU_MASK(48, 46) 242*7688df22SAndroid Build Coastguard Worker 243*7688df22SAndroid Build Coastguard Worker #define QPU_SF ((uint64_t)1 << 45) 244*7688df22SAndroid Build Coastguard Worker 245*7688df22SAndroid Build Coastguard Worker #define QPU_WADDR_ADD_SHIFT 38 246*7688df22SAndroid Build Coastguard Worker #define QPU_WADDR_ADD_MASK QPU_MASK(43, 38) 247*7688df22SAndroid Build Coastguard Worker #define QPU_WADDR_MUL_SHIFT 32 248*7688df22SAndroid Build Coastguard Worker #define QPU_WADDR_MUL_MASK QPU_MASK(37, 32) 249*7688df22SAndroid Build Coastguard Worker 250*7688df22SAndroid Build Coastguard Worker #define QPU_OP_MUL_SHIFT 29 251*7688df22SAndroid Build Coastguard Worker #define QPU_OP_MUL_MASK QPU_MASK(31, 29) 252*7688df22SAndroid Build Coastguard Worker 253*7688df22SAndroid Build Coastguard Worker #define QPU_RADDR_A_SHIFT 18 254*7688df22SAndroid Build Coastguard Worker #define QPU_RADDR_A_MASK QPU_MASK(23, 18) 255*7688df22SAndroid Build Coastguard Worker #define QPU_RADDR_B_SHIFT 12 256*7688df22SAndroid Build Coastguard Worker #define QPU_RADDR_B_MASK QPU_MASK(17, 12) 257*7688df22SAndroid Build Coastguard Worker #define QPU_SMALL_IMM_SHIFT 12 258*7688df22SAndroid Build Coastguard Worker #define QPU_SMALL_IMM_MASK QPU_MASK(17, 12) 259*7688df22SAndroid Build Coastguard Worker 260*7688df22SAndroid Build Coastguard Worker #define QPU_ADD_A_SHIFT 9 261*7688df22SAndroid Build Coastguard Worker #define QPU_ADD_A_MASK QPU_MASK(11, 9) 262*7688df22SAndroid Build Coastguard Worker #define QPU_ADD_B_SHIFT 6 263*7688df22SAndroid Build Coastguard Worker #define QPU_ADD_B_MASK QPU_MASK(8, 6) 264*7688df22SAndroid Build Coastguard Worker #define QPU_MUL_A_SHIFT 3 265*7688df22SAndroid Build Coastguard Worker #define QPU_MUL_A_MASK QPU_MASK(5, 3) 266*7688df22SAndroid Build Coastguard Worker #define QPU_MUL_B_SHIFT 0 267*7688df22SAndroid Build Coastguard Worker #define QPU_MUL_B_MASK QPU_MASK(2, 0) 268*7688df22SAndroid Build Coastguard Worker 269*7688df22SAndroid Build Coastguard Worker #define QPU_WS ((uint64_t)1 << 44) 270*7688df22SAndroid Build Coastguard Worker 271*7688df22SAndroid Build Coastguard Worker #define QPU_OP_ADD_SHIFT 24 272*7688df22SAndroid Build Coastguard Worker #define QPU_OP_ADD_MASK QPU_MASK(28, 24) 273*7688df22SAndroid Build Coastguard Worker 274*7688df22SAndroid Build Coastguard Worker #endif /* VC4_QPU_DEFINES_H */ 275