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