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