From af961f9aece6d2dddcacee8376894d78a69f9403 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:11:57 -0600 Subject: [PATCH] nouveau/mme: Add basic structures for the Turing+ MME Part-of: --- src/nouveau/mme/mme_tu104.h | 168 ++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 src/nouveau/mme/mme_tu104.h diff --git a/src/nouveau/mme/mme_tu104.h b/src/nouveau/mme/mme_tu104.h new file mode 100644 index 00000000000..0be706fd622 --- /dev/null +++ b/src/nouveau/mme/mme_tu104.h @@ -0,0 +1,168 @@ +#ifndef MME_TU104_H +#define MME_TU104_H + +#include +#include + +#include "util/macros.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define MME_TU104_DRAM_COUNT 0xc00 +#define MME_TU104_SCRATCH_COUNT 256 + +enum PACKED mme_tu104_pred { + MME_TU104_PRED_UUUU, + MME_TU104_PRED_TTTT, + MME_TU104_PRED_FFFF, + MME_TU104_PRED_TTUU, + MME_TU104_PRED_FFUU, + MME_TU104_PRED_TFUU, + MME_TU104_PRED_TUUU, + MME_TU104_PRED_FUUU, + MME_TU104_PRED_UUTT, + MME_TU104_PRED_UUTF, + MME_TU104_PRED_UUTU, + MME_TU104_PRED_UUFT, + MME_TU104_PRED_UUFF, + MME_TU104_PRED_UUFU, + MME_TU104_PRED_UUUT, + MME_TU104_PRED_UUUF, +}; + +enum PACKED mme_tu104_reg { + MME_TU104_REG_R0, + MME_TU104_REG_R1, + MME_TU104_REG_R2, + MME_TU104_REG_R3, + MME_TU104_REG_R4, + MME_TU104_REG_R5, + MME_TU104_REG_R6, + MME_TU104_REG_R7, + MME_TU104_REG_R8, + MME_TU104_REG_R9, + MME_TU104_REG_R10, + MME_TU104_REG_R11, + MME_TU104_REG_R12, + MME_TU104_REG_R13, + MME_TU104_REG_R14, + MME_TU104_REG_R15, + MME_TU104_REG_R16, + MME_TU104_REG_R17, + MME_TU104_REG_R18, + MME_TU104_REG_R19, + MME_TU104_REG_R20, + MME_TU104_REG_R21, + MME_TU104_REG_R22, + MME_TU104_REG_R23, + MME_TU104_REG_ZERO, + MME_TU104_REG_IMM, + MME_TU104_REG_IMMPAIR, + MME_TU104_REG_IMM32, + MME_TU104_REG_LOAD0, + MME_TU104_REG_LOAD1, + MME_TU104_REG_VIRTUAL0 = 32, +}; + +enum PACKED mme_tu104_alu_op { + MME_TU104_ALU_OP_ADD, + MME_TU104_ALU_OP_ADDC, + MME_TU104_ALU_OP_SUB, + MME_TU104_ALU_OP_SUBB, + MME_TU104_ALU_OP_MUL, + MME_TU104_ALU_OP_MULH, + MME_TU104_ALU_OP_MULU, + MME_TU104_ALU_OP_EXTENDED, + MME_TU104_ALU_OP_CLZ, + MME_TU104_ALU_OP_SLL, + MME_TU104_ALU_OP_SRL, + MME_TU104_ALU_OP_SRA, + MME_TU104_ALU_OP_AND, + MME_TU104_ALU_OP_NAND, + MME_TU104_ALU_OP_OR, + MME_TU104_ALU_OP_XOR, + MME_TU104_ALU_OP_MERGE, + MME_TU104_ALU_OP_SLT, + MME_TU104_ALU_OP_SLTU, + MME_TU104_ALU_OP_SLE, + MME_TU104_ALU_OP_SLEU, + MME_TU104_ALU_OP_SEQ, + MME_TU104_ALU_OP_STATE, + MME_TU104_ALU_OP_LOOP, + MME_TU104_ALU_OP_JAL, + MME_TU104_ALU_OP_BLT, + MME_TU104_ALU_OP_BLTU, + MME_TU104_ALU_OP_BLE, + MME_TU104_ALU_OP_BLEU, + MME_TU104_ALU_OP_BEQ, + MME_TU104_ALU_OP_DREAD, + MME_TU104_ALU_OP_DWRITE, +}; + +enum PACKED mme_tu104_out_op { + MME_TU104_OUT_OP_NONE, + MME_TU104_OUT_OP_ALU0, + MME_TU104_OUT_OP_ALU1, + MME_TU104_OUT_OP_LOAD0, + MME_TU104_OUT_OP_LOAD1, + MME_TU104_OUT_OP_IMM0, + MME_TU104_OUT_OP_IMM1, + MME_TU104_OUT_OP_RESERVED, + MME_TU104_OUT_OP_IMMHIGH0, + MME_TU104_OUT_OP_IMMHIGH1, + MME_TU104_OUT_OP_IMM32, +}; + +struct mme_tu104_alu { + enum mme_tu104_reg dst; + enum mme_tu104_alu_op op; + enum mme_tu104_reg src[2]; +}; + +#define MME_TU104_ALU_DEFAULTS \ + .dst = MME_TU104_REG_ZERO, \ + .op = MME_TU104_ALU_OP_ADD, \ + .src = { \ + MME_TU104_REG_ZERO, \ + MME_TU104_REG_ZERO, \ + }, + +struct mme_tu104_out { + enum mme_tu104_out_op mthd; + enum mme_tu104_out_op emit; +}; + +#define MME_TU104_OUT_DEFAULTS \ + .mthd = MME_TU104_OUT_OP_NONE, \ + .emit = MME_TU104_OUT_OP_NONE, + +struct mme_tu104_inst { + bool end_next; + enum mme_tu104_pred pred_mode; + enum mme_tu104_reg pred; + uint16_t imm[2]; + struct mme_tu104_alu alu[2]; + struct mme_tu104_out out[2]; +}; + +#define MME_TU104_INST_DEFAULTS \ + .end_next = false, \ + .pred_mode = MME_TU104_PRED_UUUU, \ + .pred = MME_TU104_REG_ZERO, \ + .imm = { 0, 0 }, \ + .alu = { \ + { MME_TU104_ALU_DEFAULTS }, \ + { MME_TU104_ALU_DEFAULTS } \ + }, \ + .out = { \ + { MME_TU104_OUT_DEFAULTS }, \ + { MME_TU104_OUT_DEFAULTS } \ + }, + +#ifdef __cplusplus +} +#endif + +#endif /* MME_TU104_H */