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