1 #include "nv_push.h"
2
3 #include "nv_device_info.h"
4
5 #include <inttypes.h>
6
7 #include "nvk_cl906f.h"
8 #include "nvk_cl9097.h"
9 #include "nvk_cl902d.h"
10 #include "nvk_cl90b5.h"
11 #include "nvk_cla097.h"
12 #include "nvk_cla0b5.h"
13 #include "nvk_cla0c0.h"
14 #include "nvk_clb197.h"
15 #include "nvk_clc0c0.h"
16 #include "nvk_clc1b5.h"
17 #include "nvk_clc397.h"
18 #include "nvk_clc3c0.h"
19 #include "nvk_clc597.h"
20 #include "nvk_clc5c0.h"
21 #include "nvk_clc697.h"
22 #include "nvk_clc6c0.h"
23 #include "nvk_clc7c0.h"
24
25 #ifndef NDEBUG
26 void
nv_push_validate(struct nv_push * push)27 nv_push_validate(struct nv_push *push)
28 {
29 uint32_t *cur = push->start;
30
31 /* submitting empty push buffers is probably a bug */
32 assert(push->end != push->start);
33
34 /* make sure we don't overrun the bo */
35 assert(push->end <= push->limit);
36
37 /* parse all the headers to see if we get to buf->map */
38 while (cur < push->end) {
39 uint32_t hdr = *cur;
40 uint32_t mthd = hdr >> 29;
41
42 switch (mthd) {
43 /* immd */
44 case 4:
45 break;
46 case 1:
47 case 3:
48 case 5: {
49 uint32_t count = (hdr >> 16) & 0x1fff;
50 assert(count);
51 cur += count;
52 break;
53 }
54 default:
55 assert(!"unknown method found");
56 }
57
58 cur++;
59 assert(cur <= push->end);
60 }
61 }
62 #endif
63
64 void
vk_push_print(FILE * fp,const struct nv_push * push,const struct nv_device_info * devinfo)65 vk_push_print(FILE *fp, const struct nv_push *push,
66 const struct nv_device_info *devinfo)
67 {
68 uint32_t *cur = push->start;
69
70 while (cur < push->end) {
71 uint32_t hdr = *cur;
72 uint32_t type = hdr >> 29;
73 uint32_t inc = 0;
74 uint32_t count = (hdr >> 16) & 0x1fff;
75 uint32_t subchan = (hdr >> 13) & 0x7;
76 uint32_t mthd = (hdr & 0xfff) << 2;
77 uint32_t value = 0;
78 bool is_immd = false;
79
80 fprintf(fp, "[0x%08" PRIxPTR "] HDR %x subch %i",
81 cur - push->start, hdr, subchan);
82 cur++;
83
84 switch (type) {
85 case 4:
86 fprintf(fp, " IMMD\n");
87 inc = 0;
88 is_immd = true;
89 value = count;
90 count = 1;
91 break;
92 case 1:
93 fprintf(fp, " NINC\n");
94 inc = count;
95 break;
96 case 3:
97 fprintf(fp, " 0INC\n");
98 inc = 0;
99 break;
100 case 5:
101 fprintf(fp, " 1INC\n");
102 inc = 1;
103 break;
104 }
105
106 while (count--) {
107 const char *mthd_name = "";
108 if (mthd < 0x100) {
109 mthd_name = P_PARSE_NV906F_MTHD(mthd);
110 } else {
111 switch (subchan) {
112 case 0:
113 if (devinfo->cls_eng3d >= 0xc697)
114 mthd_name = P_PARSE_NVC697_MTHD(mthd);
115 else if (devinfo->cls_eng3d >= 0xc597)
116 mthd_name = P_PARSE_NVC597_MTHD(mthd);
117 else if (devinfo->cls_eng3d >= 0xc397)
118 mthd_name = P_PARSE_NVC397_MTHD(mthd);
119 else if (devinfo->cls_eng3d >= 0xb197)
120 mthd_name = P_PARSE_NVB197_MTHD(mthd);
121 else if (devinfo->cls_eng3d >= 0xa097)
122 mthd_name = P_PARSE_NVA097_MTHD(mthd);
123 else
124 mthd_name = P_PARSE_NV9097_MTHD(mthd);
125 break;
126 case 1:
127 if (devinfo->cls_compute >= 0xc7c0)
128 mthd_name = P_PARSE_NVC7C0_MTHD(mthd);
129 else if (devinfo->cls_compute >= 0xc6c0)
130 mthd_name = P_PARSE_NVC6C0_MTHD(mthd);
131 else if (devinfo->cls_compute >= 0xc5c0)
132 mthd_name = P_PARSE_NVC5C0_MTHD(mthd);
133 else if (devinfo->cls_compute >= 0xc3c0)
134 mthd_name = P_PARSE_NVC3C0_MTHD(mthd);
135 else if (devinfo->cls_compute >= 0xc0c0)
136 mthd_name = P_PARSE_NVC0C0_MTHD(mthd);
137 else
138 mthd_name = P_PARSE_NVA0C0_MTHD(mthd);
139 break;
140 case 3:
141 mthd_name = P_PARSE_NV902D_MTHD(mthd);
142 break;
143 case 4:
144 if (devinfo->cls_copy >= 0xc1b5)
145 mthd_name = P_PARSE_NVC1B5_MTHD(mthd);
146 else if (devinfo->cls_copy >= 0xa0b5)
147 mthd_name = P_PARSE_NVA0B5_MTHD(mthd);
148 else
149 mthd_name = P_PARSE_NV90B5_MTHD(mthd);
150 break;
151 default:
152 mthd_name = "";
153 break;
154 }
155 }
156
157 if (!is_immd)
158 value = *cur;
159
160 fprintf(fp, "\tmthd %04x %s\n", mthd, mthd_name);
161 if (mthd < 0x100) {
162 P_DUMP_NV906F_MTHD_DATA(fp, mthd, value, "\t\t");
163 } else {
164 switch (subchan) {
165 case 0:
166 if (devinfo->cls_eng3d >= 0xc597)
167 P_DUMP_NVC597_MTHD_DATA(fp, mthd, value, "\t\t");
168 else if (devinfo->cls_eng3d >= 0xc397)
169 P_DUMP_NVC397_MTHD_DATA(fp, mthd, value, "\t\t");
170 else if (devinfo->cls_eng3d >= 0xb197)
171 P_DUMP_NVB197_MTHD_DATA(fp, mthd, value, "\t\t");
172 else if (devinfo->cls_eng3d >= 0xa097)
173 P_DUMP_NVA097_MTHD_DATA(fp, mthd, value, "\t\t");
174 else
175 P_DUMP_NV9097_MTHD_DATA(fp, mthd, value, "\t\t");
176 break;
177 case 1:
178 if (devinfo->cls_compute >= 0xc3c0)
179 P_DUMP_NVC3C0_MTHD_DATA(fp, mthd, value, "\t\t");
180 else if (devinfo->cls_compute >= 0xc0c0)
181 P_DUMP_NVC0C0_MTHD_DATA(fp, mthd, value, "\t\t");
182 else
183 P_DUMP_NVA0C0_MTHD_DATA(fp, mthd, value, "\t\t");
184 break;
185 case 3:
186 P_DUMP_NV902D_MTHD_DATA(fp, mthd, value, "\t\t");
187 break;
188 case 4:
189 if (devinfo->cls_copy >= 0xc1b5)
190 P_DUMP_NVC1B5_MTHD_DATA(fp, mthd, value, "\t\t");
191 else if (devinfo->cls_copy >= 0xa0b5)
192 P_DUMP_NVA0B5_MTHD_DATA(fp, mthd, value, "\t\t");
193 else
194 P_DUMP_NV90B5_MTHD_DATA(fp, mthd, value, "\t\t");
195 break;
196 default:
197 mthd_name = "";
198 break;
199 }
200 }
201
202 if (!is_immd)
203 cur++;
204
205 if (inc) {
206 inc--;
207 mthd += 4;
208 }
209 }
210
211 fprintf(fp, "\n");
212 }
213 }
214