xref: /aosp_15_r20/external/mesa3d/src/nouveau/mme/mme_tu104.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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