drm/nouveau/gr/gf100: handle secure boot errors
authorAlexandre Courbot <acourbot@nvidia.com>
Wed, 8 Jun 2016 08:32:39 +0000 (17:32 +0900)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 14 Jul 2016 01:53:25 +0000 (11:53 +1000)
Handle and propagate secure boot errors. Failure to do so results in
Nouveau incorrectly believing init has succeeded and a completely
black display during boot. If we propagate the error, GR init will fail
and the user will at least have a working display.

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

index 7d14d058b745d5a1d391ed3058088c9d279c9e1e..157919c788e6f72261d6989a352c4f6fddf3a014 100644 (file)
@@ -1457,6 +1457,7 @@ gf100_gr_init_ctxctl(struct gf100_gr *gr)
        struct nvkm_device *device = subdev->device;
        struct nvkm_secboot *sb = device->secboot;
        int i;
+       int ret = 0;
 
        if (gr->firmware) {
                /* load fuc microcode */
@@ -1464,15 +1465,20 @@ gf100_gr_init_ctxctl(struct gf100_gr *gr)
 
                /* securely-managed falcons must be reset using secure boot */
                if (nvkm_secboot_is_managed(sb, NVKM_SECBOOT_FALCON_FECS))
-                       nvkm_secboot_reset(sb, NVKM_SECBOOT_FALCON_FECS);
+                       ret = nvkm_secboot_reset(sb, NVKM_SECBOOT_FALCON_FECS);
                else
                        gf100_gr_init_fw(gr, 0x409000, &gr->fuc409c,
                                         &gr->fuc409d);
+               if (ret)
+                       return ret;
+
                if (nvkm_secboot_is_managed(sb, NVKM_SECBOOT_FALCON_GPCCS))
-                       nvkm_secboot_reset(sb, NVKM_SECBOOT_FALCON_GPCCS);
+                       ret = nvkm_secboot_reset(sb, NVKM_SECBOOT_FALCON_GPCCS);
                else
                        gf100_gr_init_fw(gr, 0x41a000, &gr->fuc41ac,
                                         &gr->fuc41ad);
+               if (ret)
+                       return ret;
 
                nvkm_mc_unk260(device, 1);