drm/nouveau/secboot: fix WPR descriptor generation
authorAlexandre Courbot <acourbot@nvidia.com>
Wed, 14 Dec 2016 08:02:49 +0000 (17:02 +0900)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 17 Feb 2017 05:14:32 +0000 (15:14 +1000)
Generate the WPR descriptor closer to what RM does. In particular, set
the expected masks, and only set the ucode members on Tegra.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/acr_r352.c

index 82e325bb14315219ce2b035d2bccfac080ee4f64..d4f04239b124754ede076fc512ad7a523e396242 100644 (file)
@@ -496,19 +496,22 @@ acr_r352_fixup_hs_desc(struct acr_r352 *acr, struct nvkm_secboot *sb,
 {
        struct nvkm_gpuobj *ls_blob = acr->ls_blob;
 
-       desc->ucode_blob_base = ls_blob->addr;
-       desc->ucode_blob_size = ls_blob->size;
-
-       desc->wpr_offset = 0;
-
        /* WPR region information if WPR is not fixed */
        if (sb->wpr_size == 0) {
+               u32 wpr_start = ls_blob->addr;
+               u32 wpr_end = wpr_start + ls_blob->size;
+
                desc->wpr_region_id = 1;
-               desc->regions.no_regions = 1;
+               desc->regions.no_regions = 2;
+               desc->regions.region_props[0].start_addr = wpr_start >> 8;
+               desc->regions.region_props[0].end_addr = wpr_end >> 8;
                desc->regions.region_props[0].region_id = 1;
-               desc->regions.region_props[0].start_addr = ls_blob->addr >> 8;
-               desc->regions.region_props[0].end_addr =
-                                          (ls_blob->addr + ls_blob->size) >> 8;
+               desc->regions.region_props[0].read_mask = 0xf;
+               desc->regions.region_props[0].write_mask = 0xc;
+               desc->regions.region_props[0].client_mask = 0x2;
+       } else {
+               desc->ucode_blob_base = ls_blob->addr;
+               desc->ucode_blob_size = ls_blob->size;
        }
 }