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