|
@@ -40,6 +40,7 @@ gm200_secboot_run_blob(struct nvkm_secboot *sb, struct nvkm_gpuobj *blob)
|
|
|
struct nvkm_subdev *subdev = &gsb->base.subdev;
|
|
|
struct nvkm_falcon *falcon = gsb->base.boot_falcon;
|
|
|
struct nvkm_vma vma;
|
|
|
+ u32 start_address;
|
|
|
int ret;
|
|
|
|
|
|
ret = nvkm_falcon_get(falcon, subdev);
|
|
@@ -61,9 +62,11 @@ gm200_secboot_run_blob(struct nvkm_secboot *sb, struct nvkm_gpuobj *blob)
|
|
|
|
|
|
/* Load the HS bootloader into the falcon's IMEM/DMEM */
|
|
|
ret = sb->acr->func->load(sb->acr, &gsb->base, blob, vma.offset);
|
|
|
- if (ret)
|
|
|
+ if (ret < 0)
|
|
|
goto end;
|
|
|
|
|
|
+ start_address = ret;
|
|
|
+
|
|
|
/* Disable interrupts as we will poll for the HALT bit */
|
|
|
nvkm_mc_intr_mask(sb->subdev.device, falcon->owner->index, false);
|
|
|
|
|
@@ -71,7 +74,7 @@ gm200_secboot_run_blob(struct nvkm_secboot *sb, struct nvkm_gpuobj *blob)
|
|
|
nvkm_falcon_wr32(falcon, 0x040, 0xdeada5a5);
|
|
|
|
|
|
/* Start the HS bootloader */
|
|
|
- nvkm_falcon_set_start_addr(falcon, sb->acr->start_address);
|
|
|
+ nvkm_falcon_set_start_addr(falcon, start_address);
|
|
|
nvkm_falcon_start(falcon);
|
|
|
ret = nvkm_falcon_wait_for_halt(falcon, 100);
|
|
|
if (ret)
|