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