xref: /linux/drivers/gpu/drm/nouveau/nvkm/nvfw/ls.c (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
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