img = acr->func->ls_ucode_img_load(acr, falcon_id);
if (IS_ERR(img)) {
+ if (acr->base.optional_falcons & BIT(falcon_id)) {
+ managed_falcons &= ~BIT(falcon_id);
+ nvkm_info(subdev, "skipping %s falcon...\n",
+ nvkm_secboot_falcon_name[falcon_id]);
+ continue;
+ }
ret = PTR_ERR(img);
goto cleanup;
}
managed_count++;
}
+ /* Commit the actual list of falcons we will manage from now on */
+ acr->base.managed_falcons = managed_falcons;
+
+ /*
+ * If the boot falcon has a firmare, let it manage the bootstrap of other
+ * falcons.
+ */
+ if (acr->func->ls_func[acr->base.boot_falcon] &&
+ (managed_falcons & BIT(acr->base.boot_falcon))) {
+ for_each_set_bit(falcon_id, &managed_falcons,
+ NVKM_SECBOOT_FALCON_END) {
+ if (falcon_id == acr->base.boot_falcon)
+ continue;
+
+ acr->lazy_bootstrap |= BIT(falcon_id);
+ }
+ }
+
/*
* Fill the WPR and LSF headers with the right offsets and compute
* required WPR size
struct acr_r352 *acr = acr_r352(_acr);
struct nvkm_pmu *pmu = sb->subdev.device->pmu;
const char *fname = nvkm_secboot_falcon_name[falcon];
+ bool wpr_already_set = sb->wpr_set;
int ret;
- /* Not self-managed? Redo secure boot entirely */
- if (!nvkm_secboot_is_managed(sb, _acr->boot_falcon))
- return acr_r352_reset_nopmu(acr, sb, falcon);
-
- /*
- * Otherwise ensure secure boot is done, and command the PMU to reset
- * the desired falcon.
- */
+ /* Make sure secure boot is performed */
ret = acr_r352_bootstrap(acr, sb);
if (ret)
return ret;
+ /* No PMU interface? */
+ if (!nvkm_secboot_is_managed(sb, _acr->boot_falcon)) {
+ /* Redo secure boot entirely if it was already done */
+ if (wpr_already_set)
+ return acr_r352_reset_nopmu(acr, sb, falcon);
+ /* Else return the result of the initial invokation */
+ else
+ return ret;
+ }
+
+ /* Otherwise just ask the PMU to reset the falcon */
nvkm_debug(&sb->subdev, "resetting %s falcon\n", fname);
ret = nvkm_msgqueue_acr_boot_falcon(pmu->queue, falcon);
if (ret) {
acr->base.func = &acr_r352_base_func;
acr->func = func;
- /*
- * If we have a PMU firmware, let it manage the bootstrap of other
- * falcons.
- */
- if (func->ls_func[NVKM_SECBOOT_FALCON_PMU] &&
- (managed_falcons & BIT(NVKM_SECBOOT_FALCON_PMU))) {
- int i;
-
- for (i = 0; i < NVKM_SECBOOT_FALCON_END; i++) {
- if (i == NVKM_SECBOOT_FALCON_PMU)
- continue;
-
- if (func->ls_func[i])
- acr->lazy_bootstrap |= BIT(i);
- }
- }
-
return &acr->base;
}