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