Commit 4f3c1556 authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Ben Skeggs

drm/nouveau/secboot/gm200: make firmware loading re-callable

Make it possible to call gm20x_secboot_prepare_blobs() several times
after either success or failure without re-building already existing
blobs. The function will now try to load firmware files that have
previously failed before returning success.
Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 7fcab839
...@@ -860,6 +860,8 @@ gm200_secboot_prepare_ls_blob(struct gm200_secboot *gsb) ...@@ -860,6 +860,8 @@ gm200_secboot_prepare_ls_blob(struct gm200_secboot *gsb)
/* Write LS blob */ /* Write LS blob */
ret = ls_ucode_mgr_write_wpr(gsb, &mgr, gsb->ls_blob); ret = ls_ucode_mgr_write_wpr(gsb, &mgr, gsb->ls_blob);
if (ret)
nvkm_gpuobj_del(&gsb->ls_blob);
cleanup: cleanup:
ls_ucode_mgr_cleanup(&mgr); ls_ucode_mgr_cleanup(&mgr);
...@@ -1023,21 +1025,27 @@ gm20x_secboot_prepare_blobs(struct gm200_secboot *gsb) ...@@ -1023,21 +1025,27 @@ gm20x_secboot_prepare_blobs(struct gm200_secboot *gsb)
int ret; int ret;
/* Load and prepare the managed falcon's firmwares */ /* Load and prepare the managed falcon's firmwares */
if (!gsb->ls_blob) {
ret = gm200_secboot_prepare_ls_blob(gsb); ret = gm200_secboot_prepare_ls_blob(gsb);
if (ret) if (ret)
return ret; return ret;
}
/* Load the HS firmware that will load the LS firmwares */ /* Load the HS firmware that will load the LS firmwares */
if (!gsb->acr_load_blob) {
ret = gm200_secboot_prepare_hs_blob(gsb, "acr/ucode_load", ret = gm200_secboot_prepare_hs_blob(gsb, "acr/ucode_load",
&gsb->acr_load_blob, &gsb->acr_load_blob,
&gsb->acr_load_bl_desc, true); &gsb->acr_load_bl_desc, true);
if (ret) if (ret)
return ret; return ret;
}
/* Load the HS firmware bootloader */ /* Load the HS firmware bootloader */
if (!gsb->hsbl_blob) {
ret = gm200_secboot_prepare_hsbl_blob(gsb); ret = gm200_secboot_prepare_hsbl_blob(gsb);
if (ret) if (ret)
return ret; return ret;
}
return 0; return 0;
} }
...@@ -1053,11 +1061,13 @@ gm200_secboot_prepare_blobs(struct nvkm_secboot *sb) ...@@ -1053,11 +1061,13 @@ gm200_secboot_prepare_blobs(struct nvkm_secboot *sb)
return ret; return ret;
/* dGPU only: load the HS firmware that unprotects the WPR region */ /* dGPU only: load the HS firmware that unprotects the WPR region */
if (!gsb->acr_unload_blob) {
ret = gm200_secboot_prepare_hs_blob(gsb, "acr/ucode_unload", ret = gm200_secboot_prepare_hs_blob(gsb, "acr/ucode_unload",
&gsb->acr_unload_blob, &gsb->acr_unload_blob,
&gsb->acr_unload_bl_desc, false); &gsb->acr_unload_bl_desc, false);
if (ret) if (ret)
return ret; return ret;
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment