1 /* 2 * Copyright © 2022 Mary Guillemard 3 * SPDX-License-Identifier: MIT 4 */ 5 #ifndef MME_FERMI_H 6 #define MME_FERMI_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 19 #define MME_FERMI_DRAM_COUNT 0xc00 20 #define MME_FERMI_SCRATCH_COUNT 128 21 22 enum ENUM_PACKED mme_fermi_reg { 23 MME_FERMI_REG_ZERO, 24 MME_FERMI_REG_R1, 25 MME_FERMI_REG_R2, 26 MME_FERMI_REG_R3, 27 MME_FERMI_REG_R4, 28 MME_FERMI_REG_R5, 29 MME_FERMI_REG_R6, 30 MME_FERMI_REG_R7, 31 }; 32 33 enum ENUM_PACKED mme_fermi_op { 34 MME_FERMI_OP_ALU_REG, 35 MME_FERMI_OP_ADD_IMM, 36 MME_FERMI_OP_MERGE, 37 MME_FERMI_OP_BFE_LSL_IMM, 38 MME_FERMI_OP_BFE_LSL_REG, 39 MME_FERMI_OP_STATE, 40 MME_FERMI_OP_UNK6, 41 MME_FERMI_OP_BRANCH, 42 }; 43 44 const char *mme_fermi_op_to_str(enum mme_fermi_op op); 45 46 enum ENUM_PACKED mme_fermi_alu_op { 47 MME_FERMI_ALU_OP_ADD, 48 MME_FERMI_ALU_OP_ADDC, 49 MME_FERMI_ALU_OP_SUB, 50 MME_FERMI_ALU_OP_SUBB, 51 MME_FERMI_ALU_OP_RESERVED4, 52 MME_FERMI_ALU_OP_RESERVED5, 53 MME_FERMI_ALU_OP_RESERVED6, 54 MME_FERMI_ALU_OP_RESERVED7, 55 MME_FERMI_ALU_OP_XOR, 56 MME_FERMI_ALU_OP_OR, 57 MME_FERMI_ALU_OP_AND, 58 MME_FERMI_ALU_OP_AND_NOT, 59 MME_FERMI_ALU_OP_NAND, 60 MME_FERMI_ALU_OP_RESERVED13, 61 MME_FERMI_ALU_OP_RESERVED14, 62 MME_FERMI_ALU_OP_RESERVED15, 63 MME_FERMI_ALU_OP_RESERVED16, 64 MME_FERMI_ALU_OP_RESERVED17, 65 MME_FERMI_ALU_OP_RESERVED18, 66 MME_FERMI_ALU_OP_RESERVED19, 67 MME_FERMI_ALU_OP_RESERVED20, 68 MME_FERMI_ALU_OP_RESERVED21, 69 MME_FERMI_ALU_OP_RESERVED22, 70 MME_FERMI_ALU_OP_RESERVED23, 71 MME_FERMI_ALU_OP_RESERVED24, 72 MME_FERMI_ALU_OP_RESERVED25, 73 MME_FERMI_ALU_OP_RESERVED26, 74 MME_FERMI_ALU_OP_RESERVED27, 75 MME_FERMI_ALU_OP_RESERVED28, 76 MME_FERMI_ALU_OP_RESERVED29, 77 MME_FERMI_ALU_OP_RESERVED30, 78 MME_FERMI_ALU_OP_RESERVED31, 79 }; 80 81 const char *mme_fermi_alu_op_to_str(enum mme_fermi_alu_op op); 82 83 84 enum ENUM_PACKED mme_fermi_assign_op { 85 MME_FERMI_ASSIGN_OP_LOAD, 86 MME_FERMI_ASSIGN_OP_MOVE, 87 MME_FERMI_ASSIGN_OP_MOVE_SET_MADDR, 88 MME_FERMI_ASSIGN_OP_LOAD_EMIT, 89 MME_FERMI_ASSIGN_OP_MOVE_EMIT, 90 MME_FERMI_ASSIGN_OP_LOAD_SET_MADDR, 91 MME_FERMI_ASSIGN_OP_MOVE_SET_MADDR_LOAD_EMIT, 92 MME_FERMI_ASSIGN_OP_MOVE_SET_MADDR_LOAD_EMIT_HIGH, 93 }; 94 95 const char *mme_fermi_assign_op_to_str(enum mme_fermi_assign_op op); 96 97 struct mme_fermi_bitfield { 98 uint8_t src_bit; 99 uint8_t size; 100 uint8_t dst_bit; 101 }; 102 103 struct mme_fermi_branch { 104 bool not_zero; 105 bool no_delay; 106 }; 107 108 struct mme_fermi_inst { 109 bool end_next; 110 enum mme_fermi_assign_op assign_op; 111 enum mme_fermi_op op; 112 enum mme_fermi_reg dst; 113 enum mme_fermi_reg src[2]; 114 int32_t imm; 115 union { 116 enum mme_fermi_alu_op alu_op; 117 struct mme_fermi_bitfield bitfield; 118 struct mme_fermi_branch branch; 119 }; 120 }; 121 122 #define MME_FERMI_INST_DEFAULTS \ 123 .end_next = false, \ 124 .assign_op = MME_FERMI_ASSIGN_OP_MOVE, \ 125 .op = MME_FERMI_OP_ALU_REG, \ 126 .dst = MME_FERMI_REG_ZERO, \ 127 .src = { \ 128 MME_FERMI_REG_ZERO, \ 129 MME_FERMI_REG_ZERO \ 130 }, \ 131 .imm = 0, \ 132 .alu_op = MME_FERMI_ALU_OP_ADD, \ 133 134 void mme_fermi_print_inst(FILE *fp, unsigned indent, 135 const struct mme_fermi_inst *inst); 136 137 void mme_fermi_print(FILE *fp, const struct mme_fermi_inst *insts, 138 uint32_t inst_count); 139 140 void mme_fermi_encode(uint32_t *out, uint32_t inst_count, 141 const struct mme_fermi_inst *insts); 142 143 void mme_fermi_decode(struct mme_fermi_inst *insts, 144 const uint32_t *in, uint32_t inst_count); 145 146 void mme_fermi_dump(FILE *fp, uint32_t *encoded, size_t encoded_size); 147 148 #ifdef __cplusplus 149 } 150 #endif 151 152 #endif /* MME_FERMI_H */ 153