xref: /aosp_15_r20/external/mesa3d/src/nouveau/headers/nv_push_dump.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2023 Collabora Ltd. and Red Hat Inc.
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #include "nv_device_info.h"
7 #include "nv_push.h"
8 #include <inttypes.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 
13 #include "cl902d.h"
14 #include "cla097.h"
15 #include "clb097.h"
16 #include "clc097.h"
17 #include "clc397.h"
18 #include "clc597.h"
19 #include "clc697.h"
20 #include "clc997.h"
21 
22 #include "cla0c0.h"
23 #include "clb0c0.h"
24 #include "clc0c0.h"
25 #include "clc3c0.h"
26 #include "clc5c0.h"
27 #include "clc6c0.h"
28 #include "clc7c0.h"
29 
30 #define KEPLER_DMA_COPY_A 0x0000a0b5
31 #define MAXWELL_DMA_COPY_A 0x0000b0b5
32 #define PASCAL_DMA_COPY_A 0x0000c0b5
33 #define VOLTA_DMA_COPY_A 0x0000c3b5
34 #define TURING_DMA_COPY_A 0x0000c5b5
35 #define AMPERE_DMA_COPY_A 0x0000c6b5
36 #define KEPLER_INLINE_TO_MEMORY_A 0xa040
37 #define KEPLER_INLINE_TO_MEMORY_B 0xa140
38 
get_fake_device_info(const char * arch_name)39 static struct nv_device_info get_fake_device_info(const char *arch_name) {
40   struct nv_device_info info;
41 
42   memset(&info, 0, sizeof(info));
43 
44   if (!strcmp(arch_name, "KEPLER")) {
45     info.cls_eng3d = KEPLER_A;
46     info.cls_copy = KEPLER_DMA_COPY_A;
47     info.cls_m2mf = KEPLER_INLINE_TO_MEMORY_A;
48   } else if (!strcmp(arch_name, "MAXWELL")) {
49     info.cls_eng3d = MAXWELL_A;
50     info.cls_compute = MAXWELL_COMPUTE_A;
51     info.cls_copy = MAXWELL_DMA_COPY_A;
52   } else if (!strcmp(arch_name, "PASCAL")) {
53     info.cls_eng3d = PASCAL_A;
54     info.cls_compute = PASCAL_COMPUTE_A;
55     info.cls_copy = PASCAL_DMA_COPY_A;
56   } else if (!strcmp(arch_name, "VOLTA")) {
57     info.cls_eng3d = VOLTA_A;
58     info.cls_compute = VOLTA_COMPUTE_A;
59     info.cls_copy = VOLTA_DMA_COPY_A;
60   } else if (!strcmp(arch_name, "TURING")) {
61     info.cls_eng3d = TURING_A;
62     info.cls_compute = TURING_COMPUTE_A;
63     info.cls_copy = TURING_DMA_COPY_A;
64   } else if (!strcmp(arch_name, "AMPERE")) {
65     info.cls_eng3d = AMPERE_A;
66     info.cls_compute = AMPERE_COMPUTE_B;
67     info.cls_copy = AMPERE_DMA_COPY_A;
68   } else if (!strcmp(arch_name, "ADA")) {
69     info.cls_eng3d = ADA_A;
70     info.cls_copy = AMPERE_DMA_COPY_A;
71   } else {
72     fprintf(stderr, "Unknown architecture \"%s\", defaulting to Turing",
73             arch_name);
74     info.cls_eng3d = TURING_A;
75     info.cls_compute = TURING_COMPUTE_A;
76     info.cls_copy = TURING_DMA_COPY_A;
77   }
78 
79   info.cls_eng2d = FERMI_TWOD_A;
80   info.cls_m2mf = KEPLER_INLINE_TO_MEMORY_B;
81 
82   return info;
83 }
84 
main(int argc,char ** argv)85 int main(int argc, char **argv) {
86   const char *arch_name;
87   const char *file_name;
88   FILE *file;
89   long file_size;
90   uint32_t *data;
91   struct nv_device_info device_info;
92   struct nv_push pushbuf;
93 
94   if (argc != 3) {
95     fprintf(stderr, "Usage: nv_push_dump file.bin "
96                     "<KEPLER|MAXWELL|VOLTA|TURING|AMPERE|ADA>\n");
97     return 1;
98   }
99 
100   file_name = argv[1];
101   arch_name = argv[2];
102 
103   device_info = get_fake_device_info(arch_name);
104 
105   file = fopen(file_name, "r");
106 
107   if (file == NULL) {
108     fprintf(stderr, "couldn't open file \"%s\"\n", file_name);
109     return 1;
110   }
111 
112   fseek(file, 0L, SEEK_END);
113   file_size = ftell(file);
114   fseek(file, 0L, SEEK_SET);
115 
116   if (file_size % 4 != 0) {
117     fclose(file);
118 
119     fprintf(stderr, "invalid file, data isn't aligned to 4 bytes\n");
120     return 1;
121   }
122 
123   data = malloc(file_size);
124 
125   if (data == NULL) {
126     fclose(file);
127 
128     fprintf(stderr, "memory allocation failed\n");
129     return 1;
130   }
131 
132   fread(data, file_size, 1, file);
133   fclose(file);
134 
135   nv_push_init(&pushbuf, data, file_size / 4);
136   pushbuf.end = pushbuf.limit;
137 
138   vk_push_print(stdout, &pushbuf, &device_info);
139 
140   free(data);
141 
142   return 0;
143 }