1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2022 Collabora Ltd. 3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 4*61046927SAndroid Build Coastguard Worker */ 5*61046927SAndroid Build Coastguard Worker #ifndef MME_TU104_H 6*61046927SAndroid Build Coastguard Worker #define MME_TU104_H 7*61046927SAndroid Build Coastguard Worker 8*61046927SAndroid Build Coastguard Worker #include <stdbool.h> 9*61046927SAndroid Build Coastguard Worker #include <stdint.h> 10*61046927SAndroid Build Coastguard Worker #include <stdio.h> 11*61046927SAndroid Build Coastguard Worker 12*61046927SAndroid Build Coastguard Worker #include "util/macros.h" 13*61046927SAndroid Build Coastguard Worker 14*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 15*61046927SAndroid Build Coastguard Worker extern "C" { 16*61046927SAndroid Build Coastguard Worker #endif 17*61046927SAndroid Build Coastguard Worker 18*61046927SAndroid Build Coastguard Worker #define MME_TU104_DRAM_COUNT 0xc00 19*61046927SAndroid Build Coastguard Worker #define MME_TU104_SCRATCH_COUNT 256 20*61046927SAndroid Build Coastguard Worker 21*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED mme_tu104_pred { 22*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_UUUU, 23*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_TTTT, 24*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_FFFF, 25*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_TTUU, 26*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_FFUU, 27*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_TFUU, 28*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_TUUU, 29*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_FUUU, 30*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_UUTT, 31*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_UUTF, 32*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_UUTU, 33*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_UUFT, 34*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_UUFF, 35*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_UUFU, 36*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_UUUT, 37*61046927SAndroid Build Coastguard Worker MME_TU104_PRED_UUUF, 38*61046927SAndroid Build Coastguard Worker }; 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard Worker const char *mme_tu104_pred_to_str(enum mme_tu104_pred pred); 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED mme_tu104_reg { 43*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R0, 44*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R1, 45*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R2, 46*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R3, 47*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R4, 48*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R5, 49*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R6, 50*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R7, 51*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R8, 52*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R9, 53*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R10, 54*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R11, 55*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R12, 56*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R13, 57*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R14, 58*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R15, 59*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R16, 60*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R17, 61*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R18, 62*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R19, 63*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R20, 64*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R21, 65*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R22, 66*61046927SAndroid Build Coastguard Worker MME_TU104_REG_R23, 67*61046927SAndroid Build Coastguard Worker MME_TU104_REG_ZERO, 68*61046927SAndroid Build Coastguard Worker MME_TU104_REG_IMM, 69*61046927SAndroid Build Coastguard Worker MME_TU104_REG_IMMPAIR, 70*61046927SAndroid Build Coastguard Worker MME_TU104_REG_IMM32, 71*61046927SAndroid Build Coastguard Worker MME_TU104_REG_LOAD0, 72*61046927SAndroid Build Coastguard Worker MME_TU104_REG_LOAD1, 73*61046927SAndroid Build Coastguard Worker MME_TU104_REG_VIRTUAL0 = 32, 74*61046927SAndroid Build Coastguard Worker }; 75*61046927SAndroid Build Coastguard Worker 76*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED mme_tu104_alu_op { 77*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_ADD, 78*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_ADDC, 79*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_SUB, 80*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_SUBB, 81*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_MUL, 82*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_MULH, 83*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_MULU, 84*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_EXTENDED, 85*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_CLZ, 86*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_SLL, 87*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_SRL, 88*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_SRA, 89*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_AND, 90*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_NAND, 91*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_OR, 92*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_XOR, 93*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_MERGE, 94*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_SLT, 95*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_SLTU, 96*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_SLE, 97*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_SLEU, 98*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_SEQ, 99*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_STATE, 100*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_LOOP, 101*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_JAL, 102*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_BLT, 103*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_BLTU, 104*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_BLE, 105*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_BLEU, 106*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_BEQ, 107*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_DREAD, 108*61046927SAndroid Build Coastguard Worker MME_TU104_ALU_OP_DWRITE, 109*61046927SAndroid Build Coastguard Worker }; 110*61046927SAndroid Build Coastguard Worker 111*61046927SAndroid Build Coastguard Worker const char *mme_tu104_alu_op_to_str(enum mme_tu104_alu_op op); 112*61046927SAndroid Build Coastguard Worker 113*61046927SAndroid Build Coastguard Worker bool mme_tu104_alu_op_has_implicit_imm(enum mme_tu104_alu_op op); 114*61046927SAndroid Build Coastguard Worker bool mme_tu104_alu_op_has_side_effects(enum mme_tu104_alu_op op); 115*61046927SAndroid Build Coastguard Worker bool mme_tu104_alu_op_is_control_flow(enum mme_tu104_alu_op op); 116*61046927SAndroid Build Coastguard Worker bool mme_tu104_alu_op_may_depend_on_mthd(enum mme_tu104_alu_op op); 117*61046927SAndroid Build Coastguard Worker 118*61046927SAndroid Build Coastguard Worker enum ENUM_PACKED mme_tu104_out_op { 119*61046927SAndroid Build Coastguard Worker MME_TU104_OUT_OP_NONE, 120*61046927SAndroid Build Coastguard Worker MME_TU104_OUT_OP_ALU0, 121*61046927SAndroid Build Coastguard Worker MME_TU104_OUT_OP_ALU1, 122*61046927SAndroid Build Coastguard Worker MME_TU104_OUT_OP_LOAD0, 123*61046927SAndroid Build Coastguard Worker MME_TU104_OUT_OP_LOAD1, 124*61046927SAndroid Build Coastguard Worker MME_TU104_OUT_OP_IMM0, 125*61046927SAndroid Build Coastguard Worker MME_TU104_OUT_OP_IMM1, 126*61046927SAndroid Build Coastguard Worker MME_TU104_OUT_OP_RESERVED, 127*61046927SAndroid Build Coastguard Worker MME_TU104_OUT_OP_IMMHIGH0, 128*61046927SAndroid Build Coastguard Worker MME_TU104_OUT_OP_IMMHIGH1, 129*61046927SAndroid Build Coastguard Worker MME_TU104_OUT_OP_IMM32, 130*61046927SAndroid Build Coastguard Worker }; 131*61046927SAndroid Build Coastguard Worker 132*61046927SAndroid Build Coastguard Worker struct mme_tu104_alu { 133*61046927SAndroid Build Coastguard Worker enum mme_tu104_reg dst; 134*61046927SAndroid Build Coastguard Worker enum mme_tu104_alu_op op; 135*61046927SAndroid Build Coastguard Worker enum mme_tu104_reg src[2]; 136*61046927SAndroid Build Coastguard Worker }; 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard Worker bool mme_tu104_alus_have_dependency(const struct mme_tu104_alu *first, 139*61046927SAndroid Build Coastguard Worker const struct mme_tu104_alu *second); 140*61046927SAndroid Build Coastguard Worker 141*61046927SAndroid Build Coastguard Worker #define MME_TU104_ALU_DEFAULTS \ 142*61046927SAndroid Build Coastguard Worker .dst = MME_TU104_REG_ZERO, \ 143*61046927SAndroid Build Coastguard Worker .op = MME_TU104_ALU_OP_ADD, \ 144*61046927SAndroid Build Coastguard Worker .src = { \ 145*61046927SAndroid Build Coastguard Worker MME_TU104_REG_ZERO, \ 146*61046927SAndroid Build Coastguard Worker MME_TU104_REG_ZERO, \ 147*61046927SAndroid Build Coastguard Worker }, 148*61046927SAndroid Build Coastguard Worker 149*61046927SAndroid Build Coastguard Worker struct mme_tu104_out { 150*61046927SAndroid Build Coastguard Worker enum mme_tu104_out_op mthd; 151*61046927SAndroid Build Coastguard Worker enum mme_tu104_out_op emit; 152*61046927SAndroid Build Coastguard Worker }; 153*61046927SAndroid Build Coastguard Worker 154*61046927SAndroid Build Coastguard Worker #define MME_TU104_OUT_DEFAULTS \ 155*61046927SAndroid Build Coastguard Worker .mthd = MME_TU104_OUT_OP_NONE, \ 156*61046927SAndroid Build Coastguard Worker .emit = MME_TU104_OUT_OP_NONE, 157*61046927SAndroid Build Coastguard Worker 158*61046927SAndroid Build Coastguard Worker struct mme_tu104_inst { 159*61046927SAndroid Build Coastguard Worker bool end_next; 160*61046927SAndroid Build Coastguard Worker enum mme_tu104_pred pred_mode; 161*61046927SAndroid Build Coastguard Worker enum mme_tu104_reg pred; 162*61046927SAndroid Build Coastguard Worker uint16_t imm[2]; 163*61046927SAndroid Build Coastguard Worker struct mme_tu104_alu alu[2]; 164*61046927SAndroid Build Coastguard Worker struct mme_tu104_out out[2]; 165*61046927SAndroid Build Coastguard Worker }; 166*61046927SAndroid Build Coastguard Worker 167*61046927SAndroid Build Coastguard Worker #define MME_TU104_INST_DEFAULTS \ 168*61046927SAndroid Build Coastguard Worker .end_next = false, \ 169*61046927SAndroid Build Coastguard Worker .pred_mode = MME_TU104_PRED_UUUU, \ 170*61046927SAndroid Build Coastguard Worker .pred = MME_TU104_REG_ZERO, \ 171*61046927SAndroid Build Coastguard Worker .imm = { 0, 0 }, \ 172*61046927SAndroid Build Coastguard Worker .alu = { \ 173*61046927SAndroid Build Coastguard Worker { MME_TU104_ALU_DEFAULTS }, \ 174*61046927SAndroid Build Coastguard Worker { MME_TU104_ALU_DEFAULTS } \ 175*61046927SAndroid Build Coastguard Worker }, \ 176*61046927SAndroid Build Coastguard Worker .out = { \ 177*61046927SAndroid Build Coastguard Worker { MME_TU104_OUT_DEFAULTS }, \ 178*61046927SAndroid Build Coastguard Worker { MME_TU104_OUT_DEFAULTS } \ 179*61046927SAndroid Build Coastguard Worker }, 180*61046927SAndroid Build Coastguard Worker 181*61046927SAndroid Build Coastguard Worker void mme_tu104_print_inst(FILE *fp, unsigned indent, 182*61046927SAndroid Build Coastguard Worker const struct mme_tu104_inst *inst); 183*61046927SAndroid Build Coastguard Worker 184*61046927SAndroid Build Coastguard Worker void mme_tu104_print(FILE *fp, const struct mme_tu104_inst *insts, 185*61046927SAndroid Build Coastguard Worker uint32_t inst_count); 186*61046927SAndroid Build Coastguard Worker 187*61046927SAndroid Build Coastguard Worker void mme_tu104_encode(uint32_t *out, uint32_t inst_count, 188*61046927SAndroid Build Coastguard Worker const struct mme_tu104_inst *insts); 189*61046927SAndroid Build Coastguard Worker 190*61046927SAndroid Build Coastguard Worker void mme_tu104_decode(struct mme_tu104_inst *insts, 191*61046927SAndroid Build Coastguard Worker const uint32_t *in, uint32_t inst_count); 192*61046927SAndroid Build Coastguard Worker 193*61046927SAndroid Build Coastguard Worker void mme_tu104_dump(FILE *fp, uint32_t *encoded, size_t encoded_size); 194*61046927SAndroid Build Coastguard Worker 195*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 196*61046927SAndroid Build Coastguard Worker } 197*61046927SAndroid Build Coastguard Worker #endif 198*61046927SAndroid Build Coastguard Worker 199*61046927SAndroid Build Coastguard Worker #endif /* MME_TU104_H */ 200