struct list_head hsfw, hsf;
        struct list_head lsfw, lsf;
 
+       u64 managed_falcons;
+
        struct nvkm_memory *wpr;
        u64 wpr_start;
        u64 wpr_end;
        void (*bld_write)(struct nvkm_acr *, u32 bld, struct nvkm_acr_lsfw *);
        void (*bld_patch)(struct nvkm_acr *, u32 bld, s64 adjust);
        int (*boot)(struct nvkm_falcon *);
+       u64 bootstrap_falcons;
        int (*bootstrap_falcon)(struct nvkm_falcon *, enum nvkm_acr_lsf_id);
        int (*bootstrap_multiple_falcons)(struct nvkm_falcon *, u32 mask);
 };
 
        .bld_write = gp102_sec2_acr_bld_write,
        .bld_patch = gp102_sec2_acr_bld_patch,
        .boot = gp102_sec2_acr_boot,
+       .bootstrap_falcons = BIT_ULL(NVKM_ACR_LSF_FECS) |
+                            BIT_ULL(NVKM_ACR_LSF_GPCCS) |
+                            BIT_ULL(NVKM_ACR_LSF_SEC2),
        .bootstrap_falcon = gp102_sec2_acr_bootstrap_falcon,
 };
 
        .bld_write = gp102_sec2_acr_bld_write_1,
        .bld_patch = gp102_sec2_acr_bld_patch_1,
        .boot = gp102_sec2_acr_boot,
+       .bootstrap_falcons = BIT_ULL(NVKM_ACR_LSF_FECS) |
+                            BIT_ULL(NVKM_ACR_LSF_GPCCS) |
+                            BIT_ULL(NVKM_ACR_LSF_SEC2),
        .bootstrap_falcon = gp102_sec2_acr_bootstrap_falcon,
 };
 
 
                return -ENOSYS;
        }
 
+       if ((mask & acrflcn->func->bootstrap_falcons) != mask)
+               return -ENOSYS;
+
        if (acrflcn->func->bootstrap_multiple_falcons) {
                return acrflcn->func->
                        bootstrap_multiple_falcons(acrflcn->falcon, mask);
 nvkm_acr_managed_falcon(struct nvkm_device *device, enum nvkm_acr_lsf_id id)
 {
        struct nvkm_acr *acr = device->acr;
-       struct nvkm_acr_lsf *lsf;
 
        if (acr) {
-               list_for_each_entry(lsf, &acr->lsf, head) {
-                       if (lsf->id == id)
-                               return true;
-               }
+               if (acr->managed_falcons & BIT_ULL(id))
+                       return true;
        }
 
        return false;
        struct nvkm_acr_lsfw *lsfw, *lsft;
        struct nvkm_acr_lsf *lsf;
        u32 wpr_size = 0;
+       u64 falcons;
        int ret, i;
 
        if (list_empty(&acr->hsfw)) {
                lsf->falcon = lsfw->falcon;
                lsf->id = lsfw->id;
                list_add_tail(&lsf->head, &acr->lsf);
+               acr->managed_falcons |= BIT_ULL(lsf->id);
        }
 
        /* Ensure the falcon that'll provide ACR functions is booted first. */
        lsf = nvkm_acr_falcon(device);
-       if (lsf)
+       if (lsf) {
+               falcons = lsf->func->bootstrap_falcons;
                list_move(&lsf->head, &acr->lsf);
+       } else {
+               falcons = acr->func->bootstrap_falcons;
+       }
+
+       /* Cull falcons that can't be bootstrapped, or the HSFW can fail to
+        * boot and leave the GPU in a weird state.
+        */
+       list_for_each_entry_safe(lsfw, lsft, &acr->lsfw, head) {
+               if (!(falcons & BIT_ULL(lsfw->id))) {
+                       nvkm_warn(subdev, "%s falcon cannot be bootstrapped\n",
+                                 nvkm_acr_lsf_id(lsfw->id));
+                       nvkm_acr_lsfw_del(lsfw);
+               }
+       }
 
        if (!acr->wpr_fw || acr->wpr_comp)
                wpr_size = acr->func->wpr_layout(acr);
 
        .bld_write = gm20b_pmu_acr_bld_write,
        .bld_patch = gm20b_pmu_acr_bld_patch,
        .boot = gm20b_pmu_acr_boot,
+       .bootstrap_falcons = BIT_ULL(NVKM_ACR_LSF_PMU) |
+                            BIT_ULL(NVKM_ACR_LSF_FECS) |
+                            BIT_ULL(NVKM_ACR_LSF_GPCCS),
        .bootstrap_falcon = gm20b_pmu_acr_bootstrap_falcon,
 };
 
 
        .bld_write = gm20b_pmu_acr_bld_write,
        .bld_patch = gm20b_pmu_acr_bld_patch,
        .boot = gm20b_pmu_acr_boot,
+       .bootstrap_falcons = BIT_ULL(NVKM_ACR_LSF_PMU) |
+                            BIT_ULL(NVKM_ACR_LSF_FECS) |
+                            BIT_ULL(NVKM_ACR_LSF_GPCCS),
        .bootstrap_falcon = gm20b_pmu_acr_bootstrap_falcon,
        .bootstrap_multiple_falcons = gp10b_pmu_acr_bootstrap_multiple_falcons,
 };