1c63fe2e7SBen Skeggs /*
2c63fe2e7SBen Skeggs * Copyright 2019 Red Hat Inc.
3c63fe2e7SBen Skeggs *
4c63fe2e7SBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
5c63fe2e7SBen Skeggs * copy of this software and associated documentation files (the "Software"),
6c63fe2e7SBen Skeggs * to deal in the Software without restriction, including without limitation
7c63fe2e7SBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8c63fe2e7SBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the
9c63fe2e7SBen Skeggs * Software is furnished to do so, subject to the following conditions:
10c63fe2e7SBen Skeggs *
11c63fe2e7SBen Skeggs * The above copyright notice and this permission notice shall be included in
12c63fe2e7SBen Skeggs * all copies or substantial portions of the Software.
13c63fe2e7SBen Skeggs *
14c63fe2e7SBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15c63fe2e7SBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16c63fe2e7SBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17c63fe2e7SBen Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18c63fe2e7SBen Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19c63fe2e7SBen Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20c63fe2e7SBen Skeggs * OTHER DEALINGS IN THE SOFTWARE.
21c63fe2e7SBen Skeggs */
22c63fe2e7SBen Skeggs #include <core/subdev.h>
23c63fe2e7SBen Skeggs #include <nvfw/ls.h>
24c63fe2e7SBen Skeggs
25c63fe2e7SBen Skeggs static void
nvfw_ls_desc_head(struct nvkm_subdev * subdev,const struct nvfw_ls_desc_head * hdr)26c63fe2e7SBen Skeggs nvfw_ls_desc_head(struct nvkm_subdev *subdev,
27c63fe2e7SBen Skeggs const struct nvfw_ls_desc_head *hdr)
28c63fe2e7SBen Skeggs {
29c63fe2e7SBen Skeggs char *date;
30c63fe2e7SBen Skeggs
31c63fe2e7SBen Skeggs nvkm_debug(subdev, "lsUcodeImgDesc:\n");
32c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tdescriptorSize : %d\n",
33c63fe2e7SBen Skeggs hdr->descriptor_size);
34c63fe2e7SBen Skeggs nvkm_debug(subdev, "\timageSize : %d\n", hdr->image_size);
35c63fe2e7SBen Skeggs nvkm_debug(subdev, "\ttoolsVersion : 0x%x\n",
36c63fe2e7SBen Skeggs hdr->tools_version);
37c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tappVersion : 0x%x\n", hdr->app_version);
38c63fe2e7SBen Skeggs
39c63fe2e7SBen Skeggs date = kstrndup(hdr->date, sizeof(hdr->date), GFP_KERNEL);
40c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tdate : %s\n", date);
41c63fe2e7SBen Skeggs kfree(date);
42c63fe2e7SBen Skeggs
43c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tbootloaderStartOffset: 0x%x\n",
44c63fe2e7SBen Skeggs hdr->bootloader_start_offset);
45c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tbootloaderSize : 0x%x\n",
46c63fe2e7SBen Skeggs hdr->bootloader_size);
47c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tbootloaderImemOffset : 0x%x\n",
48c63fe2e7SBen Skeggs hdr->bootloader_imem_offset);
49c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tbootloaderEntryPoint : 0x%x\n",
50c63fe2e7SBen Skeggs hdr->bootloader_entry_point);
51c63fe2e7SBen Skeggs
52c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tappStartOffset : 0x%x\n",
53c63fe2e7SBen Skeggs hdr->app_start_offset);
54c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tappSize : 0x%x\n", hdr->app_size);
55c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tappImemOffset : 0x%x\n",
56c63fe2e7SBen Skeggs hdr->app_imem_offset);
57c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tappImemEntry : 0x%x\n",
58c63fe2e7SBen Skeggs hdr->app_imem_entry);
59c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tappDmemOffset : 0x%x\n",
60c63fe2e7SBen Skeggs hdr->app_dmem_offset);
61c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tappResidentCodeOffset: 0x%x\n",
62c63fe2e7SBen Skeggs hdr->app_resident_code_offset);
63c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tappResidentCodeSize : 0x%x\n",
64c63fe2e7SBen Skeggs hdr->app_resident_code_size);
65c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tappResidentDataOffset: 0x%x\n",
66c63fe2e7SBen Skeggs hdr->app_resident_data_offset);
67c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tappResidentDataSize : 0x%x\n",
68c63fe2e7SBen Skeggs hdr->app_resident_data_size);
69c63fe2e7SBen Skeggs }
70c63fe2e7SBen Skeggs
71c63fe2e7SBen Skeggs const struct nvfw_ls_desc *
nvfw_ls_desc(struct nvkm_subdev * subdev,const void * data)72c63fe2e7SBen Skeggs nvfw_ls_desc(struct nvkm_subdev *subdev, const void *data)
73c63fe2e7SBen Skeggs {
74c63fe2e7SBen Skeggs const struct nvfw_ls_desc *hdr = data;
75c63fe2e7SBen Skeggs int i;
76c63fe2e7SBen Skeggs
77c63fe2e7SBen Skeggs nvfw_ls_desc_head(subdev, &hdr->head);
78c63fe2e7SBen Skeggs
79c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tnbOverlays : %d\n", hdr->nb_overlays);
80c63fe2e7SBen Skeggs for (i = 0; i < ARRAY_SIZE(hdr->load_ovl); i++) {
81c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tloadOvl[%d] : 0x%x %d\n", i,
82c63fe2e7SBen Skeggs hdr->load_ovl[i].start, hdr->load_ovl[i].size);
83c63fe2e7SBen Skeggs }
84c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tcompressed : %d\n", hdr->compressed);
85c63fe2e7SBen Skeggs
86c63fe2e7SBen Skeggs return hdr;
87c63fe2e7SBen Skeggs }
88c63fe2e7SBen Skeggs
89c63fe2e7SBen Skeggs const struct nvfw_ls_desc_v1 *
nvfw_ls_desc_v1(struct nvkm_subdev * subdev,const void * data)90c63fe2e7SBen Skeggs nvfw_ls_desc_v1(struct nvkm_subdev *subdev, const void *data)
91c63fe2e7SBen Skeggs {
92c63fe2e7SBen Skeggs const struct nvfw_ls_desc_v1 *hdr = data;
93c63fe2e7SBen Skeggs int i;
94c63fe2e7SBen Skeggs
95c63fe2e7SBen Skeggs nvfw_ls_desc_head(subdev, &hdr->head);
96c63fe2e7SBen Skeggs
97c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tnbImemOverlays : %d\n",
98c63fe2e7SBen Skeggs hdr->nb_imem_overlays);
99c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tnbDmemOverlays : %d\n",
100c63fe2e7SBen Skeggs hdr->nb_imem_overlays);
101c63fe2e7SBen Skeggs for (i = 0; i < ARRAY_SIZE(hdr->load_ovl); i++) {
102c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tloadOvl[%2d] : 0x%x %d\n", i,
103c63fe2e7SBen Skeggs hdr->load_ovl[i].start, hdr->load_ovl[i].size);
104c63fe2e7SBen Skeggs }
105c63fe2e7SBen Skeggs nvkm_debug(subdev, "\tcompressed : %d\n", hdr->compressed);
106c63fe2e7SBen Skeggs
107c63fe2e7SBen Skeggs return hdr;
108c63fe2e7SBen Skeggs }
109*4b569dedSBen Skeggs
110*4b569dedSBen Skeggs const struct nvfw_ls_desc_v2 *
nvfw_ls_desc_v2(struct nvkm_subdev * subdev,const void * data)111*4b569dedSBen Skeggs nvfw_ls_desc_v2(struct nvkm_subdev *subdev, const void *data)
112*4b569dedSBen Skeggs {
113*4b569dedSBen Skeggs const struct nvfw_ls_desc_v2 *hdr = data;
114*4b569dedSBen Skeggs char *date;
115*4b569dedSBen Skeggs int i;
116*4b569dedSBen Skeggs
117*4b569dedSBen Skeggs nvkm_debug(subdev, "lsUcodeImgDesc:\n");
118*4b569dedSBen Skeggs nvkm_debug(subdev, "\tdescriptorSize : %d\n", hdr->descriptor_size);
119*4b569dedSBen Skeggs nvkm_debug(subdev, "\timageSize : %d\n", hdr->image_size);
120*4b569dedSBen Skeggs nvkm_debug(subdev, "\ttoolsVersion : 0x%x\n", hdr->tools_version);
121*4b569dedSBen Skeggs nvkm_debug(subdev, "\tappVersion : 0x%x\n", hdr->app_version);
122*4b569dedSBen Skeggs
123*4b569dedSBen Skeggs date = kstrndup(hdr->date, sizeof(hdr->date), GFP_KERNEL);
124*4b569dedSBen Skeggs nvkm_debug(subdev, "\tdate : %s\n", date);
125*4b569dedSBen Skeggs kfree(date);
126*4b569dedSBen Skeggs
127*4b569dedSBen Skeggs nvkm_debug(subdev, "\tsecureBootloader : 0x%x\n", hdr->secure_bootloader);
128*4b569dedSBen Skeggs nvkm_debug(subdev, "\tbootloaderStartOffset: 0x%x\n", hdr->bootloader_start_offset);
129*4b569dedSBen Skeggs nvkm_debug(subdev, "\tbootloaderSize : 0x%x\n", hdr->bootloader_size);
130*4b569dedSBen Skeggs nvkm_debug(subdev, "\tbootloaderImemOffset : 0x%x\n", hdr->bootloader_imem_offset);
131*4b569dedSBen Skeggs nvkm_debug(subdev, "\tbootloaderEntryPoint : 0x%x\n", hdr->bootloader_entry_point);
132*4b569dedSBen Skeggs
133*4b569dedSBen Skeggs nvkm_debug(subdev, "\tappStartOffset : 0x%x\n", hdr->app_start_offset);
134*4b569dedSBen Skeggs nvkm_debug(subdev, "\tappSize : 0x%x\n", hdr->app_size);
135*4b569dedSBen Skeggs nvkm_debug(subdev, "\tappImemOffset : 0x%x\n", hdr->app_imem_offset);
136*4b569dedSBen Skeggs nvkm_debug(subdev, "\tappImemEntry : 0x%x\n", hdr->app_imem_entry);
137*4b569dedSBen Skeggs nvkm_debug(subdev, "\tappDmemOffset : 0x%x\n", hdr->app_dmem_offset);
138*4b569dedSBen Skeggs nvkm_debug(subdev, "\tappResidentCodeOffset: 0x%x\n", hdr->app_resident_code_offset);
139*4b569dedSBen Skeggs nvkm_debug(subdev, "\tappResidentCodeSize : 0x%x\n", hdr->app_resident_code_size);
140*4b569dedSBen Skeggs nvkm_debug(subdev, "\tappResidentDataOffset: 0x%x\n", hdr->app_resident_data_offset);
141*4b569dedSBen Skeggs nvkm_debug(subdev, "\tappResidentDataSize : 0x%x\n", hdr->app_resident_data_size);
142*4b569dedSBen Skeggs
143*4b569dedSBen Skeggs nvkm_debug(subdev, "\tnbImemOverlays : %d\n", hdr->nb_imem_overlays);
144*4b569dedSBen Skeggs nvkm_debug(subdev, "\tnbDmemOverlays : %d\n", hdr->nb_dmem_overlays);
145*4b569dedSBen Skeggs for (i = 0; i < ARRAY_SIZE(hdr->load_ovl); i++) {
146*4b569dedSBen Skeggs nvkm_debug(subdev, "\tloadOvl[%d] : 0x%x %d\n", i,
147*4b569dedSBen Skeggs hdr->load_ovl[i].start, hdr->load_ovl[i].size);
148*4b569dedSBen Skeggs }
149*4b569dedSBen Skeggs
150*4b569dedSBen Skeggs return hdr;
151*4b569dedSBen Skeggs }
152*4b569dedSBen Skeggs
153*4b569dedSBen Skeggs const struct nvfw_ls_hsbl_bin_hdr *
nvfw_ls_hsbl_bin_hdr(struct nvkm_subdev * subdev,const void * data)154*4b569dedSBen Skeggs nvfw_ls_hsbl_bin_hdr(struct nvkm_subdev *subdev, const void *data)
155*4b569dedSBen Skeggs {
156*4b569dedSBen Skeggs const struct nvfw_ls_hsbl_bin_hdr *hdr = data;
157*4b569dedSBen Skeggs
158*4b569dedSBen Skeggs nvkm_debug(subdev, "lsHsblBinHdr:\n");
159*4b569dedSBen Skeggs nvkm_debug(subdev, "\tbinMagic : 0x%08x\n", hdr->bin_magic);
160*4b569dedSBen Skeggs nvkm_debug(subdev, "\tbinVer : %d\n", hdr->bin_ver);
161*4b569dedSBen Skeggs nvkm_debug(subdev, "\tbinSize : %d\n", hdr->bin_size);
162*4b569dedSBen Skeggs nvkm_debug(subdev, "\theaderOffset : 0x%x\n", hdr->header_offset);
163*4b569dedSBen Skeggs return hdr;
164*4b569dedSBen Skeggs }
165*4b569dedSBen Skeggs
166*4b569dedSBen Skeggs const struct nvfw_ls_hsbl_hdr *
nvfw_ls_hsbl_hdr(struct nvkm_subdev * subdev,const void * data)167*4b569dedSBen Skeggs nvfw_ls_hsbl_hdr(struct nvkm_subdev *subdev, const void *data)
168*4b569dedSBen Skeggs {
169*4b569dedSBen Skeggs const struct nvfw_ls_hsbl_hdr *hdr = data;
170*4b569dedSBen Skeggs
171*4b569dedSBen Skeggs nvkm_debug(subdev, "lsHsblHdr:\n");
172*4b569dedSBen Skeggs nvkm_debug(subdev, "\tsigProdOffset : 0x%x\n", hdr->sig_prod_offset);
173*4b569dedSBen Skeggs nvkm_debug(subdev, "\tsigProdSize : 0x%x\n", hdr->sig_prod_size);
174*4b569dedSBen Skeggs nvkm_debug(subdev, "\tpatchLoc : 0x%x\n", hdr->patch_loc);
175*4b569dedSBen Skeggs nvkm_debug(subdev, "\tpatchSig : 0x%x\n", hdr->patch_sig);
176*4b569dedSBen Skeggs nvkm_debug(subdev, "\tmetadataOffset : 0x%x\n", hdr->meta_data_offset);
177*4b569dedSBen Skeggs nvkm_debug(subdev, "\tmetadataSize : 0x%x\n", hdr->meta_data_size);
178*4b569dedSBen Skeggs nvkm_debug(subdev, "\tnumSig : 0x%x\n", hdr->num_sig);
179*4b569dedSBen Skeggs return hdr;
180*4b569dedSBen Skeggs }
181