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