xref: /aosp_15_r20/external/mesa3d/src/nouveau/headers/nv_push.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker #include "nv_push.h"
2*61046927SAndroid Build Coastguard Worker 
3*61046927SAndroid Build Coastguard Worker #include "nv_device_info.h"
4*61046927SAndroid Build Coastguard Worker 
5*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #include "nv_push_cl902d.h"
8*61046927SAndroid Build Coastguard Worker #include "nv_push_cl9039.h"
9*61046927SAndroid Build Coastguard Worker #include "nv_push_cl906f.h"
10*61046927SAndroid Build Coastguard Worker #include "nv_push_cl9097.h"
11*61046927SAndroid Build Coastguard Worker #include "nv_push_cl90b5.h"
12*61046927SAndroid Build Coastguard Worker #include "nv_push_cla097.h"
13*61046927SAndroid Build Coastguard Worker #include "nv_push_cla0b5.h"
14*61046927SAndroid Build Coastguard Worker #include "nv_push_cla040.h"
15*61046927SAndroid Build Coastguard Worker #include "nv_push_cla0c0.h"
16*61046927SAndroid Build Coastguard Worker #include "nv_push_cla140.h"
17*61046927SAndroid Build Coastguard Worker #include "nv_push_clb197.h"
18*61046927SAndroid Build Coastguard Worker #include "nv_push_clc0c0.h"
19*61046927SAndroid Build Coastguard Worker #include "nv_push_clc1b5.h"
20*61046927SAndroid Build Coastguard Worker #include "nv_push_clc397.h"
21*61046927SAndroid Build Coastguard Worker #include "nv_push_clc3c0.h"
22*61046927SAndroid Build Coastguard Worker #include "nv_push_clc597.h"
23*61046927SAndroid Build Coastguard Worker #include "nv_push_clc5c0.h"
24*61046927SAndroid Build Coastguard Worker #include "nv_push_clc697.h"
25*61046927SAndroid Build Coastguard Worker #include "nv_push_clc6c0.h"
26*61046927SAndroid Build Coastguard Worker #include "nv_push_clc797.h"
27*61046927SAndroid Build Coastguard Worker #include "nv_push_clc7c0.h"
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker #ifndef NDEBUG
30*61046927SAndroid Build Coastguard Worker void
nv_push_validate(struct nv_push * push)31*61046927SAndroid Build Coastguard Worker nv_push_validate(struct nv_push *push)
32*61046927SAndroid Build Coastguard Worker {
33*61046927SAndroid Build Coastguard Worker    uint32_t *cur = push->start;
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker    /* submitting empty push buffers is probably a bug */
36*61046927SAndroid Build Coastguard Worker    assert(push->end != push->start);
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker    /* make sure we don't overrun the bo */
39*61046927SAndroid Build Coastguard Worker    assert(push->end <= push->limit);
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker    /* parse all the headers to see if we get to buf->map */
42*61046927SAndroid Build Coastguard Worker    while (cur < push->end) {
43*61046927SAndroid Build Coastguard Worker       uint32_t hdr = *cur;
44*61046927SAndroid Build Coastguard Worker       uint32_t mthd = hdr >> 29;
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker       switch (mthd) {
47*61046927SAndroid Build Coastguard Worker       /* immd */
48*61046927SAndroid Build Coastguard Worker       case 4:
49*61046927SAndroid Build Coastguard Worker          break;
50*61046927SAndroid Build Coastguard Worker       case 1:
51*61046927SAndroid Build Coastguard Worker       case 3:
52*61046927SAndroid Build Coastguard Worker       case 5: {
53*61046927SAndroid Build Coastguard Worker          uint32_t count = (hdr >> 16) & 0x1fff;
54*61046927SAndroid Build Coastguard Worker          assert(count);
55*61046927SAndroid Build Coastguard Worker          cur += count;
56*61046927SAndroid Build Coastguard Worker          break;
57*61046927SAndroid Build Coastguard Worker       }
58*61046927SAndroid Build Coastguard Worker       default:
59*61046927SAndroid Build Coastguard Worker          assert(!"unknown method found");
60*61046927SAndroid Build Coastguard Worker       }
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker       cur++;
63*61046927SAndroid Build Coastguard Worker       assert(cur <= push->end);
64*61046927SAndroid Build Coastguard Worker    }
65*61046927SAndroid Build Coastguard Worker }
66*61046927SAndroid Build Coastguard Worker #endif
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker void
vk_push_print(FILE * fp,const struct nv_push * push,const struct nv_device_info * devinfo)69*61046927SAndroid Build Coastguard Worker vk_push_print(FILE *fp, const struct nv_push *push,
70*61046927SAndroid Build Coastguard Worker               const struct nv_device_info *devinfo)
71*61046927SAndroid Build Coastguard Worker {
72*61046927SAndroid Build Coastguard Worker    uint32_t *cur = push->start;
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker    const bool print_offsets = true;
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker    while (cur < push->end) {
77*61046927SAndroid Build Coastguard Worker       uint32_t hdr = *cur;
78*61046927SAndroid Build Coastguard Worker       uint32_t type = hdr >> 29;
79*61046927SAndroid Build Coastguard Worker       bool is_tert = type == 0 || type == 2;
80*61046927SAndroid Build Coastguard Worker       uint32_t inc = 0;
81*61046927SAndroid Build Coastguard Worker       uint32_t count = is_tert ? (hdr >> 18) & 0x3ff : (hdr >> 16) & 0x1fff;
82*61046927SAndroid Build Coastguard Worker       uint32_t tert_op = (hdr >> 16) & 0x3;
83*61046927SAndroid Build Coastguard Worker       uint32_t subchan = (hdr >> 13) & 0x7;
84*61046927SAndroid Build Coastguard Worker       uint32_t mthd = (hdr & 0xfff) << 2;
85*61046927SAndroid Build Coastguard Worker       uint32_t value = 0;
86*61046927SAndroid Build Coastguard Worker       bool is_immd = false;
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker       if (print_offsets)
89*61046927SAndroid Build Coastguard Worker          fprintf(fp, "[0x%08" PRIxPTR "] ", cur - push->start);
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker       if (is_tert && tert_op != 0) {
92*61046927SAndroid Build Coastguard Worker          fprintf(fp, "HDR %x subch N/A", hdr);
93*61046927SAndroid Build Coastguard Worker       } else {
94*61046927SAndroid Build Coastguard Worker          fprintf(fp, "HDR %x subch %i", hdr, subchan);
95*61046927SAndroid Build Coastguard Worker       }
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker       cur++;
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker       const char *mthd_name = "";
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker       switch (type) {
102*61046927SAndroid Build Coastguard Worker       case 4:
103*61046927SAndroid Build Coastguard Worker          fprintf(fp, " IMMD\n");
104*61046927SAndroid Build Coastguard Worker          inc = 0;
105*61046927SAndroid Build Coastguard Worker          is_immd = true;
106*61046927SAndroid Build Coastguard Worker          value = count;
107*61046927SAndroid Build Coastguard Worker          count = 1;
108*61046927SAndroid Build Coastguard Worker          break;
109*61046927SAndroid Build Coastguard Worker       case 1:
110*61046927SAndroid Build Coastguard Worker          fprintf(fp, " NINC\n");
111*61046927SAndroid Build Coastguard Worker          inc = count;
112*61046927SAndroid Build Coastguard Worker          break;
113*61046927SAndroid Build Coastguard Worker       case 2:
114*61046927SAndroid Build Coastguard Worker       case 3:
115*61046927SAndroid Build Coastguard Worker          fprintf(fp, " 0INC\n");
116*61046927SAndroid Build Coastguard Worker          inc = 0;
117*61046927SAndroid Build Coastguard Worker          break;
118*61046927SAndroid Build Coastguard Worker       case 5:
119*61046927SAndroid Build Coastguard Worker          fprintf(fp, " 1INC\n");
120*61046927SAndroid Build Coastguard Worker          inc = 1;
121*61046927SAndroid Build Coastguard Worker          break;
122*61046927SAndroid Build Coastguard Worker       case 0:
123*61046927SAndroid Build Coastguard Worker          switch (tert_op) {
124*61046927SAndroid Build Coastguard Worker          case 0:
125*61046927SAndroid Build Coastguard Worker             fprintf(fp, " NINC\n");
126*61046927SAndroid Build Coastguard Worker             inc = count;
127*61046927SAndroid Build Coastguard Worker             break;
128*61046927SAndroid Build Coastguard Worker          case 1:
129*61046927SAndroid Build Coastguard Worker             fprintf(fp, " SUB_DEVICE_OP\n");
130*61046927SAndroid Build Coastguard Worker             mthd_name = "SET_SUBDEVICE_MASK";
131*61046927SAndroid Build Coastguard Worker             mthd = tert_op;
132*61046927SAndroid Build Coastguard Worker             value = (hdr >> 4) & 0xfff;
133*61046927SAndroid Build Coastguard Worker             count = 1;
134*61046927SAndroid Build Coastguard Worker             is_immd = true;
135*61046927SAndroid Build Coastguard Worker             break;
136*61046927SAndroid Build Coastguard Worker          case 2:
137*61046927SAndroid Build Coastguard Worker             fprintf(fp, " SUB_DEVICE_OP\n");
138*61046927SAndroid Build Coastguard Worker             mthd_name = "STORE_SUBDEVICE_MASK";
139*61046927SAndroid Build Coastguard Worker             mthd = tert_op;
140*61046927SAndroid Build Coastguard Worker             value = (hdr >> 4) & 0xfff;
141*61046927SAndroid Build Coastguard Worker             count = 1;
142*61046927SAndroid Build Coastguard Worker             is_immd = true;
143*61046927SAndroid Build Coastguard Worker             break;
144*61046927SAndroid Build Coastguard Worker          case 3:
145*61046927SAndroid Build Coastguard Worker             fprintf(fp, " SUB_DEVICE_OP\n");
146*61046927SAndroid Build Coastguard Worker             mthd_name = "USE_SUBDEVICE_MASK";
147*61046927SAndroid Build Coastguard Worker             mthd = tert_op;
148*61046927SAndroid Build Coastguard Worker             count = 1;
149*61046927SAndroid Build Coastguard Worker             break;
150*61046927SAndroid Build Coastguard Worker          }
151*61046927SAndroid Build Coastguard Worker          break;
152*61046927SAndroid Build Coastguard Worker       }
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker       while (count--) {
155*61046927SAndroid Build Coastguard Worker          if (!is_tert) {
156*61046927SAndroid Build Coastguard Worker             if (mthd < 0x100) {
157*61046927SAndroid Build Coastguard Worker                mthd_name = P_PARSE_NV906F_MTHD(mthd);
158*61046927SAndroid Build Coastguard Worker             } else {
159*61046927SAndroid Build Coastguard Worker                switch (subchan) {
160*61046927SAndroid Build Coastguard Worker                case 0:
161*61046927SAndroid Build Coastguard Worker                   if (devinfo->cls_eng3d >= 0xc797)
162*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVC797_MTHD(mthd);
163*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_eng3d >= 0xc697)
164*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVC697_MTHD(mthd);
165*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_eng3d >= 0xc597)
166*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVC597_MTHD(mthd);
167*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_eng3d >= 0xc397)
168*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVC397_MTHD(mthd);
169*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_eng3d >= 0xb197)
170*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVB197_MTHD(mthd);
171*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_eng3d >= 0xa097)
172*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVA097_MTHD(mthd);
173*61046927SAndroid Build Coastguard Worker                   else
174*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NV9097_MTHD(mthd);
175*61046927SAndroid Build Coastguard Worker                   break;
176*61046927SAndroid Build Coastguard Worker                case 1:
177*61046927SAndroid Build Coastguard Worker                   if (devinfo->cls_compute >= 0xc7c0)
178*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVC7C0_MTHD(mthd);
179*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_compute >= 0xc6c0)
180*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVC6C0_MTHD(mthd);
181*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_compute >= 0xc5c0)
182*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVC5C0_MTHD(mthd);
183*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_compute >= 0xc3c0)
184*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVC3C0_MTHD(mthd);
185*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_compute >= 0xc0c0)
186*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVC0C0_MTHD(mthd);
187*61046927SAndroid Build Coastguard Worker                   else
188*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVA0C0_MTHD(mthd);
189*61046927SAndroid Build Coastguard Worker                   break;
190*61046927SAndroid Build Coastguard Worker                case 2:
191*61046927SAndroid Build Coastguard Worker                   if (devinfo->cls_m2mf >= 0xa140)
192*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVA140_MTHD(mthd);
193*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_m2mf >= 0xa040)
194*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVA040_MTHD(mthd);
195*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_m2mf >= 0x9039)
196*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NV9039_MTHD(mthd);
197*61046927SAndroid Build Coastguard Worker                   break;
198*61046927SAndroid Build Coastguard Worker                case 3:
199*61046927SAndroid Build Coastguard Worker                   mthd_name = P_PARSE_NV902D_MTHD(mthd);
200*61046927SAndroid Build Coastguard Worker                   break;
201*61046927SAndroid Build Coastguard Worker                case 4:
202*61046927SAndroid Build Coastguard Worker                   if (devinfo->cls_copy >= 0xc1b5)
203*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVC1B5_MTHD(mthd);
204*61046927SAndroid Build Coastguard Worker                   else if (devinfo->cls_copy >= 0xa0b5)
205*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NVA0B5_MTHD(mthd);
206*61046927SAndroid Build Coastguard Worker                   else
207*61046927SAndroid Build Coastguard Worker                      mthd_name = P_PARSE_NV90B5_MTHD(mthd);
208*61046927SAndroid Build Coastguard Worker                   break;
209*61046927SAndroid Build Coastguard Worker                default:
210*61046927SAndroid Build Coastguard Worker                   mthd_name = "unknown method";
211*61046927SAndroid Build Coastguard Worker                   break;
212*61046927SAndroid Build Coastguard Worker                }
213*61046927SAndroid Build Coastguard Worker             }
214*61046927SAndroid Build Coastguard Worker          }
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker          if (!is_immd)
217*61046927SAndroid Build Coastguard Worker             value = *cur;
218*61046927SAndroid Build Coastguard Worker 
219*61046927SAndroid Build Coastguard Worker          fprintf(fp, "\tmthd %04x %s\n", mthd, mthd_name);
220*61046927SAndroid Build Coastguard Worker          if (mthd < 0x100) {
221*61046927SAndroid Build Coastguard Worker             P_DUMP_NV906F_MTHD_DATA(fp, mthd, value, "\t\t");
222*61046927SAndroid Build Coastguard Worker          } else {
223*61046927SAndroid Build Coastguard Worker             switch (subchan) {
224*61046927SAndroid Build Coastguard Worker             case 0:
225*61046927SAndroid Build Coastguard Worker                if (devinfo->cls_eng3d >= 0xc597)
226*61046927SAndroid Build Coastguard Worker                   P_DUMP_NVC597_MTHD_DATA(fp, mthd, value, "\t\t");
227*61046927SAndroid Build Coastguard Worker                else if (devinfo->cls_eng3d >= 0xc397)
228*61046927SAndroid Build Coastguard Worker                   P_DUMP_NVC397_MTHD_DATA(fp, mthd, value, "\t\t");
229*61046927SAndroid Build Coastguard Worker                else if (devinfo->cls_eng3d >= 0xb197)
230*61046927SAndroid Build Coastguard Worker                   P_DUMP_NVB197_MTHD_DATA(fp, mthd, value, "\t\t");
231*61046927SAndroid Build Coastguard Worker                else if (devinfo->cls_eng3d >= 0xa097)
232*61046927SAndroid Build Coastguard Worker                   P_DUMP_NVA097_MTHD_DATA(fp, mthd, value, "\t\t");
233*61046927SAndroid Build Coastguard Worker                else
234*61046927SAndroid Build Coastguard Worker                   P_DUMP_NV9097_MTHD_DATA(fp, mthd, value, "\t\t");
235*61046927SAndroid Build Coastguard Worker                break;
236*61046927SAndroid Build Coastguard Worker             case 1:
237*61046927SAndroid Build Coastguard Worker                if (devinfo->cls_compute >= 0xc3c0)
238*61046927SAndroid Build Coastguard Worker                   P_DUMP_NVC3C0_MTHD_DATA(fp, mthd, value, "\t\t");
239*61046927SAndroid Build Coastguard Worker                else if (devinfo->cls_compute >= 0xc0c0)
240*61046927SAndroid Build Coastguard Worker                   P_DUMP_NVC0C0_MTHD_DATA(fp, mthd, value, "\t\t");
241*61046927SAndroid Build Coastguard Worker                else
242*61046927SAndroid Build Coastguard Worker                   P_DUMP_NVA0C0_MTHD_DATA(fp, mthd, value, "\t\t");
243*61046927SAndroid Build Coastguard Worker                break;
244*61046927SAndroid Build Coastguard Worker             case 3:
245*61046927SAndroid Build Coastguard Worker                P_DUMP_NV902D_MTHD_DATA(fp, mthd, value, "\t\t");
246*61046927SAndroid Build Coastguard Worker                break;
247*61046927SAndroid Build Coastguard Worker             case 4:
248*61046927SAndroid Build Coastguard Worker                if (devinfo->cls_copy >= 0xc1b5)
249*61046927SAndroid Build Coastguard Worker                   P_DUMP_NVC1B5_MTHD_DATA(fp, mthd, value, "\t\t");
250*61046927SAndroid Build Coastguard Worker                else if (devinfo->cls_copy >= 0xa0b5)
251*61046927SAndroid Build Coastguard Worker                   P_DUMP_NVA0B5_MTHD_DATA(fp, mthd, value, "\t\t");
252*61046927SAndroid Build Coastguard Worker                else
253*61046927SAndroid Build Coastguard Worker                   P_DUMP_NV90B5_MTHD_DATA(fp, mthd, value, "\t\t");
254*61046927SAndroid Build Coastguard Worker                break;
255*61046927SAndroid Build Coastguard Worker             default:
256*61046927SAndroid Build Coastguard Worker                fprintf(fp, "%s.VALUE = 0x%x\n", "\t\t", value);
257*61046927SAndroid Build Coastguard Worker                break;
258*61046927SAndroid Build Coastguard Worker             }
259*61046927SAndroid Build Coastguard Worker          }
260*61046927SAndroid Build Coastguard Worker 
261*61046927SAndroid Build Coastguard Worker          if (!is_immd)
262*61046927SAndroid Build Coastguard Worker             cur++;
263*61046927SAndroid Build Coastguard Worker 
264*61046927SAndroid Build Coastguard Worker          if (inc) {
265*61046927SAndroid Build Coastguard Worker             inc--;
266*61046927SAndroid Build Coastguard Worker             mthd += 4;
267*61046927SAndroid Build Coastguard Worker          }
268*61046927SAndroid Build Coastguard Worker       }
269*61046927SAndroid Build Coastguard Worker 
270*61046927SAndroid Build Coastguard Worker       fprintf(fp, "\n");
271*61046927SAndroid Build Coastguard Worker    }
272*61046927SAndroid Build Coastguard Worker }
273