• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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