drm/nouveau/secboot: support for r367 ACR
[platform/kernel/linux-starfive.git] / drivers / gpu / drm / nouveau / nvkm / subdev / secboot / acr_r367.c
1 /*
2  * Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20  * DEALINGS IN THE SOFTWARE.
21  */
22
23 #include "acr_r367.h"
24 #include "acr_r361.h"
25
26 #include <core/gpuobj.h>
27
28 /*
29  * r367 ACR: new LS signature format requires a rewrite of LS firmware and
30  * blob creation functions. Also the hsflcn_desc layout has changed slightly.
31  */
32
33 #define LSF_LSB_DEPMAP_SIZE 11
34
35 /**
36  * struct acr_r367_lsf_lsb_header - LS firmware header
37  *
38  * See also struct acr_r352_lsf_lsb_header for documentation.
39  */
40 struct acr_r367_lsf_lsb_header {
41         /**
42          * LS falcon signatures
43          * @prd_keys:           signature to use in production mode
44          * @dgb_keys:           signature to use in debug mode
45          * @b_prd_present:      whether the production key is present
46          * @b_dgb_present:      whether the debug key is present
47          * @falcon_id:          ID of the falcon the ucode applies to
48          */
49         struct {
50                 u8 prd_keys[2][16];
51                 u8 dbg_keys[2][16];
52                 u32 b_prd_present;
53                 u32 b_dbg_present;
54                 u32 falcon_id;
55                 u32 supports_versioning;
56                 u32 version;
57                 u32 depmap_count;
58                 u8 depmap[LSF_LSB_DEPMAP_SIZE * 2 * 4];
59                 u8 kdf[16];
60         } signature;
61         u32 ucode_off;
62         u32 ucode_size;
63         u32 data_size;
64         u32 bl_code_size;
65         u32 bl_imem_off;
66         u32 bl_data_off;
67         u32 bl_data_size;
68         u32 app_code_off;
69         u32 app_code_size;
70         u32 app_data_off;
71         u32 app_data_size;
72         u32 flags;
73 };
74
75 /**
76  * struct acr_r367_lsf_wpr_header - LS blob WPR Header
77  *
78  * See also struct acr_r352_lsf_wpr_header for documentation.
79  */
80 struct acr_r367_lsf_wpr_header {
81         u32 falcon_id;
82         u32 lsb_offset;
83         u32 bootstrap_owner;
84         u32 lazy_bootstrap;
85         u32 bin_version;
86         u32 status;
87 #define LSF_IMAGE_STATUS_NONE                           0
88 #define LSF_IMAGE_STATUS_COPY                           1
89 #define LSF_IMAGE_STATUS_VALIDATION_CODE_FAILED         2
90 #define LSF_IMAGE_STATUS_VALIDATION_DATA_FAILED         3
91 #define LSF_IMAGE_STATUS_VALIDATION_DONE                4
92 #define LSF_IMAGE_STATUS_VALIDATION_SKIPPED             5
93 #define LSF_IMAGE_STATUS_BOOTSTRAP_READY                6
94 #define LSF_IMAGE_STATUS_REVOCATION_CHECK_FAILED                7
95 };
96
97 /**
98  * struct ls_ucode_img_r367 - ucode image augmented with r367 headers
99  */
100 struct ls_ucode_img_r367 {
101         struct ls_ucode_img base;
102
103         struct acr_r367_lsf_wpr_header wpr_header;
104         struct acr_r367_lsf_lsb_header lsb_header;
105 };
106 #define ls_ucode_img_r367(i) container_of(i, struct ls_ucode_img_r367, base)
107
108 struct ls_ucode_img *
109 acr_r367_ls_ucode_img_load(const struct acr_r352 *acr,
110                            enum nvkm_secboot_falcon falcon_id)
111 {
112         const struct nvkm_subdev *subdev = acr->base.subdev;
113         struct ls_ucode_img_r367 *img;
114         int ret;
115
116         img = kzalloc(sizeof(*img), GFP_KERNEL);
117         if (!img)
118                 return ERR_PTR(-ENOMEM);
119
120         img->base.falcon_id = falcon_id;
121
122         ret = acr->func->ls_func[falcon_id]->load(subdev, &img->base);
123         if (ret) {
124                 kfree(img->base.ucode_data);
125                 kfree(img->base.sig);
126                 kfree(img);
127                 return ERR_PTR(ret);
128         }
129
130         /* Check that the signature size matches our expectations... */
131         if (img->base.sig_size != sizeof(img->lsb_header.signature)) {
132                 nvkm_error(subdev, "invalid signature size for %s falcon!\n",
133                            nvkm_secboot_falcon_name[falcon_id]);
134                 return ERR_PTR(-EINVAL);
135         }
136
137         /* Copy signature to the right place */
138         memcpy(&img->lsb_header.signature, img->base.sig, img->base.sig_size);
139
140         /* not needed? the signature should already have the right value */
141         img->lsb_header.signature.falcon_id = falcon_id;
142
143         return &img->base;
144 }
145
146 #define LSF_LSB_HEADER_ALIGN 256
147 #define LSF_BL_DATA_ALIGN 256
148 #define LSF_BL_DATA_SIZE_ALIGN 256
149 #define LSF_BL_CODE_SIZE_ALIGN 256
150 #define LSF_UCODE_DATA_ALIGN 4096
151
152 static u32
153 acr_r367_ls_img_fill_headers(struct acr_r352 *acr,
154                              struct ls_ucode_img_r367 *img, u32 offset)
155 {
156         struct ls_ucode_img *_img = &img->base;
157         struct acr_r367_lsf_wpr_header *whdr = &img->wpr_header;
158         struct acr_r367_lsf_lsb_header *lhdr = &img->lsb_header;
159         struct ls_ucode_img_desc *desc = &_img->ucode_desc;
160         const struct acr_r352_ls_func *func =
161                                             acr->func->ls_func[_img->falcon_id];
162
163         /* Fill WPR header */
164         whdr->falcon_id = _img->falcon_id;
165         whdr->bootstrap_owner = acr->base.boot_falcon;
166         whdr->bin_version = lhdr->signature.version;
167         whdr->status = LSF_IMAGE_STATUS_COPY;
168
169         /* Skip bootstrapping falcons started by someone else than ACR */
170         if (acr->lazy_bootstrap & BIT(_img->falcon_id))
171                 whdr->lazy_bootstrap = 1;
172
173         /* Align, save off, and include an LSB header size */
174         offset = ALIGN(offset, LSF_LSB_HEADER_ALIGN);
175         whdr->lsb_offset = offset;
176         offset += sizeof(*lhdr);
177
178         /*
179          * Align, save off, and include the original (static) ucode
180          * image size
181          */
182         offset = ALIGN(offset, LSF_UCODE_DATA_ALIGN);
183         _img->ucode_off = lhdr->ucode_off = offset;
184         offset += _img->ucode_size;
185
186         /*
187          * For falcons that use a boot loader (BL), we append a loader
188          * desc structure on the end of the ucode image and consider
189          * this the boot loader data. The host will then copy the loader
190          * desc args to this space within the WPR region (before locking
191          * down) and the HS bin will then copy them to DMEM 0 for the
192          * loader.
193          */
194         lhdr->bl_code_size = ALIGN(desc->bootloader_size,
195                                    LSF_BL_CODE_SIZE_ALIGN);
196         lhdr->ucode_size = ALIGN(desc->app_resident_data_offset,
197                                  LSF_BL_CODE_SIZE_ALIGN) + lhdr->bl_code_size;
198         lhdr->data_size = ALIGN(desc->app_size, LSF_BL_CODE_SIZE_ALIGN) +
199                                 lhdr->bl_code_size - lhdr->ucode_size;
200         /*
201          * Though the BL is located at 0th offset of the image, the VA
202          * is different to make sure that it doesn't collide the actual
203          * OS VA range
204          */
205         lhdr->bl_imem_off = desc->bootloader_imem_offset;
206         lhdr->app_code_off = desc->app_start_offset +
207                              desc->app_resident_code_offset;
208         lhdr->app_code_size = desc->app_resident_code_size;
209         lhdr->app_data_off = desc->app_start_offset +
210                              desc->app_resident_data_offset;
211         lhdr->app_data_size = desc->app_resident_data_size;
212
213         lhdr->flags = func->lhdr_flags;
214         if (_img->falcon_id == acr->base.boot_falcon)
215                 lhdr->flags |= LSF_FLAG_DMACTL_REQ_CTX;
216
217         /* Align and save off BL descriptor size */
218         lhdr->bl_data_size = ALIGN(func->bl_desc_size, LSF_BL_DATA_SIZE_ALIGN);
219
220         /*
221          * Align, save off, and include the additional BL data
222          */
223         offset = ALIGN(offset, LSF_BL_DATA_ALIGN);
224         lhdr->bl_data_off = offset;
225         offset += lhdr->bl_data_size;
226
227         return offset;
228 }
229
230 int
231 acr_r367_ls_fill_headers(struct acr_r352 *acr, struct list_head *imgs)
232 {
233         struct ls_ucode_img_r367 *img;
234         struct list_head *l;
235         u32 count = 0;
236         u32 offset;
237
238         /* Count the number of images to manage */
239         list_for_each(l, imgs)
240                 count++;
241
242         /*
243          * Start with an array of WPR headers at the base of the WPR.
244          * The expectation here is that the secure falcon will do a single DMA
245          * read of this array and cache it internally so it's ok to pack these.
246          * Also, we add 1 to the falcon count to indicate the end of the array.
247          */
248         offset = sizeof(img->wpr_header) * (count + 1);
249
250         /*
251          * Walk the managed falcons, accounting for the LSB structs
252          * as well as the ucode images.
253          */
254         list_for_each_entry(img, imgs, base.node) {
255                 offset = acr_r367_ls_img_fill_headers(acr, img, offset);
256         }
257
258         return offset;
259 }
260
261 int
262 acr_r367_ls_write_wpr(struct acr_r352 *acr, struct list_head *imgs,
263                       struct nvkm_gpuobj *wpr_blob, u64 wpr_addr)
264 {
265         struct ls_ucode_img *_img;
266         u32 pos = 0;
267
268         nvkm_kmap(wpr_blob);
269
270         list_for_each_entry(_img, imgs, node) {
271                 struct ls_ucode_img_r367 *img = ls_ucode_img_r367(_img);
272                 const struct acr_r352_ls_func *ls_func =
273                                             acr->func->ls_func[_img->falcon_id];
274                 u8 gdesc[ls_func->bl_desc_size];
275
276                 nvkm_gpuobj_memcpy_to(wpr_blob, pos, &img->wpr_header,
277                                       sizeof(img->wpr_header));
278
279                 nvkm_gpuobj_memcpy_to(wpr_blob, img->wpr_header.lsb_offset,
280                                      &img->lsb_header, sizeof(img->lsb_header));
281
282                 /* Generate and write BL descriptor */
283                 memset(gdesc, 0, ls_func->bl_desc_size);
284                 ls_func->generate_bl_desc(&acr->base, _img, wpr_addr, gdesc);
285
286                 nvkm_gpuobj_memcpy_to(wpr_blob, img->lsb_header.bl_data_off,
287                                       gdesc, ls_func->bl_desc_size);
288
289                 /* Copy ucode */
290                 nvkm_gpuobj_memcpy_to(wpr_blob, img->lsb_header.ucode_off,
291                                       _img->ucode_data, _img->ucode_size);
292
293                 pos += sizeof(img->wpr_header);
294         }
295
296         nvkm_wo32(wpr_blob, pos, NVKM_SECBOOT_FALCON_INVALID);
297
298         nvkm_done(wpr_blob);
299
300         return 0;
301 }
302
303 struct acr_r367_hsflcn_desc {
304         u8 reserved_dmem[0x200];
305         u32 signatures[4];
306         u32 wpr_region_id;
307         u32 wpr_offset;
308         u32 mmu_memory_range;
309 #define FLCN_ACR_MAX_REGIONS 2
310         struct {
311                 u32 no_regions;
312                 struct {
313                         u32 start_addr;
314                         u32 end_addr;
315                         u32 region_id;
316                         u32 read_mask;
317                         u32 write_mask;
318                         u32 client_mask;
319                         u32 shadow_mem_start_addr;
320                 } region_props[FLCN_ACR_MAX_REGIONS];
321         } regions;
322         u32 ucode_blob_size;
323         u64 ucode_blob_base __aligned(8);
324         struct {
325                 u32 vpr_enabled;
326                 u32 vpr_start;
327                 u32 vpr_end;
328                 u32 hdcp_policies;
329         } vpr_desc;
330 };
331
332 void
333 acr_r367_fixup_hs_desc(struct acr_r352 *acr, struct nvkm_secboot *sb,
334                        void *_desc)
335 {
336         struct acr_r367_hsflcn_desc *desc = _desc;
337         struct nvkm_gpuobj *ls_blob = acr->ls_blob;
338
339         /* WPR region information if WPR is not fixed */
340         if (sb->wpr_size == 0) {
341                 u64 wpr_start = ls_blob->addr;
342                 u64 wpr_end = ls_blob->addr + ls_blob->size;
343
344                 if (acr->func->shadow_blob)
345                         wpr_start += ls_blob->size / 2;
346
347                 desc->wpr_region_id = 1;
348                 desc->regions.no_regions = 2;
349                 desc->regions.region_props[0].start_addr = wpr_start >> 8;
350                 desc->regions.region_props[0].end_addr = wpr_end >> 8;
351                 desc->regions.region_props[0].region_id = 1;
352                 desc->regions.region_props[0].read_mask = 0xf;
353                 desc->regions.region_props[0].write_mask = 0xc;
354                 desc->regions.region_props[0].client_mask = 0x2;
355                 if (acr->func->shadow_blob)
356                         desc->regions.region_props[0].shadow_mem_start_addr =
357                                                              ls_blob->addr >> 8;
358                 else
359                         desc->regions.region_props[0].shadow_mem_start_addr = 0;
360         } else {
361                 desc->ucode_blob_base = ls_blob->addr;
362                 desc->ucode_blob_size = ls_blob->size;
363         }
364 }
365
366 const struct acr_r352_func
367 acr_r367_func = {
368         .fixup_hs_desc = acr_r367_fixup_hs_desc,
369         .generate_hs_bl_desc = acr_r361_generate_hs_bl_desc,
370         .hs_bl_desc_size = sizeof(struct acr_r361_flcn_bl_desc),
371         .shadow_blob = true,
372         .ls_ucode_img_load = acr_r367_ls_ucode_img_load,
373         .ls_fill_headers = acr_r367_ls_fill_headers,
374         .ls_write_wpr = acr_r367_ls_write_wpr,
375         .ls_func = {
376                 [NVKM_SECBOOT_FALCON_FECS] = &acr_r361_ls_fecs_func,
377                 [NVKM_SECBOOT_FALCON_GPCCS] = &acr_r361_ls_gpccs_func,
378                 [NVKM_SECBOOT_FALCON_PMU] = &acr_r361_ls_pmu_func,
379                 [NVKM_SECBOOT_FALCON_SEC2] = &acr_r361_ls_sec2_func,
380         },
381 };
382
383 struct nvkm_acr *
384 acr_r367_new(enum nvkm_secboot_falcon boot_falcon,
385              unsigned long managed_falcons)
386 {
387         return acr_r352_new_(&acr_r367_func, boot_falcon, managed_falcons);
388 }