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 }